Scoot, a MacOS Cursor Actuator

Efficiently move your mouse cursor — and click and drag, too — using only keyboard shortcuts.

Scoot is a Mac app that helps you move your mouse cursor, using keyboard shortcuts.

When I started building the first prototype, I didn’t expect it to actually work (technically or practically, but especially the latter). From an early version of the project’s README:

Scoot is experimental. Is it possible to craft a keyboard-driven mouse movement utility that’s actually efficient? Something that you’ll actually want to use? This is going to take some trial and error.

After ten months of intermittent development, I finally removed that disclaimer. Scoot is still a highly niche app, but it actually works, and has (a few) real fans that are using it every day.1

Quick backstory: I had been experiencing pain in my ulnar nerve. I was making a lot of changes to get that under control, but during the process I noticed that mouse and trackpad usage exacerbated all the symptoms. As it happens, I had recently started using the excellent avy Emacs package, and it occurred to me that those ideas could be brought to the OS level.

I couldn’t find any prior art, so I opened up Xcode and started hacking around.

Let’s take a quick tour…

Scoot provides two primary navigation modes.

In grid-based navigation mode, Scoot subdivides the screen into a grid of equally-sized cells, and assigns each a unique character sequence. Type that character sequence, and your mouse cursor immediately moves to that location.

Scoot has assigned the key sequence "pg" to the cell in the top left corner of the screen. Every cell is assigned a unique character sequence. Video demo.

If multiple displays are connected, Scoot extends the grid across each screen:

Every cell (regardless of which screen it's on) is assigned a unique character sequence.

My personal favourite, though, is the element-based navigation mode. In this mode, Scoot acts like a screen reader, finding UI elements (buttons, links, etc.) on screen, and assigning each a unique key sequence. Type the character sequence associated with a UI element, and your mouse cursor will immediately move there.

In this example, Scoot has identified the only link on the page ("More information..."), and assigned it the key sequence "aa". The buttons in the toolbar have also been assigned key sequences. Video demo.

When Scoot is active, you can also move the mouse cursor using keyboard shortcuts that you’re likely already familiar with for editing text.2 Scoot supports standard MacOS text editing shortcuts, as well as Emacs and vi keybindings. These shortcuts work regardless of which mode is active.

For example:

  • to nudge the cursor up by a partial “step”, press the key on your keyboard (equivalent to C-p with Emacs bindings, and k with vi bindings)

  • to nudge the cursor up a larger amount (a full “step”), press ⌥↑ (equivalent to M-a with Emacs bindings, and C-k with vi bindings)

  • to move the cursor to the top of the screen, press ⌘↑ (equivalent to M-< with Emacs bindings, and ⇧-k with vi bindings)

These are, of course, only a small subset of movement commands. For the full list, see the usage documentation.

In addition to cursor movement, Scoot also provides keyboard shortcuts for scrolling, left clicking, double clicking, clicking the middle and right mouse buttons, and even for holding the left mouse button down (which enables drag-and-drop, all from the comfort of your keyboard).

Scoot helps reduce my reliance on my mouse and trackpad, especially when I’m at my desk. I use a split mechanical keyboard3 with a modified Miryoku keyboard layout. Miryoku puts every key within reach without needing to move my hands – and with Scoot, I don’t need to move my hands to “actuate” the cursor either. Huge win in comfort (and efficiency).4

Current desk setup. Note the split mechanical keyboard, the trackpad on the left, and the vertical mouse on the right.

That being said, it’s important to note that Scoot is not intended to replace physical pointing devices, but rather to augment them. (Replacing hardware entirely is not possible for a variety of reasons. For example, the OS–and many apps–rely heavily on gestures, which Scoot cannot simulate,5 among other challenges.6)

And sometimes it’s just easier to grab a mouse and move it where you want it to go.

If this sounds remotely interesting, give Scoot a spin, and let me know what you think. You can download the latest release here, and refer to the documentation for installation instructions and a usage guide.

(Scoot is fully open source, and MIT licensed.)

  1. I know this only because people tell me. There’s no tracking or analytics of any kind… Scoot isn’t even allowed to access the network. 

  2. Scoot adapts existing keyboard shortcuts – intended for navigating around in a document – to instead control movement on a 2-dimensional grid. Some liberties have been taken with this mapping, but (hopefully) the results are intuitive. 

  3. Most of my mechanical keyboards support mouse emulation (thanks to QMK and ZMK firmware), but because Scoot is “context-aware”, it’s in a different league of power/efficiency/utility. 

  4. I find myself using Scoot a lot less when I’m on my laptop; trackpads these days are humungous, and easily accessible with my thumbs, even when I’m typing with both hands. 

  5. Apple doesn’t provide any APIs for simulating gestures. And to the best of my knowledge, no one has put in the reverse engineering work required to figure out how to synthesize them. If any reader is interested in tackling this challenge, gesture support would make for a lovely addition to the app. 

  6. Scoot is able to interact with most UI elements, but not all. For example, Scoot can’t dismiss system notifications.