Keymouse
Control your mouse on macOS with fast, Vim-style keyboard navigation.

Demo: toggling mouse mode, moving with H J K L, clicking, and jumping the cursor with the grid system.
Features
- Global keyboard-driven mouse control on macOS (
CGEventTap) - Menu bar app mode (no dedicated terminal required)
- Start-at-login toggle from menu bar (
LaunchAgent) - Toggleable mouse mode (configurable
toggle_key, default:F8) so normal typing is unaffected when off - Cursor movement with configurable keys (defaults:
H J K L) - Speed modifiers for movement/scroll (defaults:
Shiftfast,Option/Altslow) - Scroll control with configurable keys (defaults:
U N B M) - Left/right click from keyboard (defaults:
F/D) - Drag toggle to hold/release left mouse button (default:
V) - Recursive 3x3 jump grid with translucent overlay and depth indicator
- Configurable grid labels, theme presets, and opacity (hot-reloads while running)
- Multi-monitor aware grid targeting on the display under the cursor
- Automatic event-tap re-enable if macOS temporarily disables the tap
Installation
Option 1: Install from crates.io (recommended)
Create a macOS app bundle (recommended for Spotlight/Finder launch):
Then launch Keymouse from Spotlight or from ~/Applications/Keymouse.app.
You can still run directly from terminal:
Both paths launch Keymouse as a macOS menu bar app (KM).
Option 2: Download a prebuilt binary from GitHub Releases
Latest release:
Example (Apple Silicon / arm64):
Option 3: Build from source
Clone the repository:
Build a release binary:
The compiled binary will be available at:
Usage
1) Start Keymouse
Install a Spotlight-launchable app bundle after cargo install:
If an existing app bundle is found, Keymouse asks before replacing it.
Launch from:
- Spotlight: type
Keymouse - Finder:
~/Applications/Keymouse.app
Remove the app bundle:
Keymouse asks for confirmation before uninstalling.
Run as a managed background process:
If you built from source:
Validate your config without starting the event loop:
See all available commands anytime:
Run without menu bar UI (legacy headless mode):
Stop the managed background process:
Restart the managed background process:
2) Grant macOS permissions
Grant permissions to the app that launches Keymouse:
System Settings->Privacy & Security->AccessibilitySystem Settings->Privacy & Security->Input Monitoring
If launching from Spotlight, this is usually Keymouse.app.
If launching from terminal, this is usually Terminal/iTerm.
3) Easy access
- Keep using Spotlight (
Cmd+Space, then typeKeymouse). - Optional: in Finder, open
~/Applications, right-clickKeymouse.app, then chooseAdd to Dock. - To auto-start on login, open the menu bar item
KM->Start at Login.
4) Toggle mouse mode
- Press your configured
toggle_keyto turn mouse mode on/off (default:F8). - Or use the menu bar item:
KM->Turn Mouse Mode On/Off. - When mouse mode is off, all keys behave normally.
- When mouse mode is on, keydown/keyup events are intercepted by Keymouse.
5) Control the pointer
- Move:
H J K L(hold keys for continuous movement) - Scroll:
U N B M - Click:
F(left),D(right) - Drag:
Vto hold left mouse button,Vagain to release - Modifiers:
Shift= fast,Option/Alt= slow
6) Use jump grid mode
- Press
;(defaultgrid_key) to show the 3x3 grid on the display under the cursor. - Select cells with
Q/W/E,A/S/D,Z/X/Cto zoom recursively. - Optional alternates in grid mode:
Fmaps to middle-left,Gmaps to center. - Press
Enterto move cursor to the selected region center. - Press
Escto cancel grid mode.
Default keymap
| Key | Action |
|---|---|
F8 |
Toggle mouse mode |
H J K L |
Move cursor |
Shift + move/scroll keys |
Fast movement/scroll |
Option + move/scroll keys |
Slow movement/scroll |
U N B M |
Scroll up/down/left/right |
F |
Left click |
D |
Right click |
V |
Toggle drag (left button hold/release) |
; |
Enter grid mode |
Q/W/E/A/S/D/Z/X/C |
Select grid cell recursively |
Enter |
Confirm grid jump |
Esc |
Cancel grid mode |
Quit
Use Ctrl+C in the terminal running Keymouse.
If started with --start, stop it with:
Configuration
Keymouse loads configuration from:
~/Library/Application Support/keymouse/config.toml
If the file is missing, Keymouse uses built-in defaults. At startup, it also writes an example file to that path so you can customize bindings.
Example config.toml:
= "f1"
= "k"
= "j"
= "h"
= "l"
= "u"
= "n"
= "b"
= "m"
= ";"
= "enter"
= "f"
= "d"
= "v"
= "shift"
= "option"
= "classic"
= 1.0
= "#4fd1ff"
= ["Q", "W", "E", "A", "S", "D", "Z", "X", "C"]
Supported key names for bindings are currently:
- Letters used by default (
a b c d e f g h j k l m n q s u v w x z) ;(or"semicolon"),"enter"/"return","escape"/"esc", function keys ("f1"..."f12")- Modifiers:
"shift"and"option"/"alt"(for modifier fields)
Invalid or conflicting config values now produce startup validation errors.
Grid overlay visual options:
grid_theme:classic,midnight,ocean,forestgrid_opacity:0.0to1.0grid_color: optional accent color (#RRGGBB) for grid border/depth tintgrid_labels: exactly 9 strings (visual labels only)
Keymouse hot-reloads these grid visual options when config.toml changes.
Troubleshooting
- If Keymouse exits with an event tap error, re-check Accessibility and Input Monitoring permissions for the launching app.
- If keyboard control stops after long inactivity or heavy system load, macOS may have disabled the tap; Keymouse now attempts to re-enable it automatically.
- If
Keymouse.appasks for Rosetta on Apple Silicon, reinstall Keymouse from a native (non-Rosetta) terminal, then rerunkeymouse --install-app.
Roadmap
- Vim-style cursor movement
- Grid jump navigation
- Multi-monitor support
- Recursive grid zoom
- Custom key bindings
- Configuration file
- Homebrew installation
Contributing
Contributions, suggestions, and feature requests are welcome. Open an issue to discuss ideas, or submit a pull request with a focused change.
License
MIT. See LICENSE.