Skip to content

Releases: Ar0xA/sdrsync

SDRSync v2.3.0

Choose a tag to compare

@Ar0xA Ar0xA released this 26 Aug 17:30

A new Application settings tab for customizing the interface, plus a batch of edge-case fixes found in review.

Added

  • Application settings tab: pick a light/dark theme and customize the interface, heading, and frequency-readout fonts (face, weight, style, size) independently, saved via Save → restart confirmation. Every fixed-height chrome band (strip, status bar, section bar, main frame) now scales its own minimum size with the chosen font instead of clipping or collapsing to zero width, and the main window grows to fit real content on a narrow display without crushing controls.
  • Tooltip on the Idle disconnect spin control documenting its 0–600 range, the etiquette rationale (freeing a shared WebSDR's listener slot), and that 0 disables it.

Fixed

  • RigctldClient now treats a socket EOF as a disconnect instead of an empty reply, and connect() returns false if the post-connect handshake never completes.
  • SyncEngine._tick() no longer raises UnboundLocalError when a WebSDR session is active but its driver has already gone None.
  • A round of non-finite-frequency hardening (NaN/inf guarded at driver/config boundaries — int(float('nan')) and round(float('inf')) raise, and NaN comparisons silently return false in ways that could make an invalid value look in-range).
  • Site auto-detection and click-simulation edge cases found in the same review pass (see matching_driver_types()/click_element_if_present changes).

Changed

  • Dropped the second vendored font (Cormorant Garamond) after confirming only the first registered font is visible to a native font-chooser dialog on this wxGTK stack.

551 tests pass; 9 skipped on Windows (Linux-only audio-unlock-click tests, intentionally disabled on that platform).

Windows build: SDRSync-v2.3.0-windows.zip is attached below. Extract and run SDRSync.exe — no installer needed.

Source: SDRSync-v2.3.0-source.zip / SDRSync-v2.3.0-source.tar.gz also attached, alongside GitHub's own auto-generated source archives.

SDRSync v2.2.10

Choose a tag to compare

@Ar0xA Ar0xA released this 14 Aug 17:36

All 4 supported WebSDR families (websdr.org, KiwiSDR, OpenWebRX, UberSDR) now sync the rig's real bandpass filter width to the page, instead of each site always applying its own generic per-mode default. Also adds a "Force SSB to data mode" reverse-sync option and cleans up the CW-offset settings layout.

Added

  • Bandpass filter sync: when the rig reports a passband width, it's now pushed to the WebSDR page's real filter-edge primitive on every supported site — confirmed against each site's own live JS (setmf() on websdr.org, ext_tune()'s low_cut/high_cut on KiwiSDR, setBandpass() via setMode() on OpenWebRX). Gated by a new "Sync bandpass filter from rig" Behaviour toggle (default on) that also now covers UberSDR's pre-existing filter sync from one place.
  • "Force SSB to data mode" reverse-sync option: when the WebSDR page shows USB/LSB, reverse sync can now send the rig's own data-mode token instead (PKTUSB/PKTLSB on rigctld, confirmed live against a real Yaesu rig; DATA-U/DATA-L on flrig). Default off.

Fixed

  • Turning bandpass sync off didn't actually restore the default filter on KiwiSDR or OpenWebRX — both only reset a demodulator's filter on a mode-string change, and an unchanged mode with no rig passband was a silent no-op, leaving a stale custom width in place indefinitely.
  • A CW filter width ≥1000 Hz (a common real rig CW filter, e.g. 1200 Hz) silently knocked websdr.org out of its own CW handling entirely (its iscw() check is a raw width comparison, not a mode check) — capped at 900 Hz.
  • On at least one real websdr.org build (Hack Green), forcing a passband for AMSYNC mode hit a JS case that build doesn't implement — AMSYNC no longer gets an explicit passband push there.
  • A mode change racing OpenWebRX's two-round-trip filter-apply call could land the wrong-sized filter on the wrong demodulator — added a mode-match guard.
  • _base_mode_of() (KiwiSDR) never normalized "amw" (wide AM) to "am", silently breaking reverse sync for any receiver sitting in wide AM.
  • cw_offset_hz was type-checked but never range-clamped on config load, unlike every other bounded setting.

