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.

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

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.
  • 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.2.10

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.2.10
File Size Uploaded
flight_tracer-0.2.10.tar.gz 48.5 kB Details

Built distribution (wheel)

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

Total release size: 86.3 kB

Release files / flight_tracer-0.2.10.tar.gz

Download URL flight_tracer-0.2.10.tar.gz
Size 48.5 kB
Tags Source
SHA-256 checksum
How to use checksums
0982b545ff727fb4660d4ebfab82e64111c5c743b7860bdef7e7ad17a651996d
BLAKE2b-256 checksum
How to use checksums
bcc9b51115ec75a231671ecd1a6248be5e9a1acff69f3cad8fb86c25171ca301
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.2.10-py3-none-any.whl

Download URL flight_tracer-0.2.10-py3-none-any.whl
Size 37.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
ef80f1c58f1314e0824ffbee53582cd9d6eb08a8cf534b568564905c2b6e856a
BLAKE2b-256 checksum
How to use checksums
b62731762ac2436ce35ce9ef2bbf83ef96075cd2d3f2ae29fe5f44add8f6c935
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

0.3.1

2 release files

0.3.0

2 release files

This release

0.2.10 This release

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