A RTTY contest logger — TCI-first, rate-focused.
Diddle is a desktop RTTY contest logger built around TCI software-defined radios (ExpertSDR / SunSDR, RemoteHamRadio, and compatibles). It decodes and transmits RTTY entirely in software, runs a multi-channel decoder across the whole waterfall, and is tuned for one thing: keeping your QSO rate high during a contest.
"Diddle" is the idle stream of LTRS a RTTY transmitter sends between characters to hold sync. Fitting name for a logger that lives in the RTTY sub-bands.
Most RTTY contesting setups glue together MMTTY/2Tone + N1MM + a FSK keying interface. Diddle collapses that whole chain into a single app that talks to your TCI radio over one WebSocket:
- No external decoder, no soundcard routing, no FSK interface. RTTY demod and modulation happen in Rust, driven by the radio's IQ/audio stream over TCI.
- The whole band, decoded at once. A multi-decoder watches the waterfall and surfaces callsigns as clickable tags — click to QSY and work them.
- Built for rate. N1MM-style ESM (Enter Sends Message), Super Check Partial, DX cluster spots, and contest-aware exchange macros keep your hands on the keyboard.
See FEATURES.md for the full feature list.
Coming soon. (Header / waterfall / multi-decoder / entry window / logbook.)
Pre-built installers for macOS, Windows, and Linux are attached to each GitHub Release.
| OS | Download |
|---|---|
| macOS | .dmg (Apple Silicon + Intel) |
| Windows | .msi or NSIS .exe |
| Linux | .AppImage, .deb, or .rpm |
These artifacts are produced by CI on each platform's native runner — see .github/workflows/release.yml. Diddle is not code-signed yet, so:
- macOS: right-click the app → Open the first time (Gatekeeper).
- Windows: click More info → Run anyway on the SmartScreen prompt.
To build from source instead, see BUILD.md.
- Start your TCI radio software (ExpertSDR2/3, SunSDR, RemoteHamRadio, etc.) and enable the TCI server (default
ws://localhost:40001). - Launch Diddle, type your TCI URL in the header, and click Connect. The frequency/mode readout should come alive.
- Open Settings (bottom panel) and fill in your operator info — callsign, name, state/province, CQ zone, grid — and pick your contest.
- Tune to a RTTY signal. The decoder view shows demodulated text; the waterfall shows callsign tags from the multi-decoder.
- Work stations. With ESM on,
Entersteps through CQ → exchange → TU + log automatically.
Diddle uses N1MM-style Enter Sends Message stepping in the entry window:
| Entry state | Enter does |
|---|---|
| Empty form | Fire F1 (CQ) |
| Callsign entered | Fire F2 (exchange) and jump to the Exch field |
| Call + exchange filled | Fire F3 (TU) and log the QSO |
The ESM chip in the entry window always shows what the next Enter will do. Esc aborts an in-flight transmission. The F1–F8 macros are fully editable in Settings and support <MYCALL>, <CALL>, and <SERIAL> substitution.
- Frontend: SvelteKit + Svelte 5 (runes), TypeScript, Vite,
adapter-static. - Shell + backend: Tauri 2 with a Rust core (
tokioasync). - DSP (Rust): software RTTY demodulator/modulator, AGC, biquad filtering, spectrum/scope generation, multi-decoder.
- Radio I/O: TCI WebSocket protocol client.
src/ SvelteKit frontend
lib/
Header.svelte TCI connect bar + rig readout
Waterfall.svelte spectrum waterfall + callsign tags
DecoderView.svelte demodulated RTTY text
EntryWindow.svelte call/exchange entry, ESM logic
FKeys.svelte F1–F8 macro buttons
Logbook.svelte QSO table + ADIF/Cabrillo export
BandmapPanel.svelte DX cluster spots / bandmap
SettingsPanel.svelte operator + contest config
TuningScope.svelte crossed-bananas XY scope
contests.ts contest profiles + exchange builders
exports.ts ADIF + Cabrillo formatters
macros.svelte.ts macro store + expansion
*.svelte.ts rune-based state stores (qsoLog, settings, spots, cluster)
src-tauri/ Rust backend (Tauri)
src/
tci/ TCI protocol + client
dsp/ rtty, rtty_tx, agc, biquad, scope, spectrum, multi_decoder
cluster.rs DX cluster telnet client
scp.rs Super Check Partial database
log_storage.rs QSO log persistence
wav_player.rs WAV playback for decoder testing
ipc.rs Tauri command handlers
.github/workflows/ CI: cross-platform release builds
Issues and PRs welcome — see CONTRIBUTING.md. Diddle is early (v0.1) and the feature surface is moving quickly; check the roadmap before starting big work.
MIT © 2026 WW2DX
73 and good contest. — WW2DX