Skip to content
← Home

Telemetry · Geospatial · 2026

ADS-B Aircraft Tracker: RF to Spatial Archive

I built a 1090 MHz receiver, PostGIS archive, and browser interface around an RTL-SDR and Raspberry Pi. The archive comes from broadcasts received at my station, without a paid data feed.

Tom Shanks

Loading contacts
One receiver, Denver
Drag to rotate
Scroll to re-plot by altitude

60,000 archived positions. Scroll for altitude; drag to rotate. Denver International shapes the eastern lobes, while terrain limits reception to the west. Component, data packer and the 472 KB contact field are public: spatial-fields/adsb-field

Received messages in snapshot
1.1M+
Aircraft in reference index
520K
Peak measured range
131.92 km

System architecture

An RTL-SDR and Raspberry Pi 3B receive 1090 MHz ADS-B. readsb decodes the broadcasts, and a systemd logger writes the SBS stream to local files. I copy those files to my desktop with rsync over SSH. A resumable Python process ingests new records in batches into PostgreSQL/PostGIS running in Docker.

PostGIS turns latitude and longitude into queryable geometry: aircraft near a point, coverage by bearing, and repeated routes over time. A public 520,000-aircraft index resolves broadcast hex codes into registration, operator, and aircraft type.

Scheduled materialized views precompute traffic density, receiver coverage, and route-pattern queries. The dashboard reads those views instead of scanning millions of raw messages.

FastAPI serves statistics, positions, routes, and range data to a React and Leaflet dashboard. Docker Compose runs the stack in WSL2.


Stack

Hardware

RTL-SDR USB receiver (1090 MHz) · Raspberry Pi (decoder host)

Decoding & ingest

readsb · systemd SBS logger · rsync over SSH · resumable Python ingestion

Data

PostgreSQL + PostGIS · 520K-row aircraft metadata index · materialized views

API

FastAPI (Python) · statistics, positions, routes, receiver range, corridor density, hourly traffic, and aircraft detail

Frontend

React + Vite · Leaflet.js

Deployment

Docker Compose · WSL2 Ubuntu · systemd user services · local network access only


Status and access

This is an archived station dataset, not a live feed. The dashboard stays on my local network, and the full message archive remains in the local database.

The public visualization, packer, and sampled contact field are linked above. The receiver and ingestion code are available on request.