Topic: adr vs design decision record

ADR vs Design Decision Record: What's the Difference?

You've seen both acronyms. ADR is the common one; DDR comes up in enterprise and some FAANG-adjacent practices. They overlap, but the boundary is useful — and most of the "we need a new type of decision doc" proposals are just one or the other mislabeled.

TL;DR

ADR = Architecture Decision Record. Captures durable, cross-cutting architecture choices (stack, pattern, data model, deployment topology). Lives for the life of the system. DDR = Design Decision Record. Captures specific, local design calls (API shape, schema detail, interface contract, internal class structure). Lives for the life of that component. Rule of thumb: if a new team adopting the code base would need to understand it on day one, it's ADR; if only a developer touching that specific file would need it, it's DDR.

When to use which

Example decisionUseWhy
Postgres vs MongoDB for primary storeADRAffects every feature; survives a rewrite of individual services.
Monorepo vs multirepoADRStructural, cross-cutting, expensive to reverse.
REST field names: userId vs user_idDDRLocal to the API contract; matters inside that service boundary.
Event schema v2: add idempotency_keyDDRDesign-level change to one interface; doesn't reshape the system.
Move auth from Clerk to Auth0ADRVendor swap with system-wide coupling; new hire will ask.
Cache TTL: 60s vs 300s for pricing APIDDRTunable parameter inside one subsystem.
Adopt OpenTelemetry across servicesADRCross-service, long-lived, hard to reverse.
Use zod for request validation in this serviceDDRLocal lib choice in one service; other services may differ.

Format-wise, they're almost identical

Both use the Nygard 5-section template: Title, Status, Context, Decision, Consequences. The difference is scope and storage location, not format:

This keeps the ADR folder readable (new hires can skim 30 files and understand the system) and the DDR folders relevant (only the team in that service reads theirs).

Common mistakes

How WhyChose helps

WhyChose extracts both kinds from your AI chat history. The extractor tags each record with a scope field based on heuristics — cross-cutting keywords ("database", "framework", "monorepo", "auth provider") land as ADR-scoped; narrower keywords ("API response", "schema field", "cache TTL") land as DDR-scoped. You can filter by scope in the decision log and route ADRs to the repo root while DDRs stay with their services. Same extraction runs locally via the open-source CLI.

Get early access

Related questions

Is DDR widely used or mostly internal to some companies?

Less widely used than ADR. The term shows up in some FAANG-internal practices and a few OSS projects (Kubernetes uses "KEP" for a similar role, Apache uses "design docs"). If your team hasn't adopted ADRs yet, skip DDRs too — start with the one format.

What about RFCs, DACI, and DecisionLog entries?

RFCs propose decisions for review (ADRs record them after). DACI is a decision-making framework (Driver, Approver, Contributor, Informed), not a record format — it can produce either an ADR or a DDR as output. A decision log is a lighter-weight catalog covering both; see decision log template.

Can one document be both an ADR and a DDR?

Rarely. If a decision is both cross-cutting and detailed, you probably need one ADR for the principle plus one or more DDRs for the application points. Mixing them in a single document defeats the scoping benefit.

Further reading