Architectural Decision Record

Master this essential documentation concept

Quick Definition

A structured document that captures the context, options considered, and rationale behind a significant technical or architectural decision made during software development.

How Architectural Decision Record Works

stateDiagram-v2 [*] --> Proposed : Engineer identifies significant decision Proposed --> UnderReview : Team notified, stakeholders assigned UnderReview --> Accepted : Consensus reached, rationale documented UnderReview --> Rejected : Alternative chosen, reasons recorded UnderReview --> Proposed : New context or options emerge Accepted --> Deprecated : Technology changes or better solution found Rejected --> Proposed : Conditions change, revisited later Deprecated --> [*] : Superseded by new ADR Accepted --> [*] : Decision remains active and valid

Understanding Architectural Decision Record

A structured document that captures the context, options considered, and rationale behind a significant technical or architectural decision made during software development.

Key Features

  • Centralized information management
  • Improved documentation workflows
  • Better team collaboration
  • Enhanced user experience

Benefits for Documentation Teams

  • Reduces repetitive documentation tasks
  • Improves content consistency
  • Enables better content reuse
  • Streamlines review processes

Capturing Architectural Decision Records from Design Discussions and Meetings

Many teams make their most significant architectural decisions during live design sessions, architecture review meetings, or recorded whiteboard discussions. The reasoning behind choosing one database over another, or why a particular API pattern was adopted, often lives entirely within those recordings — never formalized into an actual architectural decision record.

The problem is that a video of a two-hour architecture review is not a usable architectural decision record. When a new engineer joins your team six months later and asks why the system uses event sourcing, pointing them to a recording timestamp is not a sustainable answer. Critical context — the options that were rejected, the constraints that shaped the choice, the dissenting opinions — remains buried and unsearchable.

Converting those recorded discussions into structured documentation gives your team a foundation to build proper architectural decision records from real conversations. For example, if your team recorded a session debating microservices versus a monolith, that transcript can be organized into the standard ADR format: context, decision, consequences. The rationale is no longer locked inside a video file — it becomes a referenceable document your team can link to, update, and search.

If your architectural decisions are currently scattered across meeting recordings and informal calls, see how video-to-documentation workflows can help you build a more complete and accessible record. →

Real-World Documentation Use Cases

Documenting a Database Migration from PostgreSQL to CockroachDB

Problem

A platform team decided to migrate from PostgreSQL to CockroachDB for horizontal scalability, but six months later, new engineers joining the team repeatedly questioned the decision, leading to lengthy Slack threads and recurring architecture meetings rehashing the same trade-offs.

Solution

An ADR captures the original context (traffic growth projections, multi-region requirements), the alternatives evaluated (Amazon Aurora, Vitess, CockroachDB), the decision criteria, and the explicit rationale, giving new engineers a single authoritative source to consult.

Implementation

['Create ADR-0023-cockroachdb-adoption.md in the /docs/adr directory using the Nygard template, filling in Status: Accepted, date, and decision drivers such as 99.99% uptime SLA and multi-region writes.', 'Document all three alternatives with a comparison table covering consistency model, operational overhead, licensing cost, and team familiarity scores.', "Record the final decision paragraph explaining why CockroachDB's distributed SQL model outweighed its higher operational complexity given the team's specific traffic patterns.", 'Link the ADR from the database README, the onboarding guide, and the Confluence architecture page so discovery is automatic during onboarding.']

Expected Outcome

New engineer onboarding time for understanding the data layer dropped from 3 recurring meetings to a single self-serve document review, and the architecture team reclaimed approximately 4 hours per month previously spent re-explaining the decision.

Capturing the Adoption of GraphQL over REST for a Mobile API Gateway

Problem

A mobile team switched from REST to GraphQL to reduce over-fetching on slow 3G networks, but the backend team building new microservices kept defaulting to REST endpoints, causing integration conflicts and duplicated data-fetching logic across services.

Solution

An ADR formally establishes GraphQL as the standard API contract for the mobile gateway, documents the over-fetching problem with concrete payload size metrics, and records that REST remains acceptable for internal service-to-service communication, eliminating ambiguity.

