← BACK TO PROJECTS RFAI MONITOR
Software-Defined Radio · Local AI · v0.8.0

Every transmission. Understood.

RFAI captures radio transmissions with an Airspy Mini, transcribes them with local Whisper, classifies intent, and fingerprints the individual physical radio — all on-device, organised into named capture sessions you can export. No cloud. No subscriptions. From electromagnetic signal to searchable intelligence in seconds.

Local AI · No cloud Airspy Mini · HackRF One TX 24 MHz – 6 GHz v0.8.0 · Sessions & editions
🎯 Try Live Demo → View on GitHub How it works ↓
qalarc.com/projects/demos/rfai-monitor/app/ 🟢 LIVE
📡
Launch Live Demo
Real SvelteKit 0.8.0 UI · 9 pages · Synthetic data · No SDR needed · Opens in new tab
📊 Dashboard 📋 Log Room 💬 Chat 📡 Scanner 🗂️ Sessions 🎯 Monitor 📈 Analysis 🔍 TX ID
ℹ️
About this demo: The embed above runs the actual SvelteKit UI (build 0.8.0) in your browser with synthetic data baked in — 700+ transmissions, 16 operators, 6 named sessions, 6 fingerprinted devices. It's read-only — the backend is mocked by a Service Worker, and a synthetic SSE stream replays transmissions so the live feed moves. Writes (start session, tune, transmit) return demo-mode responses. No SDR connected, no live traffic. For the full live system: clone github.com/fivelidz/rfai-monitor and run ./start-showcase.sh.

The pipeline

Six layers from raw electromagnetic signal to searchable, session-organised insight. Each layer adds understanding — no information leaves your machine.

🔊
CAPTURE
Airspy Mini at 6 Msps — all 80 UHF CB channels in one capture. VAD + adaptive squelch. Stream watchdog self-heal.
📻
DEMODULATE
NFM · WFM · AM · USB/LSB SSB. Digital-signal detector labels DMR/C4FM. Voice descramble (static + rolling code).
✍️
TRANSCRIBE
faster-whisper streams partial transcripts within seconds. ROCm GPU support. Quality scoring per capture.
🧠
UNDERSTAND
Entities (callsigns, Q-codes, locations) + intent classification + urgency score. Local LLM or keyword.
🔗
FINGERPRINT
CFO + drift, spectral envelope, key-up transient. Online clustering answers: was that the same physical radio?
🗄️
SESSIONISE + ARCHIVE
Named capture sessions with JSON/CSV export. Urgency alerts with Kokoro TTS readback. SQLite + FTS5 forever.

9 pages in the app

The web UI runs locally at localhost:4310 (or as the Tauri desktop app) — live data via Server-Sent Events and WebSockets, any device on the LAN.

📊
Dashboard
Live transmission feed with 6 colour modes, band filters, inline audio, stat tiles with 24h deltas. SSE live updates.
📋
Log Room
Searchable full history. URL-synced filters — band, intent, urgency, callsign, frequency. Flag + notes + retranscribe.
💬
Chat Room
IRC-style view, bands as channels. Per-message playback, "radios on air", PTT transmit panel (operator edition).
📡
Scanner
Spectrum + waterfall with drag-to-tune VFO, 40-channel watchlist with per-channel SNR, presets, live gain/squelch.
🗂️
Sessions
Named capture sessions — start, switch, rename, end. Per-session history + one-click JSON/CSV export. v0.8.0.
🎯
Monitor
Watched-frequency manager — priority, enable/disable, one-click tune, hit counts and last-activity.
📈
Analysis
CSS-only analytics — activity timeline, band distribution, heatmap, busiest hours, signal quality. Live-capture provenance toggle.
🔍
TX ID
Transmitter identification — cluster browser, device prototypes, CFO scatter. Identity tiers from callsign to hardware.
ℹ️
About
Architecture, tech stack, frequency coverage, fingerprinting tiers, roadmap, legal notes.

Frequency coverage

