Skip to main content

FlightTracer

Turn an aircraft tail number, ICAO hex, or ADS-B Exchange link into a flight map, altitude and speed charts and reusable data.

pip install flight-tracer
flight-tracer trace --icao a40442

No date means recent activity. For a historical flight, add --date YYYY-MM-DD.

Example flight map over Los Angeles, with start and last-location markers

Example: An LAPD helicopter, N224LA, patrolling on an early Saturday morning.

Start with what you have

You have Command
ICAO hex flight-tracer trace --icao a40442
U.S. tail number flight-tracer trace --n-number N358TV
Historical date flight-tracer trace --icao a40442 --date 2026-09-16
ADS-B Exchange link flight-tracer trace --url "https://globe.adsbexchange.com/?icao=a9a1ad&showTrace=2020-01-26"
Tail number to look up flight-tracer resolve --n-number N358TV

Tail-number lookup requires pip install "flight-tracer[faa]". A callsign such as FDX9756 cannot currently be used as an input; first find the aircraft's ICAO hex or tail number for that flight and date.

Common recipes

Fetch a date range and render every leg

flight-tracer trace --n-number N868FD \
  --start 2026-09-26 --end 2026-09-27 --leg all

Both dates are included. Each detected leg gets its own folder, plus an overview map. Use --leg 1 for one leg or --leg latest for the most recent detected leg.

Select a time window

flight-tracer trace --icao a9a1ad --date 2020-01-26 \
  --after 2020-01-26T09:00:00 --before 2020-01-26T10:00:00 \
  --window-timezone America/Los_Angeles --timezone America/Los_Angeles

Bounds are inclusive. Timestamps without an offset default to UTC unless --window-timezone is set. --timezone controls display separately. For older archives, --infer-legs can optionally detect explicit ground stops. See the detailed January 26 case study.

Make a portrait map with local times

flight-tracer trace --icao a40442 --date 2026-09-16 \
  --aspect-ratio 9:16 --timezone America/Los_Angeles

Portrait outputs are 1080 × 1920. Local times appear alongside UTC; exported timestamps keep their full precision.

Change the basemap and gap threshold

flight-tracer trace --icao a40442 --date 2026-09-16 \
  --background osm --gap-minutes 2

Connections across tracking gaps longer than two minutes are dashed. The default threshold is five minutes. The default basemap is esri-light; see all map styles, including Mapbox with your own token.

Add a headline and label locations

flight-tracer trace --icao a40442 --date 2026-09-16 \
  --title "LAPD helicopter circles the San Fernando Valley" \
  --label "34.2098,-118.4898,Van Nuys Airport" \
  --label "34.2597,-118.4134,Whiteman Airport"

--title and --dek replace the map's generated headline and time span. Each --label takes latitude, longitude and text, and the map widens to include it. On multi-leg runs, the title and dek go on the overview and labels go on every map. They're saved in annotations.json, so render reuses them.

Re-render a saved run

flight-tracer render data/a40442_2026-09-16_2026-09-16 \
  --background osm --aspect-ratio 9:16 --output variants/portrait

Redraws images from the saved trace.csv without fetching the flight again. Data files are not rewritten. Saved annotations carry over; pass --title, --dek or --label to replace them.

Save your usual settings as presets

# ~/.config/flight-tracer/presets.toml
[default]
timezone = "auto"

[social]
aspect-ratio = "9:16"
output = "~/Desktop/social"
flight-tracer trace --icao a40442 --preset social
flight-tracer presets   # show the file's location and contents

[default] always applies. --preset NAME adds a named table on top, and flags override both. Keys are spelled like the flags. See the CLI reference for what presets can set.

Export data without charts

flight-tracer trace --icao a40442 --date 2026-09-16 \
  --no-plots --formats csv,geojson --output exports

What you get

A single-leg run writes:

data/a40442_2026-09-16_2026-09-16/
├── map.png           # Route, start and last location, dates, attribution
├── altitude.png      # Altitude over time
├── speed.png         # Ground speed over time
├── trace.csv         # Recorded points and decoded fields
├── points.geojson    # Point geometries
├── line.geojson      # Routes by leg
├── summary.json      # Aircraft metadata, times and statistics
├── selection.json    # Time bounds, leg selection and ground-filter settings
└── annotations.json  # Custom title, dek and location labels, reused by render

