romartak/sdrkit

Pocket spectrum analyzer + multimode radio + signal decoder on a Raspberry Pi Zero 2 W and RTL-SDR, used from your phone's browser. Sweep 0.5–1766 MHz, tap a signal to hear it, identify digital modes, decode pagers, APRS, sensors and ADS-B, record, scan and watch 24/7. Offline, receive-only, EN/ES.

JavaScript

9

23 commits

updated Oct 18, 2026

See the code

See what people are saying

SourceMessageScoreDate

I'm a med student and I built an open-source pocket radio lab: Raspberry Pi + RTL-SDR, controlled from your phone (r/SideProject)

I study medicine, but I've always loved building things. My side project is SDR-Kit: it turns a Raspberry Pi Zero 2 W and a cheap radio dongle into a spectrum analyzer, radio and signal decoder that you use from your phone's browser. Things I cared about: • One-command install and updates that roll…

2

Oct 17, 2026

README

SDR-Kit

A pocket spectrum analyzer, multimode radio and signal decoder — built from a Raspberry Pi Zero 2 W and an RTL-SDR, used from your phone.

CI Release License: MIT Raspberry Pi Zero 2 W Python 3.11+ Receive only UI: English | Español

📦 Install · ✨ Features · 🧪 Try without hardware · 📚 Docs · 🇪🇸 Leer en español


SDR-Kit turns ~US$90 of off-the-shelf parts into a field instrument in the spirit of the tinySA: sweep the spectrum from 0.5 to 1766 MHz, find a signal, tap once to listen to it, identify what it is, decode it, record it — all from a phone browser, with no app to install and no internet required. At home it joins your WiFi; in the field it creates its own hotspot; anywhere else it is one Tailscale hop away.

Spectrum analyzer and waterfall Multimode radio Decoded pager and APRS messages Offline aircraft radar

[!NOTE] No hardware yet? Try the panel on any computer with demo mode: pip install numpy && python3 files/sdrkit_server.py --demo --port 8080 → http://localhost:8080

[!TIP] In a hurry? Flash the Pi, SSH in and run one line — jump to the 3-minute version.

🔌 One-command install🛟 Self-rollback updatesⓘ Help everywhere🌍 EN + ES🔒 Offline & private
curl … | sudo bashbreaks → restores itselfon every controlpanel, installer, CLIno cloud, no telemetry

📑 Contents

Highlights · At a glance · Hardware · Installation · Updates · Demo · Languages · How it works · Docs · Roadmap · Contributing · Legal

✨ Highlights

📈 Spectrum analyzer

  • Live spectrum + waterfall, tinySA-style readouts
  • Tuner without touching the graph: −/+ steps, slider, jump to the next active signal
  • 4 markers with delta and peak tracking
  • Measurements: channel power, OBW, ACPR, −3/−6/−20/−26 dB bandwidth, SNR, counter, harmonics, pulses
  • Zero span with trigger, max/min hold, average, persistence, reference
  • Calibrated units (dBm, dBµV…), limit line with pass/fail
  • 24/7 monitor with occupancy map and phone alerts (ntfy)

📻 Radio

  • FM, wide FM, AM, WFM (broadcast), USB/LSB
  • Digital voice — DMR, P25, D-Star, Fusion, NXDN, dPMR, M17 (DSD-FME, optional)
  • Automatic recognition of digital signals by their shape (2/4-FSK, GMSK, AFSK, symbol rate)
  • CTCSS/DCS tone squelch detection and DTMF
  • Per-transmission recording with an activity log
  • Scanner over whole services, seek, memories
  • Fox-hunt mode to find a transmitter by ear

🔓 Decoders

  • Pagers POCSAG / FLEX, APRS with positions, EAS alerts (multimon-ng)
  • 433/868/915 MHz sensors: weather stations, tyre sensors, doorbells… (rtl_433)
  • Offline aircraft radar on 1090 MHz (dump1090)
  • 40+ more modes in the advanced receiver (OpenWebRX+): FT8, WSPR, SSTV, HF fax, ACARS…
  • Every service's channel plan built in: PMR446, FRS/GMRS, marine VHF, airband, CB, ham bands…

