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 UIMode contract
  • 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-signal Tauri 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 from get_runtime_telemetry while 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 AtomicU32 in 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 a brightness field, 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_EVENT exported 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 from LedCalibrationConfig
  • deriveDefaultCounts(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 10 LedStartAnchor positions are reachable. LedRoomCanvas now renders the stand gap and places the #1 marker on the gap-adjacent LED for bottom-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 with BOTTOM_MISSING_EXCEEDS_BOTTOM; normalizeLedCalibrationConfig auto-clamps bottomMissing to bottom count and auto-heals startAnchor when its edge is zeroed out
  • Hue stream health polling migrated from setInterval to recursive setTimeout, 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: tokio 1.50.0 → 1.52.1, openssl 0.10.76 → 0.10.78
  • Frontend dependencies bumped (minor/patch): i18next 26.0.4 → 26.0.6, react-i18next 17.0.2 → 17.0.4, tailwindcss + @tailwindcss/vite 4.2.2 → 4.2.4, typescript 6.0.2 → 6.0.3, vite 8.0.8 → 8.0.9, vitest 4.1.4 → 4.1.5, happy-dom + @happy-dom/global-registrator 20.8.9 → 20.9.0
  • GitHub Actions bumped: actions/checkout 4 → 6, actions/setup-node 4 → 6, pnpm/action-setup 4 → 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=noninteractive to prevent apt-get prompts from hanging the runner
  • .gitignore now ignores .planning/ and .jules/ recursively so local planning artefacts never leak into status
  • Removed legacy .jules tracking 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 Trans mock so rich-text i18n fragments render deterministically in jsdom
  • Removed unused imports that were failing tsc --noEmit with 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 requestAnimationFrame throttling, eliminating full-editor re-renders on cursor movement
  • SettingsLayout: wrapped in React.memo to 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 0x55 header, 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_LAYERED so 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.x to 1.0.x and 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): added typecheck, verify:shell-contracts, and vitest run validation steps before build
  • CI workflow (ci.yml): added vitest run step 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 behavior
  • manualConnectFlow.test.ts: fixed auto-scan, stale selection, remembered port, and refresh throttle tests
  • useHueOnboarding.runtime.test.ts: fixed retry pipeline routing test
  • GeneralSection.test.tsx: fixed solid payload color change test
  • useRoomMapPersist.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)
  • HueChannelOverlay renders channel positions on the room map using a [-1,1] normalized coordinate system
  • HueChannelMapPanel: drag-and-drop single and multi-channel positioning, z-axis detail strip, coordinate tooltips, positions persisted via shellStore
  • Zone auto-derivation: deriveZones algorithm maps LED strip positions to Hue channel regions automatically (13 unit tests)
  • ZoneDeriveOverlay and ZoneListPanel for reviewing, renaming, and deleting derived zones; zone assignment mode in HueChannelOverlay
  • HueReadySummaryCard in Device section — shows stream state indicator, entertainment area name, and bridge IP when Hue is connected
  • update_hue_channel_positions Rust command writes edited channel positions back to the Hue bridge with save confirmation UI
  • Target-aware lighting pipeline: targets field on LightingModeConfig selects which output devices (USB / Hue) participate per mode
  • resolveDefaultTargets helper 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
  • HueTelemetryGrid component in Diagnostics tab showing live DTLS stream metrics
  • HUE_FAULT_CODES typed constant map replaces raw string matching for all DTLS fault conditions
  • FullTelemetrySnapshot type and get_full_telemetry_snapshot Tauri command for combined runtime diagnostics
  • simulate_hue_fault Rust command for fault injection during development and testing
  • copy_background_image Rust command for importing a floor-plan background into the room map
  • roomMap.ts contract: placement types, RoomMapObject discriminated union, coordinate definitions
  • UPDATE_CHANNEL_POSITIONS command and associated status codes added to hue.ts contract
  • roomMap persistence field and ROOM_MAP section ID added to shell.ts contract
  • Shell contracts verifier extended to validate room map and Hue channel position contract coverage
  • targetFailed i18n key under device.hue namespace (EN + TR)
  • Tauri dialog and fs plugins for background image import

Fixed

  • handleOutputTargetsChange no 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
  • ShutdownSignal mechanism: DTLS sender thread signals clean exit; stop_hue_stream waits up to 3 s and marks timeout on failure
  • DTLS thread death detection: get_hue_stream_status probes shutdown signal and registers a transient fault if the thread died silently while state was Running
  • HueSolidColorSnapshot exposed in get_hue_stream_status response — 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
  • ✓ Saved feedback toast (2 s) on Hue channel-to-region override save
  • SHELL_COMMANDS constant map in shell.ts contract; trayController.ts migrated to use it
  • Initial open-source contributor documentation (CONTRIBUTING.md, CODE_OF_CONDUCT.md, SECURITY.md)
  • MIT License

Changed

  • stop_with_timeout now clears persistent_sender on user-initiated stops (ModeControl, DeviceSurface) and preserves it on system-triggered stops
  • start_hue_stream guards against race condition: re-checks owner.state after async credential fetch before storing stream context
  • App.tsx polls get_hue_stream_status every 5 s when Hue is active; removes "hue" from activeOutputTargets when backend reports Failed or Idle
  • 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.md with setup, scripts, structure, and policy references

Fixed

  • DTLS thread death no longer causes silent stuck-Running state — 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_stream timeout branch was unreachable (always called with timed_out=false) — now properly triggered via ShutdownSignal
  • persistent_sender not cleared on user-initiated stop — fixed to prevent ghost connections
  • Serial port handle leak on disconnect: disconnect_session now called on LedPacketSender to release the port
  • Phantom DISCONNECT_PORT contract entry removed from device.ts (command never existed in Rust)
  • CSP in tauri.conf.json changed from null to a strict policy
  • Hue solid color not pushed on app startup when restoring a persisted solid mode
  • Cargo.toml version aligned to 1.0.2 (was 0.1.0), fixing auto-updater version detection
  • Cargo.toml author placeholder replaced with real value

[1.0.2] — 2026-03-26

Fixed

  • Release pipeline validation: aligned CI artifact naming and signature verification steps
  • reqwest dependency 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_status runtime polling with fault-aware reconnect
  • Hue solid color push via set_hue_solid_color command
  • 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/await for improved responsiveness

Fixed

  • CI: added libudev dependencies 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

Type to search. to navigate, to open.