Home

Awesome

Scoot

Meet Scoot, your friendly cursor teleportation and actuation tool.

Scoot helps you efficiently move your mouse cursor, using keyboard shortcuts!

For updates, follow @mjrusso on Twitter.

<img src="https://github.com/mjrusso/scoot/actions/workflows/main_test.yml/badge.svg" alt="build status"></a>

<p align="center"> <img src="./Assets/card.png" alt="Scoot, MacOS Cursor Actuator" /> </p>
<img align="right" width="128" alt="Scoot App Icon" src="./Scoot/Assets.xcassets/AppIcon.appiconset/512.png" />

Scoot is a tiny utility app that provides fast, keyboard-driven control over the mouse pointer. Scoot lets you move your mouse—and click and drag, too—all from the comfort of your keyboard.

Scoot supports two primary navigation modes: element-based, and grid-based.

<p align="center"> <img src="./Assets/Examples/element-nav.png" alt="Scoot using the element-based navigation mode" /> </p> <p align="center"> <img src="./Assets/Examples/grid-nav.png" alt="Scoot using the grid-based navigation mode" /> </p>

Each location is identified by a unique character sequence, making each element (or cell) uniquely addressable with the keyboard — simply type the associated key sequence to teleport your mouse cursor to that location.

Scoot also supports moving the mouse cursor using text editing keyboard shortcuts that you're likely already familiar with (specifically, those for moving the insertion point). Scoot supports standard MacOS text editing shortcuts, as well as Emacs and vi keybindings. For a full breakdown, see the usage documentation.

There's also a supplementary usage mode:

Freestyle mode is particularly handy for those cases where you want to quickly nudge the cursor using the (re-purposed) text editing keyboard shortcuts, and would prefer to not have the grid or element-based views on screen.

About

Usage

To activate Scoot in the element-based navigation mode, use the ⇧⌘J global keyboard shortcut. Alternatively, to activate Scoot in the grid-based navigation mode, use the ⇧⌘K global keyboard shortcut. And for freestyle mode, use the ⇧⌘L global keyboard shortcut. (These shortcuts can be customized.)

As long as Scoot is running, any of these hotkeys will bring the app to the foreground, and activate the requested mode.

When Scoot is in the foreground:

After clicking, any overlaid UI elements (such as the element view, or the grid) will automatically hide. You can also hide these UI elements (and send Scoot to the background) at any time by pressing ⌘H.

Scoot includes a menu bar icon (an illustration of a Vespa-inspired scooter).

<img align="right" width="256" alt="Scoot Menu Bar Icon" src="./Assets/menu-bar-icon.png" />

Scoot is fully compatible with Spaces (and can be used in conjunction with apps that are running in native fullscreen mode).

Scoot also works on systems with multiple connected displays.

<p align="center"> <img src="./Assets/Examples/grid-multiple-displays.jpg" alt="Using Scoot with multiple connected displays" /> </p>

If you use multiple displays, and experience an issue with Scoot's windows drawing in an incorrect location when the app launches (e.g. all Scoot windows appearing on the same display), please post your findings in this issue, and note the value of your “Displays have separate Spaces” checkbox in Mission Control. If you do happen to find yourself in this state, you should be able to fix the window arrangement by clicking Scoot's menu bar icon, then “Debug”, and finally “Rebuild Jump Windows”.

To customize Scoot's settings, click Scoot's menu bar icon, then “Preferences…”, or type ⌘, while Scoot is in the foreground. In addition to modifying keybindings, it is also possible to modify Scoot's appearance (including font sizes, colours, opacity, etc.).

Keybindings

Not sure what these symbols mean? See the symbol reference, and Emacs key notation.

Global Keybindings

Global keybindings are always active, as long as Scoot is currently running.

Default ShortcutDescription
⇧⌘JUse element-based navigation (bring Scoot to foreground)
⇧⌘KUse grid-based navigation (bring Scoot to foreground)
⇧⌘LUse freestyle mode (bring Scoot to foreground)

All global keybindings are fully customizable. To modify the keybindings, click Scoot's menu bar icon, then “Preferences…”, and select the “Keybindings” tab.

Local Keybindings

Local keybindings are only active when Scoot is active (i.e., when Scoot is in the foreground).