🔭 At a glance

flowchart LR
  P["📱 Phone<br/>spectrum · waterfall<br/>audio · help"] <-->|"WiFi · hotspot · Tailscale"| Z["🥧 Raspberry Pi Zero 2 W<br/>SDR-Kit + OpenWebRX+"] <-->|"USB"| R["📡 RTL-SDR<br/>0.5–1766 MHz"]
You want to…WherePowered by
See what is on the airAnalyzer tabbuilt-in sweeps
Listen to a signaltap it → Radiobuilt-in demodulators
Know what a signal isauto-recognitionbuilt-in classifier
Read pagers / APRS / EASDecode tabmultimon-ng
Read sensors (433/868/915 MHz)Decode tabrtl_433
Track aircraft offlineRadardump1090
Hear digital voice (DMR, P25, M17…)Radio → DigitalDSD-FME (optional)
FT8, WSPR, SSTV, ACARS…Advanced receiverOpenWebRX+

🧰 Hardware

PartRecommended≈ Price
🥧 ComputerRaspberry Pi Zero 2 WUS$15
📡 SDRRTL-SDR Blog V4 (kit with the adjustable dipole antennas)US$40
💾 Storage32 GB microSD, A1/A2 (SanDisk, Samsung)US$8
🔋 Power10 000–20 000 mAh power bank (5 V / 2.4 A) + short, thick micro-USB cableUS$20
🔌 AdapterShort micro-USB OTG → USB-A adapter (+ a short USB extension with ferrite)US$5

Runtime is about 6–10 h on a 10 000 mAh bank.

➕ Optional extras (HackRF, AMBE3000, discone, second dongle)
ExtraWhat it adds
HackRF OneSweeps from 1 to 6000 MHz (experimental, auto-detected)
AMBE3000 USB stickHardware vocoder for licensed digital voice via OpenWebRX+
Discone antennaWideband reception for scanning
Second RTL-SDRDedicated dongle for aircraft radar or sensors

Details and wiring: docs/hardware.md.

📦 Installation, step by step

⚡ The short version

# 1) Flash Raspberry Pi OS Lite 64-bit (hostname: sdrpi, WiFi 2.4 GHz, SSH on)
# 2) SSH into the Pi:
ssh <user>@sdrpi.local
# 3) Install (20–45 min, reboots by itself):
curl -fsSL https://raw.githubusercontent.com/romartak/sdrkit/main/get.sh | sudo bash
# 4) Open http://sdrpi.local on your phone

🗺️ The road map of the install

flowchart LR
  A["1️⃣ Flash<br/>Pi OS Lite 64-bit"] --> B["2️⃣ Boot & SSH<br/>sdrpi.local"]
  B --> C["3️⃣ One command<br/>get.sh"]
  C --> D["4️⃣ Answer 3 questions<br/>language · passwords"]
  D --> E["☕ Wait 20–45 min<br/>auto-reboot"]
  E --> F["5️⃣ Open the panel<br/>📱 phone"]

✅ Before you start

  • Hardware assembled (Hardware) — RTL-SDR on the Pi's data micro-USB port via the OTG adapter
  • A computer (or a phone SSH app such as Termius) and a microSD card reader
  • Your home WiFi (2.4 GHz) name and password — the Pi needs internet during install
  • About 45 minutes

1️⃣ Flash the microSD card

  1. Open Raspberry Pi Imager.

  2. Device: Raspberry Pi Zero 2 W · OS: Raspberry Pi OS Lite (64-bit) (Trixie recommended, Bookworm works).

  3. Click Edit settings and set:

    SettingValue
    Hostnamesdrpi
    Username / passwordyour choice (you will use them for SSH)
    WiFiyour home network, 2.4 GHz, and your country
    Services✅ Enable SSH
  4. Write the card, put it in the Pi and power it on. First boot takes ~2 minutes.

2️⃣ Connect over SSH

ssh <your-user>@sdrpi.local

[!NOTE] If sdrpi.local does not resolve (some Windows/Android setups), find the Pi's IP in your router and use that.

3️⃣ Run the installer

curl -fsSL https://raw.githubusercontent.com/romartak/sdrkit/main/get.sh | sudo bash

