🎉 New LedFx Binaries Available!
| Variant | Description | Best For |
|---|---|---|
| Core | Browser-based server | Headless setups, remote access, Raspberry Pi |
| CC | Desktop app (Core + UI) | Desktop users, integrated experience |
| Client | Frontend only (needs Core) | deprecated - use CC instead |
⭐ CC Features (Core + Client + extra love):
Expand
🖥️ Integrated Experience
- Everything in one window - no browser juggling, just open the app and go
⚙️ System Integration
- System tray - minimize to tray, quick access menu with shortcuts
- Multi-instance - manage multiple LedFx servers from one interface
🎵 macOS Audio Helpers
- Custom BlackHole installer - one-click audio driver setup, no Terminal needed
- Device toggle - enable/disable audio devices without Audio MIDI Setup
- Volume control - adjust output volume directly in LedFx settings
- Auto-configuration - handles audio routing automatically
🔒 Local SSL Made Easy
- One-click HTTPS - self-signed cert generation and installation
- ledfx.local domain - auto-edits hosts file for clean URLs
- Secure local networking - HTTPS for accessing from other devices
- Cross-platform - works on Windows, macOS, and Linux
🎼 Song Detector Integration
Automatic track info from Spotify, YouTube Music, etc:
Song Detector (basic):
- Artist & title → LED matrix text display
- Album artwork → LED matrix image visualization
- Color extraction → auto-generate gradients for your virtuals (effect keeps running)
Song Detector Plus (advanced):
- Everything above, plus:
- Real-time playback position & duration
- Built-in player controls
- Song Triggers - auto-apply specific scenes when certain songs play
All managed from CC settings - download, install, auto-start configuration built-in.
info: on mac we are using a custom Adapter of media-control
Frontend-Changes:
Backend Changes
Expand
- chore(deps): update getsentry/action-release action to v3.7.2 (#2119)
- chore(deps): update ledfx/.github digest to 3eb9a4a (#2118)
- chore(deps): update oasdiff/oasdiff-action action to v0.1.19 (#2116)
- chore(deps): update getsentry/action-release action to v3.7.1 (#2115)
- chore(deps): update dependency certifi to v2026.10.18 [security] (#2114)
- chore(deps): update actions/upload-artifact action to v7.0.2 (#2111)
- chore(deps): update actions/download-artifact action to v8.0.2 (#2110)
- chore(deps): update dependency pyrefly to v1.3.2 (#2098)
- ci(lint-notify): treat a run without a lint job as not failed (#2101)
- chore(deps): update @scalar/api-reference to v1.72.4 (#2097)
- feat(hue): stream through native ledfx-senders and drop python-mbedtls (#2077)
- feat(websocket): acknowledge event subscription installation (#2079)
- chore(deps): update dependency aiohttp to v3.14.4 [security] (#2099)
- fix(lifx): log offline-device timeouts without a traceback (#2096)
- feat: add silence scene functionality (#2088)
- fix: lifx matrix test port pr2086 (#2095)
- test(lifx): bind the LIFX emulator to an OS-assigned port (#2086)
- fix(sendspin): schedule audio in the client's clock domain (#2093)
- chore(deps): lock file maintenance (#2092)
- chore(deps): update astral-sh/setup-uv action to v10.2.0 (#2091)
- chore(deps): update dependency ruff to v0.16.9 (#2090)
- chore(deps): update dependency actionlint-py to v1.7.12.25 (#2089)
- fix(lifx): run the Mirror's back ring in the same direction as the front (#2085)
- fix: Make User audio selection sticky in fallback scenarios (#2087)
- fix(devices): give new matrix devices a 2D virtual (#2084)
- chore(deps): update ledfx/release-ci action to v0.4.2 (#2083)
- chore(deps): update dependency multidict to v6.9.1 [security] (#2082)
- chore(deps): update ledfx/.github digest to 0e36d94 (#2081)
- refactor(devices): remove obsolete packet wrappers and UDP base (#2078)
- test(lifx): cover LIFX Mirror detection, ring virtuals and scatter (#2076)
- fix(virtuals): clear a removed virtual before destroying it (#2075)
- feat(lifx): add support for LIFX Mirror (#1854)
- fix: isolate PyPI upload sidecars from verified distributions (#2074)
- feat: integrate native LED senders and simplify render pipelines (#2071)
- ci: consume shared release-ci 0.3.0 from pyproject (#2073)
- chore(deps): lock file maintenance (#2072)
- ci: verify and attest releases with recoverable Discord notifications (#2070)
- fix(websocket): release listeners when subscription IDs are reused (#2065)
- fix(effects): close Clone screen captures on teardown (#2064)
- fix(devices): release configuration locks before virtual callbacks (#2066)
- docs: document and support maintenance patch releases (#2069)
- fix: aoisendspin to unpaired mode (#2063)
- fix(api): route scenes, presets and Home Assistant through the virtuals manager (#2055)
- refactor(virtuals): make the virtuals manager strict and keep v1's leniency in v1 (#2048)
- feat(api-v2): serve virtuals through a shared manager (#2042)
- test(api-v2): hold every v2 route to its contract (#2038)
- test: make the live LedFx tests reliable and twice as fast (#2029)
- fix(installer): close a running LedFx before upgrading and harden the installer (#2020)
- feat(api-v2): serve an offline API reference at /api/v2/docs (#2027)
- feat(api-v2): generate, serve and check an OpenAPI 3.1 spec (#2024)
- feat(api-v2): serve typed /api/v2 routes with Problem errors (#2023)
- feat(api): lay the API v2 foundations (#2022)
- fix(e131): let each sACN sender use its own source port (#2015)
- fix(virtuals): clear an effect that is no longer registered (#2018)
- fix: keep devices and transitions working after a pixel count change (#2017)
- fix(mdns): close the zeroconf instance after each device scan (#2016)
- fix(websocket): accept the frontend's Web Audio sample list (#2014)
- fix(mqtt_hass): publish the colour of the effect that changed (#2013)
- fix(qlc): reconnect reliably and close the websocket session (#2010)
- fix(websocket): block virtual_update subscriptions (#2012)
- fix: stop expected conditions reaching Sentry as errors (#2011)
- fix: follow-ups from the stack #1974 review (#2007)
- ci: run only the jobs a pull request's changes need (#2008)
- chore(deps): update pre-commit hook facebook/pyrefly-pre-commit to v1.3.1 (#2009)
- chore(deps): update dependency pyrefly to v1.3.1 (#2006)
- fix(api)!: remove two broken v1 routes; correct the v1 docs (#1998)
- fix(api): Spotify trigger edit, integration names, active state on update (#1997)
- fix(api): keep blocking network calls off the event loop (#1996)
- fix(api): schedule power stops and delayed scene activations, with caps (#1995)
- fix(api): virtual tools run only what they implement, with validated input (#1994)
- fix(api): built-in presets and colors are read-only; no false success (#1993)
- fix(api): small v1 fixes: device not-found message, one PlaylistManager (#1992)
- refactor(config): read audio and melbank config as typed, frozen models (#1990)
- refactor(schema): serve pydantic's static JSON Schema; instance choices by marker (#1988)
- fix(api): answer bad input with a validation error or a clear reason (#1986)
- refactor(config): remove voluptuous and transitional config shims (#1984)
- refactor(config): typed Config for effects m-z (#1983)
- refactor(config): typed Config for effect bases and effects a-l (#1982)
- refactor(config): typed Config for devices and integrations (#1981)
- feat(config): validate plugin configs with pydantic models (#1980)
- feat(config): typed core config with lenient loading (#1979)
- feat(config): typed field types and JSON Schema export (#1978)
- feat(config): add a versioned, crash-safe ConfigStore (#1977)
- fix: harden device lifecycle and render loop; remove no-op dev auto-reload (#1973)
- fix: resolve fourteen more runtime bugs exposed by strict typing (#1972)
- fix: resolve ten runtime bugs exposed by strict typing (#1971)
- fix: resolve Sendspin typing and client API errors (#1970)
- chore: add strict Pyrefly checking with a baseline ratchet (#1969)
- chore(deps): update docker/setup-buildx-action action to v4.4.1 (#2004)
- ci: re-check the PR title on every edit so the required check cannot be skipped (#2002)