SteelSeries Mouse Battery Widget
Mouse battery level in the Omarchy bar.

SteelSeries only. The level is read with
rivalcfg, so ifrivalcfg --battery-levelprints a percentage for your mouse, this widget will too — and if it doesn't, nothing here will help. Logitech, Razer, and Bluetooth mice are not supported.
Install
omarchy plugin add https://github.com/FadeCap/omarchy-steelseries-battery.git
It asks before enabling, and lets you pick the bar section.
Needs rivalcfg from the AUR:
yay -S rivalcfg
That's usually all of it — the AUR package's post_install hook runs
rivalcfg --update-udev for you, and those udev rules are what let it read the
mouse as your user instead of as root.
You only need to run that yourself in two cases: you installed rivalcfg with
pip rather than from the AUR, or you upgraded rivalcfg and the rules went
stale, since the packaging hooks post_install but not post_upgrade.
sudo rivalcfg --update-udev
Missing or stale rules make the widget show a dash forever with nothing to explain why, so the bundled installer checks before it installs anything:
git clone https://github.com/FadeCap/omarchy-steelseries-battery.git
cd omarchy-steelseries-battery
./install.sh # asks which section
./install.sh --section center # or name it: left, center, right
Move it any time:
omarchy bar move io.github.fadecap.steelseries-battery --section center --after omarchy.clock
Uninstall
omarchy plugin remove io.github.fadecap.steelseries-battery
Or ./uninstall.sh, which also clears a stale bar entry if a previous removal
was interrupted. Add --purge to delete the timestamped backups each removal
leaves behind — worth it if you are cycling install and uninstall.
What it shows
| State | Bar | Tooltip |
|---|---|---|
| Normal | 60% |
Mouse battery: 60% · Discharging |
| Charging | 60% |
Mouse battery: 60% · Charging |
| Low | 15% urgent-coloured |
Mouse battery: 15% · Discharging |
| Mouse off | — dimmed |
Mouse battery: mouse is turned off |
| No dongle | — dimmed |
Mouse battery: no supported device found |
| No battery support | — dimmed |
Mouse battery: this device has no battery reporting |
Left click re-polls. On a vertical bar the label stacks, icon over number.
Going low sends one notification, once — not once per poll, not once per monitor, and not again as it keeps dropping. It re-arms when the mouse charges or climbs 5 points clear of the threshold.
Configuration
| Key | Default | Range | |
|---|---|---|---|
interval |
300 |
30–3600 | Seconds between polls |
lowThreshold |
20 |
5–50 | Percent counted as low |
notify |
true |
Send the low-battery notification | |
hideWhenAbsent |
false |
Hide rather than dim when there's no reading |
omarchy bar set io.github.fadecap.steelseries-battery interval 600
Each poll spawns rivalcfg and talks to the mouse over USB, which takes about
half a second. A mouse battery moves over days, so the 5-minute default is
already far more often than the value changes.
Troubleshooting
A dash means there's no reading — the mouse is off, the dongle is out, or the
udev rules are missing. Run rivalcfg --battery-level: whatever that prints is
all the widget has to work with, and if it errors the problem is between
rivalcfg and your mouse rather than in this plugin.
Development
Logic lives in Model.js as pure functions — no QML, no I/O — so the suite runs
without a compositor or a mouse attached:
node --test test/*.test.js
omarchy plugin validate .
test/fixtures.js holds every output shape rivalcfg produces. One earns
special mention: with the mouse switched off it prints an error and exits 0,
so state is decided from stdout and the exit code is only a tie-breaker.
Licence
MIT, see LICENSE. rivalcfg is a separate WTFPL project, called as a
subprocess and neither vendored nor linked.