flightopsDocumentation
Reference

License and usage metrics

6 min readdocs/reference/license-and-telemetry.md (source repository)

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.

bash
flightops license activate
  1. 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 yes to accept. The full beta terms (source repository) were accepted when you installed.
  2. 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.
  3. The command prints who the license belongs to and until when it is valid.

Without a terminal, for example in a provisioning script:

bash
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:

bash
flightops license status
flightops license status --json

status 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:

text
This device has no Flightops beta license. Run: flightops license activate  (your key is in the Flightops beta email)

These always work:

  • --help, -h or --version as the only argument, for example onscope --help
  • flightops license ... and flightops telemetry ...
  • the installer commands flightops --list, --verify, --rollback and --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 deactivate on 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.

SentValues
Per commandtool 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 flightschoolonly that they started, with the subcommand
License eventsactivated, renewed, deactivated, refused by the license check, suspended, revoked
With each batchFlightops 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:

bash
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 now

Events 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

MessageWhat 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 refreshThe 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 timeRun the command again.
... must be a regular file owned by you with mode 600Fix the file's owner or mode (chmod 600 FILE), or remove it and activate again.

Files

FileContent
~/.config/flightops/licence.jsonthis device's signed license and device secret (mode 600)
~/.config/flightops/licence-pending.jsonan activation in progress, reused if a response is lost
~/.config/flightops/device-ida random device ID, only on systems without /etc/machine-id
~/.local/state/flightops/telemetry/queue.jsonlqueued usage events (at most 1 MiB)
~/.local/state/flightops/telemetry/state.jsonlast 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.