Book a call

Architecture Decision Records: A Practical Guide

What Architecture Decision Records are, why they matter, and how to write good ones. Includes a copy-ready ADR template and the anti-patterns to avoid.
Guide3 min read
Isometric illustration: a neat stack of glass plates like a log of records, the newest in yellow, next to a small architecture model

An Architecture Decision Record (ADR) is a short document that captures one significant architectural decision: the context, the choice and the consequences. That's it. No 90-page design doc, no wiki page nobody updates: a single, dated, version-controlled record of why you decided what you decided. ADRs matter because architecture doesn't live in diagrams; it lives in the decisions teams make every week. When those decisions aren't written down, the reasoning leaves with the people who made it, and next quarter someone relitigates a trade-off that was already settled, or worse, quietly undoes it without knowing why it was made. ADRs are the cheapest insurance against that.

Why architecture decision records are worth the effort

  • They survive team rotation. The rationale outlives the person who had it in their head. New engineers can read the why along with the what.
  • They stop the same debate recurring. A decision with a written record and status ("we chose X over Y because Z") ends the quarterly re-argument.
  • They make trade-offs explicit. Writing down the options you didn't pick, and why, is where most of the value is.
  • They're auditable. In regulated contexts, a trail of dated decisions with rationale is evidence, not overhead.
  • They keep knowledge in your organisation, not a vendor's. An engagement that leaves ADRs in your repos leaves you able to change the system yourself. That's the opposite of vendor lock-in.

What goes in an ADR

Keep it short: one decision per record, ideally a page. The widely used structure (originally from Michael Nygard) has just a few fields:

  • Title: a short noun phrase, numbered (e.g. "ADR-014: Use event sourcing for the ledger").
  • Status: Proposed / Accepted / Deprecated / Superseded (by ADR-NNN).
  • Context. The forces at play: the problem, the constraints, the requirements that make this decision necessary.
  • Decision: what you're doing, stated plainly ("We will…").
  • Consequences: what becomes easier and what becomes harder as a result, including the risks you're accepting.

Optionally add Options considered (the alternatives and why they lost) and Related decisions (links to other ADRs).

A copy-ready ADR template

1# ADR-NNN: <short title of the decision>
2 
3Status: Proposed | Accepted | Deprecated | Superseded by ADR-NNN
4Date: YYYY-MM-DD
5Deciders: <names / roles>
6 
7## Context
8What is the problem, and what forces (technical, business, regulatory,
9team) make a decision necessary now? What constraints apply?
10 
11## Options considered
121. <Option A> — pros / cons
132. <Option B> — pros / cons
143. <Option C> — pros / cons
15 
16## Decision
17We will <the choice>, because <the reasoning>.
18 
19## Consequences
20- Positive: what this makes easier.
21- Negative: what this makes harder, and the risks we accept.
22- Follow-ups: anything this decision now requires.

Architecture decision record examples

Two filled-in records in the format above. The first is a small, reversible choice; the second supersedes an earlier decision, which is exactly what the status field is for.

Example 1: choosing a vector store

1# ADR-007: Use PostgreSQL with pgvector for semantic search
2
3Status: Accepted
4Date: 2026-03-14
5Deciders: CTO, lead backend engineer
6
7## Context
8We need semantic search over 400,000 help-centre articles. The team
9already runs PostgreSQL in production and has no on-call capacity
10for another datastore.
11
12## Options considered
131. pgvector in the existing PostgreSQL cluster
142. A managed vector database
153. Elasticsearch with dense vectors
16
17## Decision
18We will use pgvector in the existing cluster, because the corpus fits
19comfortably and it adds no new system to secure, back up and monitor.
20
21## Consequences
22- Positive: one database to operate; joins with existing tables.
23- Negative: we revisit this if the corpus passes about 10 million
24vectors or search latency misses its target.

Example 2: splitting a module out of a monolith

1# ADR-012: Extract billing from the monolith with a strangler fig
2
3Status: Accepted (supersedes ADR-004)
4Date: 2026-05-02
5Deciders: Head of engineering, billing team lead
6
7## Context
8Billing changes ship once a month because every release needs a full
9regression of the monolith. Finance wants weekly pricing experiments.
10
11## Options considered
121. Route billing endpoints to a new service, one at a time
132. Modularise billing inside the monolith
143. Rewrite the whole platform
15
16## Decision
17We will put a routing layer in front of billing and move endpoints
18to a new service one at a time, starting with invoice generation.
19
20## Consequences
21- Positive: billing can release weekly without a monolith regression.
22- Negative: both codebases write to the customer table until the data
23migration; we accept this with a nightly reconciliation job.

Tools for managing ADRs

You do not need special software. A folder of Markdown files in the repository is enough, and the tools below only make it easier:

  • adr-tools: a small command-line tool by Nat Pryce that creates numbered records and links superseded ones.
  • MADR (Markdown Any Decision Records): a widely used template with an explicit options-and-outcome section.
  • Log4brains: turns the ADR folder into a searchable static site that you can publish next to your docs.
  • Pull requests: propose each ADR as a pull request, so the discussion and the approval live next to the record.

Best practices for writing good ADRs

  • Write it when the decision is made, not after. ADRs authored retroactively lose the real context and become box-ticking.
  • One decision per record. If you're documenting five things, you have five ADRs.
  • Record the options you rejected. The "why not" is often more useful to the next reader than the "why".
  • Store them with the code, in the repo (/docs/adr/ or similar), versioned alongside what they describe, instead of in a separate wiki that drifts.
  • Never edit an accepted ADR to change the decision. Supersede it with a new one and set the old status to "Superseded by ADR-NNN". The history is the point.
  • Keep them short. If it's growing past a page or two, it's probably more than one decision.
  • Make writing them a team ritual, not one architect's chore. Decisions are better when the people affected help record them.

Anti-patterns to avoid

  • The ADR graveyard. A folder created once and never added to. ADRs only work as a habit.
  • Design docs disguised as ADRs. A 20-page document isn't an ADR; it's a design doc. Keep the decision record separate and short.
  • Editing history. Rewriting an accepted ADR erases the very context that makes it valuable.
  • No status field. Without status, readers can't tell a live decision from a superseded one.

Architecture decision records FAQ

What is an Architecture Decision Record?

A short, version-controlled document that captures one significant architecture decision (its context, the choice made, and the consequences) so the reasoning survives beyond the people who made it.

What should an ADR contain?

At minimum: title, status, context, decision, and consequences. Optionally the options considered and links to related ADRs. One decision per record, ideally a single page.

Where should ADRs be stored?

In the code repository, versioned alongside the system they describe (commonly /docs/adr/), so they don't drift the way a separate wiki does.

How are ADRs different from design documents?

A design doc explores a solution in depth; an ADR records a single decision and its rationale concisely. They complement each other: the ADR is the durable "why", the design doc is the detailed "how".

When should you write an ADR?

Whenever you make a consequential, hard-to-reverse architectural choice (service boundaries, data ownership, a technology selection, an integration approach), and do it at the moment the decision is made, not months later.

Want your architecture decisions to outlast the team? Talk it through

Tell us what you are building. On a 30-minute call a senior engineer walks through your architecture and how decisions get recorded. Or get a first view of the team and timeline in two minutes.