By the end of this page, you will have ADOS Mission Control running in your browser with 7 simulated drones. You can explore the dashboard, plan missions, try the configuration panels, and fly a simulated drone with your keyboard or gamepad. No hardware needed.
Node.js 20+ (LTS recommended). Check with node --version
npm 9+ (ships with Node.js). Check with npm --version
Git. Check with git --version
A modern browser: Chrome, Edge, or Firefox. Chrome recommended for WebSerial support.
Mission Control uses WebSerial for USB flight controller connections and WebUSB for firmware flashing. Both require a Chromium-based browser (Chrome, Edge, Brave). Firefox works for everything except USB features.
The fastest way to try ADOS Mission Control is the hosted demo at command.altnautica.com.It loads with 7 simulated drones, demo telemetry, and all features enabled. Nothing to install. Just open the link.
This takes 1-2 minutes. The project uses Next.js 16 with React 19 and about 60 dependencies.
3
Start in demo mode
npm run demo
This starts the development server on port 4000 with demo mode enabled. Open http://localhost:4000 in your browser.
Demo mode sets NEXT_PUBLIC_DEMO_MODE=true and populates the dashboard with 7 simulated drones showing live-updating telemetry. It requires no Convex backend, no SITL, and no hardware.
4
Explore the dashboard
You should see the main dashboard with 7 simulated drones. Each drone shows:
Attitude indicator (artificial horizon)
GPS coordinates and altitude
Battery voltage and percentage
Flight mode (Stabilize, Loiter, Auto, etc.)
Connection status
Mission Control dashboard with 7 simulated drones in demo mode
60+ configuration panels for your flight controller. In demo mode, these show example values. With a real FC connected, you can read and write parameters.Key panels include:
Panel
What It Does
Failsafe
Battery, GCS, and RC loss behavior
PID Tuning
Rate and stabilize PIDs with live response graph
Power
Battery monitor setup (voltage divider, amps per volt)
Connect the FC to your laptop with a USB cable. Make sure it is powered (some FCs need a battery connected for USB to work, others do not).
3
Click Connect
Click the Connect button in the top navigation bar. A browser dialog will appear listing available serial ports.
WebSerial port selection dialog showing a connected flight controller
Select your flight controller and click Connect. Mission Control will:
Open the serial port at the detected baud rate
Send a MAVLink heartbeat
Request autopilot version and capabilities
Request data streams (attitude, GPS, battery, RC, sensors)
Download the full parameter list
This takes 2-5 seconds.
4
Verify the connection
The top bar will show the firmware type (ArduPilot, PX4, Betaflight, or iNav), vehicle type (Copter, Plane, Rover, etc.), and firmware version. The dashboard card will show live telemetry.If connection fails, check:
Is the FC powered?
Is another application (Mission Planner, QGroundControl, Betaflight Configurator) holding the serial port?
Are you using Chrome, Edge, or another Chromium-based browser? Firefox does not support WebSerial.
This applies to the direct USB path only. WebSerial, WebUSB, and Web Bluetooth need a secure context. On http://localhost:4000 they work. To use these browser features from another machine over the network, you need HTTPS (or the desktop app, which has native serial access with no browser restriction). The hosted version at command.altnautica.com uses HTTPS.This does not apply to connecting over the network to the ADOS Drone Agent or a MAVLink router. Those go over a WebSocket and need no secure context. See the plain-HTTP LAN self-host path below.
You do not need HTTPS, the cloud, or a Convex account to run Mission Control against a real drone on your own network. The ADOS Drone Agent serves plain HTTP on port 8080, and the GCS connects to it directly.
1
Run the GCS over plain HTTP
Start the GCS on your own machine and open it over plain HTTP:
npm run dev
Open http://localhost:4000, or reach it from another device on the LAN at http://<your-lan-ip>:4000.
Keep the GCS on http:// for LAN self-hosting. When the page is served over https://, the browser blocks it from fetching a plain-HTTP agent (mixed content), and the GCS falls back to the cloud relay. Plain HTTP keeps the connection local and direct.
2
Add the agent by IP
In the fleet sidebar, use the Add-a-Node card and enter the agent’s hostname or IP (for example drone.local or 192.168.1.50). The GCS pairs with the agent directly over the LAN, stores the key locally, and contacts no cloud service.
3
Fly
Telemetry, video, and control flow over the LAN with no internet dependency. This is the default, local-first path; the cloud relay is only for reaching a drone on a different network.
ADOS ships with a SITL (Software In The Loop) launcher that runs a full ArduPilot simulation with real physics. This is useful for testing mission planning, flight modes, and the full MAVLink stack without hardware.
1
Install ArduPilot SITL
Follow the ArduPilot SITL setup guide to build ArduPilot from source. The SITL binary lands in ~/.ardupilot/.
2
Start the SITL bridge
cd ADOSMissionControl/tools/sitlnpm installnpm start
This launches ArduPilot SITL (a real autopilot running on your computer with simulated physics) and bridges its TCP output to a WebSocket that Mission Control can connect to.
3
Connect from Mission Control
In Mission Control, click Connect and choose the SITL WebSocket option. You will see a simulated ArduPilot copter with GPS, battery, and full parameter set.You can arm, take off, switch modes, upload missions, and fly. The physics simulation includes gravity, drag, wind, and motor response. It is the same simulation that ArduPilot developers use.
Mission Control can also run as an Electron desktop app. This gives you a standalone window with native serial port access (no WebSerial browser restrictions).
# Development modenpm run desktop:dev# Demo modenpm run desktop:demo# Build distributablenpm run desktop:build:mac # macOSnpm run desktop:build # All platforms
The desktop app is the same codebase with an Electron wrapper. It uses about 200MB on disk and 200-300MB of RAM.
Cloud features (fleet management, cloud relay, community changelog) require a Convex backend. For local development and direct connections, no backend is needed.