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 stream
rustradio flowgraph → APT/LRPT demod → frames
sgp4 / 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
1---2name: sdr-satellite3description: 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 Sa4---56# SDR & Satellite Reception78How 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.910## What this skill covers1112The full open-source satellite reception stack, by layer:1314| Layer | What it does | Pick |15|---|---|---|16| **L0** Hardware abstraction | One API across dongles | `SoapySDR`; pure-Rust `rtl-sdr-rs` |17| **L1** DSP framework | Demod, filter, sync | `GNU Radio` (standard), `liquid-dsp` (lean C), `rustradio` (Rust), `radiorust` (Tokio) |18| **L2** Receiver UI | Watch the spectrum, demod live | `SDR++`, `SDRangel`, `Gqrx`, `CubicSDR`, `SigDigger` |19| **L3** Satellite decoders | TLE-aware, multi-protocol | `SatDump` (90+ sats) |20| **L4** Ground-station orchestration | Schedule, rotate, Doppler | `SatNOGS`, `sgoudelis/ground-station` (2026), `Hamlib` |21| **L5** Orbit mechanics | TLE → pass times → az/el | `sgp4` (Python), `neuromorphicsystems/sgp4` (Rust), `satkit` (full astro) |2223Detail: [references/tools-by-layer.md](references/tools-by-layer.md).2425## Quick start — your first weather image2627About a 1-afternoon project, $50 total.2829```bash30# 1. Hardware: RTL-SDR v4 ($30) + V-dipole antenna ($20 wire or 3D-printed QFH)3132# 2. Software (macOS)33brew install --cask satdump34brew install gpredict # pass prediction GUI3536# 3. Find next NOAA 18/19 pass overhead37gpredict # add NOAA 18, NOAA 19 from CelesTrak TLEs; watch for AOS3839# 4. Decode (SatDump live mode, frequency 137.9125 MHz for NOAA 19)40satdump live_processing noaa_apt_demod baseband.raw \41 --source rtlsdr --frequency 137912500 --samplerate 240000042```4344Output: PNG weather imagery of wherever you are, georeferenced. SatDump handles APT, LRPT, HRPT, HRIT, Inmarsat Aero, and ~85 other satellite formats automatically.4546Detail: [references/recipes.md](references/recipes.md).4748## Quick start — no hardware (use someone else's)4950```bash51# Visit https://network.satnogs.org/observations/new/52# Pick a station that can see the satellite you want53# Schedule an observation; the station records IQ + decodes for you54# Download the resulting waterfall, demod, decoded data via the SatNOGS API55```5657SatNOGS is ~600 crowd-sourced ground stations worldwide. Free to schedule, public results.5859## Quick start — Rust pipeline (no GUI)6061For embedding satellite reception into a Rust service — relevant for Life Agent OS, Opsis world-state events, or arcan sensorium:6263```toml64# Cargo.toml65[dependencies]66rtl-sdr-rs = "0.x" # hardware67rustradio = "0.x" # DSP block graph (or radiorust for Tokio-native)68sgp4 = "1.x" # neuromorphicsystems/sgp4 — no_std capable69satkit = "0.16" # full astrodynamics if needed70```7172Shape:73- `rtl-sdr-rs` → raw IQ stream74- `rustradio` flowgraph → APT/LRPT demod → frames75- `sgp4` / `satkit` → georeference each frame against TLE76- Emit as `OpsisEvent { kind: "sat_pass", sat_id, lat, lon, alt, timestamp, payload }`7778Detail: [references/composition.md](references/composition.md).7980## What you can actually hear8182| Satellite class | Band | What you get | Difficulty |83|---|---|---|---|84| NOAA 15/18/19 (APT) | 137 MHz | Live weather imagery, ~15-min passes | ★ easy |85| Meteor-M N2/N2-2 (LRPT) | 137 MHz | Higher-res digital weather imagery | ★★ |86| ISS SSTV / APRS | 145 MHz | Slow-scan images, packet radio | ★★ |87| GOES-16/18 (HRIT) | 1.7 GHz | Full-disk geostationary Earth | ★★★ (needs small dish) |88| Inmarsat Aero (STD-C, EGC) | L-band | Aviation messages, maritime safety | ★★★ |89| Iridium pager telemetry | L-band | Pager metadata; voice is encrypted | ★★★ |90| GPS L1 / Galileo E1 | L-band | Your own position from raw signals | ★★★★ |9192## Architectural threads (why this lives in the workspace)9394Two non-forced connections to existing Broomva work:9596**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.9798**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.99100Detail: [references/composition.md](references/composition.md).101102## Repository layout (if we build the pipeline)103104Speculative — no code shipped yet, this is the skill's compositional seed:105106```107~/broomva/experiments/sdr-satellite/ # (proposed)108├── crates/109│ ├── sat-sdr/ # rtl-sdr-rs wrapper, hardware enumeration110│ ├── sat-decode/ # rustradio flowgraphs for APT / LRPT / SSTV111│ ├── sat-orbit/ # satkit-based pass prediction + Doppler112│ └── sat-opsis-bridge/ # decoded frames → OpsisEvent emitter113└── scripts/114 ├── first-image.sh # The "your first NOAA image" walkthrough115 └── schedule-satnogs.sh # Submit observation to SatNOGS network116```117118## References119120- [tools-by-layer.md](references/tools-by-layer.md) — full L0-L5 stack survey with comparison tables121- [recipes.md](references/recipes.md) — concrete recipes: first NOAA APT image, SatNOGS scheduling, GOES dish setup, Meteor-M decode122- [composition.md](references/composition.md) — Rust pipeline composition for Life / Opsis / arcan; SatNOGS ↔ Spaces pattern analysis123124## Source list125126- [SatNOGS — global ground-station network](https://satnogs.org/) · [Wiki](https://wiki.satnogs.org/Introduction) · [Network](https://network.satnogs.org/)127- [SatDump](https://www.satdump.org/about/) — the decode engine128- [Ground Station orchestrator (sgoudelis/ground-station)](https://github.com/sgoudelis/ground-station) · [RTL-SDR.com writeup](https://www.rtl-sdr.com/ground-station-an-open-source-sdr-orchestration-platform-for-satellite-tracking-and-decoding/)129- [RTL-SDR supported software (the canonical big list)](https://www.rtl-sdr.com/big-list-rtl-sdr-supported-software/)130- [15 Best SDR Software 2026 (OneSDR)](https://www.onesdr.com/best-sdr-software/)131- [rtl-sdr-rs crate](https://crates.io/crates/rtl-sdr-rs) · [rustradio](https://crates.io/crates/rustradio) · [radiorust](https://lib.rs/crates/radiorust)132- [neuromorphicsystems/sgp4 (Rust, no_std)](https://github.com/neuromorphicsystems/sgp4) · [satkit (Rust + PyO3 astrodynamics)](https://github.com/ssmichael1/satkit) · [python-sgp4](https://pypi.org/project/sgp4/) · [heyoka.py differentiable SGP4](https://bluescarni.github.io/heyoka.py/notebooks/sgp4_propagator.html)