Skip to main content
ADOS is open source end to end, and you can run the whole stack on hardware you own. This page maps what is self-hostable, how the pieces connect, and the routes to bringing the cloud relay up.

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.
The agent lives in github.com/altnautica/ADOSDroneAgent. Mission Control, the broker assets, the video relay and the deploy tool live in github.com/altnautica/ADOSMissionControl. Both are GPL-3.0.

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.
A fresh agent install runs with 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.
To run only the layers you need, the broker and the video relay each ship their own compose file under 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:
  • :3210 is the client API. The Mission Control browser bundle talks to it (NEXT_PUBLIC_CONVEX_URL), and npx convex deploy pushes functions to it.
  • :3211 is 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’s server.self_hosted.url and pairing.convex_url point here.
Cross the two and the GCS loads but no drone ever appears. Every port in the stack is listed on Self-hosting: ports and troubleshooting.

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.
Last modified on October 11, 2026