Aviation & Infrastructure Networking
ADS-B Flight Tracker
Self-hosted flight tracking stack with custom visualization and mesh networking across every node.
The problem
I wanted my own view of the airspace above the house — not someone else's aggregated feed — and I wanted every node in the setup reachable without opening a single inbound port.
How it's built
- RTL-SDR dongle on a Raspberry Pi Zero 2 W decoding 1090 MHz ADS-B
- SSD1306 OLED on the Pi showing live aircraft counts and receiver health
- Setup script that feeds multiple public flight-tracking networks from one receiver
- Tailscale mesh joining VPS, home LAN, and the receiver; a subnet router exposes the LAN to the tailnet
- Web front end rendering traffic in an amber CRT aesthetic over a local coverage map
Architecture
1090 MHz ))) [ RTL-SDR + Pi Zero 2 W ] ──┐
│ OLED status │
└────────────┐ │
▼ ▼
[ home LAN ] <── subnet router ── [ Tailscale mesh ] ──> [ VPS + web UI ]Outcome
A private, fully self-hosted picture of local airspace, with zero inbound firewall exposure — all administration happens over the tailnet.
At a glance
- 1090 MHz
- Live ADS-B decoded on-site
- 0
- Inbound firewall ports opened
- Pi Zero 2 W
- Receiver footprint, OLED health display
Decisions & tradeoffs
Considered: Port-forwarding to reach the receiver remotely
Chose: A Tailscale mesh with a subnet router
Why: Every forwarded port is permanent attack surface on a residential connection.
Tradeoff: Devices must be enrolled in the tailnet before they are reachable at all.
Considered: Using a public tracking site as the front end
Chose: A local web UI over my own coverage data
Why: I wanted my receiver's real coverage, not an aggregated national picture.
Tradeoff: I build and maintain the visualization layer myself.