The installer asks only a few things:

QuestionNotes
🌍 LanguageEnglish or Spanish (installer and sdrkit command)
📶 Hotspot passwordFor the WiFi the Pi creates (SDR-Pi) — at least 8 characters, no "
🔑 Panel passwordFor the web panel and OpenWebRX+ — at least 4 characters, no "
🎙️ Digital voice (DSD-FME)?Default no — it shows the codec patent notice first

Then it installs everything and reboots on its own. Don't unplug it.

🔍 What the 11 installer steps do
#StepWhat happens
1Preparing the systemSwap to 1 GB, WiFi country, apt update
2Base packagesPython, NumPy, rtl-sdr, avahi, git…
3RTL-SDR driverBlacklists DVB-T modules; builds the Blog driver on Bookworm
4OpenWebRX+Adds its repository and the available decoders
5Digital voiceOnly if accepted: builds mbelib + DSD-FME (30–50 min)
6SDR-Kit panelInstalls to /opt/sdrkit, the sdrkit command and services
7WiFi hotspotAutomatic hotspot + known networks + watchdog
8Power & microSD careBluetooth off, logs in RAM, fewer SD writes
9TailscaleOptional remote access
10Starting servicesHealth check: panel answers, RTL-SDR on USB
11DonePrints addresses, records the version, reboots in 15 s

Full detail: docs/installation.md.

📴 No internet on the Pi? Offline install from the microSD

You can copy the kit onto the card and install from there. See docs/installation.md.

4️⃣ Open the panel

Where you areHow to connectAddress
🏠 At homePhone and Pi on the same WiFihttp://sdrpi.local
🏕️ In the fieldJoin the WiFi SDR-Pihttp://192.168.4.1
🌐 AnywhereTailscale on the Pi and the phonehttp://sdrpi

Tip: use your browser's Add to Home screen to install it like an app.

🩺 If something goes wrong

sdrkit doctor                  # full check-up: ✔/✖ and what to do about each failure
sudo sdrkit backup             # save your settings and memories (restore with: sudo sdrkit restore FILE)
The panel doesn't open
  1. Wait 2 minutes after the reboot.
  2. Try the IP address instead of sdrpi.local.
  3. In the field, make sure you joined SDR-Pi, not your home WiFi.
  4. Re-run the installer safely: sudo bash /opt/sdrkit-src/install.sh.

More: docs/troubleshooting.md.

The dongle is not detected

Check the OTG adapter and cable (use a short, thick one), then run lsusb — you should see 0bda:2838 or 0bda:2832. A weak power bank is the usual culprit.

🔄 Updates that cannot brick your kit

sudo sdrkit update            # shows what changed, asks, installs

…or tap More → System → Check for updates. Your settings, recordings and memories are never touched; new settings are merged in automatically. After installing, SDR-Kit checks that the panel answers — if it does not, it rolls back to the previous version by itself. sudo sdrkit rollback goes back by hand. Details: docs/updating.md.

flowchart LR
  U["sudo sdrkit update"] --> S["Show changes"] --> I["Install"] --> H{"Panel<br/>answers?"}
  H -- "✅ yes" --> OK["New version"]
  H -- "❌ no" --> R["↩️ Automatic rollback"]

🧪 Try it without hardware

The demo mode simulates an RTL-SDR with real, decodable signals — POCSAG pagers, APRS packets, an M17 digital-voice call, DMR-like and NXDN-like 4FSK, FM broadcast — so you can explore every screen on a laptop:

git clone https://github.com/romartak/sdrkit.git && cd sdrkit
pip install numpy                                   # apt install multimon-ng to decode the demo pagers/APRS
python3 files/sdrkit_server.py --demo --port 8080   # → http://localhost:8080

🎬 See it in action

Recorded straight from the demo panel on a phone-sized screen:

Spectrum analyzerRadioAircraft radar (ADS-B)Pager messages
Sweeping the FM band and jumping between stations with the tunerListening to a channel with live signal levelOffline aircraft radar updatingPOCSAG pager messages arriving
sweep 87.5–108.5 MHz, tap ⏭ to jump to the next stationtune, see the signal and the detected mode, listen on the phoneaircraft around you, no internetdecoded live as they arrive