Implementation

['Write ADR-0041-graphql-mobile-gateway.md with a Context section that includes measured payload size data: REST responses averaging 14KB versus GraphQL responses averaging 3.2KB for the product listing screen.', "List the rejected alternatives including REST with sparse fieldsets and gRPC with a clear explanation of why each failed to meet the mobile client's dynamic query requirements.", 'Add a Consequences section explicitly stating that all new mobile-facing endpoints must use the GraphQL schema-first workflow and link to the schema governance guide.', 'Present the ADR in the next architecture guild meeting, record any dissenting opinions in the ADR itself, and update the API standards documentation to reference it.']

Expected Outcome

Backend engineers stopped creating redundant REST endpoints for mobile consumers, the GraphQL schema grew consistently, and a six-month audit showed zero new REST endpoints added to the mobile gateway layer after the ADR was published.

Recording the Decision to Use Event Sourcing for an Order Management System

Problem

An e-commerce team implemented Event Sourcing for their order management system, but two years later, a compliance audit required proving the exact state of an order at any historical point in time. The auditors and the current engineering team had no documentation explaining why the system was built this way, creating uncertainty about whether the audit trail was intentional or accidental.

Solution

An ADR written at decision time would have documented that the compliance requirement for a full immutable audit trail was the primary driver, making it immediately clear to auditors that the event log is a first-class architectural feature, not a side effect.

Implementation

['Draft ADR-0007-event-sourcing-orders.md immediately when the decision is made, listing the compliance requirement (PCI-DSS audit trail mandate) and the business requirement (order replay for customer service) as explicit decision drivers.', 'Include a section on rejected alternatives such as a traditional CRUD model with a change-log table, explaining that it was rejected because reconstructing historical state required complex JOIN queries across multiple audit tables.', 'Document the known trade-offs including increased query complexity for current state and the need for CQRS read models, so future engineers understand these are accepted costs, not bugs.', "Tag the ADR with metadata labels like 'compliance', 'orders-domain', and 'data-architecture' so it surfaces in compliance audits and domain-specific searches."]

Expected Outcome

During the compliance audit, the team provided the ADR as evidence of intentional design, reducing auditor questioning time from two days to a two-hour review session, and the document became the foundation for the compliance section of the system's technical runbook.

Superseding a Monorepo Decision After Scaling Pain with Nx

Problem

A team adopted a monorepo with Nx two years ago and documented nothing. After the codebase grew to 80 packages, CI build times exceeded 45 minutes. A new tech lead proposed splitting into polyrepos, but the team had no record of why the monorepo was chosen, making it impossible to evaluate whether the original trade-offs still applied.

Solution

Creating a new ADR that supersedes the undocumented original decision allows the team to explicitly compare the current state against the original context, document that the original scalability assumptions were exceeded, and record the new decision with its updated rationale.

Implementation

["Write ADR-0089-polyrepo-migration.md with a Status of 'Accepted, supersedes ADR-0012' and reconstruct the original monorepo context from git history and old Slack messages to establish what assumptions have since changed.", 'Document the measured pain points: 47-minute average CI pipeline, 12GB repository clone size, and developer survey showing 68% reporting slow feedback loops as their top productivity blocker.', 'List the evaluated alternatives including remote caching with Nx Cloud, module federation without splitting, and full polyrepo migration, with a scoring matrix against criteria like build time, developer experience, and deployment independence.', 'Record the migration plan reference, the team members who participated in the decision, and a review date 12 months out to assess whether the polyrepo approach achieved the expected outcomes.']

Expected Outcome

The migration reduced average CI time from 47 minutes to 8 minutes for affected services, and the ADR chain from ADR-0012 through ADR-0089 gave the team a complete architectural history that was used in a conference talk on monorepo scaling challenges.

Best Practices

Write the ADR at Decision Time, Not After Implementation

