This directory holds the binding architecture decisions for this project. Each decision is one file. Each file stays once written — to revise, write a new ADR that supersedes the old one and update the old one's status.
So that anyone (including future-us) can answer "why did we do it this way?" by reading one short document — not by archeology through commits, issues, and chat logs.
Start with 0001-two-container-architecture.md, which is the highest-level decision. The others slot into it.
Each ADR follows the Nygard format: Context → Decision → Consequences.
| Status | Meaning |
|---|---|
Proposed |
Drafted, not yet accepted |
Accepted |
Live and binding |
Deprecated |
No longer recommended but still present |
Superseded by N |
Replaced — see ADR N for the current decision |
| # | Title | Status |
|---|---|---|
| 0001 | Two-container architecture (separate backend and frontend) | Accepted |
| 0002 | Python + FastAPI for the backend | Accepted |
| 0003 | Go + Tailwind + HTMX + PWA for the frontend | Accepted |
| 0004 | Plugin architecture for printer models | Accepted |
| 0005 | Print queue is mandatory (printer has none) | Accepted |
| 0006 | Status sources by phase (ESC i S / passive / SNMP) | Accepted |
| 0007 | Docker image tag scheme | Accepted |
| 0008 | Conventional Commits + semantic-release | Accepted |
| 0009 | Server-Sent Events instead of WebSockets | Accepted |
| 0010 | PWA with progressive enhancement | Accepted |
| 0011 | OpenAPI as the canonical API contract (oapi-codegen + interactive docs) | Accepted |
| 0012 | Label layouts are first-class, integration-scoped, multi-instance | Accepted |
| 0013 | Browse + cart + bulk-print UI pattern | Accepted |
- Copy
_template.mdtoNNNN-short-slug.mdwhere NNNN is the next free number, zero-padded - Fill in the sections honestly — including options not chosen
- Open a PR with the ADR alone (separate from implementation, when feasible)
- After merge, update the index above