PythonFlask + SSERTL2838 ADS-BAISLocal only
A self-hosted browser interface for any RTL-SDR dongle. Runs a local Python+Flask server and streams the spectrum to a full waterfall display using Server-Sent Events. No WebSocket, no external services β your local network only.
~13fps FFT. Tune 25MHzβ1.75GHz. Six presets: FM, ADS-B, AIS, NOAA, ACARS, VHF.
Sweeps a range, dwells per step, auto-detects signals above SNR threshold. Builds a channel list with drag-to-reorder and editable labels.
rtl_adsb.exe + pyModeS. Click β to decode Mode S transponders. Aircraft table with callsign, altitude, speed, heading. Waits ~30s for CPR pairs before showing positions.
rtl_fm.exe + GMSK demod + pyais. Decode ships on 161.975/162.025MHz. Ships table in popup.
Device handoff to rtl_fm for FM/AM demod. WAV stream to browser audio element. Server coordinates the handoff β only one process holds the device at a time.
C:\Users\YourName\bin\rtlsdr_set_dithering and several GPIO functions in try/except AttributeError
in both librtlsdr.py and rtlsdr.py.
Without this the device open call throws AttributeError on 64-bit DLL builds.
taskkill /F /IM python.exe # kill any existing instance first cd C:\your-rtlsdr-folder python sdr_server.py # open http://localhost:5000/
sdr_server.py β Flask app, SSE stream, scan engine, ADS-B/AIS decoders, audio coordinatorsdr.html β browser UI: waterfall, spectrum, presets, scan bar, channel list, popupssnapshots/ β versioned backups: v1 basic waterfall β v3.2 audio+AISTransport: SSE (not WebSocket). WebSocket failed due to version mismatches. SSE is native browser API, no libraries, works reliably.
This is a local-only app β it needs a running Python process and cannot be deployed to BTH as a static game. Fork this project page to document your own SDR setup, or fork the concept to build a WebSDR-style interface that works without local hardware (there are free SDR APIs available).