Architecture Decision Records (ADRs)
Short documents that capture a single architectural decision — the context, the options considered, the choice made, and the consequences — so future readers (and future AI sessions) know why things are the way they are.
What is an ADR?
An ADR is a snapshot of a decision. Not the code that resulted from it, not the requirements that led to it, but the decision itself — what was chosen, what the alternatives were, and why.
Software projects are full of choices: which database, which framework, which hosting provider, which data format. Each choice has trade-offs. Over time, the reasoning behind those choices fades. New team members, new AI sessions, and even your future self will look at the code and wonder: “Why is it done this way?”
Without ADRs, one of two things happens: either the question goes unanswered and the original reasoning is lost, or — worse — someone re-debates the decision and reverses it without understanding the original context. Both waste time and create risk.
An ADR is small by design — one decision, one page. It’s not a report. It’s not a justification essay. It’s a structured record that takes 10-15 minutes to write and saves hours of re-discovery later.
In plain terms
An ADR is like a judge’s written ruling. The judge doesn’t just announce the verdict (“guilty” or “not guilty”). They write down the facts of the case, the arguments from both sides, the law that applies, and the reasoning behind the decision. If someone appeals later, the ruling explains why — so the next judge doesn’t have to re-hear the whole case.
At a glance
The anatomy of an ADR (click to expand)
graph TD A["Context"] --> B["Options considered"] B --> C["Decision"] C --> D["Consequences"] D --> E["Status"] A -.- F["What situation prompted this?"] B -.- G["What were the alternatives?"] C -.- H["What was chosen and why?"] D -.- I["What follows — good and bad?"] E -.- J["Accepted / Deprecated / Superseded"] style C fill:#4a9ede,color:#fffKey: An ADR flows from context (the problem) through options (the alternatives) to a decision (the choice) and its consequences (the trade-offs). The decision node is central — everything else exists to explain and support it.
How does an ADR work?
Every ADR has five parts. Each part answers a specific question that, if left unanswered, will cause confusion later.
1. Title
One line that names the decision. Not the topic, not the context — the decision itself. Use a verb that makes the choice clear.
Good titles:
- “Use PostgreSQL instead of SQLite for the production database”
- “Serve the frontend as static HTML, not a single-page app”
- “Store translations in a database table, not in JSON files”
Bad titles:
- “Database decision” (which decision?)
- “Frontend architecture” (what about it?)
- “Translations” (what was decided?)
The title test
If someone reads only the title and the status, they should know what was decided. “Use X instead of Y for Z” is the ideal format.
2. Status
Where the decision stands in its lifecycle. An ADR is a living document — it can evolve as circumstances change.
| Status | Meaning |
|---|---|
| Proposed | Under discussion, not yet accepted |
| Accepted | Active and in effect |
| Deprecated | No longer relevant (technology retired) |
| Superseded | Replaced by a newer ADR (link to it) |
Think of it like...
Legal precedent. A court ruling is “active” until a higher court overrules it (superseded) or the law it’s based on is repealed (deprecated). The old ruling isn’t deleted — it stays in the record with a note pointing to what replaced it.
3. Context
What situation prompted this decision? Describe the problem, the constraints, and the forces at play. This is the “why now” section.
Example context
“The application needs a database. We’re a small team with limited DevOps experience. The data model is relational (users, posts, comments). We expect 10K users in year one, potentially 100K in year three. The budget for infrastructure is under $50/month initially.”
Good context includes:
- The technical situation (what exists now)
- The constraints (budget, team size, timeline, compliance)
- The trigger (why the decision is needed now)
4. Decision
What was chosen, and what were the alternatives? List the options considered and explain why the chosen option won.
Example decision
“We considered three options:
1. SQLite — zero setup, file-based, but limited concurrent writes and no built-in replication 2. PostgreSQL — robust, excellent tooling, requires a separate server, steeper initial setup 3. MySQL — widely supported, but PostgreSQL has better JSON support and is the standard in our tech stack
We chose PostgreSQL because: (a) the data model is relational and benefits from strong typing, (b) the managed hosting options (Supabase, Neon) reduce DevOps burden, (c) the ecosystem (Prisma, pgvector) aligns with our stack.”
Always list alternatives
An ADR that says “we chose X” without mentioning what else was considered is incomplete. The alternatives are what make the reasoning auditable. If you can’t name at least two alternatives, it may not be a decision worth recording.
5. Consequences
What follows from this choice? Be honest about both the benefits and the costs. Every decision has trade-offs.
Example consequences
Benefits:
- Strong typing catches data errors early
- Managed hosting (Neon) keeps DevOps minimal
- Prisma ORM provides type-safe queries
Costs:
- More setup complexity than SQLite
- Monthly hosting cost (~0 for SQLite)
- Team needs to learn PostgreSQL-specific features
Risks:
- If the project doesn’t grow beyond a prototype, PostgreSQL was overkill — SQLite would have been simpler
Think of it like...
A medical consent form. Before surgery, the doctor explains the expected benefits, the known risks, and the alternatives. The patient (future reader) can then understand why this path was chosen and what to watch for.
Why do we use ADRs?
Four problems ADRs solve
1. Institutional memory. People leave, sessions expire, context is lost. ADRs preserve the reasoning behind decisions so it outlives any single person or conversation.
2. Re-debating settled questions. Without ADRs, the same “should we use X or Y?” discussion happens every few months. With them, someone can read the ADR and either accept the reasoning or write a new ADR that supersedes it.
3. AI agent drift. An AI agent in a new session doesn’t know about past decisions. Without ADRs, it may propose contradictory approaches. With ADRs loaded into context, it respects past choices.
4. Onboarding speed. A new team member can read the ADR log and understand the project’s key decisions in an hour instead of discovering them over weeks of code archaeology.
When do we use ADRs?
- When making a decision that would be expensive to reverse (database, hosting, framework)
- When there are multiple viable alternatives and the reasoning isn’t obvious
- When someone (including future you) might question the choice later
- When working with AI agents that need to respect past decisions across sessions
- When a decision involves trade-offs that should be documented for future evaluation
Rule of thumb
If you spent more than 15 minutes deciding between options, write an ADR. The 10 minutes it takes to document the decision will save hours of re-discovery later.
How can I think about ADRs?
The lab notebook
An ADR is like a page in a scientist’s lab notebook.
- The scientist runs an experiment (considers alternatives)
- They record the hypothesis, the method, the result, and the interpretation — not just the conclusion
- When a colleague asks “why did you use reagent X instead of Y?”, the notebook has the answer
- When the scientist revisits the experiment months later, the notebook explains the reasoning they’ve forgotten
- If a new experiment contradicts the old one, the old notebook page isn’t torn out — a new page references it and explains what changed
The notebook is the institutional memory of the lab. The ADR log is the institutional memory of the project.
The family recipe with notes
An ADR is like a recipe passed down through generations, with handwritten notes in the margins.
- “Use butter, not margarine” (the decision)
- “Tried margarine in 2018, the texture was wrong” (the context)
- “Could also use coconut oil for dairy-free” (the alternatives)
- “Butter costs more but the flavour is worth it” (consequences)
- A later note: “Grandma switched to olive oil in 2023 — see her updated recipe” (superseded)
Without the margin notes, each generation re-discovers through trial and error. With them, the knowledge compounds.
Concepts to explore next
| Concept | What it covers | Status |
|---|---|---|
| adr-statuses | The lifecycle of a decision: proposed, accepted, deprecated, superseded | stub |
| decision-log | How to maintain and organise a collection of ADRs over time | stub |
| technical-debt | What happens when decisions accumulate costs that aren’t addressed | stub |
Some of these cards don't exist yet
They’ll be created as the knowledge system grows. A broken link is a placeholder for future learning, not an error.
Check your understanding
Test yourself (click to expand)
- Explain what an ADR is to a non-technical person. Use the judge’s ruling or lab notebook analogy.
- Name the five parts of an ADR and describe what question each one answers.
- Distinguish between a “deprecated” and a “superseded” ADR. Give a scenario for each.
- Interpret this scenario: a new developer proposes switching the database from PostgreSQL to MongoDB. The team has an existing ADR explaining the PostgreSQL choice. What should the developer do?
- Connect this concept: why are ADRs more important in AI-assisted development than in traditional development?
Where this concept fits
Position in the knowledge graph
graph TD SD[Software Development] --> PR[Product Requirements] PR --> PRD[PRD] PR --> TS[Technical Specification] PR --> ADR[Architecture Decision Records] ADR --> AS[ADR Statuses] ADR --> DL[Decision Log] SA[Software Architecture] -.->|decisions recorded as| ADR style ADR fill:#4a9ede,color:#fffRelated concepts:
- prd — the PRD defines what to build; ADRs record why specific implementation choices were made along the way
- technical-specification — specs define how the system behaves; ADRs explain why it was designed that way
- spec-driven-development — ADRs are an essential anti-drift tool in spec-driven workflows, preventing AI agents from contradicting past decisions
Further reading
Resources
- How to Write ADRs That Actually Get Used (Jono Herrington) — Focus on adoption and practical tips to make ADRs stick in a team
- ADRs: Stop Re-Debating Decisions You Already Made (EM Tools) — Engineering manager perspective on ADRs as institutional memory
- Architecture Decision Records: A Guide to Better Decisions (VoiceDash) — Comprehensive walkthrough of the ADR process with examples
- ADR GitHub — Templates and Practice — The canonical ADR resource with Michael Nygard’s original template and community extensions
- The Only ADR Template You’ll Ever Need (Stackademic) — Minimal effective template for teams that want to start quickly