2026-03-25 18:56:28 +00:00
2026-03-25 09:32:22 +00:00
2026-03-25 09:32:22 +00:00
2026-03-25 09:32:22 +00:00
2026-03-25 09:32:22 +00:00
2026-03-25 09:32:22 +00:00
2026-03-25 09:32:22 +00:00
2026-03-25 09:32:22 +00:00
2026-03-25 09:32:22 +00:00
2026-03-24 16:51:23 +00:00
2026-03-25 09:32:22 +00:00
2026-03-24 16:51:23 +00:00
2026-03-25 09:32:22 +00:00
2026-03-25 09:32:22 +00:00
2026-03-25 09:32:22 +00:00
2026-03-25 09:32:22 +00:00
2026-03-25 09:32:22 +00:00
2026-03-25 09:32:22 +00:00
2026-03-25 09:32:22 +00:00

gotta-scroll-fast

Host-side scroll acceleration toolkit for Linux/Wayland.

This project is a fork/reimplementation inspired by maccel, but it is a separate tool focused on scroll acceleration.

credit and licensing

components

  • gsf - parameter CLI + TUI
  • gsfd - evdev -> uinput scroll acceleration daemon
    • applies acceleration curves to wheel/hwheel (including hi-res wheel events)
    • suppresses low-res wheel duplicates when hi-res events are present in the same frame

development

nix develop
cargo build

quick start (functional)

  1. List devices:
cargo run -p gsf-daemon -- --list-devices
  1. Pick your trackball device and run dry-run first:
cargo run -p gsf-daemon -- --device /dev/input/eventX --dry-run
  1. Tune parameters (separate terminal):
cargo run -p gsf-cli -- set mode natural
cargo run -p gsf-cli -- set param sens-mult 1.0
cargo run -p gsf-cli -- set param decay-rate 0.1
cargo run -p gsf-cli -- set param limit 1.5

or launch TUI:

cargo run -p gsf-cli -- tui
  1. Run live daemon:
cargo run -p gsf-daemon -- --device /dev/input/eventX

Tip: auto-pick by name substring:

cargo run -p gsf-daemon -- --match-name ploopy

config + state paths

Default config path:

  • ~/.config/gsf/config.json
  • override with GSF_CONFIG_PATH

Default speed stats path:

  • $XDG_RUNTIME_DIR/gsf-speed.txt (if available)
  • fallback /tmp/gsf-speed.txt
  • override with GSF_STATS_PATH

runtime requirements

  • Linux with evdev/uinput
  • /dev/uinput available
  • permissions to read source event device and write uinput

For NixOS notes, see DEV_SETUP.md.

nixos module

This flake now exports:

  • packages.<system>.default (contains gsf + gsfd)
  • nixosModules.default (hardware.gsf)

Example:

# flake input
inputs.gsf.url = "github:<you>/gotta-scroll-fast";

# module import + config
{
  imports = [ inputs.gsf.nixosModules.default ];

  hardware.gsf = {
    enable = true;
    device = "/dev/input/by-id/usb-...-event-mouse";
    inputGroupUsers = [ "thomasgl" ];
    # extraArgs = [ "--match-name" "ploopy" ];
  };
}

hardware.gsf intentionally does not provide declarative accel parameters. Manage those via your dotfiles (~/.config/gsf/config.json) and gsf CLI/TUI.

systemd user service (manual alternative)

A starting unit file exists at:

  • packaging/systemd/user/gsfd.service

Copy to ~/.config/systemd/user/gsfd.service, adjust device selection args, then:

systemctl --user daemon-reload
systemctl --user enable --now gsfd
S
Description
No description provided
Readme GPL-2.0 1.4 MiB
Languages
Rust 49.1%
C 32.7%
Nix 7.6%
Shell 4.6%
Astro 3.7%
Other 2.3%