A complete rundown of what Diddle does today, plus what's planned.
- TCI WebSocket client — connects to any TCI server (ExpertSDR2/3, SunSDR, RemoteHamRadio, and compatibles). Default
ws://localhost:40001. - Live rig state — frequency, mode, and PTT reflected in the header in real time.
- Rig control — set frequency (click a spot or waterfall tag to QSY), set mode, key/unkey PTT.
- Audio + spectrum streaming — pulls the radio's RX stream over TCI to feed the software decoder and waterfall.
- Pure-software AFSK demodulator written in Rust — two quadrature correlators (mark/space NCOs), matched-filter integration over one bit period, magnitude slicer, and an async-serial start/stop-bit state machine.
- ITA2 / Baudot decode with LTRS/FIGS shift handling (fldigi-canonical table).
- Standard RTTY defaults — 45.45 baud, 170 Hz shift, tones mark 2125 Hz / space 2295 Hz. Diddle forces the radio into DIGL (LSB) on connect, which is the usual sideband for amateur RTTY; keep REV off. Tones, shift, baud, and reverse are all tunable.
- AGC + biquad pre-filtering for clean copy on weak/crowded signals.
- Decoder view streams demodulated text as it arrives.
- Up to 12 simultaneous decoders scanning the smoothed spectrum for likely RTTY pairs, each running its own independent demodulator.
- Automatic callsign extraction — decoded text from each slot is scanned for plausible callsigns.
- Clickable waterfall tags — surfaced callsigns appear as floating tags on the waterfall; click to QSY straight onto the signal.
- SCP-validated spots — candidate calls can be checked against the Super Check Partial database to cut noise.
- Software AFSK modulator (
rtty_tx) — generates the RTTY tones for transmit over TCI; no FSK keying interface required. - Macro-driven sending with
<MYCALL>,<CALL>, and<SERIAL>substitution. - TX abort —
Esc(or the abort control) stops an in-flight transmission immediately.
- 8 editable macros (F1–F8) with sensible RTTY contest defaults (CQ, exchange, TU, repeat, AGN, BRK, 73…).
- ESM — Enter Sends Message (N1MM-style stepped Enter): empty → CQ, call entered → exchange, call+exch → TU + log. The ESM chip shows what
Enterwill do next. - Frequency in the Call field — type
14080(kHz) and pressEnterto QSY the radio so the signal lands on your mark tone. - Call History pre-fill — load an N1MM+ Call History file and the received exchange is filled in the moment a known call is typed or grabbed (contest-aware: Name + State for NAQP, State for Roundup, Zone + State for CQ WW).
- Saved contest setups — contest + F-key messages + call-history file stored under a name; pick one to bring a previous contest's configuration back.
- In-entry callsign autocomplete — arrow keys to pick,
Tab/Enterto accept SCP suggestions. - Macros persist to local storage and merge cleanly when new default slots ship.
- Persistent QSO log stored by the Rust backend at
<app_data>/diddle/qsos.json. - Automatic serial numbering with running next-serial tracking.
- Per-QSO fields — call, timestamp (UTC), frequency, band, mode, RST sent/received, exchange sent/received, serial.
- Band derivation from frequency across 160 m – 2 m.
- Editable / deletable entries with auto-save.
- Built-in contest simulator (Test panel) — a synthetic RTTY band through the real decoder. Pileup mode is interactive: CQ brings callers, naming one gets its exchange, TU logs it and brings the next; stations repeat on
AGN?, correct a mis-copied call, double in a busy pileup, and give up if ignored. Playback mode plays a scripted run (RTTY Runner style). Knobs for callers per CQ, HF noise, signal level, tone spread, and background stations elsewhere in the passband (they CQ, work people, and QSY, so spots and the bandmap get exercised). Calls are drawn from SCP; exchanges follow the active contest profile. A truth panel and log show what was really sent. The radio is never keyed while it runs. - Audio-device input — decode any system input device, e.g. a virtual cable (BlackHole on macOS, VB-CABLE on Windows) carrying an external simulator's output, or a sound card fed by a radio.
- WAV playback — play a recording through the decoder for offline accuracy checks.
Built-in profiles that format your sent exchange and hint the received field:
| Profile | Exchange |
|---|---|
| Generic RTTY | RST + Serial |
| CQ WW RTTY DX | RST + CQ Zone (US/VE add State) |
| CQ WPX RTTY | RST + Serial |
| ARRL RTTY Roundup | RST + State/Prov (DX: Serial) |
| NAQP RTTY | Name + State/Prov/Country |
Each profile knows its Cabrillo CONTEST: name and builds the sent exchange from your operator settings.
- ADIF — standard
.adiwithPROGRAMID: Diddle, per-QSO RTTY records, and anAPP_DIDDLE_SERIALfield. - Cabrillo 3.0 — contest-ready log with header (callsign, contest, category, name, grid) and
QSO:lines.
- MASTER.SCP callsign database for instant partial-call lookup as you type.
- One-click auto-download of the latest MASTER.SCP from supercheckpartial.com into the app data dir, with the path persisted for next launch.
- Spot validation — confirm a decoded candidate is a known contester before tagging it.
- Telnet DX cluster client (default
dxc.k1ttt.net:7373). - Live spot stream with TTL pruning, feeding the bandmap panel.
- Click-to-QSY from cluster spots (DIGL-aware — the dial is set so the spot lands on your mark tone).
- Cluster command line under the bandmap for
set/filter,sh/dx, etc., plus persisted login commands re-sent every time Diddle connects. - Bandmap current-band / all-bands toggle, with per-band worked status.
- Spectrum waterfall with callsign overlay.
- Tuning scope — classic crossed-bananas XY display for visually netting on a signal.
- Collapsible settings panel for operator + contest configuration.
- WAV player — load a recorded
.wavto test/replay the decoder offline.
- Cross-platform desktop app (macOS, Windows, Linux) via Tauri 2.
- Small footprint — native Rust core, no bundled browser-engine bloat beyond the system WebView.
Rough and subject to change — ideas, not promises:
- Real-time dupe checking + mult tracking with on-screen needed/worked status
- Per-band/per-mode score window and rate meter
- N1MM-compatible / SO2R and second-radio support
- Configurable RTTY parameters in the UI (baud, shift, tones, USB/LSB)
- Click-to-decode: spawn a decoder on any waterfall click
- CW/PSK modes alongside RTTY
- Log import (ADIF) and merge
- Code signing / notarization for macOS & Windows installers
- Skimmer integration
- In-app screenshots & docs
Have a request? Open an issue.