2026-08-06 16:29:06 +00:00
2026-08-06 16:29:06 +00:00
2026-08-06 16:28:30 +00:00

rsi-clicker

Scroll wheel up starts spamming left click. Scroll wheel down stops it.

Clicks are injected through /dev/uinput, so they enter the kernel input stack at the same layer as your real mouse. That's why this works under KWin/Wayland and inside Proton, where xdotool, xbindkeys and AutoKey do nothing at all.

Setup

sudo pacman -S python-evdev
install -Dm755 rsi-clicker.py ~/.local/bin/rsi-clicker
rsi-clicker --doctor

--doctor checks every requirement and prints the exact command to fix anything that's missing. Work down its list until everything reads [ok]. For reference, the full set is:

# 1. uinput at boot
echo uinput | sudo tee /etc/modules-load.d/uinput.conf
sudo modprobe uinput

# 2. let your user write to it
echo 'KERNEL=="uinput", GROUP="input", MODE="0660", OPTIONS+="static_node=uinput"' \
  | sudo tee /etc/udev/rules.d/99-uinput.rules
sudo udevadm control --reload-rules && sudo udevadm trigger

# 3. let your user read real input devices
sudo usermod -aG input $USER

Then log out and back in — group membership only applies to new sessions. No root needed after that.

Run it

rsi-clicker

That's the whole thing. Wheel up, it clicks. Wheel down, it stops. It prints ▶ clicking / ■ stopped so you can see the state at a glance.

The one real gotcha: weapon swap

Darktide binds the scroll wheel to weapon swap by default. So out of the box, wheel-up will start the clicker and swap your weapon. Two ways to deal with it — pick one.

Settings → Controls, and set weapon swap to 1 / 2 / 3 instead of the wheel. Most players do this anyway because slot-select is faster than cycling. Nothing else needed; run rsi-clicker plain.

Option B — swallow the wheel entirely

rsi-clicker --swallow-wheel

This takes an exclusive kernel grab on your mouse and re-emits everything — motion, all buttons, side buttons — through the virtual device, minus the wheel events. The game (and everything else) simply never sees a scroll.

Worth knowing before you use it:

  • Scrolling stops working everywhere while it runs, not just in Darktide. That includes your browser on the other monitor. Use it for a gaming session, not as a login service.
  • If the process dies for any reason — crash, kill -9, power of the universe — the kernel releases the grab automatically when the file descriptor closes. Your mouse cannot get stuck. Ctrl+C also releases it cleanly and prints mouse released.

Options

Flag Does
--doctor Check setup, print fixes, exit. Start here.
--list Show input devices and which is your mouse.
--button left|right|middle Which button to spam. Default left.
--cps N Clicks per second. Default 11.
--jitter 0-1 Timing variance so the cadence isn't metronomic. Default 0.12.
--hold-ms N How long each click is held. Default 25. Raise to 40 if the game misses clicks.
--swallow-wheel Option B above.
--max-duration N Auto-stop after N seconds of continuous clicking.
--panic KEY Instantly quit. Default KEY_F12.
--device PATH Force a specific mouse if auto-detect picks wrong.
-v Extra detail on startup.

Tuning for Darktide

  • 11 cps is about the ceiling of sustained human clicking and feels natural. Higher doesn't help — most weapons have an internal fire-rate cap and extra clicks are just discarded.
  • If clicks get eaten, --hold-ms 40. A 25 ms press can land entirely between two frames when framerate dips, and on the 258V's integrated Arc graphics you'll see dips in heavy hordes.
  • --max-duration 45 is a good safety net — if you alt-tab or die while it's running, it stops on its own instead of clicking into your desktop.

Autostart for gaming sessions

mkdir -p ~/.config/systemd/user
printf '%s\n' \
  '[Unit]' 'Description=rsi-clicker' \
  '[Service]' 'ExecStart=%h/.local/bin/rsi-clicker --cps 11' \
  'Restart=on-failure' \
  '[Install]' 'WantedBy=default.target' \
  > ~/.config/systemd/user/rsi-clicker.service
systemctl --user daemon-reload
systemctl --user start rsi-clicker

systemctl --user stop rsi-clicker when you're done. I'd avoid enable --now if you're using --swallow-wheel, for the reason above.

Troubleshooting

Permission denied / --list shows nothing — run --doctor. Almost always the input group without a re-login. Check with groups | grep input.

Wheel-up does nothing--list and confirm the device marked MOUSE, wheel is really your mouse; pass --device /dev/input/eventN if auto-detect grabbed a touchpad or a receiver's phantom interface.

Clicks work on desktop but not in-game--hold-ms 40, and make sure the game window has focus.

Freespin wheel triggers erratically — the script auto-detects high-res wheels and accumulates to 120 units per detent, but a fully free-spinning wheel (MX Master style) will fire multiple detents per flick. Switch the wheel to ratcheted mode.

Worth repeating

Fatshark's terms prohibit input automation. It's PvE so you're not affecting anyone else's run, and kernel-level injection looks like ordinary hardware input — but that's a risk you're choosing, not a free one. A mouse with onboard macro firmware does the same job with nothing running at all.

And if your hand actually hurts rather than just getting tired, the autoclicker is treating a symptom. Worth having someone look at it.

Description
No description provided
Readme 25 KiB
Languages
Python 100%