nomouse

Put the mouse down.

nomouse moves, clicks, scrolls and drags from the keys already under your fingers. System-wide on macOS, and it keeps working inside password fields.

Get the preview

Two ways to point.

Target close by? Slide over to it. Across the screen? Jump there in two keystrokes.

Free mode ⌥ tap left Option

The cursor follows HJKL, the same as a vim motion. Tap for one step. Hold and it ramps up smoothly. A soft glow around the screen edge tells you the mode is on.

Click
Space
Right / middle click
; '
Drag
hold left ⌘
Faster
hold A S or D
Slower
hold fn
Back / forward
[ ]
Yscroll ← Uscroll ↓ Iscroll ↑ Oscroll → Plock monitor [back
H← J↓ K↑ L→ ;right click 'middle
click
Press these keys and watch them go down. Tap ⌥ to drive the cursor on this page.
D picks the cell, K picks the spot inside it.

Grid mode ⌘ tap left Command

The screen splits into 25 lettered cells. One letter picks a cell, a second picks the spot inside it, so any point on screen is two keystrokes away. Then a 9 × 3 subgrid lets you nudge to the exact pixel before you click.

Click
Space
Undo a letter
delete
Other display
tap left or right ⇧
Leave
esc

When you need more.

Hint mode ⌘⇧Space

Every clickable button, link and field gets a short label, read from macOS Accessibility. Type the label to go straight to it.

Shape mode ⌘⇧D

Draws a circle, rectangle, arrow or line as a real mouse stroke, starting from the cursor. Good for whiteboards and annotations. Size and rotation are remembered, so the next one is just toggle, then Enter.

More than one display ⇧ tap

Tap left or right Shift to move the grid to the next display. In free mode, P locks the pointer to the display it's on, even when you nudge the real mouse.

Works where others go dark.

Click into a password field and macOS turns on Secure Input. Most keyboard tools stop seeing keys until you tab out again. nomouse reads keys one layer lower, at the hardware (HID) level, through a small helper that runs as root. The grid still comes up over a login sheet or a sudo prompt.

Needs Karabiner-Elements. The helper reads Karabiner's virtual keyboard rather than your physical one, so it sits after your remaps instead of fighting them.

Installer is trying to install new software.

Enter your password to allow this.

User Nameyou
Password••••••••••
CancelInstall Software
Secure Input is on. The grid still listens.

The problem, in people's own words.

Public posts describing what nomouse is built for. None of them mention nomouse; we quote them because they put it better than we would. Excerpts are verbatim, […] marks where we cut, and every card links to the original.

Keyboard tools go blind at a password prompt

zoky on Hacker News

The problem is that when secure input is enabled, you can’t trigger a macro from the keyboard, because the daemon isn’t allowed to intercept keystrokes.

tnorthcutt on Hacker News

I frequently see this with both aText and Alfred: "Secure input is enabled (by loginwindow)" (aText) & "loginwindow seems to be preventing text expansion by locking secure entry" (Alfred)... with no indication as to how to rectify the situation.

Sean1708 opened bitwarden/clients#13241 on GitHub

Bitwarden on macOS 15.3 occasionally doesn't realease Secure Keyboard Input, preventing global hotkeys from triggering for other apps.

The hotkey does not trigger and a notification is displayed saying that another app has Secure Keyboard Input enabled. […]

The reach for the mouse

srb- on Hacker News

I used to get repetitive strain in my right hand/wrist, mostly from reaching for the mouse. […] having to move your hand off the keyboard all the time is inefficient and kills flow!

abraham_s on Hacker News

It is really about avoiding distractions rather than time saved. I feel that the act of reaching for the mouse is a noticeable distraction for me.

The part that runs as root.

A helper that can read keys below Secure Input has the same shape as a keylogger. So here is everything it does, and its source code, so you don't have to take our word for it.

Read the helper's source
Open source, and short
The helper is open source under the MIT licence: about 1,000 lines of Swift you can audit in an afternoon. The nomouse app itself is not open source.
Nothing on disk
It never writes keystrokes to a file or a log.
One client only
Every connection is checked against nomouse's code signature, using the identity the kernel attaches to the socket: Apple-issued certificate, our team ID, the app's identifier. Other apps running as you are refused.
Idle means idle
While no mode is on, it passes along only modifier keys and ⌃ ⌘ fn shortcuts, which is what it needs to notice a mode being switched on. Shift and Option combinations, which type characters, arrive only as “a key was pressed”, with no key attached. Plain typing is dropped.
Two commands, no more
The app can ask it to capture keys or release them. That's all. It can't move the mouse, type keys, or run anything.
Lets go by itself
It releases the keyboard after 30 seconds without activity, or the moment the app quits or crashes.
Easy to remove
One script, scripts/uninstall.sh, removes the helper, its launch daemon, socket and log.

Check it yourself

  1. Read the source. It's MIT-licensed and short, and every claim above maps to a few lines of it.
  2. See that it's running, and under which label: sudo launchctl list | grep com.mouseless.daemon
  3. Type something in a password field, then read the helper's log. You'll find start, stop and connect lines, and no keys: sudo tail -n 40 /var/log/mouseless-daemon.log
  4. See its permission: the helper needs an Input Monitoring grant for /usr/local/bin/mouseless-daemon. It's listed under System Settings › Privacy & Security › Input Monitoring, and you can switch it off there at any time.
  5. Its only door is one socket, /var/run/mouseless.sock. Connect to it from Terminal and it hangs up on you.

Every key is yours.

All bindings live in one plain YAML file. Change a line and nomouse picks it up while it's running. If you'd rather not edit YAML, the same settings open as a local page in your browser.

config.yaml
keymaps:
- name: mac
  entries:
    toggle free mode: OptionLeft tap
    toggle overlay: CommandLeft tap
    toggle hint mode: Command+Shift+Space
    toggle shape mode: Command+Shift+D
    move left: H
    move down: J
    move up: K
    move right: L
    left mouse button: Space
    right mouse button: ;
    hold for drag: CommandLeft
    hold for speed increase: [A, S, D]

Try the preview.

nomouse is in preview. Write to us and we'll send you a build.

  • Version1.0.0-preview.4
  • SystemmacOS 13 Ventura or later
  • Also needsKarabiner-Elements
  • HelperOpen source, MIT
Ask for the preview