Regenerate them with tools/gifs.mjs + tools/make_gifs.py.

🌍 Two languages

The whole kit is bilingual: panel, help, frequency guide, antenna tools, installer and CLI. The panel follows your browser's language; switch any time with the EN / ES chip in the header or in More → System. Adding a language is a catalog file away — see docs/development.md.

🏗️ How it works

flowchart LR
  phone["📱 Phone browser<br/>panel · EN/ES"] <-- "HTTP + Server-Sent Events<br/>hotspot · home WiFi · Tailscale" --> server
  subgraph pi["Raspberry Pi Zero 2 W"]
    server["sdrkit_server.py<br/>web panel · API · sweeps"]
    radio["sdrkit_radio.py<br/>demodulators · tones · DTMF<br/>recorder · scanner"]
    decoders["sdrkit_decoders.py<br/>multimon-ng · DSD-FME<br/>rtl_433 · dump1090 · classifier"]
    owrx["OpenWebRX+<br/>(advanced receiver)"]
    server --> radio --> decoders
    server --> decoders
  end
  sdr["📡 RTL-SDR Blog V4"] -- USB --> server
  server -. hands the dongle over .-> owrx

A single Python process owns the dongle and switches it between the analyzer, the radio and the external decoders on demand; the browser draws the spectrum and waterfall from compact JSON frames pushed over Server-Sent Events and plays 16-bit PCM audio streamed over HTTP through Web Audio. No cloud, no accounts, no telemetry. Deep dive: docs/architecture.md · HTTP API: docs/api.md.

📚 Documentation

HardwareBill of materials, power, assembly
InstallationFlashing, one-line install, offline install, first connection
User guideEvery tab and control
Digital voiceDMR, P25, D-Star, Fusion, NXDN, dPMR, M17
AntennasLengths per band, placement, cable loss
UpdatingUpdates, rollback, test branches
Troubleshooting · FAQSymptoms → causes → fixes
Architecture · API · ConfigurationFor tinkerers
DevelopmentDemo mode, tests, translations, releases
Guía en españolLa guía completa en español

🗺️ Roadmap

  • HackRF One sweeps up to 6 GHz in the analyzer (detected automatically; needs more field testing)
  • Second-dongle profiles: aircraft radar or sensors 24/7 while using the analyzer
  • Weather-satellite images (Meteor-M, 137 MHz) on a Pi 4/5
  • Small OLED status display (IP address, mode, battery)
  • More languages — contributions welcome

🤝 Contributing

Bug reports, ideas, translations and pull requests are welcome — read CONTRIBUTING.md and the Code of Conduct. Every change runs through CI: unit tests for the DSP and decoders, an end-to-end decode of real POCSAG and APRS signals, translation checks and a browser test in both languages.

[!IMPORTANT] SDR-Kit is receive-only. Listening is legal in most countries, but disclosing or using the content of private communications may not be — know your local law. Encrypted traffic is never decrypted.

The optional digital-voice decoder (DSD-FME + mbelib) implements patented AMBE/IMBE vocoders, so the installer leaves it off unless you explicitly opt in. See docs/legal.md.

🙏 Acknowledgements

Built on the shoulders of OpenWebRX+, rtl-sdr and the RTL-SDR Blog drivers, rtl_433, dump1090, multimon-ng, DSD-FME, mbelib, codec2 and the M17 Project, and inspired by the wonderful tinySA. The curated list of related projects in docs/resources.md was put together with the help of RFSec-ToolKit by @cn0xroot (雪碧 / 0x0root).

📄 License

MIT © romartak and SDR-Kit contributors. Third-party programs installed by the kit keep their own licenses.

ham-radio
ham-radio-blog
ham-radio-software
openwebrx
pocsag
raspberry-pi
rtl-sdr
rtl-sdr-dongle
rtl-sdr-receiver
rtl-sdr-security
rtl-sdr-v4
sdr
spectrum-analyzer
spectrum-analyzer-demo
tinysa
tinysam
tinysa-plus
tinysa-sdr-rtlsdr-audio-python-demodulation
tinysa-ultra