Australian band presets out of the box. Custom VFO covers 24–1700 MHz on the Airspy (1 MHz–6 GHz TX/RX on HackRF).

476.4–477.4 MHz
UHF CB (AU)
NFM · all 80 channels
One 6 Msps capture. CH40 calling, CH5 emergency.
121.5 / 118–137 MHz
Aviation VHF
AM · 25 kHz
Guard watch preset.
156.8 MHz
Marine VHF
NFM · CH16
Distress + calling, continuous record.
144–148 MHz
2m Amateur
NFM · USB/LSB
146.52 calling · SSB demod.
430–440 MHz
70cm Amateur
NFM / digital
Repeaters, digital modes.
144.8 MHz
APRS
NFM · packet
Position decode lane.
88–108 MHz
FM Broadcast
WFM
Commercial radio.
24 – 1700 MHz
Custom VFO
NFM/WFM/AM/SSB
Any frequency, drag-to-tune.

Technology stack

Hardware

Airspy MiniPrimary RX · 24–1700 MHz · 12-bit · 6 Msps — 80 CB channels at once
HackRF OneTransmit + backup RX · 1 MHz – 6 GHz · 20 Msps half-duplex
Quansheng UV-K1 ×2Managed radio fleet — firmware flash + descramble from the app

Signal Processing

SoapySDRHardware abstraction — one codebase, any SDR
numpy · scipyFFT, decimation, demod chains — NFM/WFM/AM/USB/LSB, no GNU Radio
Descramble engineStatic-pivot, blind rolling and keyed-LCG voice descramble

AI / ML

faster-whisperStreaming STT, quality scoring. tiny.en → small. ROCm GPU.
Kokoro-82MTTS readback + transmit synthesis
Ollama (local LLMs)Intent classification — phi4, qwen, gemma + keyword fallback
Online clusteringCFO + spectral + transient — verified separating same-model radios

Backend

FastAPI ×2 + daemonDashboard :4310 · live SDR :4320 · transcribe daemon
SSE + WebSocketsStreaming partial transcripts, live spectrum events
SQLite + FTS5WAL mode · full-text search · 90-day retention manager

Frontend · packaging

Svelte 5 · SvelteKitReactive SPA — the same build runs this demo
Tauri 2 · RustDesktop shell + system tray in Rust — the mini-PC appliance, and SPECTRE's app
systemd · watchdogUser services, autostart, stream self-heal

Transmitter fingerprinting

RFAI identifies individual physical radios — not just voices. Field-verified: two identical model radios separated cleanly by hardware signature alone.

T0
Verified callsign
Whisper extracts the formal callsign (VK2ABC) from the transcript. Highest confidence — the operator stated identity on air.
T1
Spoken handle
Pattern matching extracts self-reported aliases ("Sandshoe", "Pickup 4"). Medium confidence.
T2
Hardware fingerprint
Carrier frequency offset + drift, spectral envelope, key-up transient. Online clustering builds device prototypes — "was that the same radio?"
T2b
IQ-level capture
Raw IQ snippets stored per transmission for offline RF-DNA analysis. Experimental — the research lane behind T2.

Sessions & editions — v0.8.0

The commercial foundation: organised capture for after-action review, and a safe listen-only mode for shared deployments.

🗂️
Named capture sessions
"Bondi afternoon watch", "Convoy watch — Pacific Mwy". Start, switch and end from the topbar; full per-session history.
⬇️
One-click export
JSON or CSV per session — timestamps, frequencies, transcripts, intents, clusters. Built for after-action review and reporting.
🎧
Consumer edition
Listen-only. Transmit controls hidden and blocked server-side (allow_tx gate) — a LISTEN-ONLY badge shows the mode. Lower liability for shared sites.
🛠️
Operator edition
Full capability — capture, transmit (TTS or audio), fingerprinting, tuning, integrations.

Integrations & radio fleet

