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 .venv/bin/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
.venv/bin/pip install -e '.[dev]'

Use

.venv/bin/air-status                     # live view, airline detected from the Wi-Fi, saves history
.venv/bin/air-status live -p aircanada --every 10
.venv/bin/air-status live -p american     # American Airlines (Viasat aircraft)
.venv/bin/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

.venv/bin/pytest
.venv/bin/ruff check .
.venv/bin/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.0

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.0
File Size Uploaded Provenance Actions
air_status-0.1.0.tar.gz 25.4 kB With provenance Details for air_status-0.1.0.tar.gz

Built distribution (wheel)

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

Total release size: 49.9 kB

Release files / air_status-0.1.0.tar.gz

Download URL air_status-0.1.0.tar.gz
Size 25.4 kB
Tags Source
SHA-256 checksum
How to use checksums
a3743e21a34d67de4dec7e1b012497cb08239ada666dad90920c02f5322745eb
BLAKE2b-256 checksum
How to use checksums
ef5b0b7d8e2de135e1654400495cd06fd297f921aa86f870678d947e71374b28
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.0-py3-none-any.whl

Download URL air_status-0.1.0-py3-none-any.whl
Size 24.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
e55a44b48a0e85d1c484ba70440df775d45ff1d2f7656d467095b9e23742c8c3
BLAKE2b-256 checksum
How to use checksums
99d9e616e33b62392939aca6947c9a9b3afb34e39f338e21feea34612a7dd297
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.0

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.0.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.0 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