romartak/sdrkit

Pocket spectrum analyzer + multimode radio + signal decoder on a Raspberry Pi Zero 2 W and RTL-SDR, used from your phone's browser. Sweep 0.5–1766 MHz, tap a signal to hear it, identify digital modes, decode pagers, APRS, sensors and ADS-B, record, scan and watch 24/7. Offline, receive-only, EN/ES.

JavaScript

9

23 commits

updated Oct 18, 2026

See the code

See what people are saying

SourceMessageScoreDate

I'm a med student and I built an open-source pocket radio lab: Raspberry Pi + RTL-SDR, controlled from your phone (r/SideProject)

I study medicine, but I've always loved building things. My side project is SDR-Kit: it turns a Raspberry Pi Zero 2 W and a cheap radio dongle into a spectrum analyzer, radio and signal decoder that you use from your phone's browser. Things I cared about: • One-command install and updates that roll…

2

Oct 17, 2026

README

SDR-Kit

A pocket spectrum analyzer, multimode radio and signal decoder — built from a Raspberry Pi Zero 2 W and an RTL-SDR, used from your phone.

CI Release License: MIT Raspberry Pi Zero 2 W Python 3.11+ Receive only UI: English | Español

📦 Install · ✨ Features · 🧪 Try without hardware · 📚 Docs · 🇪🇸 Leer en español


SDR-Kit turns ~US$90 of off-the-shelf parts into a field instrument in the spirit of the tinySA: sweep the spectrum from 0.5 to 1766 MHz, find a signal, tap once to listen to it, identify what it is, decode it, record it — all from a phone browser, with no app to install and no internet required. At home it joins your WiFi; in the field it creates its own hotspot; anywhere else it is one Tailscale hop away.

Spectrum analyzer and waterfall Multimode radio Decoded pager and APRS messages Offline aircraft radar

[!NOTE] No hardware yet? Try the panel on any computer with demo mode: pip install numpy && python3 files/sdrkit_server.py --demo --port 8080 → http://localhost:8080

[!TIP] In a hurry? Flash the Pi, SSH in and run one line — jump to the 3-minute version.

🔌 One-command install🛟 Self-rollback updatesⓘ Help everywhere🌍 EN + ES🔒 Offline & private
curl … | sudo bashbreaks → restores itselfon every controlpanel, installer, CLIno cloud, no telemetry

📑 Contents

Highlights · At a glance · Hardware · Installation · Updates · Demo · Languages · How it works · Docs · Roadmap · Contributing · Legal

✨ Highlights

📈 Spectrum analyzer

  • Live spectrum + waterfall, tinySA-style readouts
  • Tuner without touching the graph: −/+ steps, slider, jump to the next active signal
  • 4 markers with delta and peak tracking
  • Measurements: channel power, OBW, ACPR, −3/−6/−20/−26 dB bandwidth, SNR, counter, harmonics, pulses
  • Zero span with trigger, max/min hold, average, persistence, reference
  • Calibrated units (dBm, dBµV…), limit line with pass/fail
  • 24/7 monitor with occupancy map and phone alerts (ntfy)

📻 Radio

  • FM, wide FM, AM, WFM (broadcast), USB/LSB
  • Digital voice — DMR, P25, D-Star, Fusion, NXDN, dPMR, M17 (DSD-FME, optional)
  • Automatic recognition of digital signals by their shape (2/4-FSK, GMSK, AFSK, symbol rate)
  • CTCSS/DCS tone squelch detection and DTMF
  • Per-transmission recording with an activity log
  • Scanner over whole services, seek, memories
  • Fox-hunt mode to find a transmitter by ear

🔓 Decoders

  • Pagers POCSAG / FLEX, APRS with positions, EAS alerts (multimon-ng)
  • 433/868/915 MHz sensors: weather stations, tyre sensors, doorbells… (rtl_433)
  • Offline aircraft radar on 1090 MHz (dump1090)
  • 40+ more modes in the advanced receiver (OpenWebRX+): FT8, WSPR, SSTV, HF fax, ACARS…
  • Every service's channel plan built in: PMR446, FRS/GMRS, marine VHF, airband, CB, ham bands…