🔗
Comms API
REST pull, SSE stream and push webhooks — with native Discord and Slack message formats. Pipe live RF intel into anything.
📻
Radio flash panel
Fleet firmware management for the Quansheng UV-K1 handhelds — DFU auto-detect, two-step confirm, safety rails, live log. See Kong Radio Ops.
🔓
Descramble lane
Frequency-inversion scramblers (BK4819 fleet) — auto-detect, fixed and keyed rolling-code replay. Descrambled audio flows to STT and fingerprinting.
🖥️
Appliance model
Mini-PC + Airspy, systemd autostart, LAN web dashboard on any device, Tauri shell on the box. No cloud, no subscription.

Experimental lanes

Beyond the core monitor — the research branches growing out of it.

👁️
SPECTRE
All-domain SIGINT early-warning grid — wideband RF, WiFi + drone Remote-ID, BLE/AirTag trackers, ADS-B + squawks, 433 MHz ISM and DJI bursts, fused on one event bus with map and threat feed. Own Tauri app.
🌀
psylink
A data modem that sounds like alien psytrance — polyphonic harmonic-scale keying carrying real bytes over the air (HackRF → Airspy, byte-perfect, ~80 bps). Steganographic data link.
🛰️
GPS · APRS
APRS decode lane on 144.800 MHz plotted on a map, plus a GPS position beacon over radio — position with no internet.
📟
morse_rf
Morse TX/RX and SSTV image-over-RF exploration — the minimal-bandwidth end of the stack.

Release history & roadmap

✅ v0.2 – v0.6Foundation & web UI
Live SDR capture · WFM/NFM/AM demod · faster-whisper STT · Kokoro TTS · entities + intent · SQLite + FTS5 · SvelteKit UI rewrite · channel picker · colour modes · fingerprint tab
✅ v0.7.0Field-hardened intelligence
Stream watchdog self-heal · corrected AU 80-channel plan · 40-channel watchlist + multi-channel transcription · RF fingerprinting field-verified (two same-model radios) · Comms API (Discord/Slack) · live RX gain/squelch panel
✅ v0.8.0Commercial foundation
Named/switchable/exportable sessions · consumer listen-only edition · SSB (USB/LSB) demod · digital-signal labelling (DMR/C4FM) · session-manager UI · Tauri 2 desktop shell (Rust)
🔧 In progressAll-domain + position
SPECTRE sensor fusion (WiFi/BLE/ADS-B/ISM lanes) · GPS/APRS decode + beacon · psylink OTA data link hardening
📋 NextVoice & scale
pyannote speaker embeddings on fingerprints · local-LLM intent upgrade · multi-node capture · appliance release packaging

Proven in the field

📊
8,700+ transmissions
71.5 hours of RF archived and analysed in the live demo analytics dataset — real captures, not lab fixtures.
🏜️
Remote property test
Extended off-grid deployment — multi-band monitoring on battery and solar with zero cloud dependency.
🏖️
Urban CB survey
Bondi band-survey method + watchlist — repeatable area-scan methodology documented with snapshots.
🔁
TX loopback verified
7-band transmit test harness — HackRF TX received and transcribed by the same stack, end-to-end.

Legal · privacy

Reception is legal in AU
Radiocommunications Act 1992 permits reception of public radio (CB, amateur, aviation, marine) for personal use.
🔒
All AI runs locally
No audio, transcripts or metadata leave your machine. Whisper, Kokoro, Ollama all local.
⚠️
Transmitting requires licence
UHF CB allows licence-free ≤5W. Amateur bands need ACMA licence. Reception is unlicensed.
🚫
No private comms
Cellular, DECT, encrypted services not targeted. Reception of private comms prohibited.

Run it locally

# Clone the repo git clone https://github.com/fivelidz/rfai-monitor # Install dependencies (Python 3.11 + 3.14 lanes, SoapySDR, Node for the UI) pip install fastapi uvicorn faster-whisper numpy scipy SoapySDR sounddevice # Start the stack — dashboard :4310 · live SDR :4320 · transcribe daemon cd rfai-monitor && ./start-showcase.sh # Desktop appliance shell (Tauri) instead of a browser tab ./start-tauri.sh # Open in browser — or any device on the LAN xdg-open http://localhost:4310