Ramblings of an aging IT geek
← Ramblings of an aging IT geek
linux

A Tray Icon, and a Migration on Hold

keylightd gains a cross-platform system-tray app via Wails, and an honest account of the Wails v3 migration that's parked waiting on an upstream bug.

Listen to this post
Two rectangular LED panel key lights lighting a desk either side of a monitor

Not everyone lives in GNOME, and not everyone wants a shell extension. So keylightd now has a system-tray app: a small Wails desktop application, on Linux and Windows alike, that puts your lights one click away in the system tray.

keylightd already finds every Elgato Key Light on your network over mDNS; the tray app is the friendly face on top of that. The icon toggles the lights on and off, and clicking through opens a little window with brightness and colour-temperature sliders, either for an individual light or for a whole group, plus the option to hide the ones you never reach for. It's a thin client over the daemon's API, mostly icons and a status loop, so it stays in sync no matter where the change came from: this window, the CLI, the GNOME extension or a script hitting the socket.

And of course it's themed. The window is plain CSS with hot reload, and tinct has an output plugin for it, so when I regenerate my palette the tray restyles itself to match the rest of the desktop, no restart. Tiny, but it makes me happy.

That's the good news. Here's the honest part, because I'd rather write it down than pretend.

I tried to move the tray app to Wails v3, which has a much nicer native systray story and cleaner bindings, and the migration is code-complete but on hold. Wails v3 is still in alpha, and the build segfaults during GTK initialisation on Linux (a SIGSEGV in the alpha's GTK path, not in keylightd's code). I could paper over it, but a tray app that crashes on launch for half my users isn't a release; it's a liability. So the v3 branch sits there, finished and pinned, waiting for Wails v3 to go stable, and the shipping tray app stays on v2 where it actually works.

This is the unglamorous reality of building on a fast-moving toolkit: sometimes the right move is to do the work, watch it break on something upstream, and then not ship it. The branch isn't abandoned; it's parked, with a note to revisit when the segfault is fixed. Meanwhile the v2 tray, the GNOME extension, the CLI and the API all drive the same daemon, so nobody's actually waiting on it.

Repo and docs on GitHub.