Note that vi keybindings are not enabled by default, and must be explicitly toggled on (click Scoot's menu bar icon, then “Preferences…”, select the “Keybindings” tab, and then change the keybinding mode). Emacs keybindings (and most system keybindings) are disabled when vi keybindings are active.

General
ShortcutAlternateDescription
⌘HHide UI (bring Scoot to background)
⎋ (or ⌘.)C-gCancel: if currently typing a label, clears all currently-typed characters; otherwise, brings Scoot to background

Note: ⎋ signifies the Escape key.

Cursor Movement
SystemEmacsviDescription
C-pkMove cursor up (partial step)
C-njMove cursor down (partial step)
C-bhMove cursor left (partial step)
C-flMove cursor right (partial step)
⌥↑M-aC-kMove cursor up (full step)
⌥↓M-eC-jMove cursor down (full step)
⌥←M-bC-hMove cursor left (full step)
⌥→M-fC-lMove cursor right (full step)
⌘↑M-<⇧-kMove cursor to top edge of screen
⌘↓M->⇧-jMove cursor to bottom edge of screen
⌘←C-a⇧-hMove cursor to left edge of screen
⌘→C-e⇧-lMove cursor to right edge of screen
⌃LC-l⇧-mMove cursor to center, and (on repeat) cycle around corners
Clicking
ShortcutDescription
Click left mouse button (at current cursor location)
=Press and hold left mouse button (once activated, type to release)
\Double-click left mouse button (at current cursor location)
[Click middle mouse button (at current cursor location)
]Click right mouse button (at current cursor location)

Scoot will pass along any pressed modifier keys when simulating clicks. This means that Command-click, Option-click, Control-click, and Shift-click are all supported (or any combination thereof). For example, ⌘↵ will Command-click the left mouse button at the current cursor location, ⌥↵ will Option-click, ⌃↵ will Control-click, ⇧↵ will Shift-click, etc.

Scoot can't take control of the mouse cursor when a context menu is active (for example, after right clicking). However, system-provided keyboard shortcuts for selecting the item in a menu (such as ↑, ↓, ←, →, C-n, C-p, ↵) will work as expected.

For simplicity, Scoot only supports simulating holding/ dragging, and double clicking, with the left mouse button. (If you have a use case that requires more exotic click handling, please file an issue with details.)

Note: ↵ signifies the Return (a.k.a Enter) key. (Sidenote: technically, Return and Enter are two different keys.)

Scrolling
SystemEmacsviDescription
⇧↑⇧-pC-bScroll up (at current cursor location)
⇧↓⇧-nC-fScroll down (at current cursor location)
⇧←⇧-bC-iScroll left (at current cursor location)
⇧→⇧-fC-aScroll right (at current cursor location)
Presentation
ShortcutDescription
⌃=Toggle visibility of grid lines
⌃⇧=Toggle visibility of grid labels
⇧⌘=Increase size of grid cells
⇧⌘-Decrease size of grid cells
⌘=Increase contrast of user interface
⌘-Decrease contrast of user interface

Installation

Scoot is available on Homebrew:

brew install --cask scoot

Alternatively, you can manually download the app bundle:

  1. Download and extract the latest build of Scoot.
  2. Drag the extracted Scoot.app into your computer's Applications folder.
  3. Double-click on Scoot.app (from the Applications folder) to launch it.

Setup

On first run, you'll be presented with a prompt like the following:

<p align="center"> <img width="450" src="./Assets/Documentation/accessibility-prompt.png" alt="Scoot.app would like to control this computer using accessibility features" /> </p>

Scoot will not work unless access is granted. (Note that Scoot does not collect any user or usage-related information, and does not make any network requests. The app runs entirely locally, and treats its privileged access with the utmost respect.)

To grant this permission, click “Open System Preferences”. Next, click the lock in the bottom left corner (“Click the lock to make changes”).

<p align="center"> <img width="550" src="./Assets/Documentation/privacy-locked.png" alt="Locked accessibility settings" /> </p>

Finally, check “Scoot.app” to give Scoot the ability to move your cursor, and to click, drag, and scroll.

<p align="center"> <img width="550" src="./Assets/Documentation/accessibility-access-granted.png" alt="Scoot.app granted accessibility access" /> </p>

See the usage documentation for details on how to use Scoot.

If you're finding Scoot helpful, you may want to configure the app to launch automatically when you log in. To set this up, open System Preferences again, click “Users & Groups”, and then “Login Items”:

<p align="center"> <img width="550" src="./Assets/Documentation/login-items-locked.png" alt="Locked login items settings" /> </p>

As before, you'll need to click the lock in the bottom left corner to unlock this preference pane. Once unlocked, click the “+” button, and select “Scoot.app” from the Applications folder. Checking the “Hide” checkbox is recommended.

<p align="center"> <img width="550" src="./Assets/Documentation/start-automatically.png" alt="Scoot configured to start automatically" /> </p>

If you encounter any problems, feel free to file an issue.

Demos

Element-based Navigation

This is what it's like to navigate around Wikipedia in Safari, using the element-based navigation mode:

https://user-images.githubusercontent.com/100451/151269537-627cdccd-b1a1-45e1-82aa-11992ca0dc9a.mp4

Drag and Drop

Here's what it's like to drag and drop with Scoot, using the grid-based navigation mode:

https://user-images.githubusercontent.com/100451/118299332-9e6a2e00-b4ae-11eb-901d-79a212ce1d37.mp4

For reference, the following key sequence was used to grab the file and drop it in a new location:

Feature Backlog

See the issue tracker. Contributions welcome!

License

Scoot is released under the terms of the BSD 3-Clause License.

Copyright (c) 2021-2023, Michael Russo.