Open-source web ground station for software-defined drones. ArduPilot, PX4, Betaflight, and iNav. Mission planning, AI tuning, and gamepad flight, in the browser.
Command any drone from any browser. ADOS Mission Control is a full ground control station for software-defined drones. Configure flight controllers panel by panel, plan missions with pattern generators, fly with a gamepad at 50 Hz, and tune PIDs with AI. No install. No locked hardware.
Part of the ADOS ecosystem. Pairs with ADOS Drone Agent, the Rust-first onboard companion, for the long-range data link, HD video, and cloud fleet management. Works standalone with any MAVLink drone over USB or WebSocket. Add features with ADOS Extensions, the first-party plugin repo.
Live App | Docs | ADOS Extensions | Changelog | Discord | Email | Contact
- Connect to any drone, no driver install. Plug in over USB (WebSerial), point at a MAVLink WebSocket, or pair with an ADOS agent over your LAN.
- Set up the whole flight controller. Nearly 60 panels cover calibration, PID tuning, receivers, outputs, failsafe, power, ports, OSD, firmware flashing, and the iNav-specific surfaces.
- Plan a mission by drawing it. Drop waypoints on the map, generate survey, orbit, corridor, SAR, and structure-scan patterns, follow terrain, set geofences and rally points, then validate before upload.
- Fly with a real controller. Gamepad, HOTAS, RC transmitter, or keyboard at 50 Hz, with arm/disarm, mode switching, guided flight, and a kill switch.
- Rehearse in 3D. Replay a mission over real terrain on a Cesium globe before you fly it.
- Tune PIDs with help. FFT-driven noise and motor-health analysis suggests filter settings and PID values.
- Manage a fleet from anywhere. Cloud mode adds multi-drone dashboards, mission sync, and real-time telemetry over MQTT.
- Sign your commands. HMAC-SHA256 on every outbound MAVLink v2 frame, with the key held only in your browser.
- Self-host all of it. Field operations work fully offline, and the cloud relay can run entirely on your own servers.
Try it right now at command.altnautica.com. No install needed. Demo mode loads simulated drones with live telemetry, mission planning, and full FC configuration.
Or run locally:
git clone https://github.com/altnautica/ADOSMissionControl.git
cd ADOSMissionControl
npm install
npm run demoOpen http://localhost:4000. Simulated drones, no hardware required.
- Platform: Browser-based. Runs on any OS with a modern browser. Optional Electron desktop build for WebSerial and WebUSB access.
- Firmware: ArduPilot, PX4, Betaflight, and iNav as first-class targets.
- Protocol: MAVLink v2 and MSP v1/v2 in the same app, behind a unified
DroneProtocoladapter interface. - Flight control: Gamepad, HOTAS, RC transmitter, or keyboard input at 50 Hz.
- AI tuning: PID and filter analysis with FFT-driven noise and motor-health diagnosis.
- 3D simulation: CesiumJS globe with real terrain and flight path replay.
- Fleet mode: MQTT and Convex relay for multi-drone dashboards. Self-hostable end to end.
- License: GPL-3.0-only.
The browser side is TypeScript. The onboard agent it pairs with, ADOS Drone Agent, is Rust-first, which is what carries the long-range link, HD video, and headless operation on small boards.
Nearly 60 panels covering calibration, PID tuning, receiver, outputs, failsafe, power, ports, OSD, firmware flashing, plus iNav-specific panels for safehomes, geozones, navigation config, profiles, output mapping, servos, temp sensors, MC braking, rate dynamics, and mission summary. Works with ArduPilot, PX4, Betaflight, and iNav. AI PID tuning analyzes FFT noise and motor health, then suggests filter settings and PID values. Board auto-detection for firmware flashing. WebUSB firmware flashing with no external tools.
Drag waypoints on an interactive map. Pattern generators for survey (boustrophedon), orbit, corridor, SAR (expanding square, sector, parallel track), structure scan, plus automated landing approaches. Terrain following via the Open Elevation API. Geofence editor, rally points, batch waypoint editing, and mission validation before upload. Import and export KML, KMZ, CSV, .waypoints, .plan.
Gamepad, HOTAS, RC transmitter, or keyboard input at 50 Hz. Arm/disarm, mode switching, guided flight, mission execution, kill switch. 3D Cesium globe simulation with real terrain, flight path replay, and camera presets.
Real-time attitude, GPS, battery, EKF status, vibration, RSSI, and sensor health. Pre-arm check visualization. Alert feed from the flight controller. Ring-buffered stores keep memory bounded across long sessions.
HMAC-SHA256 on every outbound MAVLink v2 frame. The 32-byte key lives only in your browser as a non-extractable Web Crypto key, and is enrolled with the flight controller once via SETUP_SIGNING. Flip require mode from the Configure tab Security panel to make the flight controller reject any unsigned command. ArduPilot 4.0 and newer supported today. See docs.
ADOS is local-first. In field mode the GCS talks directly to hardware over WebSerial or WebSocket, or to an ADOS agent over the LAN by hostname or IP, with no cloud account. Cloud mode adds fleet management, mission sync, and MQTT telemetry relay for reaching drones across networks. When paired with ADOS Drone Agent, the GCS receives live telemetry at 2 Hz and faster and can send commands through the relay.
When the paired agent runs in the ground-station profile, the node panel shows role-gated surfaces instead of the flight tabs: Network (uplink priority across WiFi, ethernet, and cellular, plus access-point management), Distributed RX (single-node link stats, relay list, combined stream stats), Mesh (batman-adv health, neighbors, gateways, and the pairing accept window), Display and Physical UI (OLED screens and button mappings), and Peripherals (connected USB and GPIO hardware). A role badge in the top bar shows at a glance whether a node is running as direct, relay, or receiver, and mesh events surface as non-blocking toasts.
| Firmware | Protocol | Status |
|---|---|---|
| ArduPilot (Copter / Plane / Rover / Sub) | MAVLink v2 | Full |
| PX4 | MAVLink v2 | Full |
| Betaflight | MSP v1/v2 | Full |
| iNav | MSP v1/v2 | Full |
~98K lines of TypeScript. Nearly 60 FC panels. 83 MAVLink message decoders. 65 iNav decoders. 7 mission pattern generators. Over 60 ring-buffered Zustand stores. Full demo mode with zero setup.
| Platform | Requirements | Notes |
|---|---|---|
| Web (recommended) | Chrome 89+ or Edge 89+ | WebSerial and WebUSB for FC connection and firmware flashing |
| Web (limited) | Firefox, Safari | No WebSerial or WebUSB. WebSocket connections work. |
| Desktop (macOS) | Intel or Apple Silicon | Electron app, not code-signed (same as Betaflight and iNav Configurator) |
| Desktop (Windows) | x64 | Electron app, .exe installer |
| Desktop (Linux) | x64 or arm64 | .AppImage |
3D features (simulation, terrain rendering) benefit from a dedicated GPU. Works without one, but frame rates will be lower.
All optional. The GCS works fully offline for local FC configuration and field operations.
| Service | Purpose | Required? |
|---|---|---|
| Convex | Cloud fleet management, auth, community features | No (field mode works without) |
| Open Elevation | Terrain following for mission planning | No (defaults to flat terrain) |
| Cesium Ion | 3D terrain tiles and satellite imagery | No (uses ArcGIS terrain by default) |
| Groq | AI PID tuning analysis | No (AI features disabled without key) |
| GitHub API | PX4 firmware release fetching | No (raises rate limit from 60 to 5000/hr) |
| Layer | Technology |
|---|---|
| Framework | Next.js 16 (App Router, Turbopack) |
| UI | React 19, Tailwind v4 |
| State | Zustand 5 (ring-buffered telemetry) |
| Maps | Leaflet + react-leaflet |
| 3D simulation | CesiumJS |
| Protocol | Custom MAVLink v2 and MSP v1/v2 binary parsers |
| Transport | WebSocket, WebSerial, WebUSB |
| Backend | Convex (optional, cloud fleet and community features) |
| Desktop | Electron 41 |
| Language | TypeScript (strict) |
npm run cli # Interactive menu (recommended starting point)
# Development
npm run cli dev # Dev server (port 4000)
npm run cli dev -a # Dev server + MQTT + Video Relay via Docker
npm run cli dev --convex # Dev server + Convex dev backend
npm run cli demo # Demo mode with simulated drones
npm run cli sitl # Launch ArduPilot SITL + WebSocket bridge
# Services (Docker)
npm run cli services # Interactive service manager
npm run cli services status # Show MQTT / Video Relay status
npm run cli services start # Start a Docker service
npm run cli services stop # Stop a Docker service
npm run cli services logs # Tail service logs
# Setup and configuration
npm run cli setup # First-time setup wizard (asks dev vs prod)
npm run cli prod # Production deployment wizard (ports, SSL, service config)
npm run cli config # Configure environment interactively
npm run cli deploy # Lint, build, start production server
npm run cli info # System check (Node, Docker, ports, security)WebSocket: Connect to any MAVLink-over-WebSocket endpoint. Use npm run cli sitl to launch ArduPilot SITL with the bridge tool. See tools/sitl/.
WebSerial (USB): Plug in your FC, open Mission Control in Chrome 89+, click connect, pick the port. No drivers needed.
ADOS agent (LAN): Add a node by hostname or IP. Mission Control pairs with the agent directly over the local network. No cloud account required.
npm run desktop:build:mac # macOS .dmg
npm run desktop:build:win # Windows .exe installer
npm run desktop:build:linux # Linux .AppImagemacOS: right-click the app, Open, then Open again. Not code-signed, same as Betaflight Configurator and iNav Configurator.
A multi-stage Dockerfile ships at the repo root for running Mission Control as a long-lived web server (instead of the desktop app or local dev). Node 22 alpine base, Next.js standalone output, runs as an unprivileged user.
docker build \
--build-arg NEXT_PUBLIC_CONVEX_URL=https://your-convex.example \
-t ados-mission-control .
docker run -d \
-p 4000:4000 \
-e NEXT_PUBLIC_CONVEX_URL=https://your-convex.example \
--restart unless-stopped \
--name mission-control \
ados-mission-controlOpen http://localhost:4000.
About NEXT_PUBLIC_* variables: these get baked into the client JS bundle at build time. Pass them as --build-arg to docker build AND as -e to docker run (the runtime version is used by server components and route handlers). The Dockerfile declares each NEXT_PUBLIC_* as ARG plus ENV so build args propagate.
Container orchestrators and PaaS: the image works with anything that can build a Dockerfile. Point your tool at this repo, set the build pack to Dockerfile, expose port 4000, and configure the env vars above. No special framework integration is needed.
Fronting with HTTPS: the container serves plain HTTP on port 4000. Terminate TLS at any reverse proxy (Caddy, nginx, Traefik) or tunnel (Cloudflare Tunnel, Tailscale Funnel, ngrok). When fronting with a tunnel, route to 127.0.0.1:4000 rather than localhost:4000, since the standalone server binds IPv4 only.
For self-hosting the supporting cloud relay (Convex, MQTT, and video relay), see SELFHOSTING.md.
Field mode works with no backend. Cloud features need a Convex deployment:
npx convex init
npx @convex-dev/auth
npx convex devSet NEXT_PUBLIC_CONVEX_URL in .env.local. The first user to sign up becomes admin.
For self-hosted MQTT and video relay, run npm run cli prod for a guided wizard (port selection, conflict detection, config file generation, optional service start), or follow the manual steps in SELFHOSTING.md. Source for each service: tools/mqtt-bridge/, tools/video-relay/.
All variables are optional. Set them with npm run cli config or edit .env.local directly. The file is gitignored and never committed.
| Variable | Description |
|---|---|
NEXT_PUBLIC_DEMO_MODE |
Enable demo mode with simulated drones |
NEXT_PUBLIC_DEMO_DRONE_COUNT |
Number of simulated drones (1, 3, 5, or 10) |
NEXT_PUBLIC_CONVEX_URL |
Convex backend URL for cloud fleet features |
GITHUB_TOKEN |
Raises the PX4 releases API limit from 60 to 5000 req/hr |
GROQ_API_KEY |
AI PID tuning suggestions. Free at console.groq.com |
CESIUM_BASE_URL |
Self-hosted Cesium JS URL (falls back to CDN if unset) |
| Tool | Path | Description |
|---|---|---|
| SITL launcher | tools/sitl/ |
ArduPilot SITL plus TCP-to-WebSocket bridge |
| MQTT bridge | tools/mqtt-bridge/ |
Mosquitto broker plus MQTT-to-Convex bridge (Docker Compose) |
| Video relay | tools/video-relay/ |
RTSP-to-WebSocket fMP4 relay via ffmpeg (Docker Compose) |
Building and testing ADOS Mission Control on real hardware. Want to get involved? Email us.
Interested in sponsoring or sending test hardware? See our partnership info.
- Discord - Join the community, ask questions, share builds
- LinkedIn - Follow company updates
- Email - team@altnautica.com
- Changelog - What shipped and when
- GitHub Issues - Bug reports and technical discussions
See CONTRIBUTING.md for the full guide. Good areas to start: real iNav 7.x hardware testing, map-based polygon geozone drawing, a dedicated iNav nav-PID panel, Betaflight hardware testing, new board profiles, UDP transport, unit tests, pattern generators.
npm run demo # Test against simulated drones
npm run lint # Must pass before PRGPL-3.0-only. Copyright 2025-2026 Altnautica. Derivative works must also be GPL-3.0, same as ArduPilot.











