WTF ADS-B field notes

About WTF ADS-B

Where the observations come from, what receives them and how we decide what they mean.

WTF ADS-B starts with aircraft radio broadcasts collected near Oakland County International Airport (PTK), Michigan. It is an independent receiver project.

We look for observations worth explaining, from repeated loops and uncommon aircraft types to numbers that disagree. Each event shows the measurements behind it and explains what they support. A flight pattern alone cannot tell us why an aircraft was there.

How the data arrives

Aircraft transmit digital messages that can include identity, position, altitude and speed. Our radios listen on 1090 MHz and 978 MHz, the two frequencies used for ADS-B in the United States. The 978 MHz system is called UAT, short for Universal Access Transceiver.

The receiver software also accepts multilateration (MLAT) position estimates from cooperating receivers. Articles distinguish those estimates from positions broadcast by an aircraft. Reception gaps and missing fields limit what we can reconstruct; the journal is a selection of observations, not a complete record of traffic around PTK.

The hardware

  • Two Nooelec NESDR SMArt v5 USB radios, one assigned to 1090 MHz and the other to 978 MHz. These are software-defined radios: the computer decodes the signals they receive.
  • A Nooelec SAWbird+ ADS-B amplifier and filter, with separate channels for 1090 MHz and 978 MHz. It amplifies signals in those bands and filters interference outside them. Product listing.
  • Two 26-inch antennas, each rated at 5.5 dBi gain.

The software

  • Ultrafeeder brings together the 1090 MHz receiver tools. Its readsb decoder turns radio messages into aircraft records, and tar1090 provides a map and access to saved tracks for analysis.
  • dump978 decodes the separate 978 MHz UAT receiver.
  • Prometheus stores operating metrics, and Grafana helps us inspect receiver performance and data gaps.
  • Custom Python tools examine saved observations, group related detections and retain their evidence in SQLite. A rare type match, a track pattern and a questionable reading are different findings, so their explanations use different checks.
  • The publishing stack uses Ghost with a custom theme. Services run in Docker Compose; the website is hosted on DigitalOcean, with Caddy serving web requests. Administration uses Tailscale.

Writing and review

Detection tools identify candidates. The OpenAI API can draft explanations from selected evidence. Received measurements, calculations and aircraft database matches stay separately labeled, and factual claims need review before publication. Current registration or type matches may differ from an aircraft's historical assignment. A database association does not tell us who was aboard.

Aircraft on a map

Maps show the saved aircraft positions, centered on the recorded path. Topographic backgrounds come from USGS The National Map, with roads, water, place names and terrain shading where available. Map services and data are available from the U.S. Geological Survey, National Geospatial Program. We save each background with the track image so the map works without a live mapping service. It is a current reference map; it does not show what the ground looked like on the flight date.

Nearby-place headings and simplified fallback maps use public geography from Natural Earth, Michigan place locations from the 2025 U.S. Census Gazetteer, and airport locations from OurAirports. Census points mark a place's internal reference location, which may differ from its downtown. Place names and airports give geographic context; they do not establish where a flight began, landed or was headed. These maps are for exploring the observations.

The scale bar shows approximate ground distance at the map's middle latitude. Recorded path length adds the distances between accepted positions in each connected segment. Gaps, missed turns and position errors can affect that number, so it describes the plotted segments rather than the full flight.

For tracks with a replay, the moving marker follows the saved positions. Movement between nearby reports is interpolated; the time, speed and altitude readings belong to the saved report shown. Playback hides the marker across gaps, and unknown readings stay blank. Altitude with an unspecified reference is labeled as such and cannot be read as height above the ground.

The receiver's exact position, marker and coverage rings stay private. Gaps in the observations remain visible, and a selected part of a flight is labeled as such.

Aircraft type photos are labeled as representative images. Their captions do not identify them as the aircraft observed. Photo credits and licenses accompany the images.

Support the project

If you find these observations useful, you can support WTF ADS-B on Buy Me a Coffee.

How publication works

Qualifying observations publish automatically after evidence and privacy checks. Each week, one selected observation receives additional sourced background. The archive describes this selected record; it does not establish complete receiver history.

Read the field guide