You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Keyboard input for per-edge LED counts and stand-gap in LED Setup, allowing direct numeric entry instead of stepper-only interaction.
First close-to-tray OS notification guides new users who wonder where the app went after closing the window.
Frontend console.* calls are now bridged to tauri-plugin-log's file sink, so [webview] records appear alongside Rust log entries in the platform log file — runtime debugging no longer requires an open DevTools window.
Changed
Polling discipline tightened across telemetry and Hue health checks: all intervals pause when the window is hidden and resume on visibility, reducing CPU and battery draw when LumaSync is running in the background.
Boot sequence streamlined: Hue credential validation is de-duplicated (previously fired twice on some paths) and the updater check is hoisted to run earlier, so the first-launch experience is snappier.
RoomMap editor migrated to amber Rev 07 design tokens with a 32 px minimum tap-target floor throughout the dock and toolbar.
Compact-mode deep-links to non-LIGHTS sections now auto-expand to full-window mode so the target panel is always visible.
Window position persistence anchored by window center instead of top-left corner, with a monitor-clamp guard that snaps the window on-screen if the saved position falls outside the current display geometry.
Release pipeline (release.yml) now runs the same Rust hardening gate as ci.yml before any tag-triggered build — cargo fmt --check, cargo clippy -D warnings, cargo test --all-features — closing the gap that previously let lint regressions or integration-test failures slip through to a release artefact.
CI: pnpm/action-setup bumped v4 → v6 to clear the Node 20 deprecation warning; workflow concurrency and release idempotency (allowUpdates) tightened.
Rust deps: mdns-sd 0.13.11 → 0.19.1 (major); ResolvedService surface adapted in the mDNS registry; Cargo.lock transitive graph refreshed on the 2.11.x Tauri line.
Fixed
macOS lifecycle hardened: Cmd+Q, tray Quit, and Ctrl+C now all route through a single kick_off_shutdown_and_die path. Two follow-up regressions from the initial rewrite are resolved — the tauri-plugin-single-instance socket is no longer leaked on watchdog exit (which caused the next dev launch to exit within ~50 ms), and stop_hue_stream is detached onto a worker thread with a 1.5 s abandon timeout so it cannot blow the 4 s watchdog.
macOS tray icon now ships as a template image (monochrome silhouette), so it renders at the correct size and respects Dark/Light menu bar mode.
Non-USB serial port types (Bluetooth, PCI, Unknown) are rejected with PORT_UNSUPPORTED before serialport::open() is called. Previously, opening /dev/cu.Bluetooth-Incoming-Port silently accepted writes while the LED strip stayed dark.
Boot output-target recovery: persisted empty [] targets are no longer overwritten with defaults on every launch; the PORT_UNSUPPORTED subscriber auto-adds Hue when a bridge is paired and Hue was not already active; a separate boot path prevents paired-Hue-only users from being stranded in OFF state on restart.
WLED backend–frontend wire mismatch: request/response payload shapes for discover, connect, and test were misaligned, causing the picker to render empty and the Connect/Test buttons to fail with MissingField. All three command pairs are now aligned; WledTestResponse reports a real round-trip in milliseconds.
WLED: additional validation rejects led_count == 0 at connect time (WLED_INVALID_LED_COUNT) and extends the SSRF guard to also block loopback, unspecified, multicast, and broadcast addresses (WLED_INVALID_IP).
Output-target delta-stop no longer evicts a chip from active membership when the underlying stop call fails — the chip stays active so the user can retry, and a transient banner identifies which target needs attention.
Hue stream shutdown emits a DTLS close_notify alert and de-dupes foreground/background deactivate calls via a single-shot atomic token, so the bridge clears its "active streamer" slot immediately and the latent HUE_STREAM_NOT_READY_ACTIVE_STREAMER 403 on the next session start is eliminated.
RoomMap rename dialog: ESC now cancels from any focused element; Tab cycles input → cancel → confirm; aria-labelledby IDs are generated with useId() to prevent DOM collisions on re-mount.
Security
WLED IP validation extended: loopback (127.0.0.0/8), unspecified, multicast, and broadcast addresses are now rejected with WLED_INVALID_IP, layered on top of v1.5.1's parser-level SSRF guard.