ADR Template¶
Architectural Decision Records (ADRs) are short documents that capture important technical decisions along with their context and consequences. They are the institutional memory of why things are the way they are—essential for onboarding, for avoiding repeated debates, and for understanding the trade-offs your system embodies.
What problem this solves¶
Technical decisions get made and forgotten. Six months later, someone asks "why do we use X instead of Y?" and no one remembers. The decision gets revisited, debated again, and sometimes reversed without understanding the original reasoning.
ADRs solve this by creating a lightweight, searchable record of significant decisions. They're not documentation of how the system works—they're documentation of why it works that way.
When to use this¶
Write an ADR when:
- The decision is significant and hard to reverse.
- Multiple options were considered.
- The decision has consequences the team should understand.
- Future engineers might reasonably question the choice.
Don't write an ADR for:
- Trivial decisions (variable naming, minor refactors).
- Decisions that are obviously correct and have no meaningful alternatives.
- Temporary spikes or experiments.
A good rule: if you'd want to explain this decision during onboarding, it probably deserves an ADR.
Roles and ownership¶
| Role | Responsibility |
|---|---|
| Decision maker | Writes the ADR. This is usually the person proposing the change—a tech lead, staff engineer, or senior engineer. |
| Reviewers | Provide feedback on the proposal. Challenge assumptions. Confirm the decision is sound. |
| Approver | Makes the final call (may be the same as the decision maker for team-level decisions, or a more senior person for cross-cutting decisions). |
How to use ADRs¶
Step 1: Propose the decision¶
Create a new ADR with status "Proposed." Fill in the context, the decision, the options considered, and the consequences.
Share it with relevant stakeholders asynchronously. Give people time to read and comment (24–48 hours minimum for significant decisions).
Step 2: Discuss and refine¶
Address feedback. Update the ADR based on discussion. If there's significant disagreement, schedule a synchronous discussion—but keep it focused on resolving specific concerns, not rehashing the entire proposal.
Step 3: Accept or reject¶
Once consensus is reached (or the approver makes a call), update the status to "Accepted" or "Rejected." Record the date.
Step 4: Implement¶
Proceed with implementation. Reference the ADR in relevant PRs, design docs, or discussions.
Step 5: Supersede when needed¶
If a future decision changes the approach, create a new ADR and mark the old one as "Superseded by ADR-XXX." Don't delete old ADRs—they're part of the history.
Signals that ADRs are working¶
- New team members can understand why the system is built the way it is.
- Decisions don't get re-debated without new information.
- ADRs are referenced in discussions and PRs.
- The ADR collection is a useful resource, not a graveyard.
Failure modes and mitigations¶
| Failure mode | What it looks like | Mitigation |
|---|---|---|
| ADRs never written | Decisions made in meetings, nothing documented | Make ADRs a required artifact for significant changes |
| ADRs too detailed | 10-page documents that no one reads | Keep ADRs short; 1–2 pages max |
| ADRs not discoverable | They exist but no one can find them | Maintain an index; use consistent naming and storage |
| Status never updated | "Proposed" ADRs languish without resolution | Set time limits; review proposed ADRs in team meetings |
| Decisions made, then ADRs written | ADR is a formality after the fact | Write ADRs before implementation; use them for discussion |
The template¶
ADR document¶
# ADR-[NUMBER]: [Title]
**Status:** [Proposed | Accepted | Rejected | Deprecated | Superseded by ADR-XXX]
**Date:** [YYYY-MM-DD]
**Decision maker:** [Name]
**Approver:** [Name, if different]
---
## Context
[What is the situation? What problem are we trying to solve? What constraints exist?]
[Include relevant technical context, business requirements, and any forcing functions.]
---
## Decision
[State the decision clearly and concisely.]
We will [decision].
---
## Options considered
### Option 1: [Name]
[Brief description]
**Pros:**
- [Pro]
- [Pro]
**Cons:**
- [Con]
- [Con]
### Option 2: [Name]
[Brief description]
**Pros:**
- [Pro]
- [Pro]
**Cons:**
- [Con]
- [Con]
### Option 3: [Name] (if applicable)
[...]
---
## Consequences
### Positive
- [Consequence]
- [Consequence]
### Negative
- [Consequence]
- [Consequence]
### Risks
- [Risk and mitigation]
---
## Related decisions
- [Link to related ADRs]
- [Link to relevant design docs]
---
## Notes
[Any additional context, discussion summary, or implementation notes.]
ADR index template¶
Keep an index file for discoverability:
# Architecture Decision Records
| ADR | Title | Status | Date |
| --------------------------------------- | ------------------------------------------------- | -------- | ---------- |
| [ADR-001](adr-001-use-postgres.md) | Use PostgreSQL as primary database | Accepted | 2025-01-15 |
| [ADR-002](adr-002-event-driven-arch.md) | Adopt event-driven architecture for notifications | Accepted | 2025-02-20 |
| [ADR-003](adr-003-monorepo.md) | Move to monorepo structure | Proposed | 2025-03-01 |
Tips for good ADRs¶
- Start with context, not solution. Help readers understand the problem before the answer.
- Be honest about trade-offs. Every decision has downsides. Acknowledge them.
- Keep it short. A good ADR fits on 1–2 pages. If you need more, you might be mixing documentation types.
- Use plain language. ADRs are for humans, not machines.
- Date everything. Context changes. Knowing when a decision was made matters.
Related pages¶
- Principles: Decision Making & ADRs — How ADRs fit into the broader decision-making framework.
- Delivery: Technical Debt — When past decisions create debt.
- Team Ops: Async Communication — ADRs as asynchronous decision-making tools.