A comprehensive, web-based remote head for the Icom IC-705 — and, via a small companion server, any USB Icom radio or SDR. Live spectrum + waterfall, receiver audio, full CI-V control and a large suite of decoders, in any browser. No RS-BA1 or wfview install on the client — just a URL.
- Panadapter + audio in the browser — canvas spectrum/waterfall, AudioWorklet playback, full VFO/mode/filter/DSP control over Icom's native RS-BA1 protocol.
- Direct-entry tuning, band buttons, click-to-tune, signal scanner, RIT, split.
- Decoders: FT8/FT4, RTTY/PSK (fldigi), POCSAG, SSTV, APRS, ADS-B, NAVTEX, WEFAX, WSJT-X modes, ARDOP/Winlink.
- Digital voice: FreeDV, M17 (RX + TX) and P25 (RX) — decoded to speech.
- CW decode + keyer, and voice transcription (whisper.cpp).
- Tools: APRS/aircraft map, HamClock-style greyline + propagation, a click-to-tune frequency directory, a satellite tracker (ham + weather + Inmarsat) with SDR decode, and AIS ship tracking.
- Multi-radio switcher, logbook (ADIF), DX cluster.
- SDR back-ends via a standalone RS-BA1 server: serve a USB radio or an SDR, and add multiple remote SDRs (including cheap RTL-SDR collectors on Raspberry Pis).
Full guides with screenshots live in docs/:
- Operator's guide — the app and its full feature set
- RS-BA1 server — serve a USB radio or SDR, and add multiple remote SDRs
- Install guide — get up and running + SDR add-ons + remote collectors
# server (Linux Mint / Ubuntu) — installs everything, idempotent
sudo bash deploy/install-mint.sh
# point it at your radio + create a login
sudoedit /opt/icom-remote/icom-remote.env # radio host, TX flag, secret
cd /opt/icom-remote && .venv/bin/python -m app.users add <name>
sudo systemctl start icom-remoteThen browse to the host (front it with a TLS reverse proxy — see the install guide). For local development:
python3 -m venv .venv && .venv/bin/pip install -r requirements.txt
# set the env vars, then:
.venv/bin/python -m app.mainBrowser (canvas waterfall, AudioWorklet playback, WebSocket)
│ HTTPS / WSS (reverse proxy → TLS)
▼
aiohttp app 127.0.0.1:8000
│ Icom RS-BA1 UDP protocol (50001 control · 50002 CI-V · 50003 audio)
▼
IC-705 over WLAN —or— rsba1server → USB radio / SDR
Key modules:
app/radio/stream.py— UDP transport: handshake, tracked sends + retransmit, pkt7 keepalives.app/radio/control.py— login (scrambled credentials), 60 s token re-auth, serial/audio stream negotiation.app/radio/serialciv.py— CI-V over UDP (big-endian outer seq, 16-bit LE CI-V length; processed in arrival order like wfview).app/radio/audio.py— RX LPCM s16le mono 48 kHz; TX 20 ms frames.app/radio/civ.py— CI-V frames: freq/mode/S-meter/PTT/scope, spectrum waveform parsing.app/main.py— aiohttp: cookie login,/ws(JSON state + binary spectrum),/audio(binary PCM both ways), static UI.rsba1server/— the standalone RS-BA1 server (USB radio or SDR back-end).
- The IC-705 accepts one network client at a time — an RS-BA1/wfview session will conflict with Rafe (and vice-versa).
- TX (PTT + browser-mic audio, plus the digital modes) is disabled by
default; set
TX_ENABLED=1to enable. On-air transmit radiates under your callsign and licence — use a login password of its own. - Protocol work references kappanhang
(MIT) and wfview; decoders are invoked as
separate programs and credit their upstream projects (see
/creditsin the app and NOTICE.md).
Rafe is released under the PolyForm Noncommercial License 1.0.0 — free to use, modify, share and contribute to for noncommercial purposes; commercial use is not permitted. This is a source-available licence (it restricts commercial use, so it is not an OSI "open source" licence). Third-party attributions and the reasoning are in NOTICE.md.
"Rafe" is the product name; the installer, systemd unit, install path (
/opt/icom-remote) and Python package (app) still use the originalicom-remoteidentifiers so existing deployments keep working unchanged.