Changed

  • WebSDR CW offset moved back to the Behaviour tab (a brief "Transceiver CW pitch" split-field experiment earlier this session added complexity a single field already covered).

492 tests pass total; 525 passed / 9 skipped on Windows (the 9 are KiwiSDR/OpenWebRX audio-unlock-click tests now explicitly skipif(win32) — that watcher is intentionally disabled on Windows, so this is a proper skip rather than the false failures earlier builds showed there).

Windows build: SDRSync-v2.2.10-windows.zip is attached below. Extract and run SDRSync.exe — no installer needed.

SDRSync v2.2.9

Choose a tag to compare

@Ar0xA Ar0xA released this 14 Aug 14:52

Mute-on-TX rewritten to use native WebView-level muting instead of per-site JS calls, plus a cluster of real bugs found by two rounds of python-bug-hunter review — most notably a rigctld caching gap that could silently revert a reverse-sync push.

Fixed

  • rigctld silent-revert bug (most severe, live-reproduced against real hamlib 4.5.5): rigctld caches the value of a SET for 500ms by default, so a reverse-sync verify poll landing in that window could report success for a rig push that was never actually applied — the WebSDR page showed the change, then it silently reverted up to 30s later with no warning. connect() now sends \set_cache 0 to disable the cache outright.
  • CW offset (Behaviour setting) going stale after connect — was only read once at driver construction, so changing it mid-session had no effect until a disconnect/reconnect. Now synced live every tick.
  • A follow-up bug in that same fix: a blind per-tick CW-offset overwrite looked identical to a genuine WebSDR-page click of the same delta and got pushed to the rig, retuning it. Now only syncs on an actual change, with a forced re-baseline instead of letting the shift be misread as a page edit.
  • WebSDR audio muting on teardown was a guaranteed no-op (fire-and-forget call racing a synchronous close()) — briefly audible after disconnect. Now awaited end-to-end via a new native mute-before-teardown path.
  • KiwiSDR/OpenWebRX audio-unlock watcher could click the real mouse forever on receivers where clicking is a permanent no-op (measured ~44 real OS-level clicks/minute, indefinitely) — now gives up after 3 ineffective attempts and switches to watch-only.
  • Simulated clicks never verified the target window was actually under the cursor — a minimized host frame or anything else covering that screen point still received a real OS-level click. Now confirmed via wx.FindWindowAtPoint() first.
  • websdr.org's audio-unlock click wasn't platform-gated on Windows like the other drivers, moving the mouse for no reason on WebView2.
  • flrig reverse-sync verify used rig.get_vfo (a cache read, no live CAT query, and the wrong VFO) — switched to rig.get_vfoA, confirmed to do a genuine live read.
  • "Mouse hijack to enable WebSDR audio" setting was also stale mid-session like CW offset — unchecking it didn't stop an already-running overlay watcher. Now re-checked every iteration.
  • Transceiver panel auto-fold now only fires on the user's own Connect click, not any reconnection (idle auto-resume, attach flap, page-death recovery).
  • _tick() was fetching WebSDR get_status() twice per tick in the steady state; now fetched lazily once.

Changed

  • Mute-on-TX: replaced per-site JS mute calls (up to ~1s lag, shared the page-write rate limiter with tuning) with a single native WebView-level mute — webkit_web_view_set_is_muted() on Linux, ICoreWebView2_8.IsMuted via raw COM on Windows. Instant, page-independent, identical across all four WebSDR families.
  • CW offset field relabeled "WebSDR CW offset (Hz)", narrowed to its actual -2000..2000 range, and gained an Apply button so a typed value takes effect without clicking elsewhere first.

