All projects

Aviation & Infrastructure Networking

ADS-B Flight Tracker

Self-hosted flight tracking stack with custom visualization and mesh networking across every node.

SDRRTL-SDRRaspberry PiTailscaleLinuxWeb UI

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.

More case studies