Skip to main content

air-status

Live flight status in the terminal while you're on board, read from the airline's in-flight Wi-Fi portal: altitude, speed, ETA, a Braille map of the route, and a saved history of every flight.

air-status live view: route bar, flight stats and a Braille map of the flown path

Made-up flight. Regenerate with python scripts/screenshot.py.

Install

pipx install air-status        # or: pip install air-status
air-status

From a checkout, for development:

python3 -m venv .venv
source .venv/bin/activate
pip install -e '.[dev]'

Use

air-status                               # live view, airline detected from the Wi-Fi, saves history
air-status live -p american              # pick the airline: aircanada, american
air-status live -p aircanada --every 10  # refresh every 10 s
air-status history                       # list saved flights

Run it in a real terminal for the live full-screen view. In a plain output window (e.g. PyCharm's Run tab) it prints one frame per update instead.

Files go in the current folder (change with --data-dir):

  • history/<provider>/ — one file per flight, in that provider's own format. Air Canada (Gogo) stores the raw portal data as change-only JSON Lines: the first line is the full reading, later lines hold only the fields that changed. Your device's IP/MAC address is never saved. American Airlines stores the Viasat flight feed plus the route's airport locations (looked up once from the portal) in the same change-only format. Its feed has no vertical speed, so climb/descent is worked out from the altitude change over the last minute (and saved too).
  • mapdata/ — map outlines from Natural Earth, downloaded on first run.

The map draws the flown path from history (solid red). Where there is no history, such as before recording started or during gaps over 60 s, it draws an estimated shortest-path line between the known points (dashed red).

Adding an airline

Providers live in src/air_status/providers/. A provider:

  • fetch() — gets a raw reading from its portal,
  • parse(reading) — turns it into the shared FlightStatus (models.py),
  • history(directory) — returns its FlightHistory (flightlog.py), which decides how readings are written and read back. Reuse ChangeLog for change-only JSON Lines, or implement your own format.

Auto-detect (the default, -p auto) asks every provider's portal at once via detect() and uses the first that returns flight data. The default detect() is "fetch and parse succeed"; override it when portals are shared (Gogo providers also check airline_code).

Same Wi-Fi system as an existing provider (e.g. another Gogo/Intelsat airline): subclass it and set id, name and airline_code, like aircanada.py. Then add an instance to PROVIDERS in providers/__init__.py.

Tests and lint

pytest
ruff check .
ruff format .

GitHub Actions (.github/workflows/ci.yml) runs the same lint plus tests on Python 3.9–3.14 for every push to main and every pull request.

Releasing

  1. Bump __version__ in src/air_status/__init__.py and commit.
  2. Tag and push: git tag v0.2.0 && git push origin v0.2.0.

.github/workflows/release.yml checks the tag matches the version, runs lint and tests, builds the package, publishes it to PyPI (trusted publishing, no token) and creates a GitHub release with the built files.

License

MIT, see LICENSE.

Metadata

Release files for air-status 0.1.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for air-status 0.1.1
File Size Uploaded Provenance Actions
air_status-0.1.1.tar.gz 25.4 kB With provenance Details for air_status-0.1.1.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for air-status 0.1.1
File Interpreter ABI Platform Actions
air_status-0.1.1-py3-none-any.whl Python 3 none any Details for air_status-0.1.1-py3-none-any.whl

Total release size: 49.9 kB

Release files / air_status-0.1.1.tar.gz

Download URL air_status-0.1.1.tar.gz
Size 25.4 kB
Tags Source
SHA-256 checksum
How to use checksums
6c6263d30c65a00b166e9c4bf74eebe40bfed2af419651a17c09da221dd8ae1b
BLAKE2b-256 checksum
How to use checksums
d7999b7c9ca982e870435907bb851e0ea2317827e190de170fd8e8ac3655e082
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 7, 2026.

Transparency log

Release files / air_status-0.1.1-py3-none-any.whl

Download URL air_status-0.1.1-py3-none-any.whl
Size 24.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
1b50bc45cf6a03765b0927d7ab17f1c951e3e112cf3afbdcdb9281d4e3f2c43c
BLAKE2b-256 checksum
How to use checksums
3b17266c27277d62167b2b214f915a12481a6726acacce869edad3af310e7553
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 7, 2026.

Transparency log

Security for air-status 0.1.1

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

Both files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for air_status-0.1.1.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 7, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.1.1 This release

2 release files Full provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page