An ADR written after the fact loses the most valuable content: the live context, the options that were genuinely on the table, and the exact reasoning that tipped the decision. Retrospective ADRs often rationalize rather than record, omitting the rejected alternatives and the uncertainty that existed at the time. Treat the ADR as a prerequisite for merging an architectural change, not as documentation debt to pay later.

✓ Do: Create a draft ADR as the first artifact when a significant architectural question is identified, use it as the discussion document during the decision meeting, and finalize it before the implementing pull request is merged.
✗ Don't: Do not write ADRs weeks or months after implementation when the context has faded, the rejected options are forgotten, and the document becomes a post-hoc justification rather than an honest record of the decision process.

Record Rejected Alternatives with Specific Reasons for Rejection

The most common ADR failure is listing alternatives without explaining why they were rejected. Without rejection rationale, future engineers cannot determine whether an alternative was rejected due to a constraint that no longer exists, making them relitigate the same decision unnecessarily. Each rejected alternative should have at least one concrete, specific reason tied to the decision context at the time.

✓ Do: For each alternative, write a sentence like 'Kafka was rejected because our operations team lacked the expertise to manage it and the 3-month training timeline exceeded our launch deadline' rather than simply 'Kafka: too complex'.
✗ Don't: Do not list alternatives as a checkbox exercise with vague rejections like 'not suitable for our needs' or 'evaluated but not chosen', which provide no useful signal to future decision-makers.

Use a Consistent File Naming and Numbering Convention Across the Repository

ADRs derive much of their value from being discoverable and cross-referenceable. A consistent naming scheme like ADR-NNNN-short-decision-title.md enables easy linking between ADRs, clear supersession chains, and reliable automation for indexing and generating ADR registries. Inconsistent naming creates orphaned documents that are never found during onboarding or audits.

✓ Do: Adopt a zero-padded sequential number prefix (e.g., ADR-0042-use-redis-for-session-storage.md), maintain an auto-generated index file in the /docs/adr directory, and enforce the convention via a CI lint check or pull request template.
✗ Don't: Do not allow freeform naming like 'database-decision.md', 'arch-notes-redis.md', or date-prefixed files without a number, which break cross-referencing and make it impossible to determine the sequence in which decisions were made.

Explicitly State the Decision Status and Update It When Circumstances Change

An ADR without a clear status field creates confusion about whether a decision is still active, under debate, or long obsolete. Engineers encountering an ADR marked 'Proposed' from three years ago cannot know if it was quietly implemented, abandoned, or is still pending. A well-maintained status field (Proposed, Under Review, Accepted, Deprecated, Superseded) makes the ADR registry a reliable source of truth rather than an archaeological artifact.

✓ Do: Include a Status field at the top of every ADR, update it whenever the decision changes, and when deprecating or superseding an ADR, add a direct link to the new ADR that replaces it (e.g., 'Superseded by ADR-0067').
✗ Don't: Do not leave ADRs in 'Proposed' or 'Under Review' status indefinitely after a decision has been made, and do not delete old ADRs when they become obsolete, as the historical record of why a decision was made and later reversed is itself valuable.

Scope ADRs to Decisions That Are Costly to Reverse, Not Every Technical Choice

Applying ADR discipline to every minor technical choice creates documentation fatigue and dilutes the signal of the ADR registry. ADRs are most valuable for decisions with significant reversal cost: choices of persistence technology, inter-service communication patterns, authentication mechanisms, deployment strategies, or programming language adoption. Trivial choices like which logging library to use within a service rarely warrant a full ADR.

✓ Do: Use a decision filter question such as 'Would reversing this decision require more than two weeks of engineering effort or affect more than one team?' to determine ADR worthiness, and for smaller decisions, use inline code comments or a lightweight design note instead.
✗ Don't: Do not create ADRs for decisions that are easily reversible with a single pull request, such as choosing between two similar utility libraries, adjusting a timeout value, or selecting a code formatter, as this devalues the ADR registry and trains engineers to ignore it.

How Docsie Helps with Architectural Decision Record

Build Better Documentation with Docsie

Join thousands of teams creating outstanding documentation

Start Free Trial