🔭 At a glance

flowchart LR
  P["📱 Phone<br/>spectrum · waterfall<br/>audio · help"] <-->|"WiFi · hotspot · Tailscale"| Z["🥧 Raspberry Pi Zero 2 W<br/>SDR-Kit + OpenWebRX+"] <-->|"USB"| R["📡 RTL-SDR<br/>0.5–1766 MHz"]
You want to…WherePowered by
See what is on the airAnalyzer tabbuilt-in sweeps
Listen to a signaltap it → Radiobuilt-in demodulators
Know what a signal isauto-recognitionbuilt-in classifier
Read pagers / APRS / EASDecode tabmultimon-ng
Read sensors (433/868/915 MHz)Decode tabrtl_433
Track aircraft offlineRadardump1090
Hear digital voice (DMR, P25, M17…)Radio → DigitalDSD-FME (optional)
FT8, WSPR, SSTV, ACARS…Advanced receiverOpenWebRX+

🧰 Hardware

PartRecommended≈ Price
🥧 ComputerRaspberry Pi Zero 2 WUS$15
📡 SDRRTL-SDR Blog V4 (kit with the adjustable dipole antennas)US$40
💾 Storage32 GB microSD, A1/A2 (SanDisk, Samsung)US$8
🔋 Power10 000–20 000 mAh power bank (5 V / 2.4 A) + short, thick micro-USB cableUS$20
🔌 AdapterShort micro-USB OTG → USB-A adapter (+ a short USB extension with ferrite)US$5

Runtime is about 6–10 h on a 10 000 mAh bank.

➕ Optional extras (HackRF, AMBE3000, discone, second dongle)
ExtraWhat it adds
HackRF OneSweeps from 1 to 6000 MHz (experimental, auto-detected)
AMBE3000 USB stickHardware vocoder for licensed digital voice via OpenWebRX+
Discone antennaWideband reception for scanning
Second RTL-SDRDedicated dongle for aircraft radar or sensors

Details and wiring: docs/hardware.md.

📦 Installation, step by step

⚡ The short version

# 1) Flash Raspberry Pi OS Lite 64-bit (hostname: sdrpi, WiFi 2.4 GHz, SSH on)
# 2) SSH into the Pi:
ssh <user>@sdrpi.local
# 3) Install (20–45 min, reboots by itself):
curl -fsSL https://raw.githubusercontent.com/romartak/sdrkit/main/get.sh | sudo bash
# 4) Open http://sdrpi.local on your phone

🗺️ The road map of the install

flowchart LR
  A["1️⃣ Flash<br/>Pi OS Lite 64-bit"] --> B["2️⃣ Boot & SSH<br/>sdrpi.local"]
  B --> C["3️⃣ One command<br/>get.sh"]
  C --> D["4️⃣ Answer 3 questions<br/>language · passwords"]
  D --> E["☕ Wait 20–45 min<br/>auto-reboot"]
  E --> F["5️⃣ Open the panel<br/>📱 phone"]

✅ Before you start

  • Hardware assembled (Hardware) — RTL-SDR on the Pi's data micro-USB port via the OTG adapter
  • A computer (or a phone SSH app such as Termius) and a microSD card reader
  • Your home WiFi (2.4 GHz) name and password — the Pi needs internet during install
  • About 45 minutes

1️⃣ Flash the microSD card

  1. Open Raspberry Pi Imager.

  2. Device: Raspberry Pi Zero 2 W · OS: Raspberry Pi OS Lite (64-bit) (Trixie recommended, Bookworm works).

  3. Click Edit settings and set:

    SettingValue
    Hostnamesdrpi
    Username / passwordyour choice (you will use them for SSH)
    WiFiyour home network, 2.4 GHz, and your country
    Services✅ Enable SSH
  4. Write the card, put it in the Pi and power it on. First boot takes ~2 minutes.

2️⃣ Connect over SSH

ssh <your-user>@sdrpi.local

[!NOTE] If sdrpi.local does not resolve (some Windows/Android setups), find the Pi's IP in your router and use that.

3️⃣ Run the installer

curl -fsSL https://raw.githubusercontent.com/romartak/sdrkit/main/get.sh | sudo bash

