Support the developer of this open-source project
Signal Intelligence Platform
A web-based interface for software-defined radio tools.

Live backend:
- Uses rtl_fm piped into multimon-ng (MORSE_CW) for real-time decode.
Recommended baseline settings:
- Tone: 700 Hz
- Bandwidth: 200 Hz (use 100 Hz for crowded bands, 400 Hz for drifting signals)
- Threshold Mode: Auto
- WPM Mode: Auto
Auto Tone Track behavior: - Continuously measures nearby tone energy around the configured CW pitch. - Steers the detector toward the strongest valid CW tone when signal-to-noise is sufficient. - Use Hold Tone Lock to freeze tracking once the desired signal is centered.
Troubleshooting (no decode / noisy decode): - Confirm demod path is USB/CW-compatible and frequency is tuned correctly. - If multiple SDRs are connected and the selected one has no PCM output, Morse startup now auto-tries other detected SDR devices and reports the active device/serial in status logs. - Match tone and bandwidth to the actual sidetone/pitch. - Try Threshold Auto first; if needed, switch to manual threshold and recalibrate. - Use Reset/Calibrate after major frequency or band condition changes. - Raise Minimum Signal Gate to suppress random noise keying.
git clone https://github.com/smittix/intercept.git
cd intercept
./setup.sh # Interactive menu (first run launches setup wizard)
sudo ./start.sh
On first run, setup.sh launches a guided wizard that detects your OS, lets you choose install profiles, sets up the Python environment, and optionally configures environment variables and PostgreSQL.
On subsequent runs, it opens an interactive menu:
INTERCEPT Setup Menu
════════════════════════════════════════
1) Install / Add Modules
2) System Health Check
3) Database Setup (ADS-B History)
4) Update Tools
5) Environment Configurator
6) Uninstall / Cleanup
7) View Status
0) Exit
Production vs Dev server:
start.shauto-detects gunicorn + gevent and runs a production server with cooperative greenlets — handles multiple SSE/WebSocket clients without blocking. Falls back to Flask dev server if gunicorn is not installed. For quick local development, you can still usesudo -E venv/bin/python intercept.pydirectly.
Choose what to install during the wizard or via menu option 1:
| # | Profile | Tools |
|---|---|---|
| 1 | Core SIGINT | rtl_sdr, multimon-ng, rtl_433, dump1090, acarsdec, dumpvdl2, ffmpeg, gpsd |
| 2 | Maritime & Radio | AIS-catcher, direwolf |
| 3 | Weather & Space | SatDump, radiosonde_auto_rx |
| 4 | RF Security | aircrack-ng, HackRF, BlueZ, hcxtools, Ubertooth, SoapySDR |
| 5 | Full SIGINT | All of the above |
| 6 | Custom | Per-tool checklist |
Multiple profiles can be combined (e.g. enter 1 3 for Core + Weather).
./setup.sh --non-interactive # Headless full install (same as legacy behavior)
./setup.sh --profile=core,weather # Install specific profiles
./setup.sh --health-check # Check system health and exit
./setup.sh --postgres-setup # Run PostgreSQL setup and exit
./setup.sh --menu # Force interactive menu
git clone https://github.com/smittix/intercept.git
cd intercept
docker compose --profile basic up -d --build
Note: Docker requires privileged mode for USB SDR access. SDR devices are passed through via
/dev/bus/usb.
Cross-compile on an x64 machine and push to a registry. This is much faster than building natively on an RPi.
# One-time setup on your x64 build machine
docker run --privileged --rm tonistiigi/binfmt --install all
docker buildx create --name intercept-builder --use --bootstrap
# Build and push for both architectures
REGISTRY=ghcr.io/youruser ./build-multiarch.sh --push
# On the RPi5, just pull and run
INTERCEPT_IMAGE=ghcr.io/youruser/intercept:latest docker compose --profile basic up -d
Build script options:
| Flag | Description |
|---|---|
--push |
Push to container registry |
--load |
Load into local Docker (single platform only) |
--arm64-only |
Build arm64 only (for RPi deployment) |
--amd64-only |
Build amd64 only |
Environment variables: REGISTRY, IMAGE_NAME, IMAGE_TAG
If you've pushed to a registry, you can skip building entirely on the target machine:
# Set in .env or export
INTERCEPT_IMAGE=ghcr.io/youruser/intercept:latest
# Then just run
docker compose --profile basic up -d
Use the Environment Configurator (menu option 5) to interactively set any INTERCEPT_* variable. Settings are saved to a .env file that start.sh sources automatically on startup.
You can also create or edit .env manually:
# .env (auto-loaded by start.sh)
INTERCEPT_PORT=5050
INTERCEPT_ADSB_AUTO_START=true
INTERCEPT_DEFAULT_LAT=51.5074
INTERCEPT_DEFAULT_LON=-0.1278
The ADS-B history feature persists aircraft messages to PostgreSQL for long-term analysis.
Automated setup (local install):
./setup.sh --postgres-setup
# Or use menu option 3: Database Setup
This will install PostgreSQL if needed, create the database/user/tables, and write the connection settings to .env.
Docker:
docker compose --profile history up -d
Set the following environment variables (in .env):
INTERCEPT_ADSB_HISTORY_ENABLED=true
INTERCEPT_ADSB_DB_HOST=adsb_db
INTERCEPT_ADSB_DB_PORT=5432
INTERCEPT_ADSB_DB_NAME=intercept_adsb
INTERCEPT_ADSB_DB_USER=intercept
INTERCEPT_ADSB_DB_PASSWORD=intercept
To store Postgres data on external storage, set PGDATA_PATH (defaults to ./pgdata):
PGDATA_PATH=/mnt/usbpi1/intercept/pgdata
Then open /adsb/history for the reporting dashboard.
Verify your installation is complete and working:
./setup.sh --health-check
# Or use menu option 2
Checks installed tools, SDR devices, port availability, permissions, Python venv, .env configuration, and PostgreSQL connectivity.
After starting, open http://localhost:5050 in your browser. The username and password is admin:admin
The credentials can be changed in the ADMIN_USERNAME & ADMIN_PASSWORD variables in config.py
| Hardware | Purpose | Price |
|---|---|---|
| RTL-SDR | Required for all SDR features | ~$25-35 |
| WiFi adapter | Must support promiscuous (monitor) mode | ~$20-40 |
| Bluetooth adapter | Device scanning (usually built-in) | - |
| GPS | Any Linux supported GPS Unit | ~10 |
Most features work with a basic RTL-SDR dongle (RTL2832U + R820T2).
| :exclamation: Not using an RTL-SDR Device? |
|---|
| Intercept supports any device that SoapySDR supports. You must however have the correct module for your device installed! For example if you have an SDRPlay device you'd need to install soapysdr-module-sdrplay. |
| :exclamation: GPS Usage |
|---|
| gpsd is needed for real time location. Intercept automatically checks to see if you're running gpsd in the background when any maps are rendered. |
This project was developed using AI as a coding partner, combining human direction with AI-assisted implementation. The goal: make Software Defined Radio more accessible by providing a clean, unified interface for common SDR tools.
This software is for educational and authorized testing purposes only.
Apache 2.0 License - see LICENSE
Created by smittix - GitHub
rtl-sdr | multimon-ng | rtl_433 | dump1090 | AIS-catcher | acarsdec | direwolf | rtlamr | dumpvdl2 | aircrack-ng | Leaflet.js | SatDump | Celestrak | Priyom.org
$ claude mcp add intercept \
-- python -m otcore.mcp_server <graph>