Errm... Akeyshually, this is an evdev-based userspace daemon configured in TOML that intercepts raw input events, performs stateful modifier tracking, and executes arbitrary shell commands through a fire-and-forget subprocess model regardless of session type or graphical environment manager
Every shortcuts manager is coupled to your display server (X11 vs Wayland ), your window manager (sway vs Hyprland vs i3), and your current machine.
I made akeyshually to not only have my configs in a single git tracked file, but to work anywhere I want.
- Works on X11, Wayland, literally any WM/DE via evdev
- All settings declared in a single TOML config
- Actually lightweight takes about ~3MB binary, <3MB RAM, 0% CPU when idle
- Configs are hot-reloaded on edit
- Special modes like
.whileheld,.toggle,.switch,.onrelease - You can literally make an auto-clicker with a single line
- Works alongside remappers (keyd, kanata, kmonad, xremap...)
curl -sSL https://raw.githubusercontent.com/DeprecatedLuar/akeyshually/main/install.sh | bashOther Install Methods
Manual Install
# Build from source
git clone https://github.com/DeprecatedLuar/akeyshually.git
cd akeyshually
go build -ldflags="-s -w" -o akeyshually ./cmd
# Install to ~/.local/bin
./other/install-local.sh
# Or install system-wide
sudo cp akeyshually /usr/local/bin/Prerequisites:
- Go 1.21+ (for building)
- User must be in
inputgroup:sudo usermod -aG input $USER # Logout and login for group change to take effect
First run auto-generates config files in ~/.config/akeyshually/. Just run akeyshually and you're good.
| Command | Description |
|---|---|
| start | Daemonize in background |
| stop | Stop daemon (via pidfile or systemctl) |
| update | Check for and install updates |
| version | Show version |
| --help | Show help |
Note
akeyshually with no args runs in foreground
Config lives at ~/.config/akeyshually/:
config.toml- All-in-one config (settings, shortcuts, command aliases)akeyshually.service- Systemd service file (with install instructions)
Configuration Example
# ~/.config/akeyshually/config.toml
[settings]
default_loop_interval = 100 # Milliseconds for .whileheld/.toggle behaviors
disable_media_keys = false # Forward media keys to system (GNOME/KDE daemons)
#shell = "/bin/bash" # Optional: override $SHELL
#env_file = "~/.profile" # Optional: source before commands
[shortcuts]
"super+k" = "edit_config"
#-[LAUNCHERS]--------------------------------
"super.onrelease" = "rofi" # Modifier tap (executes on release if pressed alone)
"super+b" = "browser"
"super+shift+b" = "browser2"
"super+return" = "kitty"
"super+f" = "dolphin"
"super+x" = "xkill"
"super+e" = "email"
"super+v" = "copyq toggle"
"super+w" = "whatsapp"
"shift+super+n" = "notetaker"
#-[UTILS]------------------------------------
"print" = "prtscr"
"super+p" = "prtscr"
"shift+print" = "/home/user/Workspace/tools/bin/screenshot-save"
"ctrl+print" = "bash -c \"xdg-open ~/Media/Pictures/temp.png\""
"ctrl+mute" = "mute_mic"
# Advanced behaviors
"f9.whileheld(50)" = "xdotool click 1" # Auto-clicker: clicks every 50ms while held
"f10.toggle" = "xdotool click 1" # Toggle: starts/stops loop on each press
"super+tab.switch" = ["window1", "window2", "window3"] # Cycle through commands
# Media keys - uncomment to enable
#"volumeup" = "volume_up"
#"volumedown" = "volume_down"
#"mute" = "mute_toggle"
[command_variables]
edit_config = "kitty micro ~/.config/akeyshually/config.toml"
browser = "brave-browser --user-data-dir=/home/user/.config/BraveSoftware/1"
browser2 = "brave-browser --user-data-dir=/home/user/.config/BraveSoftware/2"
rofi = "~/.config/rofi/scripts/launcher_t7"
email = "flatpak run org.mozilla.Thunderbird"
mute_mic = "pactl set-source-mute @DEFAULT_SOURCE@ toggle"
whatsapp = "flatpak run com.rtosta.zapzap"
notetaker = "bash -c \"source ~/.bashrc && /home/user/.config/bash/bin/notetaker/notetaker\""
prtscr = "/home/user/Workspace/tools/bin/screenshot-save --temp"
# Media key commands (uncomment shortcuts above to use)
volume_up = "pactl set-sink-volume @DEFAULT_SINK@ +5%"
volume_down = "pactl set-sink-volume @DEFAULT_SINK@ -5%"
mute_toggle = "pactl set-sink-mute @DEFAULT_SINK@ toggle"Shortcut Behaviors
Normal (default):
"super+t" = "kitty" # Executes on key pressWhile Held (repeat while key is held):
"f9.whileheld" = "xdotool click 1" # Uses default_loop_interval
"f9.whileheld(0.05)" = "xdotool click 1" # Custom interval (50ms)
"f9.whileheld(0.015)" = "xdotool click" # Sub-second intervals (15ms)
"f9.loop(50)" = "xdotool click 1" # Alias for .whileheldToggle (start/stop on each press):
"f10.toggle" = "xdotool click 1" # Loop continues after release
"f10.toggle(0.1)" = "xdotool click 1" # Custom interval in secondsSwitch (cycle through commands):
"super+tab.switch" = ["cmd1", "cmd2", "cmd3"] # Cycles on each pressRelease timing:
"super.onrelease" = "rofi" # Modifier tap: executes on release if pressed alone
"super+t.onrelease" = "cmd" # Executes when keys are releasedAvailable Key Names
Modifiers: super, ctrl, alt, shift
Letters: a-z
Numbers: 0-9
Special keys: return/enter, space, tab, esc/escape, backspace, print/printscreen, delete, insert, home, end, pageup, pagedown
Arrows: left, right, up, down
Function keys: f1-f12
Media keys: Enabled via enable_media_keys = true in config.toml (see media-keys.toml for defaults)
Troubleshooting
"Permission denied" error:
groups | grep input # Verify you're in input group
# If not there:
sudo usermod -aG input $USER
# Then logout and login"No keyboards detected":
ls -l /dev/input/by-id/*kbd* # Check devices exist
cat /dev/input/event* | head -c 1 # Test evdev accessShortcut not triggering:
- Keys must be lowercase in config (
super+tnotSuper+T) - Verify command works:
sh -c "your-command" - Check logs if running as systemd service:
journalctl --user -u akeyshually
Enable debug logging:
LOGGING=1 akeyshually


