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%
| public | ||
| package.json | ||
| README.md | ||
| server.js | ||
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.
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
While it is physically easy to do with a cheap SDR and free software, the Electronic Communications Privacy Act (ECPA) of 1986 makes it a federal crime to intentionally intercept and decode certain transmissions without consent.
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 🛰️