Open-source · Airframes · v0.21

One decoder for the whole radio stack.

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.

ACARSVDL2HFDLSATCOMIRIDIUMAISADS-B
ACARS131.550 MHzUAL1422 · N27957 · OOOI OUT KSFO 0312ZVDL2136.975 MHzDLH456 · D-AIXP · CPDLC LOGON ACCEPTEDHFDL8.927 MHzQFA8 · VH-ZNJ · POS 37°42S 144°50E FL380ADS-B1090 MHzSWA1881 · A2C4F1 · FL360 · 448 kt GSAIS162.025 MHzMSC ARIA · IMO 9619452 · 18.4 kn · 094°TADS-CL-bandWAYPOINT REPORT · FL370 · M.84 · ETA 0455ZIRIDIUM1626.104 MHzIRA · SV112 · BEAM 27 · RING ALERTSTD-C1537.70 MHzEGC SafetyNET · NAVAREA XII · GALE WARNINGUAT978 MHzN512GA · FIS-B METAR KAPA · FL085NAVTEX518 kHzZCZC · USCG · MARINE SAFETY BROADCASTACARS130.025 MHzBAW287 · G-XWBA · WX REQ EGLL ATISSONDE404.5 MHzRS41 · S4920871 · 47.5N 122.3W · 18,420 m
21Signal modes from one binary
1SDR can watch many channels
25Rust crates, shared decode core
MITOr Apache-2.0 — permissive

Why xng

Stop running a decoder per mode.

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.

Before

One SDR per decoder. Incompatible JSON. A different CLI and quirks for every mode. GPL all the way down.

a zoo of tools

After

One capture feeds many channels. One normalized message. One set of outputs that work for every mode at once.

one binary

And then some

A live web map, an interactive TUI, an auto-scanner, and native Airframes feeding the old tools never had.

next-generation

Modes

Everything it can hear.

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.

ACARS● off-air

VHF ACARS

ARINC 618 with the full application layer — ADS-C, CPDLC as readable text, OOOI, MIAM. Many channels per capture.

118–137 MHz · VHF
VDL2● off-air

VDL Mode 2

ACARS-over-AVLC and full ATN-B1: protected CPDLC, CM logon, X.25/CLNP. Beats dumpvdl2 frame-for-frame.

136.6–137 MHz · D8PSK
HFDL● off-air

HFDL

ARINC 635 squitters, logons, and mapped aircraft positions with over-the-air system-table persistence.

2.8–22 MHz · HF
AERO● off-air

Inmarsat Aero

JAERO-class P-channel 600/1200 bps and 10.5 kbps OQPSK — ACARS, ADS-C, CPDLC, control SUs over satellite.

1545–1547 MHz · L-band
STD-C● off-air

Inmarsat STD-C / EGC

NCS TDM frames and EGC SafetyNET/FleetNET — maritime safety text with geographic-area decode.

1537–1542 MHz · L-band
IRIDIUM● off-air

Iridium

Ring alerts with live sat positions, IBC/ITL, ACARS over SBD, pager, voice classification. Out-decodes gr-iridium.

1616–1626.5 MHz · DQPSK
AIS● off-air

AIS

NMEA AIVDM plus field decode for types 1–27, Inland-AIS, SART/MOB/EPIRB distress, weak-signal coherent demod.

161.975 / 162.025 MHz
ADS-B● off-air

Mode S / ADS-B

CPR 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 S
UAT● off-air

UAT 978

ADS-B downlink and FIS-B weather uplink with Reed-Solomon FEC. Validated live off-air.

978 MHz
SONDE● off-air

Radiosondes

Vaisala RS41 de-whitening, RS-FEC, and STATUS/PTU/GPS — track weather balloons as they climb.

~400–406 MHz
NAVTEX● off-air

NAVTEX

CCIR 476 / SITOR-B with 4-of-7 and FEC-B framing — maritime safety broadcasts, validated on real USCG traffic.

518 / 490 kHz
+10◐ growing

FLEX, POCSAG, APRS, DSC, SARSAT, EOT, ATCS, ADS-L, VDES…

Ten more decode cores wired to --mode, spec-anchored and growing toward off-air validation.

paging · rail · beacons

What you get

More than a pile of decoders.

Because every mode shares the same core, the conveniences apply everywhere at once.

01

One capture, many channels

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 channelizer
02

One message model

Every mode emits the same normalized message, so every output — console, JSON, Airframes, Prometheus, maps — works identically for all of them.

xng-types
03

Shared application layer

ADS-C positions and CPDLC render as readable text whether the ACARS arrived over VHF, VDL2, HFDL, Aero, or Iridium SBD.

ARINC 622 · CPDLC
04

Feeds Airframes natively

Per-decoder feeding with auto-suffixed station IDs, plus acarsdec/dumpvdl2-compatible output so your existing pipeline just works.

--feed-airframes
05

Live maps, built in

Run --http for a dark dashboard of aircraft and vessels merged across modes — and a drop-in tar1090 / AIS-catcher data API.

--http :8080
06

Find signals for you

Not 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 · tui

Quickstart

From zero to decoded in minutes.

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 quickstart
  1. Step 1

    Install

    Grab 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

  2. Step 2

    See what is out there

    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

  3. Step 3

    Watch it live

    Open the interactive TUI — message list, detail pane, spectrum, and waterfall, zero config.

    xng tui --sdr driver=rtlsdr --mode acars

  4. Step 4

    Feed Airframes

    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

Two channels. One command. Live on the network.

This is the whole thing: capture two ACARS channels from one RTL-SDR, decode the full application layer, and feed it straight to Airframes.

bashdecode two ACARS channels → Airframes
xng listen --sdr driver=rtlsdr -r 2400000 -c 131.500M \
    --channels 131.550,131.725 \
    --feed-airframes --station-id XX-KSEA-1

Install

Get xng for your station.

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.

bashthree ways to get it
# 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 --release

Full instructions — runtime dependencies, native Airspy backends, building on macOS — are in the installation guide.

Built in the open, by the Airframes community.

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.