Navigate any macOS app without touching the mouse.
Press a shortcut, type a hint or search by word — clavier clicks for you.
Free, open source, and opinionated about how it works. Alternative to Homerow, Shortcat, Wooshy, and Mouseless.
- Hint codes: Letter codes over every element; type one to click instantly
- Search by name: Type any word; one match auto-clicks, several are numbered, press one to select
- Two-stage ESC: first press clears search, second exits
- Continuous mode: press the hint shortcut again during an open session to stay across multiple clicks; hints refresh automatically once the UI settles
- Popup follow-through: clicking a select, combobox, menu button, or right-clicking keeps a one-shot session open so you can pick from the popup that opens
- Keyboard scrolling: hjkl or arrow keys; Shift for faster
- Smart area detection: auto-selects the scrollable region under focus; numbered hints to pick another
- Auto-deactivation: optional timer exits after inactivity
- Chromium apps: works with browsers such as Helium and Electron apps such as Slack, Discord, and Notion
- Spotify: one-click relaunch to enable accessibility; auto-relaunch option for every launch
Apps using fully custom rendering without Accessibility API support (e.g. Zed) won't expose elements to hint.
- Customizable: hotkeys, hint alphabet, colors, and sizes
Download clavier.dmg from the latest release and drag clavier into Applications.
clavier is ad-hoc signed and not notarized, so macOS blocks the first launch. Open System Settings → Privacy & Security and click Open Anyway, or run xattr -cr /Applications/clavier.app.
- macOS 15.0+
- Xcode 15+ (for building from source)
- Accessibility permissions (prompted on first launch)
# Clone the repository
git clone https://github.com/fabiogaliano/clavier
cd clavier
# Build from command line
xcodebuild -project clavier.xcodeproj -scheme clavier -configuration Debug build
# Or open in Xcode
open clavier.xcodeproj
# Press Cmd+R to build and run- Launch clavier (it lives in the menu bar)
- Grant Accessibility permissions when prompted (System Settings > Privacy & Security > Accessibility)
| Action | Shortcut |
|---|---|
| Hint Mode | |
| Activate Hint Mode | ⇧⌘Space |
| Continue current hint session | ⇧⌘Space again |
| Clear search text / exit hint mode | ESC |
| Start every session continuous | Enable the Clicking preference |
| Select numbered match | 1-9 (when text search shows 2-9 matches) |
| Click first match | Enter |
| Right-click / double-click / hover | Hold Ctrl / Shift / Option on the last hint letter, on Enter, or on the match number |
| Clear search text | Release Option |
| Manual refresh | Type "rr" (configurable) |
| Scroll Mode | |
| Activate Scroll Mode | ⇧⌘J |
| Select scroll area | 1-9 or arrow keys |
| Scroll | hjkl |
| Dash speed (faster) | Shift + hjkl or Shift + arrows |
| Exit scroll mode | ESC |
Open via menu bar > Preferences or Cmd+,.
- Clicking: activation hotkey, hint alphabet, text search, continuous mode
- Scrolling: activation hotkey, scroll keys, speeds, arrow key behavior
- Appearance: colors, opacity, hint size and offset
- General: accessibility permissions, Chromium and Spotify settings
Two explicit state machines — HintSession and ScrollSession — each driven by a pure reducer: (session + input) → (next session + side effects). Controllers own the lifecycle; services handle side effects.
Notable constraints:
- Threading: The keyboard event tap runs on a CFRunLoop thread. All AX calls and UI mutations are confined to
@MainActor. Shared state usesnonisolated(unsafe)static scalars dispatched back to main. - Coordinate systems: AX API uses bottom-left origin (Quartz). Overlay positioning flips to top-left (AppKit). Synthesized clicks flip back.
ScreenGeometryowns both transforms. - App compatibility: dormant renderer AX trees are enabled for known Chromium browsers and Electron apps. CEF apps (Spotify) can't be woken at runtime — detected and surfaced as a one-click relaunch instead.
MIT License