Releases: serhuey/WLEDLayoutIndicator
Release list
v1.0.8 — Reliable Launch at Login & no false link warnings
What's new
- No duplicate app when enabling "Launch at login." Registering the KeepAlive LaunchAgent made launchd spawn a second copy of the running app; a single-instance guard now makes the extra copy exit cleanly.
- Unticking "Launch at login" no longer quits the app. When the visible process was the launchd-managed one,
unregister()would terminate it. The menu-bar presence is now handed off to a fresh, independent instance before unregistering. - No false warning triangle at startup. A single failed send right after launch (Wi-Fi /
.localmDNS not ready yet) used to flash the warning icon. The app now re-probes the device at +2s and +5s before showing the warning; any success clears it instantly.
Install
Apple Silicon only · ad-hoc signed · ~2 MB.
- Download
WLEDLayoutIndicator-1.0.8.dmg, open it, drag the app to Applications. - First launch: right-click the app → Open (or run
xattr -dr com.apple.quarantine /Applications/WLEDLayoutIndicator.app) to bypass Gatekeeper, since the app is not notarized.
v1.0.7 — Honest link status & quality-of-life fixes
What's new
- Menu-bar icon now tells the truth about the connection. Previously the warning triangle only appeared after a manual "Test connection" — background send failures were silently swallowed. The client now reports every delivery result, so if the WLED device goes offline you see the triangle, and it clears automatically once the 30-second keepalive gets through.
- "Add layout…" menu. Deleted a layout row in Settings? You can now add any installed keyboard layout back (with its preset colour) without resetting everything.
- "Re-detect" is no longer destructive. It adds missing layouts and re-discovers the device, but keeps your existing colours, patterns and per-layout setup intact.
- Launch at login stays in sync. If you disable the agent in System Settings → Login Items, the toggle in app Settings now reflects that instead of showing a stale value. A failed registration retries on next launch instead of silently dropping the preference.
- Stability: fixed a small memory leak when network discovery finds no device, and two task races in the WLED client that could cause duplicate sends after a layout-switch animation.
Install
Download the DMG below, drag to Applications. First launch: right-click → Open → Open (Gatekeeper bypass, one-time — build is ad-hoc signed).
Apple Silicon only.
v1.0.6 — Auto-recover from system kills
What's new
- Survives jetsam / memory-pressure kills. Previously, under heavy macOS load the menu-bar icon could silently disappear — the app got killed without warning. v1.0.6 registers the app as a per-user LaunchAgent through
SMAppService.agent. The bundled plist hasKeepAlive = { Crashed = true; SuccessfulExit = false; }, so launchd respawns the process after involuntary terminations (jetsam, ResponsivenessChecker, etc.) while still letting Cmd-Q actually quit. - Silent migration from Login Item. If you had Launch at login enabled in v1.0.5 or earlier, the new build automatically unregisters the old Login Item and registers the LaunchAgent on first run — no manual reset needed.
Install
Download the DMG below, drag to Applications. First launch: right-click → Open → Open (Gatekeeper bypass, one-time — build is ad-hoc signed).
Apple Silicon only.
v1.0.5 — Smarter animation
What's new
-
Animation only on automatic switches. The dim → bright flash now fires only when per-app layout memory restores a layout on app focus — not on manual keyboard shortcut switches. Manual switches are instant (~15 ms, single send).
-
Faster animation. Removed the all-black intermediate frame; two sequential sends (dim old → full new) instead of three. Total animation time ~30 ms vs ~45 ms previously.
Install
Download the DMG below, drag to Applications. First launch: right-click → Open → Open.
Apple Silicon only.
v1.0.4 — Flash animation on layout switch
What's new
Layout switch animation redesign. The scroll animation was visually interesting but unreliable (frame ordering over WiFi). Replaced with a dim → black → full-brightness flash:
- Old pattern dims to ~15 %
- All-black frame
- New pattern appears at full brightness
The brightness spike is processed by the peripheral visual system much more reliably than spatial motion — the goal is to catch your eye even when you're not looking directly at the device. Three sequential HTTP sends guarantee correct frame order with no race conditions (~45 ms total on local WiFi).
Install
Download the DMG below, drag the app to Applications. First launch: right-click → Open → Open (Gatekeeper bypass for ad-hoc signed builds).
Apple Silicon only.
v1.0.3 — Scroll animation, dimming fixes
What's new
-
Layout switch animation. When the keyboard layout changes, the old pattern scrolls downward off the matrix while the new pattern slides in from the top — like a film strip advancing. Intermediate frames are sent fire-and-forget for speed; the final frame is awaited to guarantee a clean end state.
-
Fullscreen video dimming — false positive fix. Previously dimmed for any video playback, including browser tabs. Now requires both a
PreventUserIdleDisplaySleepIOKit assertion and a window covering the full screen. Facebook video in a regular tab no longer triggers dimming. -
Fullscreen video dimming — faster restore. Poll interval reduced from 5 s to 2 s. The matrix now restores within ~2 s of exiting fullscreen instead of up to 5 s.
-
Heartbeat. Every 5 s the app checks whether the tracked layout matches the real TIS state and re-syncs on drift. Every 30 s it force-resends to WLED as a keepalive, recovering from device reboots and silent network drops.
Install
Download the DMG below, drag the app to Applications. First launch: right-click → Open → Open (Gatekeeper bypass for ad-hoc signed builds).
Apple Silicon only.
v1.0.2 — Heartbeat & fullscreen video dimming
What's new
-
Fullscreen video dimming. When any video player (QuickTime, VLC, IINA, Safari, Chrome, …) holds a display-sleep prevention assertion during fullscreen playback, the matrix dims to the same low level used for sleep/screensaver. Restores automatically when playback ends or the player exits fullscreen. Implemented via IOKit
IOPMCopyAssertionsStatus— no accessibility permissions needed. -
Heartbeat. Every 5 seconds the app compares the real active layout (Carbon TIS) against what it's currently tracking. If a system notification was missed — a rare but confirmed macOS quirk — the display is corrected immediately. Every 30 seconds it also force-resends the current state to WLED, so the device recovers from reboots and silent network drops without waiting for a layout switch.
-
Reliability fix. The two dimming states (sleep and video) are tracked independently so they can't interfere with each other — waking from sleep while a video was playing, or stopping a video while the screen is locked, both resolve correctly.
Install
Download the DMG below, drag the app to Applications. First launch: right-click → Open → Open to bypass Gatekeeper (ad-hoc signed, not notarized).
Apple Silicon only.
v1.0.1 — Color picker redesign
What's new
- Color picker redesign. Replaced the unusable semi-transparent overlay with a 4×4 preset palette (16 colours by hue) + system colour panel fallback for arbitrary shades. Picked colour shows a checkmark on the matching preset (or on Custom… when off-grid).
- Fill / Clear moved into a dedicated column next to the palette, aligned with the first two preset rows. Borderless
paintbrushanderasericons. - Wake-from-sleep reliability. When the screen wakes or the screensaver stops, the app now force-resends brightness + pattern, then follows up at +3 s and +10 s. Fixes "stuck dim" / "wrong layout" after sleep when the WLED device's Wi-Fi takes longer to come back than the first try.
- Menu-bar icon stays visible on empty (
.blank) patterns — inactive pixels render at 18 % alpha so the 5×5 grid is still discernible. - Round-trip precision fix for preset detection: 200/255 × 255 was truncating to 199. Selecting yellow / blue / cyan now correctly highlights the matching preset.
Install
Download the DMG below, drag the app to Applications. First launch: right-click → Open → Open to bypass Gatekeeper (the build is ad-hoc signed, not notarized).
Apple Silicon only.
v1.0
First public release.
Download
WLEDLayoutIndicator-1.0.dmg — macOS 13+, Apple Silicon, ad-hoc signed (~2 MB).
Open the DMG, drag the app into Applications. First launch: right-click → Open → Open (Gatekeeper bypass — the build is ad-hoc signed, not notarized).
What's in 1.0
- Real-time keyboard layout tracking via Carbon TIS — zero polling, zero CPU at idle
- Per-layout colour + 5×5 pattern, configurable in Settings
- Matrix rotation (0°/90°/180°/270°)
- mDNS auto-discovery of WLED devices, manual host fallback
- Per-app layout memory (opt-in) — remembers and restores layout per foreground app
- Menu-bar icon mirrors the actual 5×5 WLED pattern in colour
- Sleep/screensaver dimming, restored on wake
- Launch at login via
SMAppService
Tested with M5Stack Atom Matrix (5×5 SK6812). See README for flashing guide and full setup.