ADR Index - lukislp/mowdeck GitHub Wiki
Architecture decisions
Every architecture decision is recorded as an ADR in a MADR-like format with the headings Status, Context, Decision and Consequences. Files are named NNNN-kebab-case-title.md; start from template.md in this directory. Decisions are never rewritten: a changed decision gets a new ADR that supersedes the old one. A test in tools/repo-checks enforces the structure.
| ADR | Title | Status |
|---|---|---|
| 0001 | OpenFGA instead of self-built authorization | Accepted |
| 0002 | Self-built Identity service in FastAPI instead of Keycloak or Zitadel | Accepted |
| 0003 | SvelteKit for the web app | Accepted |
| 0004 | Monorepo with a uv workspace | Accepted |
| 0005 | AGPL-3.0 for services and apps, Apache-2.0 for libraries | Accepted |
| 0006 | PostgreSQL for all persistence, no SQLite | Accepted |
| 0007 | NATS JetStream as event bus | Accepted |
| 0008 | Traefik as gateway | Accepted |
| 0009 | Command and event envelopes, subject naming and de-duplication | Accepted |
| 0010 | Python 3.13 for all services and libraries | Accepted |
| 0011 | Separate GPL-3.0 package for the PyMammotion adapter | Accepted |
| 0012 | Mower control interface and safety rules | Accepted |
| 0013 | Device-Gateway registry, sharding and per-mower concurrency | Accepted |
| 0014 | Authorization model, tuple ownership and the mowdeck-authz client | Accepted |
| 0015 | Tokens, sessions and key rotation | Accepted |
| 0016 | Fleet commands and authorization per command kind | Accepted |
| 0017 | Telemetry storage and retention | Accepted |
| 0018 | Realtime WebSocket protocol | Accepted |
| 0019 | Mammotion adapter transports, manual drive and secrets | Accepted |
| 0020 | Web app architecture | Accepted |
| 0021 | Browser authentication flow | Accepted |
| 0022 | Notifications: rules, recipients and delivery | Accepted |
| 0023 | Map rendering and projection | Accepted |
| 0024 | Scheduler: recurrence, rain pause and command issuing | Accepted |
| 0025 | Home Assistant integration as a pure API client | Accepted |
| 0026 | Manual drive channel over the Realtime WebSocket | Accepted |
| 0027 | Health history and theft alarm | Accepted |
| 0028 | Entitlements: plans as data and enforcement | Accepted |
| 0029 | Helm chart and release pipeline | Accepted |
| 0030 | Mowing patterns as plug-ins and the Planner | Accepted |
| 0031 | Billing with a Stripe adapter | Accepted |
| 0032 | Live camera over Agora, joined directly by the browser | Accepted |
| 0033 | Vision-assisted recovery with human approval | Accepted |
| 0034 | Linked cloud accounts and device discovery | Accepted |
| 0035 | Server-side camera frames and automatic AI analysis on errors | Accepted |
| 0036 | Native app shells with Capacitor, loading the web app from the server | Accepted |
| 0037 | Camera panorama calibration in the browser, with the AI supplying points only | Superseded |
| 0038 | Dual link per mower (cloud plus Bluetooth bridge) and firmware updates | Accepted |
| 0039 | Spot mowing by MowDeck-driven paths | Accepted |
| 0040 | Link heartbeat for online status | Accepted |
| 0041 | Spot runs from the dock: undock, transit and return | Accepted |
| 0042 | Drive calibration | Accepted |
| 0043 | Turn styles | Accepted |
Mirrored from docs/adr/README.md at commit 94c46ef36cabac4c3a0bacfc0cc0c0af4defdca3. Edit the file in the repository, not this wiki page.