Control and monitor multiple RTL-SDR command line tools from the comfort of your web browser.
  • JavaScript 53.9%
  • CSS 25.7%
  • HTML 20.4%
Find a file
2026-01-22 22:48:37 -05:00
public Upload files to "public" 2026-01-14 12:11:11 -05:00
package.json Upload files to "/" 2026-01-14 12:10:33 -05:00
README.md Improve readme 2026-01-22 22:48:37 -05:00
server.js Upload files to "/" 2026-01-14 12:10:33 -05:00

SDR-Commander

A web-based control panel for managing RTL-SDR dongles on headless Linux servers. Switch between multiple radio modes, decode pager messages, capture sensor data, and stream raw IQ samples—all from your browser.

screenshot

Features

  • Multi-Mode Operation — Seamlessly switch between pager decode (multimon-ng), rtl_433, and rtl_tcp modes
  • Real-Time WebSocket Updates — Live data streaming to your browser
  • Persistent SQLite Database — All decoded messages and sensor readings are stored
  • Telegram Notifications — Get pager alerts with flexible whitelist/blacklist filtering
  • Modern Web UI
    • Clean, responsive interface with dark mode
    • View current and previous decoded pager messages
    • View current and previous sensor data
    • Customize your Telegram notifications
    • View debug info including live logs from your server
    • Logs are filterable by SDR service
    • Show the correct IP and port for RTL_TCP mode
    • "About" page that briefly explains what SDR is, and provides descriptions and links for each of the SDR components used in SDR-Commander

Operating Modes

Mode Description Tools Used
📟 Pager Decode Decodes POCSAG pager messages (fire/EMS/hospital) rtl_fm + multimon-ng
🌡️ RTL_433 Decode Scans 433 MHz for weather stations, sensors, TPMS rtl_433
📶 RTL_TCP Streams raw IQ data over network for remote SDR apps rtl_tcp
⏹️ Idle Stops all SDR applications N/A

Note: The SDR dongle can only run one mode at a time. Switching modes automatically stops the previous service.

Requirements

Hardware

  • RTL-SDR USB dongle (may work with other SDR hardware, but I have only tested with an RTL-SDR)

Software

  • OS: Debian/Ubuntu Linux (tested on Debian Trixie)
  • Node.js: 18+
  • RTL-SDR tools: rtl_fm, rtl_tcp
  • Decoders: multimon-ng, rtl_433

Install Dependencies (Debian/Ubuntu)

sudo apt install rtl-sdr multimon-ng rtl-433

Installation

Caution

Important

There is no built-in authentication. Do not expose the web-ui to the internet unless you know what you are doing.

# Clone the repository
git clone https://git.wardnet.me/kurtis/SDR-Commander.git

# Install Node.js dependencies
npm install

# Start the server
npm start

The web-ui will be available at http://your-server-ip:3000

Configuration

Configuration is stored in config.json (created automatically on first run):

{
  "pager": {
    "frequency": "152240000",
    "gain": 40,
    "sampleRate": 22050
  },
  "telegram": {
    "enabled": false,
    "botToken": "",
    "chatId": "",
    "topicId": "",
    "whitelist": {
      "capcodes": [],
      "types": [],
      "protocols": []
    },
    "blacklist": {
      "capcodes": [],
      "types": [],
      "protocols": []
    }
  }
}

Tech Stack

  • Backend: Node.js, Express, WebSocket (ws)
  • Database: SQLite (better-sqlite3)
  • Frontend: Vanilla HTML/CSS/JS
  • SDR Tools: rtl_fm, multimon-ng, rtl_433, rtl_tcp

See the wiki for more info about the API and database structure


Built for headless SDR servers 🛰️