Skip to content
fabiogalianoPublic

About

MacOS application for keyboard-driven UI navigation

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

139 Commits

Folders and files

Repository files navigation

clavier app icon

clavier

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.

Features

Hint Mode

  • 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

Scroll Mode (in alpha)

  • 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

App compatibility

  • 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.

Customization

  • Customizable: hotkeys, hint alphabet, colors, and sizes

Install

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.

Requirements

  • macOS 15.0+
  • Xcode 15+ (for building from source)
  • Accessibility permissions (prompted on first launch)

Building

# 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

Setup

  1. Launch clavier (it lives in the menu bar)
  2. Grant Accessibility permissions when prompted (System Settings > Privacy & Security > Accessibility)

Usage

Default Shortcuts

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

Configuration

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

Architecture

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 uses nonisolated(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. ScreenGeometry owns 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.

License

MIT License

About

MacOS application for keyboard-driven UI navigation

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Contributors

Languages