Architecture Decision Records: Capturing Why, Not Just What

Architecture is not only about structures, diagrams, and technologies. It is also about decisions.

Many teams remember what was built, but forget why it was built that way. When context is lost, teams waste time re-debating settled questions, reverse good decisions by accident, or inherit trade-offs they no longer understand.

Architecture Decision Records (ADRs) solve this by preserving the reasoning behind important decisions - not as heavyweight governance, but as lightweight notes that future team members can actually find and read.

What Is an Architecture Decision Record?

An ADR is a small document that captures an important architectural decision, its context, the chosen option, and its consequences. It answers the question: Why did we decide this, and what did we expect to happen?

The widely used format by Michael Nygard keeps ADRs intentionally simple:

This simplicity is one of the strengths of ADRs. A decision record that takes thirty minutes to write is far more likely to get written than one that requires a committee and a template with forty fields.

Why ADRs Matter

What Makes a Decision Architectural?

Not every decision deserves an ADR. Architectural decisions are those that are hard to reverse, affect many parts of the system, or constrain future options significantly.

Good Candidates for ADRs

Usually Not Worth an ADR

A useful heuristic: if the decision would be worth explaining to a new team member joining six months from now, it is probably worth an ADR.

The Nygard ADR Format

Title

A short name for the decision. Prefer an active title that states the decision directly.

Status

The current state of the decision. Common statuses:

Context

The forces at play. This section should explain the problem, constraints, assumptions, business drivers, technical drivers, and relevant background. Describe the situation that made a decision necessary - not the solution itself.

Good context sections make the decision understandable even to someone who was not in the room. They include enough background that a reader can evaluate whether the original forces still apply.

Decision

The decision that was made. Keep this section direct and unambiguous. Use language like "We will..." or "The system will..."

This is not the place for hedging or explaining alternatives. State the decision clearly.

Consequences

The expected results of the decision - both positive and negative. This is where the trade-offs become visible.

Good consequence sections are honest about what the team is gaining and what it is giving up. They help future readers understand not just what was decided, but what the team knowingly accepted as a cost.

ADR Lifecycle

ADRs are living documents, but they should not be edited to rewrite history. If a decision changes, create a new ADR that supersedes the old one. The original record remains as evidence of how the architecture evolved.

Status Meaning Action
Proposed Under discussion Review and discuss with stakeholders
Accepted Active and in effect Follow this decision; reference it in code and design
Rejected Considered but not adopted Keep for reference; explains why this path was not taken
Deprecated Still applies but being phased out Plan migration away from this decision
Superseded Replaced by a newer ADR Follow the new ADR; keep this one for historical context

The key principle: never delete or silently edit an accepted ADR. If the decision needs to change, write a new ADR that explains the new context and supersedes the old one. This preserves the full decision history.

Good ADRs vs Bad ADRs

Good ADRs Bad ADRs
Explain the problem and constraints Justify a decision after the fact
Name relevant alternatives Hide trade-offs
Make trade-offs explicit Sound like marketing
Are short enough to read Contain too much implementation detail
Are written close to the time of the decision Are never updated or superseded
Are understandable without tribal knowledge Are used as bureaucracy

Worked Example

Here is a complete ADR using the Nygard format. This example uses a decision that many teams face early in a project.

ADR-0001: Use a Modular Monolith Instead of Microservices

Status: Accepted

Context:

The team is building a new business application with a complex domain. The product direction is still evolving. The team is small (six developers). Independent deployment of individual capabilities is not yet required. The organization does not yet have mature platform engineering, observability, and operational support for many independently deployed services.

Decision:

We will build the system as a modular monolith with clear internal module boundaries, explicit dependencies, and a shared deployment unit.

Consequences:

Positive:

Negative:

Copy-Paste ADR Template

Use this template as a starting point. Remove or add sections based on your team's needs.

# ADR-0001: [Short decision title]

## Status

[Proposed | Accepted | Rejected | Deprecated | Superseded]

## Context

Describe the situation that led to this decision.

Include relevant:
- business drivers
- technical constraints
- quality attributes
- assumptions
- risks
- forces or trade-offs

Do not describe the solution here. Describe why a decision is needed.

## Decision

We will [describe the decision clearly].

This means:
- [important implication]
- [important implication]
- [important implication]

## Consequences

### Positive

- [positive consequence]
- [positive consequence]
- [positive consequence]

### Negative

- [negative consequence]
- [negative consequence]
- [negative consequence]

Common Mistakes

Where to Store ADRs

The most effective location for ADRs is close to the code - for example, in a /docs/adr folder within the repository. This makes ADRs discoverable during development, version-controlled alongside the code they describe, and reviewable in pull requests.

Teams that use arc42 for architecture documentation have a natural home for ADRs: section 9 (Architecture Decisions). Storing ADRs there connects them to the broader documentation structure while keeping them accessible to the team.

Other options include wikis, architecture portals, or documentation platforms. What matters is discoverability and versioning. If developers cannot find the ADRs during their normal workflow, the records will not be read.

ADRs work especially well when they are part of normal development workflows:

Practical Advice

Preserving Architectural Reasoning

ADRs are not about documenting everything. They are about preserving the reasoning that future architects, developers, and maintainers will otherwise have to rediscover through archaeology, guesswork, or repeated mistakes.

Every system accumulates decisions over time. The question is whether those decisions are visible and understandable - or buried in chat logs, forgotten meetings, and the memories of people who have moved on.

Start with the next decision that matters. Write it down. Keep it short. Make the trade-offs visible. That is all an ADR needs to be.

Related Topics