ADS-B aircraft tracking

How to track aircraft with ADS-B

Tools
dump1090-fa, tar1090, RTL-SDR Blog v4, Raspberry Pi OS bookworm
Skill / setup
intermediate · 2–3 hours · ~$110–$165 (RTL-SDR Blog v4 ~$40 + Raspberry Pi 4 2GB ~$45 + 32GB SD ~$10 + 1090 MHz antenna ~$25–$65)
See how it compares to Squelch Deck

Every commercial airliner and most general-aviation aircraft broadcast their position, altitude, callsign, and velocity on 1090 MHz multiple times a second. With a Raspberry Pi, an RTL-SDR, and a tiny whip antenna, you can pull that traffic out of the air and turn it into a live map of every aircraft within a hundred miles of your antenna. This guide sets up dump1090-fa + tar1090 on a Pi, then walks through the antenna and gain tuning that actually drives range.

What you'll have at the end

A web browser at http://your-pi.local/tar1090 showing a map centered on your home, with every aircraft your antenna can hear plotted as a labeled icon — callsign, altitude, speed, heading. Click an aircraft for the full message history; replay session traffic; export to CSV. Behind the scenes, dump1090-fa decodes the 1090 MHz Mode S Extended Squitter messages and pipes them to tar1090's web UI. The whole thing runs as systemd services that come back on reboot.

With a window-sill antenna you'll see 30–80 miles of range. With a $25 commercial 1090 MHz antenna on a 10-foot mast outside, you'll see 150–250 miles routinely and 300+ miles on a good day. The single biggest variable in this guide is your antenna's view of the horizon — everything else is software config.

What you need

Hardware. A Raspberry Pi 4 or Pi 5 (any RAM tier; 2GB is enough). An RTL-SDR Blog v4 (~$40) — works fine for ADS-B, though a dedicated dump1090-tuned dongle (FlightAware Pro Stick, ~$25) has a built-in 1090 MHz bandpass filter that gives you 10–20% more range in noisy RF environments. A 1090 MHz antenna: cheapest option is a $5 quarter-wave whip cut to 6.9 cm (or any short broadband whip will work for testing); the upgrade is a $25 outdoor 1090 MHz collinear or a $60 filtered LNA + antenna combo. Short coax (the higher the better — losses at 1090 MHz are real). A wired Ethernet connection to the Pi.

Software. Raspberry Pi OS bookworm 64-bit. dump1090-fa from FlightAware's official apt repo (handles decoding). tar1090 (community fork of FlightAware's skyview1090 with a better UI). Both are install scripts, no compilation needed.

Time. See the frontmatter at the top of this page. Skill level. Comfortable with SSH and curl | bash install scripts. The actual setup is mostly waiting for apt install to finish.

Step-by-step setup

