Release Date: March 10, 2026 Build Version: v1.0B04 Codename: "Hardened"
Overview
Version v1.0B04 is a stability and polish release. It delivers security hardening across service providers, web configuration UI parity with the native app, and reliable display power control on KMSDRM platforms. No new features are introduced — this release focuses entirely on correctness, safety, and operational reliability.
17 commits since v1.0B03.
Major Features
Web Configuration UI Parity (updates 32–34)
The embedded web configuration UI now matches the native app's full configuration surface:
- Side Panel mode selector — Pane 5/6 can now be set to DE Info+DX/Sat, DX Cluster, On The Air, or Live Spots — matching the native panel mode options exactly.
- Display Power Method dropdown — Select the power-control method (DPMS, KMSDRM, sysfs, etc.) from the web UI; ON/OFF buttons send live commands immediately.
- Satellite tracking selector — Choose the active satellite from a dropdown populated
by the new
/api/satellitesendpoint. /api/satellitesendpoint — Returns a JSON array of all configured satellite names; consumed by the web UI satellite selector.- Pane 4 widget restriction — Pane 4 (NCDXF/BandCond) now shows only its permitted 4 widgets in the web UI, matching the native app restriction.
- Widget list alphabetically sorted — All pane widget dropdowns now sort options alphabetically.
- Active widgets correctly highlighted — Fixed root bug where
j["panes"]was built but never assigned in/api/config, so the web UI always sawundefinedpanes on load.
Security & Thread Safety (updates 27–28)
- 12 service providers refactored to
std::shared_ptr+std::weak_ptrfor async-safe callbacks — eliminates use-after-free crashes during config reloads. DXClusterDataSQL queries converted from string concatenation to prepared statements — prevents SQL injection.HamClockStateprotected withservicesMutexandlocationMutex— safe concurrent access from provider threads.SECURITY.mdadded: vulnerability disclosure policy and supported version matrix.
Display Power Control (updates 29–31)
- Init ordering fix —
DisplayPowerconstruction moved afterLog::setLevel(), ensuring all power-method detection messages appear in the log at startup. - KMSDRM fd reuse —
DisplayPower::setDrmFd()reuses SDL2's existing DRM master fd instead of opening a second fd on/dev/dri/card0, which was causing permission errors on headless Pi deployments. DisplayPower::excludeMethod()— Runtime method removal allows KMSDRM to exclude fallback methods that would conflict with its master-fd ownership.SDL_RenderPresentsuppressed after display power-off, preventing DPMS wake on KMSDRM targets where rendering to a powered-off display causes an implicit DPMS ON.
UI / Layout
- Pane 4 widened — Removed inconsistent inter-pane gaps (23 px total) and allocated the reclaimed space to Pane 4 (NCDXF/BandCond): width increased from 62 → 85 px (+37%). Panes 1–3 and the Info Panel are unchanged.
- Antimeridian path rendering — Fixed streaks in the dual-azimuthal night overlay caused by path segments crossing the antimeridian without clipping.
Under the Hood
- MCP developer onboarding —
.mcp.jsonnow auto-loads in Claude Code; context refresh documentation added for multi-session development. - DX Cluster hub endpoint — Shared cluster connection across sessions via the hub master/slave architecture.
- RPi OOM safety flush — Memory safety flush triggered on out-of-memory conditions on Raspberry Pi targets.
- Adaptive render throttle — Idle CPU reduction via configurable render rate limiting.
Bug Fixes
- Antimeridian div-by-zero guard in path segment clipping.
- Hardcoded UI colors replaced with
ThemeColorsconstants throughout affected panels. - Framebuffer blank two-step ioctl sequencing corrected;
#ifdefaudit for non-Linux builds. SDL_MOUSEWHEELrouting restored; scroll bounded to prevent runaway delta accumulation.- Watchlist arrow rendering corrected; ADIF clip guard added.
- Callsign background color on map panels now uses theme token.
- Cursor state correctly restored after dialog close on all exit paths.
- Display power method change via web UI now takes effect immediately (previously required full restart).
- Pane 6 correctly hidden when switching to non-DE-Info side panel modes via web UI.