Free remote control for your Icom IC-9700, IC-7610 and IC-7300 MK2
Connect over USB or your network and get a live waterfall and spectrum, first class satellite tooling support, AI noise reduction, voice commands, signal detection and AI classification, CW keyer, WSJT-X and FLdigi support, and full browser operation from a phone or tablet. Free to use — 6,061 tests passing.
SHA-256 checksums
Verify your download with shasum -a 256 <file> (macOS/Linux) or certutil -hashfile <file> SHA256 (Windows).
42330299ad3b9b5f36f36fbe3053c4879cab1be474cadf2d54d99626834deecc Pycom-Win64-v20261020.zip
c3cb8ba7a855720857c7987c0847d6a905e0897f99d86b9d0d87af9b86f62552 Pycom-MacOS-v20261020.zip
17402dcf998246f98b79b039ce2cce896756c0858681d30d54a186caf4980027 Pycom-MacOS-Intel-v20261020.zip
What’s new in Version 20261020
Change Log:
New Features- Audio Scope scheduled recordings — automate an off-air capture. Open the new Schedule window in the Audio Scope, optionally set a frequency and mode (leave them blank to record wherever the dial is, as-is), choose Start in minutes or at a clock time, set a recording length in minutes, and fire it once or repeat it every N minutes. At each firing the app tunes the MAIN band and records for the set duration, then restores the exact frequency and mode it started with. A job with neither frequency nor mode touches nothing on the radio, so satellite-pass captures can run under external Doppler control. Schedules persist across app restarts
- Audio Scope keeps working with the window closed — recordings and schedules live in the app itself, not in the Audio Scope window: close the window mid-recording or mid-schedule and the capture finishes properly, with the recording journal intact
- Audio Scope view follows the filter width — the visible span is now derived from the mode's filter width plus a 500 Hz edge gap, so the channel fills the view at every mode and bandwidth
- Waterfall ref level as a slider — the Lvl ▲/▼ buttons became a vertical slider on the waterfall's right edge. The camera capture button has also moved onto the waterfall itself, beside the new Audio Scope launcher
- Flexible frequency entry — the tuning field accepts plain hertz, MHz with decimals, or the positional MHz.kHz.Hz digit form (“145.550.000”). Typing a frequency on another band tunes cross-band directly, out-of-band values are refused with the band explanation rather than silently retuned, and if the radio itself refuses a frequency or mode change, the refusal is surfaced
- The Audio Scope status line shows a remaining-time timer while a recording plays back
- Fixed connecting to a radio while one was already live: switching radios now tears down the previous session completely (serial port, transports, rigctld, satellites) before the new connection starts, instead of leaving the old session half-alive
- 6,061 tests passing, flake8 clean
Change log history
Installers for older releases have been retired — change logs kept for reference.
Version 20261016
Change Log:
New Features- Audio Scope (Tools → Audio Scope) — a live waterfall and spectrum of your actual receive audio: the same 48 kHz stream you or data modes hear, displayed in-app. A FFT that resolves weak signals the radio’s RF waterfall cannot show, with frequency-axis labels, floor/range sliders, automatic noise-floor calibration, and a hover readout that shows frequency and mode. Works over both network (UDP) and USB serial connections
- Audio Scope recordings — the record button saves RX audio to WAV in ~/Pycom/audio/live_recording/ with a metadata sidecar recording frequency, mode and RIT; a QSO that changes band or mode mid-recording is journaled as segments. Review any recording in place: pause/resume in exact position, playback paced to real time, coloured badge with the recording date, and a Live button that snaps back to the live picture. Live listening audio muted while a recording plays, and playback uses your radio’s speaker device with the OS default as fallback
- AI signal highlights (Find mode) — pick a target signal type from the new Find selector on the waterfall control bar, and every automatically detected candidate the classifier confidently matches is highlighted live on the equalizer strip with a bar spanning the signal’s refined bandwidth. Unmatched or low-confidence candidates draw nothing; switching back to “None” restores the standard display, and selecting a type auto-enables Signal Detection. Captures taken while Find is active keep only the highlighted candidates
- Retrained AI signal classifier bundled with the app — the model now trains on exactly the fixed-width signal patches the Find-mode annotator classifies with, eliminating the train/serve mismatch for Find mode. 797 labelled captures across 10 signal types. User-trained models keep working untouched; models from before this release get a one-time out-of-date notice while preprocessing stays compatible
- Reproducible training — retraining now uses a seeded, deterministic train/validation split and records per-class accuracy, per-class counts and top confusions in the model’s metadata, so accuracy numbers are reproducible and comparable between models
- Rig Control console log lines are colour-coded per client connection, so simultaneous rigctld clients (e.g. Gpredict and WSJT-X) are easy to tell apart at a glance
- Updated splash screen
- Fixed a rigctld server on Windows leaving the Status-tab client LED showing an active connection after a client’s network stream was abruptly reset
- 5,848 tests passing, flake8 clean
Version 20261013
Change Log:
New Features- AI label confirmation in Signal Capture — the ✓ tick is now a declaration toggle: tick a row to confirm your own label and a Confirm All button touches only undeclared rows. Rows without your label always show what the AI thinks, and every label keeps its provenance (previously the AI label was auto-applied below a 50% confidence threshold — now you stay in control)
- Live-synced label edits — renaming a signal in the capture list updates the list, the detail row and the training metadata in one go, so a label change can't leave stale rows behind
- Retrained signal classifier — 90.4% validation accuracy on 779 captures (up 12 points from 78.1%), with new noise-relative patch normalization that measures each patch against the local noise floor. Existing user-trained models keep working: preprocessing now follows the model via a built-in provenance marker
- Memory renaming — saved memories can be renamed with a new Rename button and dialog. Name matching is per-radio and case-insensitive, so FT8 and ft8 no longer create two memories
- Signal Capture classification list now scrolls — the window fits smaller screens without cramping the waterfall
- Fixed a failed connect leaving an orphaned radio session — every connect failure now releases the radio and transport cleanly, and the app can no longer get stuck showing a permanent "connecting" state
- Fixed a first-run crash when seeding the sample config on a fresh install
- More reliable UDP connect retry — the network handshake now closes cleanly between attempts instead of leaving tokens behind (vendored library sync from upstream)
- 5,555 tests passing, flake8 clean
Version 20261005
Change Log:
New Features- Waterfall/equalizer split maintained during window resize — the flexible area between them now keeps the startup 130:100 ratio instead of the equalizer absorbing all growth; captured signal archives (.npz) stay size-stable with canonical heights
- Side-aware filter bandwidth caching — the waterfall's filter rectangle is now fed from per-side (MAIN/SUB) bandwidth caches. Any read taken while the radio is parked on SUB (Gpredict probing, satellite tracking, SatPC32, memory save, status polling) no longer poisons the MAIN bandwidth the waterfall renders, which previously stuck the filter rectangle until manual reselect
- Filter preservation across mode changes — mode and DATA-mode changes now capture the active FIL slot first and write it back in the same command (CI-V 06 [mode][filter]), so the radio's per-mode filter memory no longer silently flips your filter (and its bandwidth) when you change mode
- Fixed slow-down-and-stall of the GUI during long sessions (particularly with rigctld clients such as Gpredict or WSJT-X connected). Root causes found and eliminated from an overnight soak test:
- Waterfall render queue was unbounded — under GUI load it grew forever (overnight run: 70,565 queued frames, ~280 MB). Now bounded with drop-oldest, so the waterfall always shows the freshest data
- Rig Control console rendered one UI event per command — high client rates (6–9 lines/s) ratcheted render cost until the UI stalled. Lines are now batched and flushed on a 250 ms timer, and console history is capped
- Frequency labels did a full widget redraw on every update even when unchanged — at 1 Hz polling from Gpredict this consumed up to 70% of the UI budget. Only changed values now redraw
- Transcribe panel and Voice console kept every historical line and per-line formatting tag forever — both now keep a bounded history
- Signal detector grew an ever-longer per-signal frame list during multi-hour tracking — now constant-size
- rigctld warm-query leak fixes — repeated 'v' (get VFO), 'x' (mode reads) and \get_vfo_info polling issued hidden CI-V round-trips to the radio on every poll (some also cross-contaminated the MAIN/SUB caches); warm queries are now served zero-CI-V from cache
- Fixed the Status tab Rigctld client LED showing "no client" while a server still had an active second client (per-server connection counting replaces last-writer-wins)
- 5,431 tests passing, flake8 clean
Version 20261002
Change Log:
New Features- Dual rigctld servers — an optional second rigctld-compatible TCP server (default port 4533, off by default) can run alongside the primary (4532). Each server has its own enable switch, port, and PTT & Read Only flag; both control the same radio and each supports multiple concurrent clients — for example, give Gpredict its own port while WSJT-X keeps the primary, or run a read-only instance for monitoring tools
- Live rigctld configuration — either server can be enabled/disabled, re-ported, or flagged PTT & Read Only from Configuration → General with immediate effect and no application restart; enabling the same port on both servers is rejected with a clear error
- Shared Rig Control console — log lines from both servers carry a per-port [NNNN] prefix (second server's lines colour-tinted), with a Display Both / per-port filter rebuilt from history and the Execute box targeting the first available server
- Status tab service rows are live — the S.A.T, SatPC32 and Rigctld 2 rows appear and hide following their configuration and runtime state; the panel keeps its fixed footprint and the S.A.T LED shows grey when enabled but not actively tracking
- RC-28 settings consolidated onto a single row in the General tab; the server-address field only appears when Location is set to Remote
- Quieter console/log — web fan-out gain triage messages demoted from INFO to DEBUG under the Web Server log component
- Fixed Windows log-rotation spam — when log file crossed 5 MB, rotation failed
- Fixed web browser Listen audio playing roughly twice as loud as the desktop — web loudness now matches the desktop exactly (composed Volume × RX Gain), the Mute button now actually silences the browser stream, and voice-capture ducking mutes the web stream too
- rigctld bind failures (port already in use) are now reported to the console and log instead of the server thread dying silently
- ?-capability probes (V ?, M ?, …) are answered even when a server runs in PTT & Read Only mode
- 5,276 tests passing, flake8 clean
Version 20260925
Change Log:
New Features- Audio over the serial/USB connection — the Icom USB Audio CODEC is now fully supported: live receive audio to your speakers with volume/mute, transmit audio from your microphone while keyed, and per-radio Audio In / Audio Out codec device selection in Manage Radios
- Full UDP parity on serial — web browser Listen and PTT, Voice TX slots, Transcribe (Whisper + LLM callsign extraction), and AI Noise Reduction now all work over a serial connection
- RX Gain and TX Gain — new per-radio, per-connection-type gain sliders (0–36 dB) in Audio Settings; values persist per radio and survive restarts
- Web listen stream soft-limits peaks instead of hard-clipping when RX Gain is high
- AI Noise Reduction moved to the head of the audio chain — one shared denoiser feeds the speakers, Transcribe, and the web listener simultaneously (lower CPU, one consistent stream)
- Audio device names are remembered across reboots — Windows device-ID shifts are re-resolved by name at startup ("Speaker moved" / "Mic moved"), preferring the WASAPI device over DirectSound ghosts
- The radio's USB MOD Level is no longer forced to 25% on serial connect — your Levels-tab Mod Input Level is left as you set it
- Manage Radios Audio In/Out dropdowns: popups widen to fit long device names and flip above the window when near the bottom edge
- Fixed DATA mode silently turning off whenever a filter was changed
- Fixed crash at application exit from onnxruntime telemetry (macOS crash reports after shutdown)
- Fixed "Invalid sample rate" with mono/16 kHz USB headsets on Windows, and −9998/−9997 stream errors when connecting or switching audio devices
- IC-7610 / 7300 MK2: corrected CI-V registers for MOD level read/write and USB AF output; monitor stream now recovers automatically after a TX-related stream close
- 5,190 tests passing, flake8 clean
Version 20260919
Change Log:
New Features- rigctld Extended Response Protocol — hamlib-compatible labelled-record responses (Mode:/Frequency:/... with RPRT trailer), verified byte-for-byte against native rigctld 4.7.2; new \get_vfo_info, V ?, M ? and \get_vfo_list queries
- rigctld l STRENGTH — integer dB-over-S9 signal level using per-radio hamlib calibration tables (IC-9700, IC-7610, IC-7300 MK2)
- Audio Settings device dropdowns decluttered — Windows device lists are filtered to the WASAPI host API, eliminating quadruplicated entries from MME/DirectSound/WDM-KS
- Dropdown labels show the device name only (no PortAudio index prefix); duplicate names get " #2"/" #3" suffixes and names containing ":" now resolve correctly
- Fixed shared-controls frame height and Tune button width on tuner radios (7610 / 7300 MK2)
- Fixed "got Future attached to a different loop" killing the first rigctld client connection after a server restart
- Fixed a failed audio device switch leaving no audio until restart — the new stream is created and started before the old one is closed
- 4,709 tests passing, flake8 clean
Version 20260916
Change Log:
New Features- 7300MK2 Support - tested agaist physical radio
- BK-IN control — new BK-IN selector (OFF / Semi / Full break-in) in the CW Keyer window, reading and writing the radio's break-in function. The TX-failed message now points at BK-IN when the radio won't key.
- Waterfall memory markers are now filtered per radio — markers show only the currently connected radio's memories
- Fixed 7610 scope failure when connected via USB cable — scope data reassembly constants are now parameterized per radio
- Fixed 7610/7300MK2 CTCSS tone frequency encoding — the 100 Hz digit was byte-swapped
- Fixed WSJT-X failing to connect to the IC-7300 MK2 (netrigctl_open -8 protocol error) — the hamlib dump_state now matches a native Hamlib 4.7.2 rig 3094 capture
- Fixed the 7300MK2 waterfall filter box not being drawn in FM
- 4,629 tests passing, flake8 clean
Version 20260913
Change Log:
New Features- IC-7300 MK2 support — full implementation for the HF/50 MHz radio
- Per-component log levels — set Trace/Debug/Info per component group (radio, waterfall, web server, audio, voice, satellite, …) in the Logging config tab
- RX Gain — new fixed-makeup receive audio gain on desktop and web, with a two-way synced global volume/mute and labelled MAIN/SUB channel controls
- HTTPS certificate trust made permanent — the self-signed certificate is now a real CA (CA:TRUE) with hostname SANs, so phones stay trusted across app updates without re-accepting the browser warning; existing legacy pairs auto-replace on next start, and a bundled default pair ships for machines without the cryptography package or OpenSSL
- Fluent UI icons replace emoji across the UI (MIT-licensed Fluent UI System Icons + Ant Design navigation glyphs), with greyed disabled states
- Main Display tab aligned to a uniform 5px grid with transceiver frames stretching to fill
- Audio balance slider is now active with the mono codec (1-channel pan); global volume/mute and MAIN/SUB channel controls sync both ways
- Wire-mono in 1ch plays duplicated L=R
- Per-scope span & ref level; SUB scope now shows its own span/ref, and Lvl/Zoom buttons act on the active scope (previously MAIN-only). Also fixed a swallowed AttributeError that left ref level stale after band changes.
- 7610 split NAK fix — 0F 10/11/12 simplex/DUP are 9700-only; 7610 trimmed to OFF/SPLIT_ON
- Fixed web browser click-to-tune mis-tuning by −RIT — the RIT correction applies only where the display actually carries it, matching the desktop waterfall
- Fixed a cross-band NAK when clicking the SUB scope on the web Tune card, and ACK-gated the frequency cache so stale values can't resurface
- UDP audio hardened: codec switches now rebuild the audio session cleanly, a bidirectional desync auto-heal repairs wire/config mismatches in both directions, and stored audio state (mic gain, volume, mute, balance) is re-applied after handler rebuilds
- Web RX audio parity with the desktop: 48 kHz stream at wire rate, stereo deinterleave keyed to the packet identity, and a seamless Hermite splice at stream seams
- Waterfall RIT re-anchor fix: the display stays anchored at dial+RIT, eliminating a double history shift when RIT changed
- Radio type registry — a single source of truth for per-radio metadata shared by the connection tab, Radio Manager, and demo mode; adding a radio now means one registry entry plus an implementation class. Demo mode now borrows its per-radio profile data from the real radio classes, eliminating the duplicated tables
- 4,522 tests passing, flake8 clean
Version 20260906
Change Log:
New Features- CW Keyer (Tools → CW Keyer) — store and read the radio's eight CW memory keyer channels (M1–M8) and key free-text messages, on the IC-9700 and IC-7610. Uses the radio's own keyer: memories are saved and read on the radio via CI-V (up to 70 characters, including the ^ "BT" symbol and the * contest-number counter), so they also work from the radio's front panel
- Free-text CW sending — type a message and press Send (or Enter): the app keys it through the radio's CW keyer in 30-character chunks, monitoring the radio's TX/RX state so multi-chunk messages flow as one continuous transmission. Stop cancels mid-send. Requires BK-IN (or Transmit) enabled on the radio
- Compose-while-sending — the compose box stays editable during a send; pressing Send/Enter mid-send appends your text to the in-flight message, so you can queue the next over while the current one is still keying
- Keyer speed control — the window reads the radio's keying speed when opened, and a 6–48 WPM slider writes it back to the radio
- Progressive OUTGOING display — a read-only outgoing entry shows the message being sent and deletes keyed characters from the left as the radio keys them, giving a live send-progress indicator; the compose box below is never touched during a send
- Lowercase input is normalized to uppercase automatically (the IC-9700's send character set has no lowercase), and unsupported characters are named in the status line instead of failing silently
- Log timestamps now include milliseconds
- Fixed Gpredict satellite tracking breaking after an earlier rigctld session — per-client state is now reset on every client connection. Previously a stale selected-VFO value made GPredict flip its downlink/uplink assignment and band-exchange churn until the client disconnected. Affects all satellite tracking driven via rigctld
- rigctld f and i now always return the Main/VFO-A and Sub/VFO-B frequencies in non-VFO mode, per hamlib semantics
- rigctld now acks hamlib's \set_vfo_opt / \get_vfo_opt handshake commands instead of returning an error
- 4,078 tests passing, flake8 clean
Version 20260903
Change Log:
New Features- Browser control UI — control and monitor your radio from any device on your network (phone, tablet, laptop). The app serves a secure web page with the live waterfall and spectrum, S/PO/SWR/ALC meters, and full radio controls: frequency, band, mode, filter, data mode, ATT, squelch, NR, RF power, split, tone type and tone frequency. Enable it in Configuration → General (Web Server Port + Web Server Enabled)
- Live RX audio in the browser — press Listen to stream radio audio over the LAN, with a Main/Sub selector that follows the transceiver buttons
- Web PTT — hold the TX button to transmit using the browser device's microphone: the desktop mic is muted automatically while the web mic is active and restored on release, and RX audio mutes during TX then returns live afterwards (no catch-up replay). Operate remotely without being at the shack desk
- HTTPS with an auto-generated self-signed certificate covering every local IP address (accept the browser warning). HTTPS is required for microphone access from non-localhost devices
- Mic Settings card — choose the browser input device and set per-browser gain with a live level meter
- Stuck-TX watchdog — if the browser closes or loses connection mid-transmission, the app auto-releases the radio after 5 seconds
- Scope zoom and reference level controls on the web Tune card — same +/− step semantics as the desktop waterfall overlay
- Web UI follows the selected transceiver (Main or Sub)
- Web server logging available in DEBUG so normal operation stays quiet in the console
- Fixed NG response when applying a split memory while dual-watch is enabled — dual watch is turned off automatically first (the radio pins each transceiver to its band in DW mode)
- 3,919 tests passing, flake8 clean
Version 20260831
Change Log:
New Features- AI Noise Reduction (AI NR) — neural-network noise reduction on receive audio, running entirely on your computer: new AI NR switch on the Main Display tab beside the radio's own NR, with an AI NR Level strength slider in the Levels tab. Independent of the radio's NR, RX-only (TX path untouched). Auto-disables with a log entry if inference can't keep up with real-time audio, always fail-safe to clean passthrough. The user-replaceable model lives at ~/Pycom/audio/model/denoiser.onnx (default bundled); unavailable on macOS Intel (no onnxruntime) where the controls hide automatically
- Voice Commands — control the radio by voice: tap the capture key (Config → Speech, default Left Shift) or say the optional wake word, speak a command, and the app transcribes it with Whisper and executes it. Command set includes: tune to any frequency (spoken numbers in MHz, kHz, or words), set modes, bare "FT8" jumps to the band's calling frequency, filters, data mode, VOX on/off, key up/unkey, apply memory by name, connect/disconnect any saved radio by name, satellite mode on/off, start/stop Transcribe, show satellite passes, and play voice TX slots
- Voice Commands console tab — a time-stamped log of wake events, live Whisper transcripts, and command outcomes, plus a typed command entry that runs the same grammar without speech
- Mid-transmission commands — while transmitting (or receiving with VOX enabled), a shorter no-wake-word command mode arms automatically so "vox off" / "tx off" work hands-free mid-QSO; QSO chatter is never transcribed into actions
- Voice-command capture key is the primary trigger (single tap: ping, green LED, received audio muted). The wake word is optional (headset recommended) and off by default. Works without onnxruntime — macOS Intel gets the key path too
- Spacebar PTT restored — a Tk binding pattern collision silently disabled the spacebar TX/RX toggle in the 20260828 build
- The Transcribe privacy warning now sits beside the Enable Transcribe checkbox on the same row
- Whisper transcription fixed for quiet operators: percentile-based AGC amplifies speech, never silence — eliminates "Thanks for watching" hallucinations on valid quiet speech
- Fixed the transcribe audio tap silently dying after switching between mono and stereo codecs
- 3,672 tests passing, flake8 clean
Version 20260828
Change Log:
New Features- PSK Reporter receiver-query view — querying by receiver callsign now shows the heard stations in the results table, map markers, and tooltips. Previously every row repeated the receiver's callsign and all map markers stacked on one locator
- Keyboard shortcuts — Cut/Copy/Paste/Select All (⌘ on macOS, Ctrl on Windows/Linux) now work on every text entry and text box that has a right-click context menu
- Press-and-hold auto-repeat on the waterfall reference-level ▲/▼ buttons
- Signal Capture window Delete All button - remove all automatically detected signals from current capture quickly
- PSK Reporter map title uses the callsign captured at query time, not the live form state
- Transcription dedup suppresses callsign variants (prefix/suffix fragments) to avoid duplicate rows
- More NATO phonetic mishearings recognised for AI callsign identification
- Fixed transcription restart after Stop/Start cycles — no stale audio-tap handlers accumulate
- Signal classifier retrained from scratch — 78.12% validation accuracy (688 samples, 9 active classes), up from 71.64%; training now defaults to 60 epochs
- Fixed per-sample label counting in retraining
- 3,193 tests passing, flake8 clean
Version 20260822
Change Log:
New Features- Voice TX — record and play up to 8 voice TX audio slots per radio from a new Voice TX window (Tools → Voice TX). Slot labels are per-radio and persist in config; a Stop button cancels playback. The TX button indicator reflects active playback state
- Live transcription with LLM-first callsign extraction — a new Transcribe window (Tools → Transcribe) streams received audio through Whisper and an Ollama LLM that decodes NATO phonetics, mishearings, callsigns, RST reports, and Maidenhead grid locators from noisy radio audio. Callsigns are QRZ-linked and a 3-chunk context window handles split callsigns
- Transcription dedup & phonetic gating — repeat callsigns are suppressed when the current chunk has no new phonetic evidence, preventing context-bleed from the 3-chunk window; ambiguous phonetics (e.g. "Austin") are demoted so they don't false-trigger callsign assembly
- SSB passband overlay now starts 300 Hz above (USB) or below (LSB) the center frequency, reflecting the suppressed-carrier offset. CW/RTTY/AM/FM remain symmetric. New
ssb_filter_offsetconfig key (default 300)
- Signal classifier retrained from scratch — 71.64% validation accuracy (705 samples, 9 active classes)
- 3,028 tests passing, flake8 clean
Version 20260816
Change Log:
New Features- Demo mode — connect to a synthetic IC-9700 or IC-7610 with no hardware required. Choose 'Demo' in the connection type dropdown; license-free. Generates a sideband-aware passband with an audio tone sweep across it
- Audio enabled by default with a stereo codec (PCM 2-channel 16-bit, previously mono and off). Speaker and mic default to the system default device
- Scrollable audio device dropdowns — the speaker and mic selection menus in Audio Settings now scroll instead of overflowing off-screen when you have many audio devices
- Manage Radios new-radio default transceiver ID is now type-aware — defaults to A2 for the IC-9700 and 98 for the IC-7610, and updates automatically when you change the radio type (only if you haven't manually edited it)
- Audio Settings added to the File menu
- Filter dropdown now updates immediately when changing mode on a non-active transceiver — previously stale until the next read_status poll
- Waterfall passband overlay refreshes immediately after toggling data mode on/off (SSB and SSB-D have different bandwidths)
- disconnect() always tears down the transport; audio cleaned up on application close
- set_opmode uses get_operating_mode() instead of a separate filter read, eliminating a redundant CI-V round-trip
- 2,609 tests passing, flake8 clean
Version 20260812
Change Log:
New Features- VOX controls — toggle VOX on/off, with adjustable gain (0–100%) and delay (0.0–2.5s) sliders. PTT button reflects VOX-triggered TX state with real-time visual feedback via UDP radio events
- PSK Reporter map overlays — Maidenhead locator grid (zoom-dependent precision) and CQ zone boundaries with toggle checkboxes
- Band-coloured markers on the PSK Reporter map — each band gets a distinct colour pin, with a legend showing only bands visible in the current viewport
- Hover tooltips on PSK Reporter map markers — hover any receiver pin to see callsign, grid locator, frequency, mode, SNR, and time heard
- Removed callsign text labels from map markers — the pin is cleaner and the callsign is now in the hover tooltip
- Band colours persist across refresh cycles — a band keeps its colour for the entire session even if it temporarily has no reports
- Reports with missing frequency data (frequency=0 from PSK Reporter) are now filtered out, eliminating spurious "Unknown" band entries
- CQ zone labels positioned at area-weighted polygon centroids — zone numbers now appear inside their polygons
- Fixed band colour confusion where markers could show the wrong colour after auto-refresh due to stale icon cache
- 2,597 tests passing, flake8 clean
Version 20260719
Change Log:
New Features- IC-7610 support — full implementation for the HF/6m radio, including attenuator, internal preamp (OFF/PAMP1/PAMP2), antenna tuner, and MAIN/SUB band selection. Radio-aware GUI adapts automatically: preamp dropdown, ATT dropdown, memory Radio column, SAT controls hidden (no sat mode on 7610)
- Tune button auto-enables the tuner switch if off after triggering a tune cycle
- Removed equaliser smoothing and sped up waterfall - more like Icom defaults
- QRZ "callsign not found" no longer logs as ERROR with full XML dump (downgraded to INFO with reason)
- Fixed a bug where updating a saved radio in the manage radio dialogue did not update the connection tab drop-down
Version 20260715
Change Log:
New Features- Satellite pass prediction — the AMSAT status dialog now shows the next AOS time, pass duration, and max elevation for each satellite. Toggle between UTC and local time, sort by AOS or alphabetically, and filter by heard/has-TLE. Uses SGP4 propagation with TLE data from Celestrak (cached for 24 hours)
- Reclassify button in the signal capture window — re-runs AI inference on all detected candidates in the current snapshot with a single click
- AI prediction alternatives — when classifier confidence is below 90%, the capture window now shows the top 3 predictions (e.g. “→ FT8 (65%), CW (20%), FT4 (8%)”)
- Derived spectral features — 7 new spectral descriptors (spectral flatness, kurtosis, periodicity, etc.) added to the AI classifier’s feature set for improved signal discrimination
- Capture window navigation expanded with Start, −10, +10, and End jump buttons alongside the existing Prev/Next
- Capture window type filter — filter the browse list by signal label to quickly find saved captures of a specific type
- Unsaved captures now appear at the end of the browse list, visible regardless of the active filter, and are only written to disk when you save them
- AMSAT status dialog font sizes increased for better readability (satellite names 10pt → 13pt, counts 9pt → 12pt)
- Capture window layout tightened to fit smaller screens
- Capture filenames no longer include the signal label — cleaner
{timestamp}_{freq}.npzformat - Capture filename displayed in the capture window header
- User labels preserved separately from AI predictions — the original AI classification is retained for training data integrity even when you relabel a signal
- Signal classifier retrained from scratch — 81.7% validation accuracy (up from 68.6%), 9 active classes including AM and RTTY
- Error-aware difficulty weighting — new training technique up-weights samples the model misclassifies, improving accuracy by 8 percentage points
- PSK Reporter queries now validate reception report data before returning results, removing fallback paths that produced incomplete or inaccurate reports
- PSK Reporter auto-refresh continues updating the map when the main PSK Reporter window is closed, and correctly resumes when the dialog reopens with restored query parameters
Version 20260616
Change Log:
New Features- In-app interactive map — replaced external browser map with TkinterMapView for PSK Reporter spots, with SQLite tile caching and persistent map window position
- Map markers with callsign labels, propagation lines between sender and receivers, and auto-refresh
- Log QSO form now replaces the lookup image instead of packing beside it
- Map window position and pan/zoom preserved across refreshes and sessions
- Signal classifier retrained from scratch (68.63% validation accuracy, 525 samples, 7 active classes)
Version 20260615
Change Log:
New Features- PSK Reporter integration — query reception reports by sender or receiver callsign, view results in a table with QRZ links, and plot spots on an interactive map with propagation lines and auto-refresh
- AMSAT satellite status — submit and view satellite status reports directly from the app
- Attenuator control — read and set RF attenuator (OFF / 10 dB) from the radio display
- Window positions now persist across sessions — PSK Reporter, AMSAT Status, Audio Settings, and main window all remember their screen position
- PSK Reporter results table with clickable callsigns linking to QRZ lookup
- Signal classifier retrained from scratch (71.29% validation accuracy, 517 samples, 7 active classes)
Version 20260611
Change Log:
New Features- Resizable window and full-screen support — drag the window edges or maximise to expand the waterfall and equaliser display
- Mouse wheel frequency stepping — scroll up/down on the waterfall to change frequency using the current step size
- Equaliser display scales vertically when the window is resized
- Status and Rig Control text boxes expand horizontally to fill available space
- Mouse scroll events coalesced with 50ms debounce timer (matching RC-28 dial pattern)
- Scroll wheel frequency changes skipped when radio is disconnected
Version 20260604
Change Log:
New Features- IARU multi-region band plan — colour-coded band plan strip on the waterfall showing allocations for your region (Region 1: Europe/Africa/Middle East, Region 2: Americas, Region 3: Asia/Oceania). Select your region in Configuration → General
- Hover any band plan segment for category and description details
- Band plan strip shows category labels (CW, SSB, FT8, Satellite, etc.) with colour-coded segments
- Region change takes effect immediately — no restart needed
- Darkened Beacons band plan colour for better readability
- 70cm band plan covers the full 420–450 MHz allocation for Region 2 operators
- Optimised equalizer rendering — fewer per-frame font calculations
- Batched statistical detector calculations for faster signal analysis
- icom_udp scope data parsing optimised
Version 20260530
Change Log:
New Features- Signal detection and AI classification system — automatic signal detection with configurable statistical detector, 8 tuneable parameters, and 3 presets (Normal/Sensitive/Strong Only)
- AI signal identification — classifies detected signals using an ONNX neural network (81% accuracy for signals that have training data)
- Signal capture window — browse detected signals, assign labels, add notes, and capture training data
- Fine-tuning from the distributed base model — `python retrain_model.py --fine-tune` adds your captures to the distributed model, or build your own from scratch.
- Training metadata, quality warnings, and protected default model pair (.onnx.default + .json.default) prevent accidental model regression
- Signal detection is OFF by default — enable it when you need it
- Reload Model button in Signal Detection settings loads a retrained model without restarting
- Capture window sorts candidates by frequency (low to high)
- Re-capture when capture window is already open
- license and API key fields now hide typed content
- Fixed File → Quit calling exit(1) instead of proper shutdown
- Validation accuracy warning when trained on fewer than 10 samples
- Change from 20260528 - "Noise" class removed from AI model
- Change from 20260528 - Signal detection suppressed during TX
- Change from 20260528 - icom_udp lib updated, fixed issue where TX stream would silently fail, additional logging
Version 20260520
Change Log:
New Features- Transceiver display redesign — dedicated left/right transceiver frames with independent band, mode, filter, datamode, and tone controls per side
- Four display modes: VFO (single transceiver), Split (VFO A RX / VFO B TX), Satellite (Main RX / Sub TX), and Dual Watch (Main + Sub)
- Shared controls frame with Split, DW, Satellite mode switches and VFO A|B, A▶B, M/S Exchange buttons
- Per-transceiver mode state tracking and automatic re-application after band exchange in SatPC32 virtual serial
- Waterfall displays sub scope data when sub transceiver is selected
- Satellite mode label headers show Main (RX) and Sub (TX)
- Split mode shows VFO A (RX) and VFO B (TX) labels with active selection highlight
- DW mode shows selected transceiver with VFO letter suffix (e.g., Main (VFO A))
- Waterfall center marker color matches mode: green for RX, red for TX in split
- Debounced read_status (300ms) during SatPC32 rapid-fire commands to prevent CI-V flooding
- SatPC32 virtual serial: mode-aware band selection (07 D0/D1 routes through satellite band commands when in sat mode)
- SatPC32 virtual serial: 16 5A 00/01 (satellite OFF/ON) sends CI-V directly and updates model state
- SatPC32 virtual serial: 05 (set frequency) routes through radio_model.set_frequency() for auto band-exchange when frequency is on wrong band
- SatPC32 virtual serial: 07 B0 (band exchange) swaps model state and re-applies per-transceiver modes via raw CI-V
- Satellite mode automatically turns on DW and disables the DW switch to prevent accidental toggle
- Fixed satellite ON/OFF handlers to update model state without triggering redundant GUI callbacks
- Scope waterfall now always starts over UDP connections (scope ON commands sent on connect)
Version 20260512
Change Log:
Usability- Updated icom_udp library with mic gain attenuation fix (0.0-1.0 range) and TX sample rate fix (16kHz eliminates UDP fragmentation and results in a much cleaner and stronger signal going to the radio)
- Mic gain slider now controls UDP TX audio gain when connected via UDP with audio enabled
- Fixed rigctld chk_vfo response format — returns plain "0" or "1" instead of "CHKVFO 1" (per rigctld spec)
- Fixed rigctld get_lock_mode response — returns "2" for Off instead of "0" (per hamlib spec where 1=On, 2=Off)
- Mic gain delegates to UDP AudioHandler when connected via UDP with audio enabled, falls back to CI-V for serial connections
- Add _verify_band_modulation with retry and NAK detection for SAT setup
- Add _send_with_retry for CI-V commands with configurable retries
- Convert RadioModel state attributes to properties with lazy-load from radio
- Properties (current_opmode, current_datamode, filter_bandwidth, etc.) return cached value if available, query radio on first access if None
- Minor change from 20260510 - fix broken links to docs and manage license
Version 20260509
Change Log:
New Features- Added PO meter replacing the S meter while transmitting
- Mic gain level control added
- Added rigctld l SWR and l RFPOWER_METER_WATTS commands for external rig control (WSJT-X Plus)
- Added additional rigctl support for FLdigi compatibility
- Added rigctl command executor in Rig Control Server tab
- Added CI-V command executor in Status tab (async, full frame response)
- Rigctld PTT & Read Only mode blocks write commands, allows PTT
- PO meter always displays green regardless of power level
- PTT & Read Only indicator label (red/green) next to rigctl execute button
- Rig control status auto-scrolls
- Correlation IDs in rigctl logs
- f command returns sub-band frequency when PTT & Read Only + satellite mode
- Meter readings cached on RadioModel, avoiding additional reads from rigctl clients
- CI-V executor runs on daemon thread to avoid blocking GUI
- Fixed send_rf_gain_level subcommand
- PTT handler supports VFO params from clients
- Warning logging on all rigctl RPRT -1 paths
- Empty-params guards on set_vfo, set_mode, set_ptt
- Fixed rigctld \get_lock_mode routing (was incorrectly routing to dump_state)
Version 20260503
Change Log:
Usability- Added NR (noise reduction) on/off toggle switch next to the squelch switch on main display
- Added right-click Cut/Copy/Paste/Select All context menu to all text entry and text box widgets
- Cut and Paste are automatically greyed out on read-only text fields (e.g., status tab)
- Spacebar TX/RX toggle no longer fires when typing in text entry fields or text boxes
- Clicking outside a text field now defocuses it, restoring spacebar TX/RX toggle
- Added rigctld l SWR and l RFPOWER_METER_WATTS commands for external rig control (WSJT-X Plus)
- Fixed rigctld \get_lock_mode routing (was incorrectly routing to dump_state)
- Meter readings (SWR, ALC, S-meter) now cached on RadioModel via meter thread, avoiding additional reads from rigctl clients
Version 20260501
Change Log:
Usability- Added full duplex 2 channel audio support
- Added DW (dual-watch) on/off switch next to the split mode dropdown
- Added audio settings dialog with codec selection (mono/stereo), speaker/mic device selection, stereo balance slider, and per-channel volume/mute controls
- Audio codec can now be switched at runtime — no reconnect needed to go from mono to stereo
- Stereo controls (balance, L/R volume, L/R mute) are automatically disabled when mono codec is selected
- Audio controls are disabled when connected via serial/USB (not applicable)
- All audio settings persist across sessions
- Config file writes are debounced to avoid disk I/O spikes during slider adjustments
- Fixed rit_max range handling (now correctly stored as float)
- Removed scipy dependency from waterfall display (replaced with simpler smoothing)
- Audio stream restart on codec switch avoids unnecessary stop/start on initial connect
- Fixed stereo codec (0x10) producing silent audio — the speaker stream is now correctly recreated when switching between mono and stereo codecs
- Log rotation threshold increased from 1 MB to 5 MB to reduce log churn
- Updated icom_udp library with sequence number overflow fix and improved dual-channel audio routing
- configure_audio_codec now properly resends CONNINFO to the radio, preventing codec mismatch
Version 20260428
Change Log:
Stability & Reliability- Drain stale CIV responses before sending commands in udp_transport to prevent response misattribution
- Fix meter reads (S/SWR/ALC) to validate frame length >= 9 and FD terminator, preventing int('01fd') failure
- Add S.A.T backoff on 3 consecutive failures (10s pause, resets on success)
- Fix ConfigManager.set_log_level to update icom_udp logger at runtime
- Add PTT ack debug logging (OK/NG/NO RESPONSE)
- Remove gaussian_filter1d from waterfall
- Update icom_udp: audio thread cleanup, stop events, RX/TX heartbeat stats, reconnect fixes which could cause the program to crash when changing audio devices
- Update icom_udp: connection short-packet skip, status error check, stream_open flag which could cause the program to hang/freeze for a couple of minutes
Version 20260426
Change Log:
Usability- UDP stablity, faster connects, auto reconnects and cleaner disconnects
Version 20260423
Change Log:
New Features- UDP/Network connection — control your radio over Wi-Fi
- Much faster scope and waterfall (Network only)
- In app audio controls and audio device selection
- Audio streaming — hear and transmit radio audio through your computer (Network only)
- Radio Manager per-radio connection type (USB/Network)
- Connection tab now let's you modify the radio connection directly on the tab
- Network connectivity rather than USB means a much more responsive application
- Error messages now appear inline instead of popup dialogs
- Memory and logging errors shown as inline feedback with auto-clear
Version 20260420
Change Log:
Stability & Reliability- Enhanced CI-V ACK checking
- Frequency unit and precision fixes
- Automatic CI-V echo mode detection
- Improved debug/trace logging
- Streamlined Sat Mode/VFO switching and apply memory efficiency
Version 20260417
Change Log:
Stability & Reliability- Fixed potential crashes or hangs on shutdown
- RC-28 dial no longer ghost spins — frequency changes stop when you stop turning the wheel
- Waterfall display no longer freezes
- SatPC32 passthrough no longer errors on DATA mode commands
- Transmit button on RC-28 no longer errors when the radio isn't connected
- SAT tracking no longer gets stuck and stops updating the radio
- Virtual serial port no longer errors when reading frequency with no radio connected
- License check no longer errors on empty version responses
- Password fields now hide what you type
- Radio Manager rename no longer corrupts entries
- Radio Manager now includes CI-V address field
- Added Help -> About window
- Waterfall display renders faster and uses less CPU
Version 20260110
Change Log:
- Minor UI adjustments
- Fixed a bug where the SAT integration would not update the radio correctly when the M/S needed exchanging
Version 20251219
Change Log:
- Added the ability to log a satellite pass when using S.A.T
- Fixed a bug where data mode was not always set correctly
Version 20251216
Change Log:
- Added scope overlay memory markers
- S.A.T integration improvements
Version 20251209
Change Log:
- Added Nor/Rev tracking for satellite mode
- GUI layout changes
- S.A.T stability improvements
Version 20251128
Change Log:
- Added support for CSN S.A.T Controller
- Memory function now saves RF power level and preamp configuration
- New status panel showing tracking information
- Bug fixes
- Performance improvements
Version 20251115
Change Log:
- Added support for sub scope
- Fixed apply memory bug when switching between satellite and vfo mode
- Performance improvements
Version 20251114
Change Log:
- Fixed Win64 packaging error
Version 20251113
Change Log:
- Added MacOS Intel Support
- Added M/S button
- Added experimental SatPC32 integration (Windows only)
- Performance improvements and bug fixes
Version 20251109
Change Log:
- Added WSJT-X support
- Expanded Hamlib rigctld server protocol implemention
- Fixed an issue that prevented radio updates via the radio manager window
- Automatically set Main scope to Center mode on radio connect
- Other minor improvements and bug fixes
Version 20251104
Change Log:
- Added clickable waterfall tuning
- Added new version available check
- Fixed scope scaling issue
Version 20251103
Change Log:
- Fixed bug saving config when RC-28 set to local or none
- Fixed bug on launch when rit max was a floating point number
Version 20251102
Change Log:
- In app configuration
- Bug fixes
Version 20251028
Change Log:
- Dark waterfall
- Fixed various RC28 Controller issues
- Started adding support for multiple radios and in app config
Version 20251026
Change Log:
- Changed layout for larger waterfall
- Added 1 kHz markers on frequency label
- Added 10 kHz markers on equaliser display
Version 20251003
Change Log:
- Added URL escaping for web provider lookups
Version 20251002
Change Log:
- Added auto reconnect on error functionality
- Added application logs
Version 20250601
Change Log:
- Waterfall performance improvements
Version 20250411
Change Log:
- Performance improvements, Connection Tab enhancements and fixes
Version 20250326
Change Log:
- Initial release — connection tab and IC-9700 remote control basics




