name: sdr-satellite description: "Software-defined radio (SDR) and satellite reception toolkit — what to install, what you can hear from space, and how to compose the open-source stack (SatDump, SatNOGS, GNU Radio, rustradio, satkit). Covers hardware abstraction (SoapySDR, rtl-sdr-rs), DSP frameworks (GNU Radio, liquid-dsp, rustradio, radiorust), receiver UIs (SDR++, SDRangel, Gqrx, CubicSDR), satellite decoders (SatDump for NOAA APT, Meteor-M LRPT, GOES HRIT, Inmarsat), ground-station orchestration (SatNOGS network, sgoudelis/ground-station, Hamlib), orbit mechanics (SGP4 in Python + Rust, satkit astrodynamics, dSGP4 differentiable). Use when: (1) the user wants to receive satellite signals — weather imagery, ISS SSTV, telemetry, (2) building a ground station or scheduling observations on SatNOGS, (3) decoding TLEs and computing satellite passes, (4) composing SDR tooling into a Rust pipeline (e.g. for Life Agent OS, Opsis world-state events, or arcan/sensorium), (5) explaining what an RTL-SDR or HackRF actually does, (6) deciding between SatDump vs custom GNU Radio flowgraph vs hand-rolled Rust DSP, (7) user mentions 'SDR', 'RTL-SDR', 'HackRF', 'NOAA', 'NOAA APT', 'Meteor-M', 'GOES', 'satellite reception', 'ground station', 'SatNOGS', 'SatDump', 'Gqrx', 'SDR++', 'SDRangel', 'TLE', 'SGP4', 'orbit propagation', 'Hamlib', 'Doppler correction', 'pass prediction', 'CelesTrak', 'amateur radio satellite', 'weather satellite', 'signal decoding'."
SDR & Satellite Reception
How to hear satellites with a $30 dongle, decode the bits, predict the next pass, and (if we want) wire it into Life Agent OS or Opsis as a real-world-event source.
What this skill covers
The full open-source satellite reception stack, by layer:
| Layer | What it does | Pick |
|---|---|---|
| L0 Hardware abstraction | One API across dongles | SoapySDR; pure-Rust rtl-sdr-rs |
| L1 DSP framework | Demod, filter, sync | GNU Radio (standard), liquid-dsp (lean C), rustradio (Rust), radiorust (Tokio) |
| L2 Receiver UI | Watch the spectrum, demod live | SDR++, SDRangel, Gqrx, CubicSDR, SigDigger |
| L3 Satellite decoders | TLE-aware, multi-protocol | SatDump (90+ sats) |
| L4 Ground-station orchestration | Schedule, rotate, Doppler | SatNOGS, sgoudelis/ground-station (2026), Hamlib |
| L5 Orbit mechanics | TLE → pass times → az/el | sgp4 (Python), neuromorphicsystems/sgp4 (Rust), satkit (full astro) |
Detail: references/tools-by-layer.md.
Quick start — your first weather image
About a 1-afternoon project, $50 total.
# 1. Hardware: RTL-SDR v4 ($30) + V-dipole antenna ($20 wire or 3D-printed QFH)
# 2. Software (macOS)
brew install --cask satdump
brew install gpredict # pass prediction GUI
# 3. Find next NOAA 18/19 pass overhead
gpredict # add NOAA 18, NOAA 19 from CelesTrak TLEs; watch for AOS
# 4. Decode (SatDump live mode, frequency 137.9125 MHz for NOAA 19)
satdump live_processing noaa_apt_demod baseband.raw \
--source rtlsdr --frequency 137912500 --samplerate 2400000
Output: PNG weather imagery of wherever you are, georeferenced. SatDump handles APT, LRPT, HRPT, HRIT, Inmarsat Aero, and ~85 other satellite formats automatically.
Detail: references/recipes.md.
Quick start — no hardware (use someone else's)
# Visit https://network.satnogs.org/observations/new/
# Pick a station that can see the satellite you want
# Schedule an observation; the station records IQ + decodes for you
# Download the resulting waterfall, demod, decoded data via the SatNOGS API
SatNOGS is ~600 crowd-sourced ground stations worldwide. Free to schedule, public results.
Quick start — Rust pipeline (no GUI)
For embedding satellite reception into a Rust service — relevant for Life Agent OS, Opsis world-state events, or arcan sensorium:
# Cargo.toml
[dependencies]
rtl-sdr-rs = "0.x" # hardware
rustradio = "0.x" # DSP block graph (or radiorust for Tokio-native)
sgp4 = "1.x" # neuromorphicsystems/sgp4 — no_std capable
satkit = "0.16" # full astrodynamics if needed
Shape:
rtl-sdr-rs→ raw IQ streamrustradioflowgraph → APT/LRPT demod → framessgp4/satkit→ georeference each frame against TLE- Emit as
OpsisEvent { kind: "sat_pass", sat_id, lat, lon, alt, timestamp, payload }
Detail: references/composition.md.
What you can actually hear
| Satellite class | Band | What you get | Difficulty |
|---|---|---|---|
| NOAA 15/18/19 (APT) | 137 MHz | Live weather imagery, ~15-min passes | ★ easy |
| Meteor-M N2/N2-2 (LRPT) | 137 MHz | Higher-res digital weather imagery | ★★ |
| ISS SSTV / APRS | 145 MHz | Slow-scan images, packet radio | ★★ |
| GOES-16/18 (HRIT) | 1.7 GHz | Full-disk geostationary Earth | ★★★ (needs small dish) |
| Inmarsat Aero (STD-C, EGC) | L-band | Aviation messages, maritime safety | ★★★ |
| Iridium pager telemetry | L-band | Pager metadata; voice is encrypted | ★★★ |
| GPS L1 / Galileo E1 | L-band | Your own position from raw signals | ★★★★ |
Architectural threads (why this lives in the workspace)
Two non-forced connections to existing Broomva work:
SatNOGS ↔ Spaces. SatNOGS's distributed ground-station network has the same pattern as core/life/spaces: global registry of nodes, a scheduler that assigns work to nodes with the right capability, observations flow back to a central DB. If we ever want "Life node, but with antennas," SatNOGS already solved the rotator/Doppler/TLE-sync coordination problem on top of an open scheduling API.
Satellite passes ↔ Opsis. Opsis is already an AI-native world-state engine with OpsisEvent protocol and a CesiumJS globe. Live satellite passes are literally georeferenced world-state events. satkit (Rust SGP4 + ITRF/Geodetic transforms) → OpsisEvent { kind: "sat_pass", ... } → CesiumJS globe already renders it. Zero forced abstraction; the pieces match.
Detail: references/composition.md.
Repository layout (if we build the pipeline)
Speculative — no code shipped yet, this is the skill's compositional seed:
~/broomva/experiments/sdr-satellite/ # (proposed)
├── crates/
│ ├── sat-sdr/ # rtl-sdr-rs wrapper, hardware enumeration
│ ├── sat-decode/ # rustradio flowgraphs for APT / LRPT / SSTV
│ ├── sat-orbit/ # satkit-based pass prediction + Doppler
│ └── sat-opsis-bridge/ # decoded frames → OpsisEvent emitter
└── scripts/
├── first-image.sh # The "your first NOAA image" walkthrough
└── schedule-satnogs.sh # Submit observation to SatNOGS network
References
- tools-by-layer.md — full L0-L5 stack survey with comparison tables
- recipes.md — concrete recipes: first NOAA APT image, SatNOGS scheduling, GOES dish setup, Meteor-M decode
- composition.md — Rust pipeline composition for Life / Opsis / arcan; SatNOGS ↔ Spaces pattern analysis
Source list
- SatNOGS — global ground-station network · Wiki · Network
- SatDump — the decode engine
- Ground Station orchestrator (sgoudelis/ground-station) · RTL-SDR.com writeup
- RTL-SDR supported software (the canonical big list)
- 15 Best SDR Software 2026 (OneSDR)
- rtl-sdr-rs crate · rustradio · radiorust
- neuromorphicsystems/sgp4 (Rust, no_std) · satkit (Rust + PyO3 astrodynamics) · python-sgp4 · heyoka.py differentiable SGP4