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.

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

Metadata

Release files for flight-tracer 0.3.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.3.1
File Size Uploaded
flight_tracer-0.3.1.tar.gz 57.0 kB Details

Built distribution (wheel)

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

Total release size: 101.2 kB

Release files / flight_tracer-0.3.1.tar.gz

Download URL flight_tracer-0.3.1.tar.gz
Size 57.0 kB
Tags Source
SHA-256 checksum
How to use checksums
a9a7102ec9b74458910d0c9c6786eae23d2ca15a839c44e4ed4befb86248d93f
BLAKE2b-256 checksum
How to use checksums
378f634e1a45a64e2b7f6b0d629eeb3ed1062166b60971a50c71c006220f1420
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.7

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

Download URL flight_tracer-0.3.1-py3-none-any.whl
Size 44.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
c5e7998a0fc77ba753fca75297ce85c7741b5fa8726b99a9ecd7b3ee780e8638
BLAKE2b-256 checksum
How to use checksums
8a8d227e41f9261d3eb807fa7109983029df3565d7fbc4949c4f185e912ec2aa
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.7

Release history Release notifications | RSS feed

0.4.2

2 release files

0.4.1

2 release files

0.4.0

2 release files

0.3.2

2 release files

This release

0.3.1 This release

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