Before
One SDR per decoder. Incompatible JSON. A different CLI and quirks for every mode. GPL all the way down.
a zoo of toolsOpen-source · Airframes · v0.21
xng is a single native binary that decodes ACARS, VDL2, HFDL, satcom, Iridium, AIS, ADS-B and a dozen more modes — replacing a whole zoo of single-purpose tools with one capture, one message model, and one set of outputs.
Why xng
The radio-monitoring world is a patchwork of brilliant single-purpose tools — acarsdec, dumpvdl2, dumphfdl, JAERO, gr-iridium, AIS-catcher, dump1090 — each its own process, its own dongle, its own output format. xng collapses all of it into one tested, permissively-licensed application.
One SDR per decoder. Incompatible JSON. A different CLI and quirks for every mode. GPL all the way down.
a zoo of toolsOne capture feeds many channels. One normalized message. One set of outputs that work for every mode at once.
one binaryA live web map, an interactive TUI, an auto-scanner, and native Airframes feeding the old tools never had.
next-generationModes
Eight flagship modes are validated off-air and fenced by CI regression gates; a dozen newer cores are spec-anchored and climbing the same ladder. Each is its own crate — and every one feeds the same outputs.
ARINC 618 with the full application layer — ADS-C, CPDLC as readable text, OOOI, MIAM. Many channels per capture.
118–137 MHz · VHFACARS-over-AVLC and full ATN-B1: protected CPDLC, CM logon, X.25/CLNP. Beats dumpvdl2 frame-for-frame.
136.6–137 MHz · D8PSKARINC 635 squitters, logons, and mapped aircraft positions with over-the-air system-table persistence.
2.8–22 MHz · HFJAERO-class P-channel 600/1200 bps and 10.5 kbps OQPSK — ACARS, ADS-C, CPDLC, control SUs over satellite.
1545–1547 MHz · L-bandNCS TDM frames and EGC SafetyNET/FleetNET — maritime safety text with geographic-area decode.
1537–1542 MHz · L-bandRing alerts with live sat positions, IBC/ITL, ACARS over SBD, pager, voice classification. Out-decodes gr-iridium.
1616–1626.5 MHz · DQPSKNMEA AIVDM plus field decode for types 1–27, Inland-AIS, SART/MOB/EPIRB distress, weak-signal coherent demod.
161.975 / 162.025 MHzCPR positions, Comm-B registers, ACAS RA, TIS-B/ADS-R. SBS + Beast out, native 2.4 MS/s on a plain RTL-SDR.
1090 MHz · Mode SADS-B downlink and FIS-B weather uplink with Reed-Solomon FEC. Validated live off-air.
978 MHzVaisala RS41 de-whitening, RS-FEC, and STATUS/PTU/GPS — track weather balloons as they climb.
~400–406 MHzCCIR 476 / SITOR-B with 4-of-7 and FEC-B framing — maritime safety broadcasts, validated on real USCG traffic.
518 / 490 kHzTen more decode cores wired to --mode, spec-anchored and growing toward off-air validation.
paging · rail · beaconsWhat you get
Because every mode shares the same core, the conveniences apply everywhere at once.
A single RTL-SDR can watch a dozen ACARS channels at once. Modes that share a band share the capture — no more one-dongle-per-decoder.
polyphase channelizerEvery mode emits the same normalized message, so every output — console, JSON, Airframes, Prometheus, maps — works identically for all of them.
xng-typesADS-C positions and CPDLC render as readable text whether the ACARS arrived over VHF, VDL2, HFDL, Aero, or Iridium SBD.
ARINC 622 · CPDLCPer-decoder feeding with auto-suffixed station IDs, plus acarsdec/dumpvdl2-compatible output so your existing pipeline just works.
--feed-airframesRun --http for a dark dashboard of aircraft and vessels merged across modes — and a drop-in tar1090 / AIS-catcher data API.
--http :8080Not sure what is receivable? xng scan and xng survey sweep the bands and print a ready-to-paste config. The TUI runs zero-config.
scan · survey · tuiQuickstart
It looks intimidating — 21 modes, a dozen subcommands. It is not. Plug in an RTL-SDR, let the scanner find traffic, and watch it stream. You can try the whole pipeline on a recorded IQ file with no hardware at all.
Open the quickstartGrab a prebuilt binary, the .deb, or the Docker image. No Rust toolchain required to run it.
sudo apt install ./xng_0.21.0_arm64.deb
List your radios, then let the scanner sweep the bands and tell you what is receivable.
xng scan --sdr driver=rtlsdr --modes acars,vdl2,ais
Open the interactive TUI — message list, detail pane, spectrum, and waterfall, zero config.
xng tui --sdr driver=rtlsdr --mode acars
Point a decode session at the network with your station ID and you are contributing.
xng listen --feed-airframes --station-id XX-KSEA-1
The headline recipe
This is the whole thing: capture two ACARS channels from one RTL-SDR, decode the full application layer, and feed it straight to Airframes.
xng listen --sdr driver=rtlsdr -r 2400000 -c 131.500M \
--channels 131.550,131.725 \
--feed-airframes --station-id XX-KSEA-1Install
Prebuilt binaries and a Docker image are published on every release, so most people never touch a compiler. Want to build it anyway? One cargo command.
# Debian / Ubuntu / Raspberry Pi
sudo apt install ./xng_0.21.0_arm64.deb
# Docker (multi-arch)
docker run --rm ghcr.io/airframesio/xng:latest --version
# From source
cargo build --releaseFull instructions — runtime dependencies, native Airspy backends, building on macOS — are in the installation guide.
xng is dual-licensed MIT or Apache-2.0. Its decode cores are clean-room from public ICAO, ARINC, ITU-R and ETSI specs, or ported from permissively-licensed projects with attribution. Every benchmark is fenced by a CI gate, and every crate documents exactly where its knowledge came from.