Release history
Changelog
Sourced from voyvodka/LumaSync at the pinned submodule ref. This page redeploys when the submodule is bumped — see Releases for signed binaries.
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog: https://keepachangelog.com/en/1.1.0/
[Unreleased]
[1.3.1] — 2026-04-23
Fixed
- CHANGELOG: de-duplicated
[1.1.0]heading; the March 2026 foundation entry was never tagged and is now demoted to a historical sub-section so the release workflow's changelog extractor no longer silently drops it
[1.3.0] — 2026-04-22
Added
- Compact UI mode with dual-sized window (compact 320×480 / full 900×620), custom overlay title bar, and accent theme system driven by a new
UIModecontract - CompactLayout view with quick-access mode presets, scene tiles, and integrated mode toggle for a tray-style experience
- LightsSection redesign (M6): mode selector, scene presets, ambilight profile sliders, and live device/status visualisation
- StatusBar with mode, device, and stream indicators alongside the new shell chrome
- UpdateModal rewrite covering four states (available / downloading / installing / error) with i18n-backed labels
- Hue Bridges section redesign (B-08): card state classes, pill variants, traffic bar label row, four-step pairing tracker with failure state, area-select label, conflict/repair/offline banners, and action buttons aligned to all 17 defined states
- Edge signal preview panel: the ambilight worker now emits a throttled
ambilight://edge-signalTauri event (~10 Hz) with top/bottom/left/right RGB samples, rendered as live linear gradients next to a primary-display tile - Runtime telemetry meta pill showing live
Δframe latency andΣFPS sourced fromget_runtime_telemetrywhile Ambilight is active; polling pauses when the tab is hidden - Ambilight saturation control: luminance-preserving Rec.601 factor (range 0.5–2.0, identity 1.0) stored as an
AtomicU32in the worker's live settings, applied on the hot path before smoothing so USB LEDs, Hue channels, and the edge-signal preview stay visually consistent; exposed in Lights as a 50–200% dial - Unified scene preset catalog (
src/features/mode/model/scenePresets.ts) with abrightnessfield, shared by Compact and Lights; active preset is derived from the current SOLID payload so selection survives view switches and app restarts - Dock "+" add-zone affordance rendered as disabled with a tooltip, surfacing multi-zone support as a known-future feature
EdgeSignalPayload/EDGE_SIGNAL_EVENTexported from the mode contract module for typed event wiring- Jules agent documentation: hard constraints, security rules, and architecture data-flow map to guide automated security/performance scans
LedRoomCanvas: read-only SVG illustration of the monitor + desk scene with LED dots distributed per edge, a #1 start marker, and a direction arrow — driven purely fromLedCalibrationConfigderiveDefaultCounts(display): frontend heuristic that assigns sensible per-edge LED counts from monitor resolution and aspect ratio so auto-selected displays fill the canvas on first run without a template picker
Changed
- Compact/full UI mode transition now uses a single content slot with sequential fade + resize + fade and easing matched to the window animation, eliminating the progressive-clipping artefact where the incoming layout overflowed the still-animating window
- Removed the orange edge-sweep animation from window mode transitions; the simpler fade + resize flow remains
- LED Setup redesigned to a single-screen stage + 268px dock layout: the three-step display/template/editor wizard, template picker, and draggable editor canvas are gone; counts are adjusted directly in the dock and the test pattern runs in place with a preview/output HUD overlay on the canvas
- LED Setup dock exposes the full strip topology: partial-edge setups (e.g. LEDs only on the top) are allowed (0-count edges), monitor stand gap (
bottomMissing) has a dedicated stepper, LED direction toggles between CW / CCW, and start anchor is driven by edge tabs + Start/End/Gap-R/Gap-L endpoint buttons so all 10LedStartAnchorpositions are reachable.LedRoomCanvasnow renders the stand gap and places the#1marker on the gap-adjacent LED forbottom-gap-*anchors - Calibration validation: 0-count edges are now accepted as long as
sum > 0(NO_LEDS_CONFIGURED); stand gap wider than the bottom edge now fails withBOTTOM_MISSING_EXCEEDS_BOTTOM;normalizeLedCalibrationConfigauto-clampsbottomMissingto bottom count and auto-healsstartAnchorwhen its edge is zeroed out - Hue stream health polling migrated from
setIntervalto recursivesetTimeout, preventing overlapping probes when a health check takes longer than its interval and stopping polling as soon as the stream is detected dead - Internationalisation sweep: DeviceSection cell labels (Area, Protocol, Ch, Rate, Status, Error, Retries, Next, Fault, Config, Credential, Invalid), traffic bar Stream label, DTLS streaming subtitle, display card ID/Scale labels, previously-missing wizard step keys, UpdateModal note kind tags moved to
updater.noteKind.*, RenameDialog Cancel/OK buttons in RoomMapEditor, and StatusBar keyboard hint labels (mode / settings) — EN + TR locales kept in sync - Test layout: all colocated
*.test.ts(x)files relocated into__tests__/subdirectories and CLAUDE.md updated to document the convention - Rust dependencies bumped:
tokio1.50.0 → 1.52.1,openssl0.10.76 → 0.10.78 - Frontend dependencies bumped (minor/patch):
i18next26.0.4 → 26.0.6,react-i18next17.0.2 → 17.0.4,tailwindcss+@tailwindcss/vite4.2.2 → 4.2.4,typescript6.0.2 → 6.0.3,vite8.0.8 → 8.0.9,vitest4.1.4 → 4.1.5,happy-dom+@happy-dom/global-registrator20.8.9 → 20.9.0 - GitHub Actions bumped:
actions/checkout4 → 6,actions/setup-node4 → 6,pnpm/action-setup4 → 6 - Dependabot configuration added for Cargo, npm, and GitHub Actions ecosystems so future dependency updates land as reviewable PRs
- Linux CI hardened with
DEBIAN_FRONTEND=noninteractiveto prevent apt-get prompts from hanging the runner .gitignorenow ignores.planning/and.jules/recursively so local planning artefacts never leak into status- Removed legacy
.julestracking files from the repository
Fixed
- Hue stream polling overlapping probes when a health check ran longer than the interval (migrated to recursive
setTimeout) - DeviceSection and SettingsLayout test suites updated for the b06 redesign markup
- LightsSection test suite: added a
Transmock so rich-text i18n fragments render deterministically in jsdom - Removed unused imports that were failing
tsc --noEmitwith TS6133 after recent refactors - Hardcoded fallback strings in Device and Updater UIs replaced with
t()keys so EN/TR locales render consistently
Performance
- RoomMapEditor: isolated high-frequency mouse-coordinate state into a dedicated child that uses native DOM listeners with
requestAnimationFramethrottling, eliminating full-editor re-renders on cursor movement - SettingsLayout: wrapped in
React.memoto prevent polling-triggered re-renders of the entire settings tree
Known Limitations
- USB output is single-zone: the ambilight worker currently samples one pixel and sends a single RGB triplet per frame to the controller, which the companion firmware extends across the full strip. Per-edge position sampling driven by
LedCalibrationConfig(edge counts, start anchor, direction, bottom gap) is planned for v1.4; the calibration UI still records and persists the full layout so the Hue channel path and future USB wiring stay consistent. - The USB serial frame format is LumaSync-specific (
0xAA 0x55header, LE LED count, gamma-corrected RGB, XOR checksum) — earlier documentation referred to this as "Adalight-compatible", which it is not.
[1.2.0] — 2026-04-10
Added
- Room map editor: undo/redo with Cmd+Z / Cmd+Shift+Z (max 50 steps)
- Room map editor: collapsible object list panel (right sidebar) with grouped objects and inline rename
- Room map editor: smart snap alignment guides (edge/center) during drag operations
- Room map editor: origin crosshair marker with snap-to-center
- Room map editor: right-click context menu (duplicate, delete, lock, z-order, rename, rotate)
- Room map editor: property bar with numeric x/y/w/h/rotation inputs for precise positioning
- Room map editor: extended keyboard shortcuts (Cmd+D duplicate, Shift+Arrow 10x nudge, L lock, [ ] z-order)
- Room map editor: scroll wheel zoom (0.5x–3x) with mouse-centered scaling and Cmd+0 fit-to-view
- Room map editor: space+drag and middle-mouse pan navigation
- Room map editor: real-time mouse coordinate display in meters
- Room map editor: template system with presets (TV 55", L-desk, full room, blank canvas)
- Room map editor: multi-image background layers with per-layer opacity, lock, and reorder
- Room map editor: universal object lock and resize handles for all object types
- Room map editor: floating left toolbar replacing fixed top toolbar
Fixed
- Room map editor: rotated furniture resize now uses anchor-based positioning for correct behavior
[1.1.1] — 2026-04-09
Fixed
- Windows: calibration overlay close event no longer intercepted by the close-to-tray handler (overlay was preventing app quit)
- Windows: overlay positioning now uses display's scale factor instead of window's runtime scale factor, fixing placement on DPI-scaled monitors
- Windows: WebView2 child windows now receive
WS_EX_TRANSPARENT | WS_EX_LAYEREDso the overlay is truly click-through and does not block mouse events behind it
[1.1.0] — 2026-04-09
Added
- Ambilight: black border detection to crop letterbox bars before color sampling
- Ambilight: user-configurable color transition speed (smoothing alpha) in settings
- Tray: quick-action menu items (Lights Off, Resume Last Mode, Solid Color) with i18n label support
- CI: universal macOS binary (x86_64 + arm64) support in release workflow
- Debug: sidebar FPS widget in development builds
Changed
- Hue: per-channel EWMA smoothing and continuous position sampling for smoother color transitions
- App version now resolved dynamically from the build instead of a hardcoded string
- macOS deployment target set to 12.3 for SCStream compatibility
Fixed
- WS2812B output: apply gamma 2.2 correction for accurate perceived brightness
- Ambilight UI: reflect mode state correctly in UI on transient Hue failure
- Hue telemetry: fix stream state reporting after per-channel smoothing refactor
- Tests: fix 2 failing unit tests and resolve 12 unhandled rejections in App test suite
- SCStream: fix log timestamp formatting and release crash on session stop
[1.0.4] — 2026-04-09
Changed
- Migrated package manager from Yarn Classic (1.x) to pnpm 10; updated all scripts, CI/CD workflows, docs, and
tauri.conf.json - SECURITY.md: updated supported versions table from
0.1.xto1.0.xand added private vulnerability reporting link - README.md: added CI, Release, License, and Platform badges; added Platform Support table (macOS / Windows / Linux)
- CONTRIBUTING.md: commit examples updated with scope prefixes; added fork workflow and review process sections
- CODE_OF_CONDUCT.md: added GitHub private vulnerability reporting as a confidential report channel
Fixed
- Release workflow (
release.yml): addedtypecheck,verify:shell-contracts, andvitest runvalidation steps before build - CI workflow (
ci.yml): addedvitest runstep for frontend test coverage - CHANGELOG.md: removed stale separator under
[Unreleased]
Added
.github/ISSUE_TEMPLATE/config.yml: issue template chooser with security advisory link and blank issue restriction- CLAUDE.md: added Code Style, Verification Flow sections; consolidated with AGENTS.md as single source of truth
- AGENTS.md: rewritten as thin reference to CLAUDE.md with agent-specific behavioral rules only
Fixed (tests)
App.test.tsx: fixed mode orchestration tests for updated output target and Hue gate behaviormanualConnectFlow.test.ts: fixed auto-scan, stale selection, remembered port, and refresh throttle testsuseHueOnboarding.runtime.test.ts: fixed retry pipeline routing testGeneralSection.test.tsx: fixed solid payload color change testuseRoomMapPersist.test.ts: fixed resetConfig default room map test
[1.0.3] — 2026-04-08
Added
- Room map canvas editor with draggable furniture, TV anchor, and USB strip objects (
RoomMapEditor,RoomMapCanvas,RoomMapToolbar) HueChannelOverlayrenders channel positions on the room map using a[-1,1]normalized coordinate systemHueChannelMapPanel: drag-and-drop single and multi-channel positioning, z-axis detail strip, coordinate tooltips, positions persisted viashellStore- Zone auto-derivation:
deriveZonesalgorithm maps LED strip positions to Hue channel regions automatically (13 unit tests) ZoneDeriveOverlayandZoneListPanelfor reviewing, renaming, and deleting derived zones; zone assignment mode inHueChannelOverlayHueReadySummaryCardin Device section — shows stream state indicator, entertainment area name, and bridge IP when Hue is connectedupdate_hue_channel_positionsRust command writes edited channel positions back to the Hue bridge with save confirmation UI- Target-aware lighting pipeline:
targetsfield onLightingModeConfigselects which output devices (USB / Hue) participate per mode resolveDefaultTargetshelper preserves backward compatibility with persisted configs that predate the targets field- USB hot-plug detection: suggestion banner appears when a USB controller is plugged in while Hue-only mode is active
- Startup target filtering: USB target is silently removed from persisted state if the device is not connected on launch
- Delta start/stop in
handleOutputTargetsChange— adding or removing an output target while a mode is active no longer restarts the full pipeline HueTelemetryGridcomponent in Diagnostics tab showing live DTLS stream metricsHUE_FAULT_CODEStyped constant map replaces raw string matching for all DTLS fault conditionsFullTelemetrySnapshottype andget_full_telemetry_snapshotTauri command for combined runtime diagnosticssimulate_hue_faultRust command for fault injection during development and testingcopy_background_imageRust command for importing a floor-plan background into the room maproomMap.tscontract: placement types,RoomMapObjectdiscriminated union, coordinate definitionsUPDATE_CHANNEL_POSITIONScommand and associated status codes added tohue.tscontractroomMappersistence field andROOM_MAPsection ID added toshell.tscontract- Shell contracts verifier extended to validate room map and Hue channel position contract coverage
targetFailedi18n key underdevice.huenamespace (EN + TR)- Tauri
dialogandfsplugins for background image import
Fixed
handleOutputTargetsChangeno longer stops an active lighting mode when a target is only being added (not removed)- DTLS reconnect monitor correctly detects and registers thread death in all failure paths
Historical — Pre-1.1.0 Foundation (2026-03-28)
Added
- Philips Hue DTLS 1.2 PSK entertainment streaming over UDP (cipher
PSK-AES128-GCM-SHA256, port 2100) using vendored OpenSSL ShutdownSignalmechanism: DTLS sender thread signals clean exit;stop_hue_streamwaits up to 3 s and marks timeout on failure- DTLS thread death detection:
get_hue_stream_statusprobes shutdown signal and registers a transient fault if the thread died silently while state wasRunning HueSolidColorSnapshotexposed inget_hue_stream_statusresponse — tracks last pushed solid color for UI sync- Hue → UI color sync: when Hue transitions to
Running, the last solid color is reflected in the solid color picker exactly once per connection (no continuous polling) - Stream running indicator on Hue output chip in Control page (pulsing emerald dot)
- Action-aware retry button in Device section — label changes based on
actionHint(Re-pair, Revalidate, Retry…) - Amber banner in Device section when pairing is waiting for the Hue bridge link button press (
HUE_PAIRING_PENDING_LINK_BUTTON) - "Stop retrying" button cancels an active Hue reconnect loop
✓ Savedfeedback toast (2 s) on Hue channel-to-region override saveSHELL_COMMANDSconstant map inshell.tscontract;trayController.tsmigrated to use it- Initial open-source contributor documentation (
CONTRIBUTING.md,CODE_OF_CONDUCT.md,SECURITY.md) - MIT License
Changed
stop_with_timeoutnow clearspersistent_senderon user-initiated stops (ModeControl,DeviceSurface) and preserves it on system-triggered stopsstart_hue_streamguards against race condition: re-checksowner.stateafter async credential fetch before storing stream contextApp.tsxpollsget_hue_stream_statusevery 5 s when Hue is active; removes "hue" fromactiveOutputTargetswhen backend reportsFailedorIdle- Device Settings redesign: Serial Device and Philips Hue split into separate cards with compact connect bar, status indicator dots, and per-port connection badges
- Control page output targets redesigned as compact chip-style toggles showing live device availability
- Hue stepper redesigned with numbered steps (✓ / active / inactive) and network unreachable hint
- Dark mode badge color improvements in Device section (Connected, Checking, Unreachable badges)
- Expanded
README.mdwith setup, scripts, structure, and policy references
Fixed
- DTLS thread death no longer causes silent stuck-
Runningstate — fault is registered and UI reflects failure - Race condition in
start_hue_stream: concurrent stop during async credential fetch no longer spawns a dangling sender stop_hue_streamtimeout branch was unreachable (always called withtimed_out=false) — now properly triggered viaShutdownSignalpersistent_sendernot cleared on user-initiated stop — fixed to prevent ghost connections- Serial port handle leak on disconnect:
disconnect_sessionnow called onLedPacketSenderto release the port - Phantom
DISCONNECT_PORTcontract entry removed fromdevice.ts(command never existed in Rust) - CSP in
tauri.conf.jsonchanged fromnullto a strict policy - Hue solid color not pushed on app startup when restoring a persisted solid mode
Cargo.tomlversion aligned to1.0.2(was0.1.0), fixing auto-updater version detectionCargo.tomlauthor placeholder replaced with real value
[1.0.2] — 2026-03-26
Fixed
- Release pipeline validation: aligned CI artifact naming and signature verification steps
reqwestdependency upgraded to resolve upstream security advisory
[1.0.1] — 2026-03-26
Added
- Philips Hue entertainment area streaming (DTLS, CLIP v2)
- Hue channel-to-screen-region mapping with per-channel override UI
- Hue bridge discovery, pairing, and credential validation flow
get_hue_stream_statusruntime polling with fault-aware reconnect- Hue solid color push via
set_hue_solid_colorcommand - Output target selection (USB / Hue / both) persisted across sessions
- Display enumeration and overlay support for multi-monitor calibration
- DPI correction and fallback logic for display capture
Changed
- Settings redesigned into Control / Calibration / Settings navigation
- Device section migrated to contract-first design (
device.ts,hue.ts,shell.ts) - Hue commands refactored to
async/awaitfor improved responsiveness
Fixed
- CI: added
libudevdependencies on Linux runners - Calibration auto-open flag preserved across page refreshes via
sessionStorage
[1.0.0] — 2026-03-21
Added
- Tray-first shell: single window hidden to tray on close, reopen via tray icon
- USB serial device discovery with CH340 / FTDI chip support
- Connection resilience: auto-reconnect loop with health check pipeline
- LED calibration editor: template selection, edge counts, gap, corner ownership, start anchor, direction
- Lighting modes: Off, Ambilight (screen capture), Solid (RGB + brightness)
- Ambilight: real-time screen capture at up to 60 Hz with runtime quality controller
- Solid: color picker and brightness slider with debounced 50 ms push
- Runtime telemetry: FPS, frame drops, capture errors displayed in Diagnostics tab
- EN / TR localization with automatic locale parity test
- Auto-updater: GitHub Releases with minisign signature verification
- Startup launch-at-login toggle
- QUAL-04 60-minute stability gate passed