node_modules/, dist/, target/, virtual environments) are left out.
Mission Control
Repository: github.com/altnautica/ADOSMissionControl Stack: Next.js 16, React 19, TypeScript, Zustand 5, Tailwind CSS 4, Leaflet, CesiumJS, Convex, Electron.ADOSMissionControl/
├── src/
│ ├── app/ # Next.js App Router
│ │ ├── page.tsx # Dashboard (home)
│ │ ├── plan/ # Mission planner
│ │ ├── simulate/ # 3D simulation and replay (Cesium)
│ │ ├── flight-logs/ # Flight log review and reports
│ │ ├── mcp/ # MCP server connections
│ │ ├── config/ # App settings (data, firmware, input, notifications, plugins, theme, video, ...)
│ │ ├── pair/ # Add a node over the LAN
│ │ ├── community/ # Changelog and contact
│ │ └── api/ # Route handlers (auth, LAN pairing proxy, firmware and manifest fetch, ...)
│ ├── components/ # React components by area
│ │ ├── dashboard/ # Fleet dashboard
│ │ ├── drone-detail/ # Per-vehicle tabs, FC panel navigation and routing
│ │ ├── fc/ # Flight controller configuration panels
│ │ ├── cockpit/ # Flight cockpit
│ │ ├── flight/ # Flight controls
│ │ ├── planner/ # Mission planning
│ │ ├── simulation/ # Simulation
│ │ ├── map/ # Map layers
│ │ ├── hardware/ # Ground station hardware views
│ │ ├── connect/ # Connect dialog and transport panels
│ │ ├── plugins/ # Extension host and UI slots
│ │ ├── vision/ # Vision views
│ │ ├── shared/, ui/ # Shared components and primitives
│ │ └── ...
│ ├── stores/ # Zustand stores
│ ├── lib/ # Core libraries
│ │ ├── protocol/ # MAVLink and MSP: parser, adapters, encoders, transports
│ │ ├── video/ # WebRTC (WHEP and MQTT-signalled) and MSE playback
│ │ ├── agent/ # Agent client: pairing, status, capabilities
│ │ ├── plugins/ # Extension runtime, capabilities, slot registry
│ │ ├── dronecan/, can/ # DroneCAN
│ │ ├── mission/, patterns/ # Mission model and survey patterns
│ │ └── ...
│ ├── hooks/ # React hooks (use-panel-params.ts and others)
│ ├── mock/ # Demo mode: flight engine, mock protocol, demo fleet
│ ├── i18n.ts # Translation setup
│ └── types/
├── locales/ # Translations, one JSON file per language (en.json is the source)
├── convex/ # Convex backend: schema, HTTP actions, cloud relay tables
├── electron/ # Desktop app (main process, native UDP and TCP sockets, updater)
├── tools/
│ ├── sitl/ # ArduPilot SITL launcher and WebSocket bridge
│ ├── mavlink-bridge/ # Local bridge for UDP and TCP links from a browser
│ ├── mqtt-bridge/ # Mosquitto broker deployment
│ ├── video-relay/ # RTSP to fragmented MP4 over WebSocket
│ ├── selfhost/ # All-in-one self-host stack
│ └── deploy/ # Self-host deploy tool
├── public/ # Static assets
├── scripts/ # Build and maintenance scripts
├── tests/
├── package.json
├── next.config.ts
├── CONTRIBUTING.md
└── SELFHOSTING.md
Key files
| File | What it does |
|---|---|
src/lib/protocol/types/protocol.ts | The DroneProtocol interface every adapter implements |
src/lib/protocol/mavlink-adapter.ts | The MAVLink adapter for ArduPilot and PX4 |
src/lib/protocol/mavlink-adapter-frame-handlers.ts | routeFrame(): message id to handler |
src/lib/protocol/msp-adapter.ts | The MSP adapter for Betaflight and iNav |
src/lib/protocol/mavlink-crc-extra.ts | CRC_EXTRA and payload lengths for every decoded message |
src/stores/drone-manager.ts | Connected vehicles, their adapters and the selected vehicle |
src/stores/drone-manager-bridge.ts | bridgeTelemetry(): adapter callbacks to stores |
src/stores/telemetry-store.ts | Ring-buffered telemetry |
src/hooks/use-panel-params.ts | The parameter hook every configuration panel uses |
src/components/drone-detail/fc-nav-items.tsx | The list of flight controller configuration panels |
src/components/drone-detail/FcPanelRouter.tsx | Maps a panel id to its component |
src/lib/video/webrtc-client.ts | WHEP and MQTT-signalled WebRTC client |
convex/schema.ts | Convex database schema |
convex/http.ts | Convex HTTP actions the agent calls (/agent/status, /agent/commands, …) |
Drone Agent and Ground Agent
Repository: github.com/altnautica/ADOSDroneAgent Stack: Rust (a Cargo workspace incrates/, tokio, axum) and Python 3.11 or later, managed by systemd. One codebase serves every profile.
ADOSDroneAgent/
├── crates/ # Rust workspace
│ ├── ados-supervisor/ # Gates, starts and supervises the systemd units
│ ├── ados-mavlink-router/ # FC serial link, MAVLink IPC fan-out, vehicle-state snapshot, :8765 WebSocket
│ ├── ados-control/ # Native HTTP front on :8080
│ ├── ados-cloud/ # Cloud relay: status heartbeat, command poll, MQTT relays, WebRTC signaling
│ ├── ados-video/ # Video pipeline: ffmpeg, MediaMTX and radio tap supervision
│ ├── ados-radio/ # WFB-ng link: adapter selection, monitor mode, TX, frequency hopping
│ ├── ados-groundlink/ # Ground data plane: WFB receive, video fan-out, mesh
│ ├── ados-net/ # Ground uplink matrix: wired, Wi-Fi station, cellular, failover
│ ├── ados-display/ # OLED and LCD rendering, panel probe
│ ├── ados-hid/ # Touch, buttons, gamepads and the front-panel arbiter
│ ├── ados-gpio/ # GPIO output (buzzer, LED)
│ ├── ados-crsf/ # CRSF and ExpressLRS RC control lane
│ ├── ados-config-tunnel/ # Config over radio (MAVLink TUNNEL)
│ ├── ados-swarmbus/ # Swarm state bus (2 Hz position beacons)
│ ├── ados-swarm-control/ # Onboard swarm control laws and task allocation
│ ├── ados-vision/ # Vision engine host: frame rings, model registry
│ ├── ados-offload/ # Perception offload for drones without an NPU
│ ├── ados-plugin-host/ # Plugin RPC host and capability-token checks
│ ├── ados-logd/ # Black-box log and telemetry store (SQLite), :8090
│ ├── ados-macpin/ # Stable MAC pinning for adapters that randomize it
│ ├── ados-hal-probe/ # Probe-first hardware capability detection
│ ├── ados-config/ # Config loading for the Rust services
│ ├── ados-protocol/ # IPC wire contracts and contracts.toml
│ ├── ados-capabilities-codegen/ # Generates the capability and contract tables for Rust, Python and TypeScript
│ ├── ados-sdk/ # Rust plugin SDK
│ ├── ados-installer/ # Step-graph installer
│ └── ados-tui/ # Terminal dashboard (`ados` with no subcommand)
├── src/ados/ # Python package
│ ├── api/ # Residual FastAPI app, behind ados-control on an internal socket
│ ├── bootstrap/ # profile_detect.py: fallback profile detection
│ ├── cli/ # The `ados` command
│ ├── core/ # Config models, IPC helpers, generated contracts
│ ├── hal/ # Board detection and board profiles (hal/boards/*.yaml)
│ ├── plugins/ # Python plugin runtime support
│ ├── sdk/ # Python plugin SDK
│ ├── services/ # Entry points for Python-backed units
│ ├── setup/ # Setup facade
│ ├── dashboard/, cockpit/ # Built web bundles served by ados-control
│ └── __init__.py # Agent version
├── dashboard/ # Agent dashboard web app (source)
├── cockpit/ # On-box cockpit web app (source)
├── web-shared/ # Code shared by the two web apps
├── data/systemd/ # Unit files
├── schemas/ # Agent config and plugin manifest JSON schemas
├── scripts/ # install.sh bootstrap, build and release helpers
├── vendor/ # WFB-ng and the RTL8812EU driver
├── docs/ # Reference material
├── tests/
├── pyproject.toml
├── CONTRIBUTING.md
└── README.md
Key files
| File | What it does |
|---|---|
crates/ados-supervisor/src/registry.rs | The unit catalog: categories, profile and role gates, crash-loop handling |
crates/ados-protocol/contracts.toml | Every IPC contract and its version |
crates/ados-control/src/routing.rs | Which routes are native and which prefixes go to the residual API |
crates/ados-cloud/src/mqtt/mod.rs | The MQTT topics and broker selection |
src/ados/bootstrap/profile_detect.py | The fallback hardware fingerprint used when no profile is set |
src/ados/hal/boards/*.yaml | Board profiles |
data/systemd/*.service | The unit files |
scripts/install.sh | The installer bootstrap |
src/ados/__init__.py | The agent version |
Extensions
Repository: github.com/altnautica/ADOSExtensionsADOSExtensions/
├── extensions/ # First-party Extensions, one directory each
│ ├── follow-me/
│ ├── mavlink-gimbal-v2/
│ ├── siyi-pod/
│ ├── thermal-camera-flir-lepton-usb/
│ ├── vision-nav/
│ └── world-engine/
├── packages/
│ ├── create-ados-plugin/ # Plugin scaffolder
│ ├── plugin-sdk/ # TypeScript SDK for the Mission Control side
│ └── extension-ui/ # Shared UI primitives for first-party Extensions
├── scripts/ # Lint, pack, sign and submit
├── docs/
├── Cargo.toml, pyproject.toml, package.json
└── README.md
MCP server
Repository: github.com/altnautica/ADOS-MCPADOS-MCP/
├── src/
│ ├── server.ts, cli.ts, index.ts # Server and command-line entry points
│ ├── transport/ # MCP transports
│ ├── auth/, gate/ # Scopes and confirmation for actions that move an aircraft
│ ├── audit/ # Call audit trail
│ ├── discovery/, registry/ # Finding and tracking nodes
│ ├── catalog/ # Tool catalog
│ ├── plane/ # Node and fleet access
│ └── param-metadata/
├── catalog/
├── test/
└── package.json
Android GCS
Repository: github.com/altnautica/ADOSAndroidGCS Stack: Kotlin, Jetpack Compose, Gradle.ADOSAndroidGCS/
├── app/ # Application module
├── feature/ # Screens: cockpit, configure, connect, fleet, logs, node, plan, settings
├── core/ # Shared modules: agent, cloud, data, database, designsystem, extensions, link, map, mavlink, model, skills, video
├── radio/ # Radio modules: rx, usb
├── build-logic/ # Gradle convention plugins
├── baselineprofile/
└── settings.gradle.kts
Paths on a running node
| Path | Purpose |
|---|---|
/etc/ados/config.yaml | Main agent configuration |
/etc/ados/profile.conf | The node’s profile, written at install |
/etc/ados/pairing.json | Pairing state and key (mode 0600) |
/opt/ados/bin/ | Rust service binaries |
/opt/ados/venv/ | Python virtual environment |
/run/ados/mavlink.sock | MAVLink IPC socket |
/run/ados/state.sock | Vehicle-state socket (length-prefixed msgpack, see Agent services) |
/run/ados/api-internal.sock | Residual API socket behind ados-control |
/run/ados/logd-query.sock | Black-box query socket |
Next steps
Code recipes
Add a panel, a decoder, a store or a service.
Contributing
Set up a development environment and open a pull request.