March 21, 2026
7 min read
ADRs That Keep Systems Sane
How to document technical decisions with context, tradeoffs, and consequences without writing an endless wiki.
Leer en espanolADRs are not general documentation
An ADR is useful when the team needs to remember why it chose a technical direction and what costs it accepted in return. It does not replace a README, onboarding notes, or API documentation. Its job is to capture an architectural decision before it turns into folklore.
Months later, when someone asks “why are we still using async jobs for this workflow?” or “why did we separate billing from identity?”, a good ADR prevents the team from reopening the entire discussion from scratch.
What a useful ADR should contain
The best ADRs are short and specific. They describe context, decision, alternatives considered, and consequences. That is enough for another engineer to understand the original problem and judge whether the decision still holds.
An ADR fails when it tries to document the whole system or declares a solution without explaining the pain it was addressing. Without context, the decision looks arbitrary. Without consequences, it looks free.
Minimal structure for an ADR that actually helps.
# ADR-007: Use application services for publish workflows
## Status
Accepted
## Context
Publish flows currently split rules across route handlers and UI actions.
## Decision
Move publish orchestration into application services behind explicit ports.
## Consequences
Improves testability and consistency, but adds one extra composition layer. When to write one
Not every change deserves an ADR. A small library swap or a local refactor usually does not need one. But once a decision affects structure, important dependencies, module boundaries, persistence, external integration, or operational behavior, writing it down becomes worthwhile.
A simple rule works well here: if another engineer is likely to question the decision in three months, or reversing it later would be expensive, capture it now.
- Write ADRs for durable decisions.
- Link them to the PR or code that implements the choice.
- Supersede them with a new ADR when the decision changes.
ADRs as a speed tool
Used well, ADRs increase velocity. They reduce repeated debates, make tradeoffs visible, and keep code from being the only source of truth for structural decisions. They also improve onboarding because new people can tell what is intentional and what is merely inherited debt.
The goal is not to produce more writing. The goal is to give the system memory so that evolution does not mean rediscovering the same argument every quarter.
More articles
Back to articlesHexagonal Architecture Without Ceremony
How to separate UI, use cases, and infrastructure in a web app without turning every change into another layer.
May 12, 2026
8 min read
Pragmatic DDD for Web Products
Ubiquitous language, bounded contexts, and transaction boundaries without turning domain modeling into bureaucracy.
April 29, 2026
9 min read
Spec-Driven Development for Teams
Specify behavior before implementation to align frontend, backend, and product with less rework.
April 10, 2026
8 min read