Architecture Decision Records
This directory holds ADRs for Patina — short records of significant architecture decisions, written at the time they're made, following Michael Nygard's format as popularized by Martin Fowler: https://martinfowler.com/bliki/ArchitectureDecisionRecord.html.
When to write one
Write an ADR when a decision is:
- Hard, or expensive, to reverse once other code depends on it.
- Not obvious from reading the code — a "why", not a "what".
- The kind of thing that'll get re-litigated later without a record ("didn't we already decide this?").
Small, reversible choices don't need one. Rule of thumb: if you'd want to explain the choice to a new contributor in a paragraph beyond what the code itself shows, it's ADR-sized.
An ADR is a point-in-time record of a decision as it was made, including the options considered and rejected. It does not get rewritten later — a decision that reverses or replaces an earlier one gets its own new ADR that supersedes the old one, which stays in place with its status updated.
Convention
- One file per decision:
NNNN-short-kebab-title.md, numbered sequentially, zero-padded to 4 digits. Numbers are never reused, even for a decision that gets reversed. - Start from
0000-template.md— copy it, don't write from scratch. Statusis one of:Proposed,Accepted,Rejected,Deprecated, orSuperseded by ADR-NNNN(linked to the superseding record).- Every new ADR gets a row in the index below.
- Keep records short — a paragraph or two per section is normal. An ADR documents a decision and its reasoning, not a design document.
For the design language itself, see ../design.md.
If you are working with Claude Code in this repo, .claude/skills/adr/SKILL.md handles the
mechanics of adding one. Patina apps should keep ADRs the same way
(ADR-0002): copy this README (minus the index),
0000-template.md and the skill.
Index
| # | Title | Status |
|---|---|---|
| 0001 | Share the suite's frame and components as one published crate, Patina | Accepted |
| 0002 | Recommend ADRs for every Patina app, and keep them for Patina itself | Accepted |
| 0003 | The frame's API: a TitleBar builder with left and right slots, styled by FrameStyle | Proposed |
| 0004 | Move the suite skin format into Patina, with a shared skins folder and Dark Orange built in | Proposed |
| 0005 | Build Calendar, Notebook and Steam Classic into Patina, and colour controls on a coloured bar | Accepted |
| 0006 | Title bar: word menus on the left, the app's output actions on the right | Accepted |
| 0007 | Unity in variety: the structure is shared, the skin varies, and GNOME is only a source of defaults | Accepted |
Decision Relationship
flowchart TD
A[0001: One crate for the suite] --> B[0002: ADRs in every Patina app]
A --> C[0003: Frame API]
A --> D[0004: Skins in Patina]
C --> D
D --> E[0005: App skins built in, bar controls]
C --> F[0006: Menus left, output actions right]
C --> E
D --> G[0007: Unity in variety]
C --> G
Revisit Triggers
- An app needs a frame option the builder lacks, or a desktop where the frame misbehaves. See ADR-0003.
- egui releases break the apps' shared upgrade, or one app needs to stay behind. See ADR-0001.
- A shared skin key needs to differ between apps, or users want per-app overrides of a shared skin. See ADR-0004.
- A component only one app uses keeps growing app-specific options. Move it back into the app.