Repository navigation
Architecture 01 Introduction And Goals
MowDeck is an independent, multi-user control centre for robotic mowers: everything the owner does with the mower (status, map, jobs with their settings, schedules, cameras, notifications, an optional AI assistant) in one self-hosted web app. It consists of small services that scale individually, runs at home on a mini PC as well as in the cloud, and depends on no cloud provider. It is manufacturer-independent by construction: the services only know the mowdeck-control interface, and a manufacturer is an adapter package behind it (capabilities tell the app what a mower can do). The first adapter is for Mammotion mowers.
It is open and self-hostable without cloud lock-in, and the mower control is a reusable building block (mowdeck-control) that other programs can use.
- Audience: first the owner and household, later other households and businesses on the same installation.
- Accounts, rights and fleet: accounts (household or business) with sub-users, roles built from single permissions, and fleet management. Data is strictly separated per account.
-
Mower connection: through a manufacturer adapter behind
mowdeck-control. For Mammotion: PyMammotion over the manufacturer cloud today, Bluetooth via an ESP32 bridge on the mower as a second link. - Positioning: own RTK station and Mammotion network RTK over 4G are both supported.
- UI: web app that installs on phones (PWA), German by default and English; optional store app later.
- Home Assistant: own HACS integration as a client of the public API.
- Login: username and password first; further methods (OAuth such as GitHub, later passkeys) as plug-ins.
- Subscription and payment: optional service, switchable per installation (off for the owner household).
- Operation: self-hosted (Docker Compose) or cloud (Kubernetes) with the same images.
| Feature | Phase |
|---|---|
| Accounts, sub-users, invitations, custom roles | 1 Foundation |
| Status (battery, mowing state, RTK fix, connectivity) with live updates; connection choice; map; start/pause/dock; cut height and speed; notifications | 2 MVP |
| Home Assistant, schedules, rain pause, health history, joystick, RTK signal map, theft alarm, multiple users and themes | 3 Comfort |
| Billing, plan limits, operator console, sites, groups, fleet map, bulk commands, reports, fleet API | 4 Fleet & Subscription |
| Spot mowing with patterns, re-mow missed spots, live camera | 5 Spot & Camera |
| Ai Recover, Find Dock | 6 AI |
| Priority | Goal | Meaning |
|---|---|---|
| 1 | Tenant isolation | No account can see or control data of another account |
| 2 | Safety | Commands expire, are deduplicated, and emergency stop has priority |
| 3 | Operability | One docker compose up at home; same images in Kubernetes |
| 4 | Extensibility | New features as new modules or services without changing existing ones |
| 5 | Light footprint | Runs on a Raspberry Pi 5 with 4 GB |
| Role | Expectation |
|---|---|
| Owner / household user | Reliable control and live status of own mowers |
| Sub-user (family, staff) | Limited rights, possibly without e-mail address |
| Operator (business, later) | Fleet overview, bulk commands, reports |
| Developer / contributor | Clear service pattern, contracts, fast checks |
| Integrator (Home Assistant) | Stable, versioned public API with limited tokens |
Mirrored from docs/architecture/01-introduction-and-goals.md at commit a117684672263ba4f0b7e2e3538233456122d24e. Edit the file in the repository, not this wiki page.
Mirrored from the docs/ directory at commit a117684672263ba4f0b7e2e3538233456122d24e. Edit the files in the repository, not this wiki.
MowDeck documentation
- Home
- Phases
- Architecture
-
Decisions (ADR)
- Architecture decisions
- ADR 0001: OpenFGA instead of self-built authorization
- ADR 0002: Self-built Identity service in FastAPI instead of Keycloak or Zitadel
- ADR 0003: SvelteKit for the web app
- ADR 0004: Monorepo with a uv workspace
- ADR 0005: AGPL-3.0 for services and apps, Apache-2.0 for libraries
- ADR 0006: PostgreSQL for all persistence, no SQLite
- ADR 0007: NATS JetStream as event bus
- ADR 0008: Traefik as gateway
- ADR 0009: Command and event envelopes, subject naming and de-duplication
- ADR 0010: Python 3.13 for all services and libraries
- ADR 0011: Separate GPL-3.0 package for the PyMammotion adapter
- ADR 0012: Mower control interface and safety rules
- ADR 0013: Device-Gateway registry, sharding and per-mower concurrency
- ADR 0014: Authorization model, tuple ownership and the mowdeck-authz client
- ADR 0015: Tokens, sessions and key rotation
- ADR 0016: Fleet commands and authorization per command kind
- ADR 0017: Telemetry storage and retention
- ADR 0018: Realtime WebSocket protocol
- ADR 0019: Mammotion adapter transports, manual drive and secrets
- ADR 0020: Web app architecture
- ADR 0021: Browser authentication flow
- ADR 0022: Notifications: rules, recipients and delivery
- ADR 0023: Map rendering and projection
- ADR 0024: Scheduler: recurrence, rain pause and command issuing
- ADR 0025: Home Assistant integration as a pure API client
- ADR 0026: Manual drive channel over the Realtime WebSocket
- ADR 0027: Health history and theft alarm
- ADR 0028: Entitlements: plans as data and enforcement
- ADR 0029: Helm chart and release pipeline
- ADR 0030: Mowing patterns as plug-ins and the Planner
- ADR 0031: Billing with a Stripe adapter
- ADR 0032: Live camera over Agora, joined directly by the browser
- ADR 0033: Vision-assisted recovery with human approval
- ADR 0034: Linked cloud accounts and device discovery
- ADR 0035: Server-side camera frames and automatic AI analysis on errors
- ADR 0036: Native app shells with Capacitor, loading the web app from the server
- ADR 0037: Camera panorama calibration in the browser, with the AI supplying points only
- ADR 0038: Dual link per mower and firmware updates
- ADR 0039: Spot mowing by MowDeck-driven paths
- ADR 0040: Link heartbeat for online status
- ADR 0041: Spot runs from the dock: undock, transit and return
- ADR 0042: Drive calibration
- ADR 0043: Turn styles
- ADR 0044: Drive view with camera
- Development
- Operations
- Spikes
- Guides
- Original plan (German)