1. Choose your antenna placement (this is the #1 driver of range)

Before anything else: ADS-B is 1090 MHz, line-of-sight, and obstruction-sensitive. The same Pi + dongle hardware will see 30 miles of range with the antenna sitting on a desk and 250 miles with the same antenna on a 10-foot mast outside. If you're going to spend money anywhere, spend it on antenna placement, not on the dongle.

Best to worst:

  1. Outdoor antenna on a mast above the roofline — clear view to the horizon in all directions
  2. Outdoor antenna at any height — even ground-level outside beats indoors
  3. Window-sill antenna with the window open — beats a window-sill antenna with the window closed
  4. Anywhere indoors, near a window — what most people start with
  5. Center of the house — barely works, signals are mostly attenuated

For a first install, start with option 4 (window-sill, near a window facing the direction of the nearest airport or busy airway), then upgrade once you've confirmed the software side works.

2. Flash and boot the Pi

Flash Raspberry Pi OS bookworm 64-bit to an SD card using Raspberry Pi Imager. Set SSH + Wi-Fi + a hostname (adsb-pi is conventional) in the imager's advanced options. Boot the Pi, find its IP from your router, SSH in.

Update:

sudo apt update && sudo apt upgrade -y

3. Install dump1090-fa from FlightAware's repo

FlightAware maintains a Debian repo with prebuilt packages for dump1090-fa. Use their official install path:

sudo apt install -y wget gnupg
sudo mkdir -p /usr/share/keyrings
wget -qO - https://www.flightaware.com/adsb/piaware/files/packages/pubkey.gpg | sudo gpg --dearmor -o /usr/share/keyrings/flightaware-adsb.gpg
echo "deb [signed-by=/usr/share/keyrings/flightaware-adsb.gpg] http://flightaware.com/adsb/piaware/files/packages bookworm piaware" | sudo tee /etc/apt/sources.list.d/piaware.list
sudo apt update
sudo apt install -y dump1090-fa

The package auto-installs as a systemd service. Plug in the RTL-SDR, then start the service:

sudo systemctl start dump1090-fa
sudo systemctl enable dump1090-fa
sudo systemctl status dump1090-fa

status should show active (running) and recent log lines about message rates. If the service can't find the RTL-SDR, the kernel DVB driver is probably squatting on it — blacklist:

echo 'blacklist dvb_usb_rtl28xxu' | sudo tee /etc/modprobe.d/blacklist-rtl.conf
sudo modprobe -r dvb_usb_rtl28xxu
sudo systemctl restart dump1090-fa

4. Confirm decoded messages with the built-in web UI

dump1090-fa ships its own basic web map at http://your-pi-ip:8080/. Open it on your laptop. If anything is being decoded, you'll see aircraft icons appearing within ~30 seconds. The map's range circle is fixed at 250 nm — anything outside that is being received but not plotted (some antennas can hear 300+ nm).

If no aircraft appear:

  • Check journalctl -u dump1090-fa -f — if message rate is Hz: 0, the dongle isn't decoding (gain too low, no antenna, or wrong antenna for 1090 MHz)
  • If message rate is non-zero but no aircraft on the map: positional traffic might just be sparse — wait a few minutes during daylight hours when commercial traffic is active

5. Install tar1090 (better web UI)

tar1090 is the community-maintained UI most ADS-B enthusiasts use instead of the bundled UI. Single install script from its maintainer:

sudo bash -c "$(wget -nv -O - https://raw.githubusercontent.com/wiedehopf/tar1090/master/install.sh)"

The installer pulls the latest tar1090 from GitHub, drops it under /usr/local/share/tar1090, and sets it up as a systemd timer that pulls fresh data from dump1090-fa every second.

Browse to http://your-pi-ip/tar1090/. You'll see the same map data as the bundled UI, but with a substantially better UX: aircraft trails, altitude-coded colors, range rings centered on your antenna's published position, a sidebar with aircraft details, and CSV / KML export.

6. Tune gain for maximum message rate

dump1090-fa ships with an auto-gain mode that's reasonable but not always optimal. The two values that matter:

  • Gain — the RTL-SDR's RF gain stage. Too low and weak distant aircraft don't decode; too high and you get IMD products and signal overload from nearby aircraft / pagers / other 900–1100 MHz traffic.
  • Sample rate2400000 for RTL-SDR v4 (the only valid value for dump1090-fa is 2.4 MS/s; this is set in the package config and you usually don't change it).

Edit /etc/default/dump1090-fa:

RECEIVER_OPTIONS="--device-index 0 --gain 49.6 --ppm 0"

Common gain values: 40 dB is the default, 49.6 dB is maximum for RTL-SDR v4. Start at 40, increase by 5 dB at a time, and watch the message rate in journalctl -u dump1090-fa. Pick the value that gives the highest message rate — usually somewhere between 38 and 49.6 dB depending on local RF noise.

Restart after each change: sudo systemctl restart dump1090-fa.

7. (Optional) Feed your data to FlightAware for a free Premium account

FlightAware gives volunteer feeders a free Premium account ($40/month value) in exchange for streaming your decoded ADS-B traffic to their network. Install the feeder:

sudo apt install -y piaware
sudo piaware-config allow-auto-updates yes
sudo piaware-config allow-manual-updates yes
sudo systemctl restart piaware

Visit flightaware.com/adsb/piaware/claim while logged into your FlightAware account; it'll auto-detect your feeder. Within a few hours, your account gets upgraded.

Two other aggregators worth considering: ADS-B Exchange (no filtering of military / VIP traffic, community-friendly) and FlightRadar24 (commercial; gives feeders a Business plan equivalent). Each provides their own feeder package and install instructions.

8. Mount and route the antenna

Once the software pipeline is working, this is where you actually gain range. Swap your testing whip for an outdoor 1090 MHz collinear. Mount it as high as you can — even an extra 6 feet matters. Use the shortest possible coax run; if you must do a long run, RG-6 is acceptable but LMR-400 is dramatically better at 1090 MHz.

Re-measure message rate before / after the antenna change. A move from window-sill whip to outdoor mast typically doubles the message rate; from outdoor mast to outdoor-mast-plus-LNA adds another 20–40% on top.

Common gotchas

Aircraft appear in the message log but not on the map. dump1090-fa decodes two ADS-B message types: position messages (which include lat/lon) and non-position messages (callsign, velocity, altitude only). An aircraft has to broadcast at least one position message before it appears on the map. Some older transponders are slow to send position; wait a few seconds.

Range collapses around sunset. Local pagers / GSM traffic / other 900–1100 MHz services are typically louder in the evening. If your message rate cliff-drops at the same time every day, your gain is set too high — the receiver is being saturated by nearby noise. Drop gain by 5–10 dB and re-measure.

RTL-SDR works but message rate is mysteriously low. Either the antenna is detuned (not actually 1090 MHz) or the kernel DVB driver is fighting for the device. Blacklist the driver (step 3 above) and use a known-good 1090 MHz antenna. A quarter-wave whip cut to 6.9 cm is a $1 test that confirms whether the rest of the stack is healthy.

FlightAware claim fails — "feeder not detected." Most common cause: the Pi can't reach the FlightAware servers, usually because the router is doing strict outbound filtering. Confirm with curl https://flightaware.com. If that fails, the network is the problem, not piaware.

Pi 4 USB power issue with multiple dongles. A single RTL-SDR is fine on Pi USB power. Two dongles on a Pi 4 often draws enough to brown out one of them. Use a powered USB hub.

What to do next

Pair this with the airband guide for the full audio + visual experience: hear the aircraft on tower frequency on SDR++ and watch them maneuver on the tar1090 map at the same time. If you have a Pi-based spyserver running for SDR++, the same Pi can host dump1090-fa simultaneously — they use separate dongles but share the host. The ADS-B Exchange forum is the most useful community for tuning the receiver setup, antenna selection, and getting more range. For lower-altitude general-aviation traffic in the US (978 MHz UAT, used by lots of light GA below 18,000 ft), install dump978-fa alongside dump1090-fa with a second RTL-SDR. For a deeper dive into the protocol, the ICAO Annex 10 specification documents the Mode S Extended Squitter format that ADS-B is built on.

Local DIY vs. Squelch Deck

DimensionLocal DIYSquelch Deck
Setup time2–3 hours~1 minute (tap the app)
Hardware cost~$110–$165One device
Ongoing maintenanceOS updates, dependency drift, debugging when it breaksApp updates roll through the Squelch Deck catalog
Customization ceilingTotal — you own the stackBounded by what apps support; you can build new apps
Skill requiredSSH, systemd, antenna placement intuitionTouchscreen
Best forTinkerers who want a permanent always-on receiverPeople who want it to work on a dedicated box
Join the list

Sources we drew from