The installer asks only a few things:

QuestionNotes
🌍 LanguageEnglish or Spanish (installer and sdrkit command)
📶 Hotspot passwordFor the WiFi the Pi creates (SDR-Pi) — at least 8 characters, no "
🔑 Panel passwordFor the web panel and OpenWebRX+ — at least 4 characters, no "
🎙️ Digital voice (DSD-FME)?Default no — it shows the codec patent notice first

Then it installs everything and reboots on its own. Don't unplug it.

🔍 What the 11 installer steps do
#StepWhat happens
1Preparing the systemSwap to 1 GB, WiFi country, apt update
2Base packagesPython, NumPy, rtl-sdr, avahi, git…
3RTL-SDR driverBlacklists DVB-T modules; builds the Blog driver on Bookworm
4OpenWebRX+Adds its repository and the available decoders
5Digital voiceOnly if accepted: builds mbelib + DSD-FME (30–50 min)
6SDR-Kit panelInstalls to /opt/sdrkit, the sdrkit command and services
7WiFi hotspotAutomatic hotspot + known networks + watchdog
8Power & microSD careBluetooth off, logs in RAM, fewer SD writes
9TailscaleOptional remote access
10Starting servicesHealth check: panel answers, RTL-SDR on USB
11DonePrints addresses, records the version, reboots in 15 s

Full detail: docs/installation.md.

📴 No internet on the Pi? Offline install from the microSD

You can copy the kit onto the card and install from there. See docs/installation.md.

4️⃣ Open the panel

Where you areHow to connectAddress
🏠 At homePhone and Pi on the same WiFihttp://sdrpi.local
🏕️ In the fieldJoin the WiFi SDR-Pihttp://192.168.4.1
🌐 AnywhereTailscale on the Pi and the phonehttp://sdrpi

Tip: use your browser's Add to Home screen to install it like an app.

🩺 If something goes wrong

sdrkit doctor                  # full check-up: ✔/✖ and what to do about each failure
sudo sdrkit backup             # save your settings and memories (restore with: sudo sdrkit restore FILE)
The panel doesn't open
  1. Wait 2 minutes after the reboot.
  2. Try the IP address instead of sdrpi.local.
  3. In the field, make sure you joined SDR-Pi, not your home WiFi.
  4. Re-run the installer safely: sudo bash /opt/sdrkit-src/install.sh.

More: docs/troubleshooting.md.

The dongle is not detected

Check the OTG adapter and cable (use a short, thick one), then run lsusb — you should see 0bda:2838 or 0bda:2832. A weak power bank is the usual culprit.

🔄 Updates that cannot brick your kit

sudo sdrkit update            # shows what changed, asks, installs

…or tap More → System → Check for updates. Your settings, recordings and memories are never touched; new settings are merged in automatically. After installing, SDR-Kit checks that the panel answers — if it does not, it rolls back to the previous version by itself. sudo sdrkit rollback goes back by hand. Details: docs/updating.md.

flowchart LR
  U["sudo sdrkit update"] --> S["Show changes"] --> I["Install"] --> H{"Panel<br/>answers?"}
  H -- "✅ yes" --> OK["New version"]
  H -- "❌ no" --> R["↩️ Automatic rollback"]

🧪 Try it without hardware

The demo mode simulates an RTL-SDR with real, decodable signals — POCSAG pagers, APRS packets, an M17 digital-voice call, DMR-like and NXDN-like 4FSK, FM broadcast — so you can explore every screen on a laptop:

git clone https://github.com/romartak/sdrkit.git && cd sdrkit
pip install numpy                                   # apt install multimon-ng to decode the demo pagers/APRS
python3 files/sdrkit_server.py --demo --port 8080   # → http://localhost:8080

🎬 See it in action

Recorded straight from the demo panel on a phone-sized screen:

Spectrum analyzerRadioAircraft radar (ADS-B)Pager messages
Sweeping the FM band and jumping between stations with the tunerListening to a channel with live signal levelOffline aircraft radar updatingPOCSAG pager messages arriving
sweep 87.5–108.5 MHz, tap ⏭ to jump to the next stationtune, see the signal and the detected mode, listen on the phoneaircraft around you, no internetdecoded live as they arrive

