What you can self-host
Drone Agent
The agent on your companion computer, pointed at your own backend.
Mission Control and Convex
The web GCS plus a self-hosted Convex backend for auth, fleet data and
cloud commands.
MQTT broker
Mosquitto with per-device auth and an ACL synced from Convex.
Video relay
RTSP to fragmented MP4 over WebSocket so a browser can play the stream.
Local-first by default
You do not need any cloud infrastructure to fly. The default path is local, over your LAN:- The drone-to-ground link is the WFB-ng radio.
- Mission Control reaches an agent directly by hostname or IP. Paste the agent’s address into the Add-a-Node card and the GCS pairs with it over the LAN. No Convex round-trip is involved.
server.mode: local, and nothing reaches out
to a backend. That is the correct setup for a single-LAN bench or field
deployment.
On the LAN, Mission Control talks to the agent over plain HTTP. The cloud
relay path is used only when the GCS is served over HTTPS. See
Drone Agent configuration for the agent’s
server block.When you want the cloud relay
The cloud relay is the opt-in path for reaching a drone across networks: remote sites, mobile data, anywhere the GCS and the agent are not on the same LAN. Each layer is optional.
Fleet status does not travel over MQTT. The agent POSTs its status heartbeat
straight to
{convex}/agent/status over HTTPS every 5 seconds, authenticated
with its X-ADOS-Key. The broker carries the live data planes under
ados/<deviceId>/...; the full topic list is on
Cloud infrastructure.
To put an agent on a self-hosted backend, set its server.mode to
self_hosted, point server.self_hosted.url and pairing.convex_url at your
Convex site origin, and set server.self_hosted.mqtt_broker to your broker.
See Self-hosting: the agent.
Routes to deploy
Deploy tool
The recommended path.
ados-deploy is a guided terminal deployer that
drives the tools/selfhost Compose stack for you.All-in-one stack
One Docker Compose at
tools/selfhost/ runs the Convex backend and
dashboard, Mission Control, Mosquitto with its auth sync, and the video
relay on a single host.tools/mqtt-bridge/deploy/ and
tools/video-relay/deploy/, so you can add a relay layer beside an existing
Convex deployment.
Convex has two origins
A self-hosted Convex backend exposes two origins that are not interchangeable::3210is the client API. The Mission Control browser bundle talks to it (NEXT_PUBLIC_CONVEX_URL), andnpx convex deploypushes functions to it.:3211is the site origin that serves HTTP actions. The agent’s pairing register, status heartbeat and command poll go here, and so does the broker auth sync. The agent’sserver.self_hosted.urlandpairing.convex_urlpoint here.
Resource footprint
A small deployment of one to five drones runs on a single 4-core, 8 GB Linux host that runs Convex, Mosquitto and the video relay together. The Convex backend needs the most headroom, because its SQLite store grows with your data. The broker is light. The video relay runs one ffmpeg remux per stream that has viewers.Next steps
Deploy tool
Bring the stack up with the guided installer.
All-in-one stack
The one-host Docker Compose runbook.
Self-hosting: the agent
Point a Drone Agent at your backend.
Ports and troubleshooting
The port table and the common failure modes.