A Decky Loader plugin that drives the Steam Machine's front light bar.
Valve exposes the bar as 17 standard Linux multicolor LED class devices, so this writes RGB values straight to sysfs — no reverse engineering, no daemon, no dependencies.
The plugin adds a single Display control with three options.
Any of eight motions combined with any color set.
Motions: Scroll Right, Scroll Left, Outward Pulse, Inward Pulse, Bounce, Crossfade, Breathe, Scanner.
Colors: eleven presets (Aurora, Candy, Deep Sea, Ember, Forest, Miami, Orchid, Sunset, Toxic, Ultraviolet), a generated Rainbow with adjustable hue spread, or Custom with 2–6 colors of your own.
Speed and blend are adjustable, plus per-motion controls where they apply — tail length for Scanner, minimum brightness for Breathe.
A fixed picture on the bar: a solid color, any color preset held still, or one of 27 flags — including a HAL 9000 eye at the end of the list.
A toggle. When on, launching one of 21 supported games takes over the bar with that game's colors, and quitting restores whatever you had. Anything else leaves your display alone.
Supported: Balatro, Blue Prince, Clair Obscur: Expedition 33, Counter-Strike 2, Cyberpunk 2077, Deadlock, Elden Ring, Forza Horizon 6, GTA V, Half-Life, Half-Life 2, Hollow Knight, Hollow Knight: Silksong, Neon White, Portal, Portal 2, Red Dead Redemption, Red Dead Redemption 2, Stardew Valley, Subnautica, Team Fortress 2.
Download SteamLED.zip from
Releases, then either use
Decky's Settings → Developer → Install Plugin from URL, or:
sudo unzip SteamLED.zip -d ~/homebrew/plugins/
sudo systemctl restart plugin_loaderNeeds Node 18+ and pnpm 9. SteamOS has a read-only root filesystem, so install
Node with nvm rather than pacman — it lives in
~/.nvm and survives system updates.
./install-local.sh # nvm + Node + build + install into Decky
./package.sh # build a distributable out/SteamLED.zipinstall-local.sh handles the whole toolchain on the Steam Machine itself.
Both scripts run the backend tests before building.
The engine lives in py_modules/ and works standalone:
sudo python3 run.py --list
sudo python3 run.py animated --preset miami --motion scroll_left
sudo python3 run.py static --mode flag --flag usCtrl-C restores whatever the bar was showing.
- Brightness belongs to Steam. The plugin never writes the master brightness attribute, so the native light bar brightness slider keeps working.
- The bar is handed back cleanly. Its state is snapshotted on start and restored on stop, so disabling the plugin returns control to Steam.
- Idle costs nothing. Redundant writes are skipped, and static displays repaint only when something changes.
- It resumes on boot, waiting for the LED devices if they aren't registered yet.
test_engine.py fakes the whole sysfs tree in a temp directory, so the backend
can be tested on any Linux machine without Steam Machine hardware:
python3 test_engine.pyFlags, game palettes and color presets are plain data — one dict entry each in
flags.py, games.py and scroll.py, and they appear in the UI
automatically. Effects declare their own parameters, so adding a motion needs
no frontend changes.
BSD-3-Clause.