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.
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 sharedFlightStatus(models.py),history(directory)— returns itsFlightHistory(flightlog.py), which decides how readings are written and read back. ReuseChangeLogfor 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
- Bump
__version__insrc/air_status/__init__.pyand commit. - 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)
| 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)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| 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 logRelease 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 logSecurity 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.
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 logA 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.