lightctl
Extensible peripheral lighting for Linux. One CLI, one Omarchy panel (Peripheral Lighting), and in-tree devices other people (or their agents) can PR.
Ships with:
- logitech-pro2 — PRO 2 Lightspeed logo (HID++ 0x8071)
- logitech-g915-tkl — G915 TKL LIGHTSPEED keys + logo (Bolt
c545) - nzxt-kraken-elite — Kraken Elite 2023 LCD, pump, fans
- dummy —
LIGHTCTL_DUMMY=1, for tests and as the copy-paste template
No G HUB, no NZXT CAM, no network. Unofficial; not affiliated with Logitech or NZXT.
Panel
The Omarchy bar chip opens an in-widget panel. Controls follow capabilities: a mouse shows color and brightness; the Kraken also shows LCD, rotation, pump, and fans.
logitech-pro2 — PRO 2 Lightspeed logo, battery, brightness


logitech-g915-tkl — keys and logo on a Bolt receiver


nzxt-kraken-elite — LCD still/GIF, rotation, pump and fan duty


Install (Omarchy)
The bar widget is this repo. The lightctl binary is a separate build step — omarchy plugin add only copies files.
omarchy plugin add https://github.com/sshbrian/lightctl.git --enable
cd ~/.config/omarchy/plugins/io.github.sshbrian.lightctl
cargo build --release
install -m755 target/release/lightctl ~/.local/bin/lightctl
sudo rm -f /etc/udev/rules.d/99-lightctl.rules
sudo install -m644 udev/70-lightctl.rules /etc/udev/rules.d/70-lightctl.rules
sudo udevadm control --reload
sudo udevadm trigger
Unplug/replug the receivers and AIO if hidraw nodes stay 0600. Then restart the shell if the chip is missing:
omarchy plugin enable io.github.sshbrian.lightctl --section right
omarchy-shell shell rescanPlugins
Build (CLI only)
cargo build --release
install -m755 target/release/lightctl ~/.local/bin/lightctl
sudo rm -f /etc/udev/rules.d/99-lightctl.rules
sudo install -m644 udev/70-lightctl.rules /etc/udev/rules.d/70-lightctl.rules
sudo udevadm control --reload
sudo udevadm trigger
Usage
lightctl list
lightctl status
lightctl status --json
lightctl apply logitech-pro2 color '#ff0033'
lightctl apply logitech-pro2 brightness 40
lightctl apply logitech-pro2 effect breathe magenta --period 3500
lightctl apply logitech-g915-tkl color '#00e5ff'
lightctl apply nzxt-kraken-elite lcd image ~/pic.png
lightctl apply nzxt-kraken-elite rotate 90
lightctl apply nzxt-kraken-elite duty pump 40
lightctl sync '#00aaff'
lightctl restore
lightctl restore logitech-pro2
Saved lighting is in ~/.local/state/omarchy/lighting.json. The bar widget runs lightctl restore at login and again when a device reappears or a wireless mouse reports battery after sleep.
lightctl mouse … and lightctl kraken … still work as aliases. New devices only get apply <id> ….
The panel is capability-driven. A device that only implements color + brightness shows those controls and nothing else.
Add a device
See AGENTS.md (short) and docs/adding-a-device.md. Copy src/devices/dummy.rs, register one line in src/devices/mod.rs, do not touch clap or QML.
Remove
omarchy plugin remove io.github.sshbrian.lightctl
The lightctl binary and udev rule are separate (~/.local/bin/lightctl, /etc/udev/rules.d/70-lightctl.rules). The rule is named 70- so TAG+="uaccess" is applied before systemd's 73-seat-late.rules. Nodes are 0660/input (not world-writable 0666). Do not run lightctl itself as root.
sudo rm -f /etc/udev/rules.d/70-lightctl.rules /etc/udev/rules.d/99-lightctl.rules
sudo udevadm control --reload