What's new in v0.21.0
This is a big one. v0.21.0 more than doubles the number of supported modes
(8 → 20) — twelve brand-new decoders spanning aviation, maritime, rail,
paging, and safety beacons — adds deep protocol decoding across every existing
mode, and rebuilds how xng feeds Airframes and presents data on the dashboard.
258 files changed, ~65k lines.
12 new decode modes
| Mode | What it decodes |
|---|---|
| UAT 978 MHz | ADS-B + FIS-B (wideband CPFSK front end), synthesized onto 1090 for tar1090/readsb |
| FLEX paging | Motorola FLEX 1600 / 3200 / 6400 bps 2- and 4-FSK, automatic rate detection |
| POCSAG paging | multi-baud auto-detect, spec-correct numeric + alphanumeric |
| APRS | AFSK1200 / AX.25, Mic-E, compressed, telemetry (PARM/UNIT/EQNS/BITS), all-region freqs, space/ISS reception with TLE satellite correlation |
| COSPAS-SARSAT 406 MHz | distress-beacon FGB decode (biphase-L, real off-air polarity) |
| NAVTEX | CCIR 476 4-of-7 alphabet, FEC-B time-diversity, ZCZC message decode |
| DSC | CCIR 493 MF/HF FSK, DX/RX time diversity, structured message decode |
| RS41 radiosonde | GFSK demod, RS(255,231) FEC, frame/sub-block decode |
| ADS-L | EASA SRD860 i-Conspicuity (2-FSK / Manchester) |
| ATCS | rail Spec-200 HDLC/LAPB deframer + Layer-3 packet decode |
| EOT / HOT | rail End/Head-of-Train telemetry |
| VDES | ITU-R M.2092-1 ASM application payloads (DAC=1 + DAC=200) |
Each ships with an IQ front end, a spec-faithful modulator for loopback tests,
vendored real-RF fixtures wired into the bench gate, and a PROVENANCE.md.
Deeper decoding in the existing modes
- Mode S / ADS-B — surface movement (TC5-8), Gillham + geometric altitude
(TC9-18), airborne velocity (TC19), target state (TC29), operational status
(TC31), aircraft/emergency status (TC28); Comm-B BDS 1,0 / 1,7 / 3,0 (ACAS RA)
/ 4,4 / 4,5 (MRAR/hazard met) / 6,2; Mode A/C reply decode; DF18 CF source
tagging (TIS-B / ADS-R / non-ICAO); DF19 military, DF24-27 Comm-D ELM;
graduated position trust; version-aware NUCp/NIC/NACv/SDA; density/penalty BDS
scoring; single-bit CRC repair. - VDL Mode 2 — full ATN upper-layer PER, Context Management, ACSE, COTP TSDU
reassembly, CLNP multipart, X.25 (RESTART / SNDCF), complete XID parameter set,
IDRP, ES-IS, expanded CPDLC argument coverage. - HFDL — full HFNPDU/LPDU record decode, aircraft position + ICAO cache,
persistent system table with ground-station roster, per-burst SNR/CFO, Viterbi
FEC-correction count. - Inmarsat Aero — coherent burst demod with real FEC-correction count, P/R/T
SU classifier, P-channel superframe-lock + AFC/DCD state machine, log-on/off
and call-announcement control SUs, physical-channel tagging. - Inmarsat STD-C / EGC — RRC matched filter, EGC geographic-area geometry,
LES/NCS operator + ocean-region tables, many signalling-channel field decodes,
ITA2/Baudot text. - AIS — multi-fragment AIVDM reassembly + per-MMSI tracker, Class A
kinematics, types 4/5/11/18/19/21(AtoN)/24, DAC=1 (IMO SN.1/Circ.289) and
DAC=200 Inland ASM, SOTDMA/ITDMA radio state, SART/MOB/EPIRB distress tagging. - ACARS — OOOI times + airports, free-text position → lat/lon, winds-aloft
(4J), H1 families (#CFB maintenance, FPN flight plans, 5Z), remaining FANS-1/A
CPDLC argument shapes, raw MIN + downlink sequence, syndrome-table FEC,
reassembly status (assstat). - Iridium — soft-decision (Chase-2) BCH for weak frames, deeper IBC / LCW /
ISY / GSM-L3 decode, PPP-PAP + HTTP Basic-Auth credential recovery from IP
frames, iri_time re-epoch (LBFN roll) fix.
Outputs, feeding & dashboard
- Per-decoder, per-port Airframes feeding — each mode reaches Airframes over
its native legacy port: ACARS via acarsdec UDP, VDL2 via a new dumpvdl2
decoded:jsonfeed (UDP:5552/ TCP:5553, verified field-for-field
against dumpvdl2 2.6.0); everything else via asf-2.0. Per-mode enable/disable
and station-id override. - Geo export —
/data/export.{geojson,gpx,kml}(aircraft, vessels, beacons,
Iridium mobile-terminal fixes — current position + trail). - Cross-mode distress surface on
/api/state— ADS-B 7500/7600/7700 +
emergency, AIS SART/MOB/EPIRB, STD-C distress, DSC distress, every
COSPAS-SARSAT 406 beacon. - Beast / SBS synthesis for UAT + HFDL positions (DF17 native; DF18 with the
correct CF preserving TIS-B / ADS-R / non-ICAO provenance; TC19 velocity
frames) with a monotonic 12 MHz sample-clock MLAT counter. - readsb-schema data API —
/data/aircraft.json(with provenancetypeand
incremental?since=<unix>) and/data/receiver.json. - Prometheus — per-ACARS-label message counter and per-channel FEC-corrected
counter; station mode now serves one shared metric set (station/metrics
previously read all zeros). - Web dashboard — entity-type tabs (flights, ships, beacons, pagers, EOT
trains), per-entity and show-all position trails, a mode-aware layer control,
pager message history + resizable detail pane, receiver-position pin,
antimeridian-safe trails, color-emoji icons, and an XSS fix on entity rows.
DSP & internals
- Root-raised-cosine matched-filter design shared in
xng-dsp; narrow-passband
DDC cutoff fix (restored live NAVTEX/DSC decode); new per-mode IQ front ends. - Real-RF bench fixtures added for the new modes and wired into the regression
gate.
Reliability
- Two adversarial
/code-reviewpasses hardened the new surface: a VDL2
multi-block reassembly feed-loss, Prometheus label escaping + CRC-gated
cardinality, a readsb-faithful provenance ranking (notypeflip-flop), AIS
rate/dedup ordering, and ACARS noise-floor recovery.
Full per-mode detail is in the README
and docs/notes/.
Full diff: v0.20.0...v0.21.0.
xng is a single native decoder for the radio side of aviation
and maritime data: ACARS, VDL Mode 2, HFDL, Inmarsat Aero (L/C),
Inmarsat STD-C/EGC, Iridium (ring alerts, broadcasts, ACARS over
SBD with wideband burst hunting), AIS, and Mode S/ADS-B — one CLI,
every output (console, JSON/JSONL, acarsdec-compatible UDP,
Airframes feeding, Prometheus, asf-2.0 gRPC/QUIC), and a built-in
application layer (ADS-C, CPDLC rendered as text, media advisory).
Every decode core is validated against real off-air recordings or
reference-implementation test vectors, vendored into CI. The VHF
ACARS chain is validated end-to-end into production Airframes from
a live station.
Assets
| Asset | Platform |
|---|---|
xng-*-x86_64-unknown-linux-gnu.tar.gz |
Linux x86_64 |
xng-*-aarch64-unknown-linux-gnu.tar.gz |
Linux arm64 (Pi 4/5 64-bit) |
xng-*-aarch64-apple-darwin.tar.gz |
macOS Apple Silicon |
xng_*.deb |
Debian/Ubuntu packages (x86_64 + arm64) |
Intel macOS: build from source (GitHub retired its free Intel
macOS runners) — brew install soapysdr airspy airspyhf protobuf && cargo build --release --features airspy,airspyhf.
Binaries are built with SoapySDR plus the native Airspy backends;
they need libsoapysdr (and libairspy/libairspyhf for native
Airspy) at runtime — the .deb declares these. Multi-arch Docker
images (amd64/arm64/armv7) are published to
ghcr.io/airframesio/xng for the same tag.
Quick start:
xng devices
xng scan --sdr driver=rtlsdr --gain 28 --modes acars,vdl2,ais
xng survey --sdr driver=rtlsdr --mode acars --tune-gain
xng listen --sdr driver=rtlsdr --mode acars -r 2400000 -c 130.940M \
--channels 130.025,131.550,131.725 \
--feed-airframes --station-id XX-YOUR-STATION