Skip to content

Architecture decision records

One short file per architecture decision, so the why behind the template survives the people who made it and a change to a decision is a diff, not a conversation. CLAUDE.md and docs/ cite decisions as "PLAN.md decision N"; the table they cite lives here, and only here, as ADR-0001PLAN.md keeps no copy. A project created with bun run init inherits this folder as-is (it describes the template the project started from).

Adding one

  1. Copy 0000-template.md to NNNN-short-kebab-title.md, where NNNN is the next number after the highest one in this folder.
  2. Fill in the sections; keep it to one screen. Link the issue and the grill session if there was one (Conventions → Changing a locked decision).
  3. If it changes a row of the locked-decisions table, mark that row in ADR-0001 superseded with a link to the new record, in the same PR. PLAN.md has no row to update.
  4. Add the file's H1 to the index below, verbatim. The docs site's Decisions sidebar needs no edit: docs/.vitepress/config.mts reads this folder and uses each file's H1, so a new NNNN-*.md (anything but 0000-template.md) is picked up automatically.

Status values

  • Proposed — written up, not yet agreed.
  • Accepted — agreed and in effect.
  • Superseded — replaced by a later ADR (link it); kept for history.

Index

ADRTitleStatus
0001ADR-0001: Locked architecture decisionsAccepted
0002ADR-0002: release-please owns versioning and the release tagAccepted
0003ADR-0003: Update policies — silent, opt-in, forced, criticalAccepted
0004ADR-0004: oxlint as a fast front pass in front of ESLintAccepted
0005ADR-0005: Accessibility E2E as a hierarchy audit, not a screen-reader flowAccepted
0006ADR-0006: Maestro Cloud as an opt-in EAS workflow, not a laneAccepted
0007ADR-0007: Flashlight as an opt-in hook of the Android E2E job, not a laneAccepted
0008ADR-0008: Multi-runtime OTA backports as a manual, approval-gated workflowAccepted
0009ADR-0009: A VitePress docs site on GitHub PagesAccepted