Regenerate them with tools/gifs.mjs + tools/make_gifs.py.

🌍 Two languages

The whole kit is bilingual: panel, help, frequency guide, antenna tools, installer and CLI. The panel follows your browser's language; switch any time with the EN / ES chip in the header or in More → System. Adding a language is a catalog file away — see docs/development.md.

🏗️ How it works

flowchart LR
  phone["📱 Phone browser<br/>panel · EN/ES"] <-- "HTTP + Server-Sent Events<br/>hotspot · home WiFi · Tailscale" --> server
  subgraph pi["Raspberry Pi Zero 2 W"]
    server["sdrkit_server.py<br/>web panel · API · sweeps"]
    radio["sdrkit_radio.py<br/>demodulators · tones · DTMF<br/>recorder · scanner"]
    decoders["sdrkit_decoders.py<br/>multimon-ng · DSD-FME<br/>rtl_433 · dump1090 · classifier"]
    owrx["OpenWebRX+<br/>(advanced receiver)"]
    server --> radio --> decoders
    server --> decoders
  end
  sdr["📡 RTL-SDR Blog V4"] -- USB --> server
  server -. hands the dongle over .-> owrx

A single Python process owns the dongle and switches it between the analyzer, the radio and the external decoders on demand; the browser draws the spectrum and waterfall from compact JSON frames pushed over Server-Sent Events and plays 16-bit PCM audio streamed over HTTP through Web Audio. No cloud, no accounts, no telemetry. Deep dive: docs/architecture.md · HTTP API: docs/api.md.

📚 Documentation

HardwareBill of materials, power, assembly
InstallationFlashing, one-line install, offline install, first connection
User guideEvery tab and control
Digital voiceDMR, P25, D-Star, Fusion, NXDN, dPMR, M17
AntennasLengths per band, placement, cable loss
UpdatingUpdates, rollback, test branches
Troubleshooting · FAQSymptoms → causes → fixes
Architecture · API · ConfigurationFor tinkerers
DevelopmentDemo mode, tests, translations, releases
Guía en españolLa guía completa en español

🗺️ Roadmap

  • HackRF One sweeps up to 6 GHz in the analyzer (detected automatically; needs more field testing)
  • Second-dongle profiles: aircraft radar or sensors 24/7 while using the analyzer
  • Weather-satellite images (Meteor-M, 137 MHz) on a Pi 4/5
  • Small OLED status display (IP address, mode, battery)
  • More languages — contributions welcome

🤝 Contributing

Bug reports, ideas, translations and pull requests are welcome — read CONTRIBUTING.md and the Code of Conduct. Every change runs through CI: unit tests for the DSP and decoders, an end-to-end decode of real POCSAG and APRS signals, translation checks and a browser test in both languages.

[!IMPORTANT] SDR-Kit is receive-only. Listening is legal in most countries, but disclosing or using the content of private communications may not be — know your local law. Encrypted traffic is never decrypted.

The optional digital-voice decoder (DSD-FME + mbelib) implements patented AMBE/IMBE vocoders, so the installer leaves it off unless you explicitly opt in. See docs/legal.md.

🙏 Acknowledgements

Built on the shoulders of OpenWebRX+, rtl-sdr and the RTL-SDR Blog drivers, rtl_433, dump1090, multimon-ng, DSD-FME, mbelib, codec2 and the M17 Project, and inspired by the wonderful tinySA. The curated list of related projects in docs/resources.md was put together with the help of RFSec-ToolKit by @cn0xroot (雪碧 / 0x0root).

📄 License

MIT © romartak and SDR-Kit contributors. Third-party programs installed by the kit keep their own licenses.

ham-radio
ham-radio-blog
ham-radio-software
openwebrx
pocsag
raspberry-pi
rtl-sdr
rtl-sdr-dongle
rtl-sdr-receiver
rtl-sdr-security
rtl-sdr-v4
sdr
spectrum-analyzer
spectrum-analyzer-demo
tinysa
tinysam
tinysa-plus
tinysa-sdr-rtlsdr-audio-python-demodulation
tinysa-ultra