Cloud Relay
The cloud relay lets you monitor and control your drone from anywhere. It works behind NAT, through firewalls, and over cellular networks without port forwarding. The relay uses three additive layers. Each adds more real-time capability on top of the last.Three layers
Layer 1: Convex HTTP (baseline)
The simplest layer. The agent POSTs status to a Convex HTTP endpoint every 5 seconds and polls for pending commands. Mission Control uses reactive Convex queries to display the data in near-real-time.- Latency: 2-5 seconds
- Requires: Internet connection (any)
- Used for: Status updates, command queue, pairing
- Always active when paired
Layer 2: MQTT (real-time telemetry)
The agent publishes telemetry to an MQTT broker over WebSocket transport (port 443, through Cloudflare). The default publish rate is 2 Hz (configurable).- Latency: 100-300 ms
- Requires: MQTT broker access
- Topics:
ados/{deviceId}/status,ados/{deviceId}/telemetry - Used for: Live telemetry in Mission Control, fleet dashboards
Layer 3: WebRTC P2P (video)
For live video, the agent uses peer-to-peer WebRTC signaling relayed through MQTT. This avoids sending video through a central server. The flow:- GCS publishes an SDP offer to
ados/{deviceId}/webrtc/offervia MQTT - Agent’s
WebrtcSignalingRelayservice picks up the offer - Agent forwards it to MediaMTX’s WHIP endpoint
- MediaMTX generates an SDP answer
- Agent publishes the answer to
ados/{deviceId}/webrtc/answer - GCS receives the answer and establishes a direct WebRTC connection
- Latency: 50-200 ms (video)
- Requires: STUN/TURN servers for NAT traversal
- Used for: Live video in Mission Control
P2P WebRTC works on most home and office networks. On symmetric NAT cellular carriers (~5-15% of mobile networks), the ICE negotiation may fail. In that case, the GCS falls back to Layer 1 for commands and telemetry. Video requires switching to a different network.
Connection modes
The agent supports three server modes:- Cloud (default)
- Self-hosted
- Disabled
Connects to the ADOS cloud backend. MQTT goes through This is the default for most users. No infrastructure to manage.
mqtt.altnautica.com via Cloudflare. Convex HTTP goes to convex-site.altnautica.com.MQTT topics
When connected to the cloud, the agent publishes to these MQTT topics:| Topic | Rate | Content |
|---|---|---|
ados/{deviceId}/status | Every 5s | Full status (board, FC, services) |
ados/{deviceId}/telemetry | 2 Hz | Attitude, position, speed, battery |
ados/{deviceId}/webrtc/answer | On demand | SDP answer for video |
| Topic | Content |
|---|---|
ados/{deviceId}/webrtc/offer | SDP offer from GCS |
MQTT reliability
The agent usespaho-mqtt with these settings for reliable operation:
max_inflight_messages_set(1000)to prevent message drops under load- WebSocket transport on port 443 to pass through corporate firewalls
- Automatic reconnection with exponential backoff
- QoS 0 for telemetry (fire and forget, optimized for real-time)
- QoS 1 for command acknowledgments (at least once delivery)
Heartbeat
The agent sends a heartbeat to the cloud every 5 seconds (configurable):Security
All cloud traffic is encrypted:- MQTT uses WebSocket over TLS (wss://, port 443)
- Convex HTTP uses HTTPS
- WebRTC uses DTLS for media and HTTPS for signaling
- The agent authenticates with its API key (set during pairing)