53 commits across 14 contributors since v26.8.2. Full detail in CHANGELOG.md.
A new shell — the workspace canvas
View ▸ Workspace Canvas turns pans and applets into freely placed, resizable, layered items on a canvas that can span several top-level windows. Named workspaces recall which applets are open as well as where they sit, and can be bound to radio profiles so recalling a profile switches your layout with it.
It is opt-in and off by default. If you never open that menu, this release changes nothing about how AetherSDR looks or behaves — and an install that never enables it never even gains a settings key. Enabling it migrates your current layout into a "Classic" workspace you can always reset back to, and disabling it restores the shell exactly while keeping your placement for next time.
A deliberate limitation this release: items move between canvas windows through a right-click Move to ▸ menu rather than by dragging across windows. Cross-window drag is a cross-top-level reparent, which is the crash lineage behind #2495 / #4617 / #4319, so it goes through one deliberate, safe path for now.
We want to hear from you. Layout is personal, and this is the feature most likely to meet a station setup we did not imagine — file a bug report or a feature request and say what you were arranging.
Experimental radio families — Hermes-Lite 2 and networked Icom
Both continue to move fast this release, and both are still experimental: neither is a supported radio family yet, and FlexRadio remains the supported target. See Supported Hardware for what each backend does and does not do today. Reports from testers are how these families move from experimental to supported — please say which radio and which firmware you are on.
Headlines
Icom — a command plane, the IC-7300MK2, and WSPR on the air.
- A CI-V command scheduler. Every meter read, control write, reconciliation poll and PTT transition now goes through one ordered command plane instead of independent timers calling the transport directly. Dispatches are paced into 25 ms slots with one reply-bearing transaction in flight, prioritised emergency-unkey → operator → PTT → active meter → control → maintenance, with duplicate reads and rapid writes coalesced by semantic register. The case that forced it: a pre-key PTT poll requested
OFF, the client then issuedON, and the delayedOFFreply arrived after that intent — stopping transmit audio before the radio's realONconfirmation. Stale completions after a newer intent are now rejected. Icom-only; Flex and HL2 command, meter and PTT behaviour is untouched. (#5006) - The IC-7300MK2 control surface is complete against live hardware — 18 operator-visible defects, including RF Gain that did not survive an ANT-menu close or a reconnect, an ATU button that could not be clicked back into bypass, no RF Power or SWR meter at all, MIC Gain that was never subscribed, MON and Monitor Level that neither worked nor subscribed, notches that ignored front-panel changes, and preamp/attenuator conflated with display RF Gain. (#4981)
- WSPR transmits from an Icom.
prepareWsprTransmit()armed the seam-audio path correctly, but the readiness check accepted that latch only whenhostModulateswas true — and Icom deliberately reports it false, because the radio's own firmware modulates from the PCM this computer ships. PSK Reporter therefore never considered the stream ready and never advanced to PTT. Confirmed on the air: 20 reception reports across the continental US and Alaska, −22 to +4 dB SNR. (#5016) - RS-BA1 lease renewal. The frozen panadapter was a media-lease failure, not a renderer failure — serial CI-V and audio stopped together while the outer control socket still looked healthy. The inner renewal sequence was encoded as a shifted little-endian field, accidentally byte-identical only through sequence 255; at 256 it overwrote the next byte and the radio answered
0xffffffff. (#4995) - The connect path asks the radio for its own CI-V address. An Icom connected with the CI-V field blank was addressed at a hardcoded
0xA4— the IC-705's address — so every other model silently ignored the traffic, and because a wrong address produces no error the session came up looking healthy with no frequency, no scope and no transmit. Measured on an IC-9700 with the same probe built in both trees:0.000000 MHzbefore,445.841350 MHzUSB after. Type an address deliberately and it is still honoured, and not rescued — that is what makes the auto-detect trustworthy. (#4991) - DATA mode reaches the radio. DIGU/DIGL carried the sideband but left the DATA flag clear (#4989), and
DFMwas missing from the mode map entirely — so selecting it simply reverted, and a radio already in FM-D reported back as plain FM, meaning the next mode write silently took it out of data mode and put room noise on the air from the microphone on a 2 m AX.25 frame. (#4994) - PC Audio routing, on verified models. PC Audio now switches only the model-specific DATA OFF modulation input — WLAN on the IC-705, LAN on the IC-7300MK2 — and only on an operator click; the connect edge publishes state and advises on a mismatch rather than writing, because that register is a SET-menu value the radio persists. Switching it off restores the value your radio had rather than assuming MIC, so an operator running USB for a rig interface gets USB back. An unverified model declines the write rather than guessing, and Radio Health no longer shows a MOD Input row it would have to label from the IC-705's enum — which is how an IC-9700 correctly set to LAN reported "USB" and got warned at, every session. (#5016)
- The PC Audio button is now unlockable on Icom, since a backend that ships TX audio over the seam without host-modulating no longer forces it on — an Icom's own microphone is a real alternative. And every CW gate now recognises the normalized
CWUan Icom reports, not just the decoder's; the same sweep caught three places testing bare"CW"that were sending a CWL slice to the SSB settings bucket. (#5016)
Hermes-Lite 2 — noise blanking, a real BFO, and a TX ALC that respects your client.
- A working NB button. The HL2 ships raw IQ and runs no firmware DSP, so it correctly reports "no radio-side DSP" — and the UI hid NB alongside NR and ANF. That was the right conclusion about the command and the wrong one about the control: WDSP's impulse blanker can run here, and on this radio here is the only place it can run at all. It runs on the raw IQ ahead of the demodulator, because an impulse is short in time and wide in frequency — once an 8192-tap bandpass has smeared it there is no spike left to blank. (#4908)
- CW gets a real BFO. The panadapter drew its passband skirt entirely to the right of the marker, where a USB filter sits. On this radio that is worse than cosmetic: the gateware generates the shaped CW carrier at the TX NCO, which is the marker — so the receiver was listening 600 Hz from where the radio transmits. (#4914)
- AGC mode and threshold survive a restart. Set Slow/40, quit, relaunch, and the session came up on Med/65. The AGC loop for this radio runs in WDSP on the host, so the client is the only place the setting can live — and it was living nowhere. (#4911)
- Your client's level control works again. WSJT-X's
Pwrslider is not a rig command, it is a digital attenuator on the audio the client streams over TCI. The host speech ALC ran over that audio, so the control was either normalised away or frozen into a path-dependent gain: TUNE at a low setting made no RF, sliding up mid-key wound the gain up, and sliding back retained it. The bypass is deliberately one-sided — client audio is never lifted, but it is still reduced, because removing that half left the modulator's hard clamp as the only thing between a hot client and the band. DAX clients get the same fix. (#4910) - The meter surface is certified on real hardware —
TX:MICPEAKtracked a −20 dBFS tone to +0.023 dB whileTX:ALCdid not move at all across a 20 dB sweep, which is the ALC normalising, measured rather than assumed. Every meter on the radio was correct; two of the concerns the certification tool reported on a clean run were not, and five defects in the tool are fixed with it. (#4916, #4917)
VK3AMP amplifiers — 600 W / 1000 W / 2000 W.
- A third peripheral amplifier alongside ACOM and SPE, entirely outside the radio seam: TCP control and status plus UDP telemetry, with calibration curves for output, reflected, current and input power unit-tested against real capture values. Idle-aware keepalive and watchdog, a bypass and voltage-rail safety interlock, hold-to-confirm reset, and a dockable panel with Power / Reflected / SWR gauges. A persisted variant selector rescales the forward-power gauge to each unit's rated output plus 25% headroom. Connection reliability came straight out of hardware testing — the amp's network stack answers only broadcast ARP, so a cold connect can stall 9–12 s on Windows' unicast-first neighbour-cache reconfirmation. (#4919)
Transmit audio, DAX and CAT.
- The TX voice chain moves to 48 kHz float. The channel strip was performing several rate conversions and bit-depth truncations, compounding aliasing artifacts and quantization noise. It is now pinned to 48 kHz float end to end with a single high-quality conversion to transport rate and TPDF dither immediately before the final quantization. A 12% SRC profile improves latency for 44.1 and 48 kHz hosts — the two most common — while keeping flat response across the full 10 kHz baseband. (#4875)
- 8 DAX RX audio channels on a FLEX-6700. The path was capped at 4 (6600-class sizing), so slices assigned to DAX 5–8 were silently carrying silence-fill — the audio device existed, but no radio-side stream was ever requested. Selectors are now driven from the radio's actual slice capacity, so smaller models present no dead entries. Verified end to end: eight sources carrying live audio, eight WSJT-X instances decoding on eight slices. (#4854)
- CAT band changes bring the panadapter with them. A band change from WSJT-X, FLDigi, rigctld or SmartCAT moved the slice and left the view behind on the old band until a manual GUI action. An in-span target tunes without a yank — external Doppler software steps every few seconds and must not recenter each step — while a cross-band target recenters and re-bands. (#4876)
- rigctld reports split per client. With one CAT port per WSJT-X instance, only one slice holds the TX flag, so every other port read as "in split" and WSJT-X refused emulated split on all but one instance. (#4853)
- Every TCI argument goes through a checked parse. Malformed input did not fail — Qt returns
0, so it became a valid-looking zero and the command proceeded. This class does not fail quietly, it succeeds convincingly: the command applies, a well-formed notification goes out, and neither the sender nor a second client watching the wire can tell. Thirty of the fifty sites were the trx index, which resolves positionally — somute:abc,truemuted slice 0 and broadcast a notification naming it. All 66 conversions now route through checked helpers. (#4870)
Crash and stability.
- A multi-hour Windows transmit crash is closed. Two Microsoft Store dumps from v26.8.2 resolved to the same write, with an input block 30,976 bytes past the signed 2 GiB boundary. Fresh TCI audio suppressed the local microphone callback, so the Windows capture device was never drained; Qt/WASAPI kept appending at ~192 kB/s; and when local mic processing resumed the whole multi-gigabyte residue came back in one read, overflowing the normalizer's signed size arithmetic. Reads are now bounded and frame-aligned, and past 1 MiB of residue the stale head is skipped so the freshest audio reaches the air rather than a backlog replaying. (#4958)
- A panadapter pop-out crash no longer becomes a boot loop. The pan ID was committed to the floating list before the reparent and GPU re-initialize that follow, and the restore path replayed that list unconditionally on every post-connect layout restore — so any crash inside the float path was self-perpetuating, with no in-app escape. #4617's reporter had to hand-edit the settings store to get his radio back. (#4863)
- Shutdown phase breadcrumbs now record paired begin/end markers with elapsed time across radio, audio, KiwiSDR, controllers, spot clients and worker-thread teardown, so a force-quit log finally says which close was still in progress. Diagnostic only — no ordering change. (#4979)
- Momentary keying is released when the radio disconnects. A key held across a disconnect stranded its flag, so the first press after reconnect was silently consumed — one dead press per disconnect-while-held, usually reported as "PTT stopped working after reconnect". (#4811)
GUI and workflow.
- Clone to all Pans — tune the look on one panadapter and press one button in the Display panel; every other open pan matches. Setting up a second pan previously meant re-picking every colour, fill rate, scheme, floor and 3D setting by hand. Radio-authoritative values are cloned by sending the same commands the sliders send, and auto-black clones your stored intent rather than a capability-masked value. (#4881)
- The mini-pan centres on the passband, not the carrier. On SSB the carrier sits at the edge of the filter, so a carrier-centred ±5 kHz window spent half its width on the sideband the filter throws away. (#4874)
- The PSK Reporter map wraps the world and stops stalling — the camera and tile layer repeat continuously across the antimeridian, so comparing Asia against North America no longer means panning all the way back around; tile requests are coalesced across world copies, a bounded decoded-image cache sits above the disk cache, and marker hit-testing is skipped while dragging. Wheel and trackpad zoom now return exactly to the starting scale over equal notches in and out. (#4952)
- SpotHub auto-scroll follows the right end. The model prepends, so the newest spot is row 0 — but the follow logic chased the bottom, copied from the append-only console panes, and self-latched on an empty table. Sorting by any other column now leaves your viewport alone entirely. (#4922)
- Copy Assist's indicator gates on the active slice, not the TX slice — so an operator who disables TX for safety, or runs receive-only, can actually open it. (#4932)
- Frameless move and edge resize work under
QT_QPA_PLATFORM=xcb— the platform move/resize path reports success on xcb but the WM-driven grab is unreliable there, and the edge filter was never receiving events at all, because a top-level QWindow stops seeing platform mouse events once child widgets acquire native windows. Reported and manually verified by @JonathanPerkins. (#4829) - Copy Assist can carry context between segments — opt-in, off by default — conditioning each decode on the last confident segment for continuity of names, callsigns and topic, with a confidence gate, a silence-gap flush and a working Clear button. (#4831, RFC #4818)
- MIDI binding profiles import and export, auto-detecting the native XML or the SmartSDR
.mapfiles controller vendors publish per device. Import names what it skipped rather than silently dropping it. (#4898)
CI, build and governance.
- Compiler caches are restored everywhere and saved only from
main. Actions caches are scoped by ref, so every PR run was writing a ~0.6 GB entry that no other PR could ever read — and evicting the sharedmainentry that all of them can. 80% of the 10 GB budget was PR-scoped and unreadable, with no Linux or Windows cache left onmainat all; one PR took 19+ minutes against a 7–13 minute norm. (#5008) - The colour ratchet takes its base from the merge base, rather than billing one PR for a cleanup another PR landed while it sat in the queue. (#4960)
- Test registration moved to
tests/tests.cmake— the rootCMakeLists.txtwent from 6,357 lines to 2,780, as a pure move with the relocated lines byte-identical andctest -Nlisting the same tests. (#5002) - CODEOWNERS Tier 1 narrows to one test — does a wrong change here alter who decides things, or what gets signed? — and
docs/,resources/andtests/move to the broad reviewer roster. Nobody loses authority. (#4959, #5001)
Contributors
Big thanks to @jensenpat (17 PRs — the Icom CI-V scheduler, the IC-7300MK2 control surface, the RS-BA1 lease fix, WSPR/PC Audio/CW mode recognition, the HL2 noise blanker, CW BFO and AGC persistence, the HL2 meter certification and the five radiocert defects it exposed, the PSK Reporter map rework, the Windows TCI transmit crash, the pop-out boot loop, shutdown breadcrumbs, Clone to all Pans, the theme style guide and the CI gate trim), @ten9876 (14 PRs — the workspace canvas from core through phase 7 plus its palette and minimal-mode fixes, the TCI checked-parse sweep, the mini-pan passband centring, both CODEOWNERS retiers, the tests.cmake split, the colour-ratchet base fix and the Actions cache split), @K5PTB (4 PRs — Copy Assist context-carry, the CAT band-follow policy, the Copy Assist indicator gate and the keyerless CW test gating), @Ozy311 (3 PRs — the HL2 TX ALC bypass, CI-V address auto-detection and the automation-bridge connection-path fixes), @hotairfred (2 PRs — 8 DAX RX channels on the 6700 and per-client rigctld split), @M7HNF-Ian (2 PRs — the SpotHub auto-scroll fix and the dead TCI receive-audio removal), @skerker (2 PRs — MIDI profile import/export and the momentary-keying release), @rfoust (automatic QRhi colour-buffer sizing), @Silent-Gloves (the 48 kHz float TX voice chain), @ezypezy22 (VK3AMP amplifier support), @nigelfenton (Icom DFM and the IC-9700 0x26 path), @g4ivv (frameless move and resize under xcb), and @floze-the-genius (the TCI audio guidance correction). The AetherClaude orchestrator bot contributed the Icom DATA-mode fix.
Thanks also to @JonathanPerkins for reporting and verifying the xcb frameless bug, @eicket for the power-ramp observations that pinned the HL2 ALC behaviour, @G0JKN for the live IC-9700 traces behind the 0x26 mode path, and the Microsoft Store crash reporters whose dumps made both Windows fixes possible.
73, Jeremy KK7GWY & Claude (AI dev partner)
Downloads
Linux AppImage (x86_64 / aarch64), macOS DMG (Apple Silicon + Intel, signed + notarized), Windows installer (setup.exe) + portable ZIP, and the Stream Deck and StreamController plugins are attached below — built and signed by CI workflows on this tag.
Full diff: v26.8.2...v26.8.3
Verifying releases: see docs/VERIFYING-RELEASES.md. Signing key: docs/RELEASE-SIGNING-KEY.pub.asc.