adr-decision-platform
ADRs and RFCs versioned on the web — MADR, Nygard and Y-statements, no wiki required
git clone https://github.com/fernando-moretes/ref-adr-decision-platform.gitListen to guide
generated on playGenerated only on first play
Powered by Amazon Polly + OmniVoice
A Next.js 16 web platform to author, list and version Architecture Decision Records and lightweight RFCs — with MADR, Nygard and Y-statement templates, an index browser filtered by status, tag and date, and sync from the docs/adr/ folder of any GitHub repository.
What it is
ADR Decision Platform is where an architecture decision stops being a chat message and becomes a record with an owner, a date, a status and consequences. It is a web application — Next.js 16, React 19, TypeScript 5 and Tailwind CSS 4 — deployed on Vercel with DNS on Cloudflare; the production instance runs at adr.moretes.com.
The scope is deliberately narrow. It does four things: offers templates for writing the decision (MADR, Nygard, Y-statement and an RFC model for cross-team proposals); lists decisions in a browsable index; versions each record so the status change from proposed to accepted or superseded stays traceable; and syncs ADRs that already live in docs/adr/ of any repository, so the platform never forces anyone to abandon Markdown in Git.
What it is not: it is not a wiki, not a replacement for the repository, and not an approval system with a complex state workflow. The repository remains the source of truth — the platform exists so the decision can be found by whoever joins the team two years later.
Why it exists
After 16 years operating financial platforms on AWS, the problem I saw repeat most often was not the wrong decision — it was the lost one. The reason a system used SQS instead of Kinesis lived in an archived Slack thread; the rationale for the multi-account layout was in a slide only the architect who left still had. When someone questions the decision three years later, nobody knows whether it still holds or whether the context that motivated it has already changed.
ADRs have solved this for a long time — the Nygard format dates from 2011 — but the format does not solve the access problem. ADRs in docs/adr/ across twenty different repositories are ADRs nobody reads outside the team that owns the repository. Whoever needs the decision does not know where it is, and whoever knows where it is does not know another team already decided the opposite.
The platform exists to close that gap: keep the Markdown in Git, where it already lives, and provide an index that crosses repositories. The cost it attacks is not the cost of writing the ADR — it is the cost of keeping it findable and reviewable over years, after the team has changed.
What ships in the box
docs/adr/ of any repository — Git remains the source.How the pieces fit
The architect writes on the platform or in the repository; the index spans both paths.
- Next.js 16 + React 19 · frontend/
- Templates · MADR · Nygard · Y-statement · RFC
- Navegador de ADRs · status · tag · data
- docs/adr/*.md · fonte da verdade
- GitHub Actions · CI · Frontend · Security
- DNS · adr.moretes.com
How it works
All application code lives in frontend/, a Next.js 16 project with React 19 in TypeScript 5. The presentation layer is Tailwind CSS 4. There is no separate backend in the repository: whatever needs a server runs in the Next.js routes themselves on Vercel.
Templates: each format is a field model the authoring form fills in. MADR asks for considered options and pros and cons per option; Nygard asks only for context, decision and consequences; the Y-statement reduces everything to one sentence shaped as "in the context of X, facing Y, we decided Z to achieve W, accepting V". The RFC template is the same mechanism with fields for proposal and discussion.
Index: the browser lists decisions and filters by status, tag and date. This is what makes the platform useful to someone who did not write the ADR — the status filter answers "what is still proposed?", and the tag filter answers "what have we already decided about messaging?".
GitHub sync: the platform reads docs/adr/ from a repository and pulls the files into the index. It is the path for teams that already write ADRs in Markdown and do not want to migrate anything — Git stays the owner of the text.
Pipeline: three GitHub Actions workflows — CI, Frontend and Security — plus the Vercel deploy. DNS for adr.moretes.com is on Cloudflare. Architecture details in docs/architecture.md; operations in OPERATIONS.md and SETUP.md.
Install and run locally
- 1
Clone the repository
git clone https://github.com/fernando-moretes/ref-adr-decision-platform.gitand enter the folder. The application code is infrontend/, not at the root. - 2
Install the frontend dependencies
cd frontend && npm install. The project is Next.js 16 — use a Node.js release compatible with that version before blaming a build error. - 3
Start the dev server
npm run devand open the local URL Next.js prints. With no environment variables you can already author and browse ADRs; GitHub sync depends on the configuration described inSETUP.md. - 4
Write the first decision
Pick a template — start with Nygard if in doubt — fill in context, decision and consequences, and save with status
proposed. Move toacceptedonly after review. - 5
Bring in the ADRs you already have
Point the integration at a repository with
docs/adr/and sync. Do not copy the files by hand: the platform would hold one version and Git another, and nobody would know which one counts. - 6
To run in production
Read
OPERATIONS.mdandSETUP.mdbefore pointing DNS or configuring Vercel. The pipeline (CI, Frontend, Security) runs on GitHub Actions and the deploy goes out through Vercel's Git integration.
git clone https://github.com/fernando-moretes/ref-adr-decision-platform.git
cd ref-adr-decision-platform/frontend
npm install
npm run dev
# abra a URL local impressa pelo Next.js / open the local URL printed by Next.jsWhich template to use
Having four formats does not mean all four fit everything. The choice is conditional, and erring toward the heavy format is as bad as erring toward the light one: a two-page ADR for a one-sentence decision gets neither written nor read.
Use MADR when: the decision has three or more real options, the cost of being wrong is high — changing database, multi-account strategy, identity provider — and someone will need the per-option pros and cons to challenge the decision later.
Use Nygard when: there are two options and one is clearly better in your context; what matters is recording context and consequence, not the comparison matrix.
Use Y-statements when: the decision is local, reversible within a sprint, and the team makes several a week. One sentence with context, decision, goal and accepted trade-off beats nothing — and nothing is what happens when the format is too heavy.
Use RFC when: the decision is not yet yours to make. The proposal crosses teams and needs comment before becoming an ADR. When the RFC closes, the resulting ADR should point back to it.
The rule I use: if you cannot write the Y-statement, you are not ready to write the MADR. The long format does not replace clarity — it only exposes its absence over more lines.
Where this fails silently
An ADR with status accepted that nobody revisits becomes a decision the team obeys without knowing why. The index shows the date — use the date filter to find everything accepted more than two years ago and ask whether the context still holds. When it does not, mark it superseded and write the new one; do not edit the old one. A decision's history is worth more than its current text.
Questions I would ask myself
Do I need to migrate my ADRs from Git into the platform?
No. The integration reads docs/adr/ from any repository and pulls the files into the index. Git remains the source of truth; the platform is where the decision gets found.
Why a platform instead of just a `docs/adr/` folder per repository?
The per-repository folder works for one team. It fails when there are twenty repositories and the question is "has anyone already decided this?" — the index crosses repositories, the folder does not.
Does it run without a Vercel or Cloudflare account?
Locally, yes: cd frontend && npm install && npm run dev. Vercel and Cloudflare are the production choice of the public instance, not a dependency of the code.
What is the license?
MIT. Use it, adapt it and publish your own instance; the only obligation is keeping the copyright notice.
References
Verdict
Use this platform when: your team already writes ADRs in Markdown and the problem is finding them across repositories; or when you want to start recording decisions and need a template that fits the team's pace — Y-statements for the day-to-day, MADR for what is expensive to get wrong. Do not use it when: you have one repository and one team — docs/adr/ with a README solves it, and a platform is maintenance cost with no return. The value is not in the tool; it is in the habit of marking superseded instead of deleting. The tool only makes the habit cheaper to keep.
Architecture, AWS, AI and market deep dives — straight to your inbox. Free.
No spam · unsubscribe anytime