Installed Flightops beta builds need an activated device, and they send usage metrics. This page is the reference for both. The beta page explains how to get a key; the privacy notice says what the beta service keeps and for how long.
A source checkout is not gated: the check is in the installed launcher, flightops-launch, which every command in ~/.local/bin runs through.
Activate this device
Activation needs the internet once. Source ROS first if you want to run a ROS command right after.
flightops license activate- Read the usage-metrics notice (the 0.2.0b1 builds title it "Flightops beta terms"). It lists what is sent and what never is. Type
yesto accept. The full beta terms (source repository) were accepted when you installed. - Paste the key from your beta email (
FO1-and four groups of five characters) at the hidden prompt. The key does not appear on screen or in your shell history. - The command prints who the license belongs to and until when it is valid.
Without a terminal, for example in a provisioning script:
flightops license activate --accept --key-file ~/flightops-key.txt
# or
FLIGHTOPS_LICENSE_KEY=FO1-... flightops license activate --accept--accept accepts the terms and also replaces an earlier activation of the same device without asking. Remove the key file afterwards.
Check the result:
flightops license status
flightops license status --jsonstatus exits with 0 when the license on this device is valid and 1 when it is not.
Commands that work without a license
Until the device is activated, or after its license has expired, every installed command exits with code 3 and prints what to do, for example:
This device has no Flightops beta license. Run: flightops license activate (your key is in the Flightops beta email)These always work:
--help,-hor--versionas the only argument, for exampleonscope --helpflightops license ...andflightops telemetry ...- the installer commands
flightops --list,--verify,--rollbackand--uninstall
Help for a subcommand, such as flightops doctor --help, needs an activated device.
Renewal and expiry
- The license renews itself in the background when the device is online, from 7 days after its last renewal. A command never waits for it.
- Without a renewal, the license stays valid for 37 days after its last renewal. During the last 7 days, commands print a warning with the date.
- To renew now:
flightops license refresh. - If renewal is not possible (no internet, a proxy blocks HTTPS), the current license stays as it is until it expires. Then commands exit with code 3 until a refresh succeeds.
- Every beta license ends on 31 March 2027.
Activation and renewal use HTTPS to https://beta.flightops.dev. Allow that host if your network filters outbound traffic.
Devices
- A device is one user account on one machine. Flightops uses a one-way fingerprint of the machine ID (
/etc/machine-id) and your numeric user ID. Two user accounts on one PC are two devices. - One key works on 3 devices.
- To free a slot, run
flightops license deactivateon the device you no longer use. It sends the last queued metrics, releases the slot and removes the local license. - Reinstalling Flightops keeps the license, because it lives in your configuration folder. If you activate again on the same machine and account, the command asks whether to replace the earlier activation.
- A new machine ID (for example a reinstalled OS) is a new device. Deactivate the old one first, or write to beta@flightops.dev.
Usage metrics
During the beta, installed builds send usage metrics. They are required.
| Sent | Values |
|---|---|
| Per command | tool and subcommand (fixed list), JSON output requested or not, outcome (ok, error, usage, interrupted, crashed), exit code, duration rounded to 10 ms, Python exception class of a crash (fixed list) |
flightlead and flightschool | only that they started, with the subcommand |
| License events | activated, renewed, deactivated, refused by the license check, suspended, revoked |
| With each batch | Flightops version, Ubuntu version, CPU architecture, Python version, ROS 2 distribution, middleware name, CI or not, coding agent that started the command when detectable (Claude Code, Codex, Cursor) |
Never sent: command arguments, file or directory paths, package, node, topic, frame or parameter names, launch files, recordings, evidence, results, logs, AI prompts or answers, code, host names, user names or other environment values.
Inspect and control the queue:
flightops telemetry show # exactly what the next sends contain
flightops telemetry show --json # the same, compact
flightops telemetry status # queue size, last send, next attempt
flightops telemetry send # send nowEvents are queued locally and sent in the background at most once an hour. Nothing is sent before the device is activated. A failed send never blocks a command; the sender backs off up to 24 hours. The queue keeps at most 1 MiB; the oldest events are dropped first.
Error messages
| Message | What to do |
|---|---|
| This device has no Flightops beta license. | Run flightops license activate. |
| The Flightops beta license on this device needs a refresh. | Connect to the internet and run flightops license refresh. |
| connect to the internet before DATE so it can refresh | The license expires on DATE without a renewal. Go online once before then. |
| This key is not active. Use the newest key from your Flightops beta email. | A newer key was sent to you; use it. |
| ... active on its limit of 3 devices ... | Run flightops license deactivate on a device you no longer use, or write to beta@flightops.dev. |
| This license is suspended. / This license was revoked. / This device was revoked. | Write to beta@flightops.dev. |
| The Flightops beta period for this license has ended. | The beta license period is over. |
| Could not reach the Flightops beta service. | Check the internet connection and HTTPS access to beta.flightops.dev, then run the command again. |
| Too many activation attempts; wait an hour and try again. | Wait an hour. |
| Another activation changed this device at the same time | Run the command again. |
| ... must be a regular file owned by you with mode 600 | Fix the file's owner or mode (chmod 600 FILE), or remove it and activate again. |
Files
| File | Content |
|---|---|
~/.config/flightops/licence.json | this device's signed license and device secret (mode 600) |
~/.config/flightops/licence-pending.json | an activation in progress, reused if a response is lost |
~/.config/flightops/device-id | a random device ID, only on systems without /etc/machine-id |
~/.local/state/flightops/telemetry/queue.jsonl | queued usage events (at most 1 MiB) |
~/.local/state/flightops/telemetry/state.json | last send, next attempt, failures |
XDG_CONFIG_HOME and XDG_STATE_HOME move these folders when they are set. The file names keep the British spelling licence.