No description
  • Rust 49.1%
  • C 32.7%
  • Nix 7.6%
  • Shell 4.6%
  • Astro 3.7%
  • Other 2.3%
Find a file
Thomas G. Lopes 3bccad3870
Some checks failed
Tests / test_core_function (push) Failing after 13s
move gsfd restart resilience defaults into hardware.gsf module
2026-03-25 18:56:28 +00:00
.github/workflows import upstream maccel baseline 2026-03-25 09:32:22 +00:00
bench import upstream maccel baseline 2026-03-25 09:32:22 +00:00
cli import upstream maccel baseline 2026-03-25 09:32:22 +00:00
crates/core use per-user runtime stats path for reliable gsfd+tui updates 2026-03-25 16:01:19 +00:00
daemon use per-user runtime stats path for reliable gsfd+tui updates 2026-03-25 16:01:19 +00:00
driver import upstream maccel baseline 2026-03-25 09:32:22 +00:00
nix move gsfd restart resilience defaults into hardware.gsf module 2026-03-25 18:56:28 +00:00
packaging/systemd/user add host-side daemon and config-backed parameter store 2026-03-24 16:51:27 +00:00
site import upstream maccel baseline 2026-03-25 09:32:22 +00:00
tui import upstream maccel baseline 2026-03-25 09:32:22 +00:00
udev_rules import upstream maccel baseline 2026-03-25 09:32:22 +00:00
.gitignore import upstream maccel baseline 2026-03-25 09:32:22 +00:00
AGENTS.md import upstream maccel baseline 2026-03-25 09:32:22 +00:00
Cargo.lock import upstream maccel baseline 2026-03-25 09:32:22 +00:00
Cargo.toml rename user-facing commands and crates to gsf 2026-03-24 16:51:32 +00:00
CONTRIBUTING.md import upstream maccel baseline 2026-03-25 09:32:22 +00:00
DEV_SETUP.md add nix dev shell and setup notes 2026-03-24 16:51:23 +00:00
dkms.conf import upstream maccel baseline 2026-03-25 09:32:22 +00:00
flake.lock add nix dev shell and setup notes 2026-03-24 16:51:23 +00:00
flake.nix export gsf package and hardware.gsf nixos module 2026-03-25 13:02:21 +00:00
install.sh import upstream maccel baseline 2026-03-25 09:32:22 +00:00
LICENSE import upstream maccel baseline 2026-03-25 09:32:22 +00:00
maccel.install import upstream maccel baseline 2026-03-25 09:32:22 +00:00
maccel.sysusers import upstream maccel baseline 2026-03-25 09:32:22 +00:00
Makefile import upstream maccel baseline 2026-03-25 09:32:22 +00:00
module.nix import upstream maccel baseline 2026-03-25 09:32:22 +00:00
NOTICE.md rename user-facing commands and crates to gsf 2026-03-24 16:51:32 +00:00
PKGBUILD import upstream maccel baseline 2026-03-25 09:32:22 +00:00
README.md use per-user runtime stats path for reliable gsfd+tui updates 2026-03-25 16:01:19 +00:00
README_NIXOS.md import upstream maccel baseline 2026-03-25 09:32:22 +00:00
uninstall.sh import upstream maccel baseline 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