Repository navigation
Ops Assistant
Chat control lets users type what a mower should do ("mäh morgen früh nur hinten", "send it to the station"). The optional service assistant turns the request into a work order of validated actions; the user confirms it in the web app, which then sends the actions through the normal command and schedule endpoints. Design and safety rules: ADR 0075. For users: guide.
It is off unless you enable it. Without it nothing changes and no chat box appears.
- No secret, no database, no NATS user. The assistant only calls MowDeck's HTTP API (Identity, Fleet, Telemetry, Vision) with the token of the user who asked.
-
An AI provider for the default interpreter
provider: each user's own provider (Settings, AI provider) or the installation's model (VISION_DEFAULT_*, plan featureai_recover_hosted), the same as AI assist (ADR 0033). Users without one see a link to the provider settings. Vision limits the requests per user and hour (VISION_STRUCTURED_PER_HOUR, default 30) and records them in its cost accounting with kindstructured. - Or the interpreter
phrases: a built-in phrase parser for a few German and English requests, without any AI. Demo mode always uses it.
In infra/compose/.env:
COMPOSE_PROFILES=assistant # comma separated with other profiles, e.g. relay,assistant
IDENTITY_EXTRA_MODULE_URLS=http://assistant:8000
ASSISTANT_INTERPRETER=provider # or phrases
ASSISTANT_REQUESTS_PER_MINUTE=20
ASSISTANT_AI_TIMEOUT_SECONDS=60Then docker compose up -d --wait. Identity lists the assistant's UI area within a minute (it polls missing module URLs every 30 s); users reload the app once to see the chat box on the mower page.
To remove it, take assistant out of COMPOSE_PROFILES and its URL out of IDENTITY_EXTRA_MODULE_URLS, then docker compose up -d --wait --remove-orphans.
services:
assistant:
enabled: true
config:
ASSISTANT_INTERPRETER: providerThe chart adds the assistant to Identity's module list and to the Ingress (/api/v1/assistant) only when it is enabled.
| Variable | Default | Meaning |
|---|---|---|
ASSISTANT_INTERPRETER |
provider |
provider: the user's AI provider through Vision; phrases: the phrase parser without AI. Demo mode forces phrases. |
ASSISTANT_REQUESTS_PER_MINUTE |
20 |
Proposals per user and minute (per replica). |
ASSISTANT_AI_TIMEOUT_SECONDS |
60 |
Timeout of one structured answer from the AI provider. |
VISION_STRUCTURED_PER_HOUR |
30 |
Vision: structured answers per user and hour (the AI cost bound). |
The service-internal URLs (MOWDECK_ASSISTANT_IDENTITY_URL, ..._FLEET_URL, ..._TELEMETRY_URL, ..._VISION_URL) default to the Compose service names; the chart sets its own.
A public demo (ADR 0068) takes no Compose profiles, so the demo stack does not run the assistant. If you run it next to a demo yourself, it uses the phrase parser regardless of ASSISTANT_INTERPRETER and calls no external AI.
Mirrored from docs/ops/assistant.md at commit ea8b3955b591ac0393dfcfda93ecacdeb6b8f1c3. Edit the file in the repository, not this wiki page.
Mirrored from the docs/ directory at commit ea8b3955b591ac0393dfcfda93ecacdeb6b8f1c3. 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
- ADR 0045: Camera relay
- ADR 0046: Device settings as capabilities
- ADR 0047: The RTK base station as a Fleet device
- ADR 0048: Maintenance commands
- ADR 0049: Manual driving over the Mammotion cloud
- ADR 0050: Passkeys and the app login hand-off
- ADR 0051: Sign in with GitHub
- ADR 0052: Sign in with Apple
- ADR 0053: Retention and downsampling of the position track
- ADR 0054: Aerial photo under the mower map
- ADR 0055: Deploy maintenance window
- ADR 0056: Camera photo in push notifications for errors and theft alarms
- ADR 0057: Step-up re-authentication for critical actions
- ADR 0058: Theft tracking mode
- ADR 0059: iOS widgets and the mowing Live Activity
- ADR 0060: Apple Watch app
- ADR 0061: Mowing angle rotation
- ADR 0062: Setup tour for new users
- ADR 0063: Matter server (mowers in Apple Home and Google Home)
- ADR 0064: Personal access tokens and the public API documentation
- ADR 0065: Security center and new-login alerts
- ADR 0066: Cloud provider plugins and adapters for more vendors
- ADR 0067: Error code lexicon, provider independent
- ADR 0068: Public demo mode
- ADR 0069: Provider conformance kit and provider package template
- ADR 0070: Virtual zones for mowers without a vendor map
- ADR 0071: Capability matrix generated from the adapters
- ADR 0072: API explorer in the web app, for the public demo
- ADR 0073: Guided tour with coach marks
- ADR 0074: NATS authentication and per-service subject permissions
- ADR 0075: Chat control as an optional assistant add-on
- ADR 0076: Demo sandboxes, one account per visitor
- ADR 0077: Liveness, readiness and routing
- ADR 0078: Batched state ingestion
- ADR 0079: Fast demo sandbox claim and release
-
Development
- Getting started
- Service template
- Shared libraries
- Cloud providers: adding a vendor
- Adding a provider: template and conformance kit
- Adding an error lexicon for a vendor
- Design: identity and authorization
- Design: fleet, telemetry, realtime
- Design: web app
- Web app
- Home Assistant integration
- Camera source bridge protocol
- Fuzzing and property-based tests
- CI and pull request scope
- GitHub wiki mirror
-
Operations
- Operating the Compose stack
- Operating MowDeck on Kubernetes (Helm)
- Building the Bluetooth bridge (ESPHome on a XIAO ESP32-S3)
- Releases
- Vendor library updates
- Billing operations
- Telemetry: retention and position downsampling
- iPhone and Android apps
- Passkeys
- Sign in with GitHub
- Aerial photo under the map
- Sign in with Apple
- Theft tracking mode
- Matter server
- Chat control (assistant add-on)
- Source code offer (AGPL-3.0 section 13)
- Public demo
- Load testing
- Spikes
-
Guides
- Guides
- ESP32 bridge: purchase and setup
- Signing in with a passkey
- Signing in with GitHub
- Error codes in plain words
- Aerial photo under the map
- Signing in with Apple
- Confirming critical actions
- Your security page
- iPhone widgets and the mowing Live Activity
- Apple Watch
- The setup tour
- Apple Home and Google Home (Matter)
- Chat control
- Worx Landroid, Kress and LandXcape mowers
- Scripting MowDeck
- Capability matrix
- API reference
- Original plan (German)