Skip to content

Commit 1195389

Browse files
ten9876claude
andauthored
release(v26.5.1): version bump + 1.0-equivalent / CalVer cutover notes (aethersdr#2564)
First stable release. Drops pre-1.0 framing. Project moves from semver to CalVer (YY.M.patch) starting with this tag; rationale (release cadence driven by FlexLib + ham season + community fixes, not API stability commitments) captured in the CHANGELOG. - CMakeLists.txt: project VERSION 0.9.8 → 26.5.1 - README.md: current-version line + CalVer note - CLAUDE.md: current-version line + scheme note (previous tags retained) - CHANGELOG.md: new v26.5.1 section covering 55 commits since v0.9.8 organized into features / bug fixes / closed-without-fix / infra - WhatsNewData.cpp: regenerated from CHANGELOG via scripts/gen_whatsnew.py Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent a13190d commit 1195389

5 files changed

Lines changed: 389 additions & 3 deletions

File tree

CHANGELOG.md

Lines changed: 325 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,331 @@
33
All notable changes to AetherSDR are documented in this file.
44
Format follows [Keep a Changelog](https://keepachangelog.com/).
55

6+
> **Versioning:** Starting with **v26.5.1**, AetherSDR moves to **CalVer**
7+
> (`YY.M.patch`). Earlier tags used semver through v0.9.8.
8+
9+
## [v26.5.1] — 2026-05-10
10+
11+
### 1.0 — first stable release; CalVer cutover
12+
13+
The 1.0-equivalent. After eight 0.9.x cycles the client now covers
14+
every documented SmartSDR feature on the FLEX-6000, FLEX-8000, and
15+
Aurora platforms, and ships the Aetherial Audio Channel Strip's RX and
16+
TX paths in full. Confidence in stability across Linux / macOS /
17+
Windows is high enough to drop the pre-1.0 framing.
18+
19+
Coincident with the milestone, the project switches from semver to
20+
**CalVer** (`YY.M.patch`). Rationale: AetherSDR's release cadence is
21+
driven by FlexLib protocol changes, ham contest seasons, and a steady
22+
trickle of community fixes — not by API stability commitments to
23+
downstream consumers. CalVer communicates "this is what shipped in
24+
month X" more honestly than a 1.x semantic version would. The previous
25+
`v0.9.x` tags remain in git history; new tags use the `vYY.M.patch`
26+
form starting here.
27+
28+
55 commits since v0.9.8; highlights below. Big thanks to **@jensenpat**
29+
(macOS `.icns` build-time generation, FlexControl wheel modes, popout
30+
frameless lifecycle), **@chibondking** (Windows UI scaling settings
31+
path), **@rfoust** (DAX IQ Windows/non-PipeWire-Linux fix, RX output
32+
panel rebuild, TCI volume/drive/rx_volume dispatch), **@aethersdr-agent**
33+
(AetherClaude — parallel implementations on `aetherclaude-eligible`
34+
issues, including #2550 spot background_color), **@s53zo**, and
35+
**@M7HNF-Ian** for contributions across this cycle.
36+
37+
### New features
38+
39+
**S-History v2 — voice signal detection + QRM classification (#2426)**
40+
- New CNN classifier on the panadapter that distinguishes confirmed
41+
voice signals from QRM channels in the Signal History overlay.
42+
Voice markers age out independently of QRM markers (30 s after the
43+
last voice-width hit); QRM channels with voice riding on top get
44+
both markers simultaneously so operators can see the interference
45+
AND the person trying to work through it.
46+
47+
**Connected Stations dialog when multiFLEX disabled (#2488)**
48+
- Operators running with multiFLEX off can now see who else is on
49+
the radio via Help → Connected Stations. Lists every connected
50+
client with handle, program, station, and ownership state.
51+
52+
**FPS meters + performance telemetry (#2480)**
53+
- Footer FPS readouts for spectrum / waterfall plus a
54+
`PerfTelemetry::recordUiHeartbeat()` hook that captures the Qt
55+
event-loop cadence at 50 ms intervals. Feeds the future System Info
56+
diagnostics dialog (#2554).
57+
58+
**8-axis edge resize for frameless main window (#2522)**
59+
- The main window's frameless mode now supports the full eight-axis
60+
resize grip (N/S/E/W/NE/NW/SE/SW) matching the Aetherial Audio
61+
Channel Strip and other frameless dialogs.
62+
63+
**SpotHub Display tab + tunable Signal History (#2506)**
64+
- Consolidates the SpotHub display controls into a single tab with
65+
Signal History tunables (qualify duration, hide-after, suspect-QRM
66+
threshold). Sub-tabs replaced with grouped sections.
67+
68+
**Frameless chrome on Memory Channels dialog (#2509)**
69+
- The Memory Channels dialog gets the standard 18 px gradient title
70+
bar, grip glyph, drag-to-move, double-click-to-maximize, 8-axis
71+
resize — matching NetworkDiagnosticsDialog and the Channel Strip.
72+
73+
**Add Memory action moved into MemoryBrowsePanel (#2533)**
74+
- The "Add memory" button now lives in the MemoryBrowsePanel itself,
75+
closer to where users are looking when they want to capture the
76+
current slice. The slice-letter badge variant was dropped — adding
77+
always targets the active slice without per-letter selection.
78+
79+
**Float popped-out applet panel as frameless project window (#2536)**
80+
- Popping out the applet panel via the new title-bar icon (or
81+
Ctrl+Shift+S) now floats it as a frameless project window with the
82+
full chrome treatment: gradient title bar, drag handle, 8-axis
83+
resize. Three new title-bar icons (dock-left / dock-right / pop-out)
84+
replace the legacy status-bar `` toggle.
85+
86+
**Always-on-Top pin on popped-out applets (#2430, #2479)**
87+
- Per-container pin on the popped-out applet header keeps the float
88+
above the panadapter window for instrument-on-instrument workflows.
89+
90+
**FlexControl WheelRit / WheelXit modes (#2452, #2455)**
91+
- Two new FlexControl USB knob assignment modes drive RIT and XIT
92+
offsets directly without touching the slice frequency.
93+
94+
**Easter egg: Ctrl+Shift+A toggles starstruck pan-drag sound (#2534)**
95+
- Hidden audio cue tied to pan dragging — off by default, no shortcut
96+
reservation, harmless when not enabled.
97+
98+
**Status-bar +PAN icon redrawn as a jagged FFT trace (#2537)**
99+
- Replaces the previous generic icon with a 30-point jagged FFT
100+
spectrum trace at 5 distinct peaks — matches the actual spectrum
101+
visual idiom AetherSDR is built around.
102+
103+
### Bug fixes
104+
105+
**Linux waterfall smear after TX (#2527, fixes #2527-class reports)**
106+
- 10–18 second post-TX vertical-stripe smear on Linux only. Root
107+
cause: `WaterfallBlanker` retained a TX-era "last good row" across
108+
the TX→RX transition; subsequent impulse-detection substitutions
109+
painted that row as a frozen vertical stripe until the ring rolled
110+
past it. Fix: clear `m_wfLastGoodRow` and reset `m_wfBlankerRingCount`
111+
on TX-exit; gate blanker substitution on `!m_transmitting`.
112+
113+
**Slice reduction crash + float/dock GPU corruption + exit crash (#2495, #2512)**
114+
- Three Multi-Flex / multi-pan crashes consolidated. Slice reduction
115+
on disconnect cascade tripped a use-after-free in
116+
`wirePanadapter()`. Float→dock transitions on QRhiWidget panes
117+
corrupted the spectrum framebuffer until the next full repaint.
118+
Exit crash on rapid quit-while-streaming traced to a connection
119+
teardown ordering bug. All three guarded with lifetime checks.
120+
121+
**Spot `background_color` honored when override is off (#2550, #2560)**
122+
- `SpotData::backgroundColor` was parsed from the FlexLib protocol
123+
and stored in the model, but dropped at the model→view boundary:
124+
`SpotMarker` didn't carry the field, the converter silently dropped
125+
it, and `drawSpotMarkers()` only drew the pill from the local
126+
Override Background color. Third-party spot sources
127+
(wave-flex-integrator, SpotCollector) encoding priority /
128+
worked-before via `background_color` now render correctly when
129+
Override Background is off.
130+
131+
**ALC gauge rewired to SW ALC meter; mirror across Phone + CW (#2552)**
132+
- HWALC (RCA voltage telemetry) was driving the SmartSDR-equivalent
133+
ALC gauge, producing meaningless readings. Split into hwAlc /
134+
swAlc; the gauge now consumes the SW ALC meter (post-software-ALC
135+
SSB peak). Mirror identical gauge across Phone and CW panels with
136+
the new `HGauge::setFillFromRight` mode.
137+
138+
**DSP curve widgets: HarfBuzz reshape on every paint (#2546, #2556)**
139+
- The DSP curve widgets (`ClientCompCurveWidget`,
140+
`ClientGateCurveWidget`, `ClientDeEssCurveWidget`) were calling
141+
`QPainter::drawText` for axis labels on every paint, forcing a
142+
full HarfBuzz reshape per frame. Cache axis labels as `QStaticText`
143+
with `AggressiveCaching`; ~7× drop in `shapeText` cost.
144+
145+
**macOS app icon missing on local builds (#2558, jensenpat)**
146+
- `docs/AetherSDR.icns` was never committed (only generated inside
147+
the macos-dmg CI runner), so every local macOS dev build silently
148+
produced a generic-icon `.app`. Fixed by moving icns generation
149+
into CMake via `add_custom_command` sourced from the committed
150+
`docs/logo-circle.png`. No new build dependencies.
151+
152+
**Stream Deck mute toggle TCI command (#2519)**
153+
- The mute action on Stream Deck mappings sent the wrong TCI command.
154+
Corrected to the canonical mute/unmute primitive.
155+
156+
**DAX IQ silently broken on Windows / non-PipeWire Linux (#2524)**
157+
- DAX IQ streams produced no output on Windows and on Linux systems
158+
without PipeWire (PulseAudio-only). Root cause: the IQ stream
159+
setup path assumed PipeWire native and silently returned without
160+
initialization on other platforms. Adds the proper fallback.
161+
162+
**Windows ClangCL build failures (#2525)**
163+
- ClangCL toolchain failures for NR4/specbleach and other modules
164+
resolved with target-specific include path adjustments.
165+
166+
**Memory recall radio state sync (#2526)**
167+
- Recalling a memory entry now correctly syncs all radio state (mode,
168+
filter, slice settings) instead of just frequency.
169+
170+
**RADE mode not disabled on PTT release (#2517)**
171+
- Mic metering during RADE TX could be interrupted if RADE auto-
172+
disabled on key-up. Now stays in RADE mode across PTT cycles.
173+
174+
**RX output panel rebuild with canonical meter ballistics (#2514)**
175+
- Aetherial Audio Channel Strip's RX output panel rebuilt to use the
176+
canonical `MeterSmoother` ballistics (30 ms attack, 180 ms release
177+
at 120 Hz) — matches every other meter in the app.
178+
179+
**XVTR Flex band-stack key uses status index, not order (#2342, #2511)**
180+
- Band-stack persistence keyed off the position-in-list of XVTR
181+
entries; if the radio reordered them, recall pulled the wrong
182+
entry. Now keys on the radio-supplied status index.
183+
184+
**Frameless float popout follows frameless setting (#2449)**
185+
- Popped-out applets now respect the global "use frameless windows"
186+
preference — previously they were always system-decorated.
187+
188+
**MIDI toggle params + modeUp/Down + category filter (#2446)**
189+
- Toggle MIDI params no longer auto-revert on note release.
190+
Adds `modeUp` / `modeDown` actions. Category filter in MIDI Learn
191+
expanded to cover every action group.
192+
193+
**RTTY squelch auto-disable (#2504, #2510)**
194+
- Switching to RTTY mode now auto-disables squelch (squelch on RTTY
195+
notches characters out and breaks decoding).
196+
197+
**NR4 button disabled when libspecbleach unavailable (#2484, #2508)**
198+
- Builds without `libspecbleach` left the NR4 button live but
199+
no-op — confusing operators about what NR4 actually does. Button
200+
is now disabled with a tooltip when the dependency is missing.
201+
202+
**CWX release TX when queue drains (#2450, #2507)**
203+
- CWX macros could leave the radio stuck in TX if the queue drained
204+
without an explicit end-of-message marker. Now releases TX when
205+
the queue is empty.
206+
207+
**Audio mute restore on reconnect (#2489)**
208+
- Reconnecting to the radio no longer restores per-slice audio mute
209+
state — that's a radio-authoritative setting per the
210+
Radio-Authoritative Settings Policy.
211+
212+
**QsoRecorder QTimer playback → QAudioSink pull mode (#2295, #2487)**
213+
- QSO recorder playback used a `QTimer` to push audio buffers,
214+
producing audible glitches under high system load. Rewritten to
215+
`QAudioSink` pull mode for glitch-free playback.
216+
217+
**Slice capacity clamp to model limit (#2477)**
218+
- Some radio models report a slice count higher than they actually
219+
support. Client now clamps to the model-specific limit.
220+
221+
**DVK F1-F12 shortcut conflict with CwxPanel (#2464, #2469)**
222+
- F-key shortcuts triggered both DVK and CWX panels when both were
223+
visible. Resolved via panel-scoped shortcut routing.
224+
225+
**ShackSwitch button stale visibility (#2456)**
226+
- Top-right tray's ShackSwitch button stayed visible after the
227+
ShackSwitch feature was disabled. Now toggles in lockstep.
228+
229+
**RX applet radeActivated guard (#2376)**
230+
- `RxApplet` was missing the RADE-active guard that `VfoWidget`
231+
uses — could fire stale mode-change events while RADE was busy.
232+
233+
**Avoid unchanged spot overlay repaints (#2474)**
234+
- Spot marker list was being rebuilt and repainted on every spot
235+
source update even when no visual change occurred. New
236+
`spotMarkersVisuallyEqual()` predicate gates the repaint.
237+
238+
**Reassert desired panadapter and waterfall display rates (#2465)**
239+
- Radio reconnect could silently leave the panadapter and waterfall
240+
at the radio's default display rate (10 Hz) instead of the
241+
client's configured rate. Now reasserted on every reconnect.
242+
243+
**Windows 48 kHz L-R audio pan (#2403, #2459)**
244+
- L-R audio panning was incorrect on the Windows 48 kHz resampler
245+
path. Restored to match the macOS / native-rate paths.
246+
247+
**Protocol: send client program/low_bw_connect before client gui (#2466)**
248+
- Subscription order matters on the FlexLib side; sending `client
249+
program` and `client low_bw_connect` after `client gui` caused
250+
intermittent rejection of metadata. Reordered to match what
251+
SmartSDR-for-Windows does.
252+
253+
**TCI volume/drive/rx_volume command dispatch (#1764, #2463)**
254+
- Three TCI v2.0 commands had no dispatch wiring on AetherSDR's
255+
side. Added the three handlers + bidirectional state sync.
256+
257+
**Spectrum cursor update guards (#2461)**
258+
- Spectrum cursor position updates fired without checking widget
259+
lifetime, producing rare null-deref crashes during layout changes.
260+
261+
**AmpApplet telemetry forwarding (#2444)**
262+
- Amplifier telemetry from the radio (id, vac, meffa, temp) was
263+
parsed but not forwarded to `AmpApplet`. Wired through.
264+
265+
**Windows UI scaling settings path (#2443)**
266+
- Pre-Qt settings read on Windows used the Linux path convention.
267+
Corrected to `%APPDATA%/AetherSDR/`.
268+
269+
**FreeDV Station Msg live-update without restart (#2476)**
270+
- The Station Msg field in FreeDV settings required an app restart
271+
to take effect. Now live-updates the reporter.
272+
273+
**Container pop-out glyph + size (#2499)**
274+
- Switches the pop-out glyph to `` at a larger size for
275+
discoverability.
276+
277+
**Minimal mode hides dock-side icons (#2562)**
278+
- The three dock-side selectors (left dock, right dock, pop-out)
279+
and their separator are now hidden in minimal mode — they have
280+
no meaning when the spectrum is hidden.
281+
282+
**View → Applet Panel / Pop Out menu entries removed (#2540)**
283+
- Both menu entries are redundant with the new title-bar dock-side
284+
icons (#2536) and the Ctrl+Shift+S window-scoped shortcut.
285+
286+
**Reconnect dialog chrome polish (#2541)**
287+
- The reconnect dialog gets the frameless gradient title bar and
288+
proper chrome to match the rest of the app.
289+
290+
### Closed without fix
291+
292+
**`_platform_memmove` cost in macOS backing-store flush (#2547, #2548)**
293+
- Two related claims about Qt's widget-RHI fallback cost on macOS
294+
(#2547) and 30 Hz hidden-widget timer storms (#2548). Implemented
295+
the #2548 fix in full (~150 LOC, 10 widgets timer-gated on
296+
visibility) and measured before/after with `perf record -F 99 -g`
297+
on Linux: paint pipeline cost moved 16.8 % → 15.7 %, within noise.
298+
Reverted; closed both as `wontfix`. Reopen with matched windowed
299+
macOS profiling if the cost ever reproduces.
300+
301+
### Infrastructure
302+
303+
**Buffered async file logging (#2478)**
304+
- AetherSDR's log file path now flushes via a buffered async writer
305+
to avoid blocking the GUI thread on slow disks (especially network
306+
shares on macOS).
307+
308+
**FPS meters + perf telemetry framework (#2480)**
309+
- Foundation for the System Info diagnostics dialog (#2554) — see
310+
Features above.
311+
312+
**actions/cache bump 4 → 5 (#2493)**
313+
- Dependabot bump for the GitHub Actions cache action.
314+
315+
**Qt 6.7+ GPU rendering requirement documented (#2531, #756)**
316+
- README now documents the minimum Qt version for GPU spectrum
317+
rendering. Older Qt falls back to CPU rasterization.
318+
319+
**README supported hardware refresh (#2532)**
320+
- Aurora 510M, RT-series, ML-series, CL-series additions to the
321+
Supported Hardware list. AU-520 confirmed working.
322+
323+
**libopengl0 build dep documented (#2523)**
324+
- Ubuntu/Debian build instructions now list `libopengl0` explicitly.
325+
326+
**1.0 release prep — stale reference sweep (#2515)**
327+
- Sweep across CLAUDE.md, README.md, CHANGELOG.md, and
328+
`docs/architecture-pipelines.md` removing pre-1.0 framing and
329+
TODO breadcrumbs.
330+
6331
## [v0.9.8] — 2026-05-06
7332

8333
### Aetherial Audio Channel Strip RX + community-driven reliability sweep

CLAUDE.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,9 @@ cmake --build build -j$(nproc)
6464

6565
Full dependency list is in `README.md` — don't duplicate it here.
6666

67-
Current version: **0.9.8** (set in both `CMakeLists.txt` and `README.md`).
67+
Current version: **26.5.1** (set in both `CMakeLists.txt` and `README.md`).
68+
Versioning scheme is **CalVer** (`YY.M.patch`) starting with this release, the
69+
1.0-equivalent. Earlier tags used semver through v0.9.8.
6870

6971
---
7072

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
cmake_minimum_required(VERSION 3.20)
2-
project(AetherSDR VERSION 0.9.8 LANGUAGES C CXX)
2+
project(AetherSDR VERSION 26.5.1 LANGUAGES C CXX)
33

44
set(CMAKE_CXX_STANDARD 20)
55
set(CMAKE_CXX_STANDARD_REQUIRED ON)

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
AetherSDR brings FlexRadio operation to Linux without Wine or virtual machines. Built from the ground up with Qt6 and C++20, it speaks the SmartSDR protocol natively and aims to replicate the full SmartSDR experience.
1212

13-
**Current version: 0.9.8** | [Download](https://github.com/ten9876/AetherSDR/releases/latest) | [Discussions](https://github.com/ten9876/AetherSDR/discussions) | [What's New](https://github.com/ten9876/AetherSDR/releases)
13+
**Current version: 26.5.1** — first stable, 1.0-equivalent release. Versioning moves to CalVer (`YY.M.patch`). | [Download](https://github.com/ten9876/AetherSDR/releases/latest) | [Discussions](https://github.com/ten9876/AetherSDR/discussions) | [What's New](https://github.com/ten9876/AetherSDR/releases)
1414

1515
> **Cross-platform downloads available:** Linux AppImage, macOS universal DMG, Windows installer and portable ZIP.
1616
> Linux is the primary supported platform. macOS and Windows builds are provided as a courtesy.

0 commit comments

Comments
 (0)