For several detected legs, the root contains the full data and overview.png; subfolders such as leg1_FDX9756/ contain each leg's data and charts. Interactive runs ask which leg to use; --leg all skips the prompt. Non-interactive runs default to all legs.

Running the same aircraft/date selection again writes to the same folder. Use a different --output directory to keep variants.

Installation and upgrades

Python 3.9 or newer is required. Optional extras add tail-number lookup and automatic timezone lookup:

pip install "flight-tracer[faa,tz]"
flight-tracer --version
flight-tracer trace --help

Quote extras such as [faa,tz] in zsh. To upgrade an existing installation:

pip install --upgrade flight-tracer

For local development, run this from the repository after installing dependencies:

pip install --no-deps -e .

Understand the trace

  • Last location means last received position, not a confirmed landing or crash site.
  • Check the data-quality notes. Each run reports tracking gaps, stale and multilaterated positions, missing metadata and how leg boundaries were found; the full set is in summary.json.
  • Dashed segments approximate missing coverage. They do not establish the path flown. Exported route geometries include connections without dash styling.
  • Legs use the archive's boundary flags. Older archives may lack them. Opt-in --infer-legs uses explicit ground stops and labels its results as estimates; otherwise use a time window. Seven-field historical records are supported.
  • Date Line crossings are handled automatically. Maps wrap around the Pacific where appropriate; exported routes split at ±180°.
  • Altitude and speed are raw, uncorrected values. Missing metadata stays empty. Times default to UTC; local time is opt-in.

More examples and reference

Guide What you'll find
Recipes Historical links, older archives, ground points, timezones and troubleshooting
Map styling Aspect ratios, basemaps, Mapbox tokens, OSM caching and tracking gaps
Python examples Fetching, selecting time windows, plotting and working with fleets
CLI reference Options, defaults and date precedence
Changelog Release history
Backlog Prioritized feature ideas and maintenance work

Contributing and releasing

Run checks with python -m pytest tests/. tests/test_visual.py compares rendered maps and charts with the reference images in tests/baseline_images/. If a change to the output is intended, regenerate them with FLIGHT_TRACER_UPDATE_BASELINES=1 python -m pytest tests/test_visual.py and review the new images before committing. Failed comparisons leave the new render and a diff in tests/visual_results/. See PUBLISH.md for the release workflow.

Credits and license

Flight data comes from ADS-B Exchange. Consider subscribing or contributing data. FAA tail-number resolution uses hangarbay. Keep the basemap attribution in exported maps.

FlightTracer is released under CC0 1.0. The bundled Inter typeface (flight_tracer/fonts/) is by The Inter Project Authors and keeps its own SIL Open Font License 1.1.

Metadata

Release files for flight-tracer 0.4.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 flight-tracer 0.4.1
File Size Uploaded
flight_tracer-0.4.1.tar.gz 469.6 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for flight-tracer 0.4.1
File Interpreter ABI Platform
flight_tracer-0.4.1-py3-none-any.whl Python 3 none any Details

Total release size: 920.0 kB

Release files / flight_tracer-0.4.1.tar.gz

Download URL flight_tracer-0.4.1.tar.gz
Size 469.6 kB
Tags Source
SHA-256 checksum
How to use checksums
417286e07cf56e0eddb518b838d7090c905e9b4f630c606ec57547b2d2835566
BLAKE2b-256 checksum
How to use checksums
d83e0da1308f56cbbf48ac230c0951e39b8ff9432318061ce1bea9992d6eaa56
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.8

Release files / flight_tracer-0.4.1-py3-none-any.whl

Download URL flight_tracer-0.4.1-py3-none-any.whl
Size 450.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
6c6e898507b1f813215f69ea6d8998d9b6fb8b92baf8b0d031dcac1ccbca7e99
BLAKE2b-256 checksum
How to use checksums
e8a2d8f29b0872aa90dfe4545f1790e64384c2bf6fe9e518f1542d82854760fa
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.8

Release history Release notifications | RSS feed

0.4.2

2 release files

This release

0.4.1 This release

2 release files

0.4.0

2 release files

0.3.2

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.9

2 release files

0.2.7

2 release files

0.2.6

2 release files

0.2.4

2 release files

0.2.3

2 release files

0.2.2

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.7

2 release files

0.1.6

2 release files

0.1.5

2 release files

0.1.4

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

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