Every fix has a regression test confirmed to fail against the pre-fix code before being restored. 487 tests pass (Windows: 480/487 — 7 pre-existing failures are a Linux-only audio-unlock-watcher test gap that doesn't mock sys.platform, not a regression; that watcher is intentionally disabled on Windows).

Windows build: SDRSync-v2.2.9-windows.zip is attached below. Extract and run SDRSync.exe — no installer needed.

SDRSync v2.2.8

Choose a tag to compare

@Ar0xA Ar0xA released this 14 Aug 06:42

WebSDR audio was silently broken on native (non-WSL2) Linux desktops for KiwiSDR, OpenWebRX, UberSDR, and websdr.org — each site gates its own audio unlock behind a real trusted click that automation alone can't satisfy on WebKitGTK there. All four now work. Also includes a new Linux launcher script and several smaller fixes/polish items.

Added

  • sdrsync.sh: one-command Linux launcher — detects your distro, installs the needed wxPython/WebKitGTK packages (apt confirmed, dnf/pacman best-effort), sets up a venv, and launches the app.
  • "Mouse hijack to enable WebSDR audio (Linux only)" setting in Behaviour (default on, greyed out on Windows) — lets you opt out of the automated clicking described below.

Fixed

  • Silent audio on websdr.org on native Linux — WebKitGTK's non-standard AudioContext "interrupted" state wasn't being resumed.
  • Silent audio on KiwiSDR, OpenWebRX, and UberSDR on native Linux — sdrsync now uses real OS-level clicks (not JS-dispatched, which browsers reject as untrusted) to click through each site's audio-unlock overlay/button, with devicePixelRatio-aware coordinate targeting and hit-test verification so the click lands on the right element.
  • Two bugs from an independent code-review pass: UberSDR could get stuck powered-off with no recovery if a click in its unlock sequence missed; KiwiSDR/OpenWebRX could falsely report the audio unlock succeeded on require_id-gated receivers where the click is a genuine no-op.
  • PTT tag falsely showing "RECEIVE" when only the rig was connected (no WebSDR) — added a proper "IDLE" state.
  • Reverse sync (from v2.2.6, included here for completeness): no longer silently swallows a WebSDR-side click that lands in the ~1s window right after a periodic resync.

Changed

  • Higher-contrast label/caption text throughout the UI.
  • Transceiver Connect/Disconnect button now matches the WebSDR strip's styling (red when connected).
  • PORT label reads "XML-RPC Port" when flrig is the selected backend.

Windows build: SDRSync-v2.2.8-windows.zip is attached below. Extract and run SDRSync.exe -- no installer needed.

SDRSync v2.2.6

Choose a tag to compare

@Ar0xA Ar0xA released this 12 Aug 20:22

A fix for a silent WebSDR <-> rig desync in reverse sync (WebSDR -> rig), found by an automated bug-review pass over the sync engine.

Fixed

  • Reverse sync could silently discard a genuine click on the WebSDR page: roughly every 30 seconds (the periodic full resync that keeps both sides honest), a ~1-second window opened where a real frequency or mode change made on the WebSDR page was quietly adopted as "no change" instead of being pushed to the rig -- then reverted back to the rig's actual value at the next resync, with no warning. This could happen in any session, whether or not the rig itself had moved recently.

Windows build: SDRSync-v2.2.6-windows.zip is attached below. Extract and run SDRSync.exe -- no installer needed.

SDRSync v2.2.5

Choose a tag to compare

@Ar0xA Ar0xA released this 12 Aug 11:26

Several fixes found by a new automated bug-review pass over the sync engine and WebSDR/browser code, covering everything since v2.2.4.

Fixed

  • Reverse sync (WebSDR -> rig) could get a single frequency permanently stuck: after tuning away from a value and back to it, clicking back to that earlier frequency on the WebSDR page sometimes silently did nothing, even though every other frequency worked fine.
  • A frequency verification check added in v2.2.4 could mistake your own manual click on the WebSDR page for a failed sync, and silently snap it back to the rig's frequency within about half a second of any rig-driven retune.
  • Fixed a rare case where switching WebSDR sites, or disconnecting, right as a page script was still in flight could cause a later, unrelated status read to receive the wrong data.
  • Fixed a crash if you hit Disconnect at the exact moment a frequency was being pushed to the WebSDR.

Windows-only build (SDRSync-v2.2.5-windows.zip). Linux is still run-from-source -- see the README.

SDRSync v2.2.4

Choose a tag to compare

@Ar0xA Ar0xA released this 12 Aug 05:31

Several fixes found during live testing with real hardware (rigctld and flrig), covering everything since v2.2.0:

Fixed

  • flrig frequency sync (WebSDR -> rig) was silently rejected outright -- flrig's set_vfoA requires a specific numeric type SDRSync wasn't sending, so every reverse-sync frequency push failed with no visible cause.
  • Very fine-tuning your radio (down to a single Hz) sometimes wouldn't reach the WebSDR -- a jitter filter meant to ignore hardware noise was too aggressive and could silently drop a genuine small step.
  • The same issue in the other direction: clicking a precise step control on the WebSDR page (e.g. "+10 Hz") could get stuck and do nothing until several clicks piled up, then suddenly jump.
  • Mode changes no longer touch your radio's filter/bandwidth -- only the mode itself changes now, on both rigctld and flrig. Previously a mode change could also silently reset or change your filter width.
  • Switching between rigctld and flrig in Settings wasn't always restoring each backend's own saved port correctly.
  • A "connection failed" popup could incorrectly reappear even when a second connect attempt actually succeeded.
  • A verification step on websdr.org-based receivers was silently failing on every single tune (checking a page element that doesn't exist on real sites), which also meant it could get confused about the frequency actually showing in CW mode.

Windows-only build (SDRSync-v2.2.4-windows.zip). Linux is still run-from-source -- see the README.

SDRSync v2.2.0

Choose a tag to compare

@Ar0xA Ar0xA released this 11 Aug 05:40

New: SDRSync now tells you when a newer version is out.

Update notification

  • On launch, SDRSync checks GitHub's latest release in the background (a single quick request, never blocks startup).
  • If a newer version is available, a popup shows with a View release button (opens the GitHub release page in your default browser) and a Close button.
  • A "Don't show this again for this version" checkbox lets you dismiss it -- per version, not permanently, so you'll still be notified the next time a release actually ships.
  • Completely silent if the check fails (offline, GitHub unreachable, rate-limited) -- never shown as an error.

Windows-only build (SDRSync-v2.2.0-windows.zip). Linux is still run-from-source -- see the README.

SDRSync v2.1.0

Choose a tag to compare

@Ar0xA Ar0xA released this 11 Aug 05:11

New feature: pop the receiver out into a small always-on-top control bar, and pop it back in.

Popout / dock

  • The strip's Undock icon (previously inert, tooltipped "coming soon") now works: it hides the main window and shows a small compact bar with the rig dot, frequency, mode, PTT tag, Pause sync, and Mute on TX.
  • The embedded WebView is reparented, not recreated -- audio keeps playing through the whole transition, with no glitch, pause, or reload. Verified live on both Windows (WebView2) and Linux/WSL (WebKitGTK).
  • Dock in the compact bar reverses it -- the main window comes back with the receiver still playing.
  • Two previously-inert settings in the Behaviour panel now do something: Hide receiver window when undocked (audio keeps playing with no receiver window at all) and Keep compact bar always on top.
  • Closing via the compact bar's own close button quits the app cleanly, same as the main window's.

Other fixes

  • Fixed a real cross-platform sizing bug found while testing this feature on Linux: a fixed-size frame's dimensions need to be set as client size, not outer frame size -- got it backwards, which GTK3's larger window decorations turned into a fully blank window (Windows' smaller decorations just quietly undersized it instead). Both platforms now render correctly.
  • Fixed a label-clipping bug in the shared RX/TX/MODE display widget (affects the compact bar's MODE field and, latent until now, the main strip's).
  • Two stale "Hold toggle" mentions in the README, left over from the v2.0.0 rewrite's "Sync direction" rename.
  • Windows install instructions now lead with the packaged exe instead of pip install.

Windows-only build (SDRSync-v2.1.0-windows.zip). Linux is still run-from-source -- see the README.

SDRSync v2.0.2

Choose a tag to compare

@Ar0xA Ar0xA released this 10 Aug 19:59

Small patch release: fixes the window titlebar being stuck on "not connected".

The titlebar was set once at startup and never updated afterward -- a bug that predates the v2.0.0 GUI rewrite (the old titlebar had a different static subtitle, also never touched again). It now updates on every status snapshot to reflect the real rig/WebSDR connection state ("not connected" / "rig connected" / "connected").

Windows-only build (SDRSync-v2.0.2-windows.zip). Linux is still run-from-source -- see the README.