Architecture Decision Records
Architecture Decision Records
Section titled “Architecture Decision Records”Explanation — why we chose X over Y. Numbered, immutable, append-only.
Every load-bearing technical choice gets an ADR. Format: MADR v3 lite.
Why ADRs
Section titled “Why ADRs”- Immutable: once accepted, an ADR is never rewritten. Superseded by a new ADR that links back.
- Searchable: grep for a tech name and find the decision + alternatives.
- AI-friendly: agents read ADRs to stop re-litigating settled decisions.
- Audit trail: new devs see the reasoning, not just the outcome.
Format
Section titled “Format”# ADR <N>: <title>
- Status: Accepted | Superseded by ADR-<M> | Deprecated- Date: YYYY-MM-DD- Deciders: Ideony team
## ContextWhy this needed to be decided. 1-3 sentences.
## DecisionWhat was chosen. 1-2 sentences.
## Consequences+ positive outcomes− negative trade-offs3-5 bullets, concrete.
## Alternatives considered- Name — why rejected- Name — why rejectedWhen to write a new ADR
Section titled “When to write a new ADR”- Picking a new library, framework, or external service
- Changing an architecture pattern (auth, deployment, data layer)
- Establishing a code-level convention with broad impact (e.g. central fonts registry, rebase-over-merge)
- Superseding a previous ADR — write a new one with
Status: Accepted, mark the old oneStatus: Superseded by ADR-<N>.
Do not ADR-ify:
- Bug fixes or routine refactors
- UI copy changes
- Config tweaks that don’t shape the system
Numbering
Section titled “Numbering”Sequential, zero-padded to 4 digits. Never reuse a number.
Current highest: see file list. Next ADR = highest + 1.
ADRs are self-indexing — ls shows all, filenames encode title + chronological order. For a quick scan, run:
grep -h "^# ADR" decisions/*.mdSub-topic index (by area):
Monorepo & tooling
Section titled “Monorepo & tooling”- 0001 — Turborepo + pnpm monorepo
- 0014 — Biome over ESLint + Prettier
- 0015 — Rebase over merge (git flow)
- 0016 — Zod over class-validator
Mobile app
Section titled “Mobile app”- 0002 — Expo SDK 55 over Next.js (mobile)
- 0009 — Gluestack + NativeWind design system
- 0010 — Italian Sole palette + Gambarino + Switzer fonts
- 0021 — Central
lib/fonts.tsfont registry
Backend
Section titled “Backend”- 0003 — NestJS + Fastify over Express
- 0004 — PostgreSQL + PostGIS over MongoDB
- 0017 — Prisma 7 over Drizzle
- 0018 — Soft-delete on User (FK safety)
- 0019 — Atomic
updateManyfor SOS accept
External services
Section titled “External services”- 0005 — Clerk for auth
- 0006 — Stripe Connect Express
- 0007 — Novu for notifications
- 0008 — Mapbox over Google Maps
- 0013 — Cloudflare R2 for storage
AI / agentic
Section titled “AI / agentic”Infra & deploy
Section titled “Infra & deploy”- 0012 — Dokploy + Hetzner hosting
- 0020 — Registry-based CD (ghcr.io → Dokploy pulls)
- 0022 — BullMQ for all async
Product / UX
Section titled “Product / UX”Testing
Section titled “Testing”Supersession chain
Section titled “Supersession chain”None yet. If you supersede an ADR, add the link here.