A mobile-friendly web interface for RTL-SDR radio reception. Stream audio over the network as MP3 and listen from any device.
This fork simplifies radio use for non-technical users during emergencies. Built on rtl_fm_python, it offers tailored HTML pages for specific radio modes, ensuring ease of use.
- Mobile-optimized UI
- Purpose-built radio modes: FM, Marine, Aviation, PMR446, Hunter/Gather
- FM Sweep Scanner: Discover and fine-tune stations
- Channel memory: Save stations locally
- CTCSS tone squelch: Filter walkie-talkie channels
- Offline capable: Runs on local network
- Remote listening: Stream audio from anywhere on your network
- Sweep Scanner for station discovery
- Auto fine-tuning and manual tuning
- Channel management
- Emergency and common maritime channels preset
- AM modulation with emergency and airport frequencies
- 16 walkie-talkie channels
- Norwegian hunter channels with CTCSS tone squelch
- RTL-SDR USB dongle
- Linux (tested on Raspberry Pi OS, Ubuntu)
- Python 3.x
- FFmpeg
- RTL-SDR drivers
- Clone the repository:
git clone https://github.com/tronba/rtl_fm_python_webgui.git cd rtl_fm_python_webgui - Install dependencies:
sudo apt-get install rtl-sdr librtlsdr-dev ffmpeg pip install -r requirements.txt
- Compile rtl_fm:
./build.sh
Start the web server:
./start_web_stream.shAccess at http://localhost:10100/
- Edit
rtl-fm-radio.serviceto match your setup. - Install the service:
./radio-control.sh install
- Control the service:
./radio-control.sh start
- Enable auto-start (optional):
sudo systemctl enable rtl-fm-radio
Access remotely via http://YOUR_SERVER_IP:10100/.
| Endpoint | Description |
|---|---|
/state |
Get current radio state |
/frequency/human/101.1M |
Tune to frequency |
/demod/w |
Set modulation |
/gain/human/28 |
Set gain in dB |
/stream.mp3 |
Live audio stream |
├── rtl_fm_python_web.py # Flask web server
├── rtl_fm_python_thread.py # RTL-SDR control thread
├── static/ # HTML, CSS, JS files
└── docs/ # Documentation
- Audio streaming: Raw audio → FFmpeg → MP3 → Network
- State polling: Updates every 500ms
- CTCSS detection: Goertzel algorithm (~125ms blocks)
Built on rtl_fm_python and RTL-SDR. Licensed under GPLv2. See LICENSE for details.