What Cloud Adds
Architecture
The cloud backend is built on Convex, a reactive backend platform. The GCS repo includes a completeconvex/ directory with around 30 custom tables alongside the auth tables.
Key tables:
Cloud Relay
When the GCS runs on HTTPS, it auto-activates cloud mode. This enables connecting to remote drones through the Convex backend. In hosted cloud mode the backend is managed by Altnautica with zero configuration. If you prefer to run the stack yourself, point the GCS at your own Convex deployment using the self-hosting steps below.Cloud relay is the secondary, remote-access path, not a requirement. For a drone on the same network as Mission Control, serve the GCS over plain HTTP (
http://localhost:4000 or http://<lan-ip>:4000) and pair the agent by IP. That talks to the agent directly over the LAN with no Convex account and no HTTPS. The agent itself always serves plain HTTP on port 8080. Reach for cloud relay only to connect a drone on a different network.- Convex HTTP (Baseline)
- MQTT (Real-time)
- WebRTC (Video)
The simplest layer. The Drone Agent POSTs status to the Convex backend every 5 seconds. The GCS subscribes to reactive queries.
- Latency: 2-5 seconds
- Infrastructure: Just the Convex backend, nothing else
- Use case: Monitoring, fleet overview, non-critical telemetry
Authentication
Cloud mode uses Convex Auth with a password provider. Users sign up with email and password. The first user to register is automatically granted admin role. Roles:- Admin: Full access. Manage users, view all drones.
- Member: Standard access. View paired drones, use community features.
- Viewer: Read-only. Can view fleet status but cannot send commands.
Community Features
The community section (/community route) provides:
- Changelog: Browse project updates and release notes. Admins can create and edit entries.
- Roadmap: View the project roadmap as a kanban board.
- Contact form: Submit feedback or questions.
Self-Hosting
You can deploy your own Convex backend and run the full cloud stack independently.1
Install Convex CLI
2
Start the dev backend
From the ADOSMissionControl directory:This starts a local Convex development backend and pushes your schema and functions.
3
Generate auth keys
Convex Auth (the password provider) signs and verifies session tokens with RS256. Generate the keypair with the bundled script:It prints
JWT_PRIVATE_KEY (PKCS#8 PEM with newlines collapsed to spaces), JWKS (the public key as a JSON Web Key Set), and a SITE_URL reminder, in the exact format the auth runtime expects.Set all three on your Convex backend:4
Set the URL
Copy the Convex client URL and set it in your Use the client-API origin here (port
.env:3210 on a self-hosted backend, or your *.convex.cloud URL on Convex Cloud).5
Start the GCS
Production Deployment
For production, deploy the Convex backend to Convex Cloud (free tier available) or self-host using Convex’s open-source backend with Docker and SQLite.MQTT Bridge Tool
Thetools/mqtt-bridge/ directory contains a Node.js service that bridges MQTT telemetry to Convex:
- Subscribes to MQTT topics (
ados/+/status,ados/+/telemetry) - Debounces updates (3 seconds per device)
- POSTs to the Convex HTTP API
Video Relay Tool
Thetools/video-relay/ directory contains a video relay that converts RTSP streams to WebSocket fMP4:
- Accepts WebSocket connections from browser clients
- Spawns ffmpeg per device (copy codec, no transcoding)
- Streams fMP4 fragments over WebSocket
- Cleans up ffmpeg when the last viewer disconnects
Offline Behavior
Cloud features degrade gracefully when the network is unavailable:- Local connections (USB, WebSocket) continue to work
- Settings stored in IndexedDB remain available
- Previously loaded fleet data stays visible but marked as potentially stale
- The GCS retries cloud connections in the background