Every transmission. Understood.
An open-source SDR intelligence platform that captures radio transmissions, transcribes them with local AI, and surfaces patterns in real time — no cloud, no subscriptions, no hardware limit beyond your antenna.
What it does
RFAI is a six-layer intelligence stack sitting on top of a software-defined radio. Each layer adds understanding — from raw electromagnetic signal to searchable, queryable insight.
Frequency coverage
Any band the HackRF (or Airspy / RTL-SDR) can receive. Current presets cover Australian domestic bands — add any frequency with the custom VFO.
Technology stack
Hardware
Signal Processing
AI / ML
Backend
Frontend
Transmitter fingerprinting
RFAI can identify individual physical radios — not just voices — using a multi-tier biometric system. Each tier adds confidence.
CTCSS is the strongest discriminator — it is programmed into the radio itself, so the same hardware always emits the same sub-audible tone regardless of speaker.
Pages in this app
Demo mode — no SDR required
RFAI runs without any radio hardware. Three ways to inject audio:
/tmp/rfai-demo/ which the transcribe daemon picks up automatically via the sentinel protocol. Your voice appears in the live feed as a real transmission.POST /api/demo/mic-record · POST /api/demo/mic-stopPOST /api/transmit/audio. Played through the soundbar and logged to the DB as source='transmitted'.POST /api/transmit/text · body: { text, band, frequency_hz }Roadmap
- HackRF One — live IQ capture via ctypes
- Spectrum + waterfall display (PyQt5)
- WFM / NFM / AM demodulation with FIR decimation chains
- RMS VAD + adaptive squelch gate
- Auto-record WAV on transmission detect
- Band presets: UHF CB, Aviation, Marine, Amateur, FM
- faster-whisper STT — streaming partial transcripts via SSE
- Kokoro-82M TTS — spoken readback and transmit synthesis
- Entity extraction — callsigns, Q-codes, locations, phonetic alphabet
- Intent classification — 8 categories + urgency score (0–1)
- SQLite + FTS5 — all transmissions, full-text search
- 7-model intent bakeoff (Claude, phi4, qwen, gemma, keyword)
- Svelte 5 SPA — Dashboard, Log Room, Chat Room, Scanner, Analysis, TX ID
- Live SSE feed — recording_started → partial transcript → complete
- MIC DEMO mode — showcase without SDR hardware
- Transmit panel — TTS synthesis + soundbar playback + DB logging
- Transmitter fingerprinting UI — cluster browser, identity tiers
- FastAPI backend + uvicorn + CORS on ports 4310/4311/4312
- Light mode + alternate dark themes (CSS variable swap)
- Audio playback — inline player for archived transmissions
- Compact message density — reduce row padding
- Frequency filter pills + colour-coded by freq or ID
- CB/Marine/Aviation channel lookup table (477.125 → "UHF CB Ch40")
- Flag SSE broadcast — live sync across browser tabs
- Svelte source committed to git (currently only build is tracked)
- Airspy Mini integration — 12-bit IQ, true carrier phase data
- Carrier frequency offset extraction — per-radio systematic offset
- Transmitter turn-on transient — unique hardware signature
- Phase noise floor — distinguishes radio model + unit
- Combined IQ + voice + CTCSS fingerprint — high-confidence ID without callsign
- Cross-band operator tracking — same voice heard on UHF + Marine
- Channel-hop detection — "go to 5" → auto-follow to ch5
- Convoy/group session stitching — link related transmissions
- Temporal pattern analysis — who transmits when, at what cadence
- Deploy on qalarc.com — live demo of the full UI and stack
- Demo data: curated synthetic transmissions covering all intent types
- Read-only public view — no live SDR in cloud (legal/practical)
- Replay mode — watch a stored session play back in real time
- Shareable permalinks — link to a specific transmission or time range
Architecture
┌─────────────────────────────────────────────────────────────────────┐
│ HARDWARE LAYER │
│ HackRF One ──────────────────── USB ──────────────── Desktop PC │
│ (1MHz–6GHz · 20Msps · half-duplex) AMD ROCm iGPU available │
└─────────────────────┬───────────────────────────────────────────────┘
│ IQ samples (int8 → complex64)
▼
┌─────────────────────────────────────────────────────────────────────┐
│ SCANNER (hackrf_scanner_v9.py · PyQt5 GUI) │
│ Engine thread: FFT → spectrum/waterfall → demodulate (WFM/NFM/AM) │
│ AudioOut: 400ms ring buffer → sounddevice → speakers │
│ VAD + squelch → auto-record WAV → sentinel file created │
└─────────────────────┬───────────────────────────────────────────────┘
│ WAV + .inprogress sentinel
▼
┌─────────────────────────────────────────────────────────────────────┐
│ TRANSCRIBE DAEMON (port 4311) │
│ inotify watches /tmp/rfai-test-audio/ + /tmp/rfai-demo/ │
│ sentinel created → emit recording_started SSE │
│ sentinel deleted → queue WAV for processing │
│ faster-whisper tiny.en (streaming) → partial_transcript SSE │
│ faster-whisper small (final) → transcription_complete SSE │
│ entities.py → callsigns, Q-codes, locations │
│ intent_llm.py → Ollama/keyword → intent + urgency │
│ → INSERT INTO transmissions (SQLite · WAL mode) │
└─────────────────────┬───────────────────────────────────────────────┘
│ SSE proxy + DB queries
▼
┌─────────────────────────────────────────────────────────────────────┐
│ WEB DASHBOARD (FastAPI · port 4310) │
│ GET /api/transmissions GET /api/stats GET /api/operators │
│ GET /api/events ← SSE proxy from daemon + DB poll │
│ GET /api/clusters ← fingerprint.py clusters │
│ POST /api/demo/mic-record POST /api/transmit/text │
│ POST /api/transmit/audio GET /api/daemon/health │
│ Serves ui/build/ SPA at / (catch-all → index.html) │
└─────────────────────┬───────────────────────────────────────────────┘
│ HTTP/SSE · CORS
▼
┌─────────────────────────────────────────────────────────────────────┐
│ BROWSER UI (SvelteKit SPA · port 4312 / 4310) │
│ /dashboard — live feed · stats · band chart · MIC DEMO │
│ /log — searchable table · flag · notes · export │
│ /chat — IRC-style · live bubble · transmit panel │
│ /scanner — waterfall · VFO · hardware config │
│ /analysis — stats · model bakeoff · intent arena │
│ /fingerprint — cluster browser · identity tiers · label │
│ /about — this page │
└─────────────────────────────────────────────────────────────────────┘
Legal & compliance
This system is designed for lawful monitoring of public radio traffic for personal, research and educational purposes only. Reception only. Personal use. Australian Radiocommunications Act 1992.