Skip to main content
The agent installs with a single command. The installer detects your board, installs dependencies, writes the config, registers the systemd units and starts the agent.
Mission Control’s Flash Tool shows this install command for your board. See Install paths for the recommended flow per board class.

Quick install

SSH into your companion computer and run:
The install needs root. It installs to /opt/ados/, writes config to /etc/ados/, registers the systemd units, and fetches the prebuilt Rust service binaries into /opt/ados/bin/. systemd is the supported process manager on Linux.

Setup wizard

On a fresh interactive install with none of the identity flags set, the installer opens a setup wizard in the terminal. After a welcome screen it walks seven screens. Each one shows the detected default, and Esc goes back a step:
  1. Role: pick the node profile (drone, ground_station, workstation or compute).
  2. Hardware: a scan of the hardware categories that matter for that profile, each marked found or not detected.
  3. Features: a checklist of optional components, such as the World Engine extension.
  4. Wi-Fi: join a Wi-Fi network (including a hidden one), so the wired cable can be unplugged afterwards.
  5. Name: the node’s hostname, which is also its .local mDNS name.
  6. Pairing: an optional Mission Control pairing code. This screen appears only for drone and ground_station.
  7. Review: confirm the answers and install, or jump back to change one.
The wizard is skipped when a decisive flag is given, under --yes, --non-interactive, --json or --quiet, or when no terminal is attached.

What the installer does

1

Detect the board

Matches the board via an optional /etc/ados/board_override, the device-tree compatible string and model, then /proc/cpuinfo, falling back to generic-arm64 or generic-x86_64. There is no --board flag. See HAL and tiers.
2

Install system packages

Installs Python and the board-specific packages, including the RTL8812EU driver for WFB-ng unless you pass --no-rtl-driver. Uses apt on Debian and Ubuntu. On a base OS without Python 3.11 the installer downloads a self-contained CPython 3.11.
3

Create the runtime

Builds a Python virtual environment at /opt/ados/venv/ for the Python-backed services, and fetches the prebuilt Rust service binaries (supervisor, MAVLink router, control front, cloud relay, video, radio, logging store and the rest) into /opt/ados/bin/.
4

Generate device identity

Creates a 12-hex device id at /etc/ados/device-id. Pairing and mDNS use it.
5

Write the config

Creates /etc/ados/config.yaml with defaults for your board and records the profile and release channel in /etc/ados/profile.conf.
6

Install the systemd units

Installs the unit files and enables the ones your profile runs. See Systemd services.
7

Start the agent

Starts ados-supervisor, which brings up the units for your profile: the MAVLink proxy, the HTTP front and API, video when a camera is present, and the rest.

Install with pairing

If you have a pairing code from Mission Control, pass it during install:
The node pairs to your Mission Control account during installation and appears in Mission Control as soon as it connects. See Pairing.

Upgrade an existing installation

Or run ados update, which re-runs the installer in upgrade mode. Both keep /etc/ados/config.yaml, the device id and pairing state. See Update Drone Agent.

Installer flags

The bootstrap passes everything after bash -s -- straight to the installer. The parser rejects an unrecognised flag and aborts before touching the box, so a mistyped flag fails the install instead of being ignored. Notes on specific flags:
  • --channel <edge|stable>: release channel, default edge (tip of main). stable installs the signed release named by --version <X.Y.Z> and is remembered for later upgrades.
  • --ref <commit> requires --channel edge. With --channel stable it is refused with exit code 2 before any download, because a stable release addresses a version, not a commit.
  • --display <auto|none|id>: auto-detect (ground station default), opt out, or a display id the board profile declares. An undeclared id is rejected.
  • --wifi-pass-file <path>: file whose first line is the password for --wifi-ssid; keeps the secret off the command line. Omit it for an open network. The join never touches the interface your SSH session uses.
  • --profile accepts ground_station; use that spelling in scripts.

Unattended install

A fully unattended provisioning run looks like this:

Install from source

For contributors who want to change the agent code:
For deployment on real hardware, always use the install script instead of pip install -e. The install script catches packaging problems (missing data files, broken entry points) that editable installs hide. Editable installs are for local development only.

Install on macOS

macOS gets a rootless, per-user workstation node. Run the same bootstrap without sudo; the script refuses a root run with exit code 2. There is no prebuilt macOS installer, so the Mac path builds the installer from source (it installs the Rust toolchain first if needed) and defaults to --profile workstation.
The installer registers per-user LaunchAgents under $HOME/.ados, including the plugin host, which runs each extension as its own LaunchAgent in ~/Library/LaunchAgents. The World Engine extension is installed by default, as on any workstation. A macOS node has no systemd, no WFB radio and no GPIO.

Uninstall

On Linux this runs the installer’s uninstall: it removes the services and binaries and keeps config and identity. Add --purge to remove config and identity as well:
On macOS, ados uninstall removes the LaunchAgents, and --purge also removes ~/.ados.

Directory layout after install

Verify the installation

ados shows the dashboard URL, service state, MAVLink state, video state, network addresses and remote access state. Open the dashboard URL in a browser to finish first-run setup.

Requirements

Next steps

Dashboard

Open the browser dashboard and finish first-run setup.

Pairing

Pair the node with Mission Control.

Update Drone Agent

Keep the agent current.
Last modified on October 11, 2026