A keyboard-driven command palette for macOS. Press the leader hotkey, then type a key sequence to launch apps, open URLs, or run shell commands defined in ~/.config/rapidkey/rapidkey.toml.
RapidKey runs as a menu bar utility (no Dock icon). It watches your config file and reloads changes automatically when you save.
Inspired by the which-key plugin in LazyVim — press a leader key, then see a visual map of the shortcuts available at each step.
- Features
- Quick Start
- Installation
- Usage
- Configuration
- Permissions
- Building from source
- Project layout
- License & Author
- Global leader hotkey opens a command palette
- Key sequences with optional groups and section titles in the palette header
- Running apps branch at the root: press Space to switch to open applications (hotkeys
1–0, thena–z) - Actions:
run(shell command),open(application),url(browser) - Live shell output panel for long-running commands (
show_output) - Config hot-reload when
rapidkey.tomlis saved - Optional launch at login
- Two leader modes:
- Chord — e.g.
alt+space(no extra permissions) - Double-tap modifier — e.g.
doubletap+ctrl(requires Input Monitoring)
- Chord — e.g.
-
Install via Homebrew:
brew install --cask ivalkou/tap/rapidkey
-
Launch RapidKey from
/Applications. On first run it creates~/.config/rapidkey/rapidkey.tomlwith example bindings. If your leader uses a double-tap modifier, grant Input Monitoring when prompted (see Permissions). -
Press the leader hotkey (default:
alt+space) to open the palette, then type a key sequence to run an action. See Usage for palette navigation and Configuration to customize bindings.
- macOS 15.6 or later (Apple Silicon)
- Xcode (Swift 5; uses TOMLKit via Swift Package Manager) — only needed to build from source
Install via Homebrew to get updates:
brew install --cask ivalkou/tap/rapidkeyInstall a specific version:
brew install --cask ivalkou/tap/rapidkey@0.1.0Note: RapidKey is not notarized. Notarization is Apple's process for approving binaries before distribution. The Homebrew cask removes the
com.apple.quarantineattribute on install, so the app should run without the "Apple cannot check … for malicious software" warning.For a manual install from Releases, unpack the zip, move
RapidKey.appto/Applications, then if Gatekeeper blocks launch:xattr -d com.apple.quarantine /Applications/RapidKey.app
On first run, RapidKey creates ~/.config/rapidkey/ and writes a fully documented rapidkey.toml with example bindings. On every launch it also writes example.toml in the same folder — the same reference content (not used by the app; edits are overwritten on the next launch).
Edit rapidkey.toml in any text editor; changes are picked up automatically after you save (debounced file watcher).
Use the menu bar item to:
- Show [leader] — open the command palette
- Open Config Folder — open the config directory in Finder
- Grant Input Monitoring… — shown when the leader is
doubletap+…and permission is missing - Quit — exit the app
- Space (at the root) — open the running-apps branch (see below)
- Backspace — step back one level in config groups, or return from running apps to the root (no effect at the root)
- Esc — close the palette
At the root of the palette, Space opens a dynamic list of running GUI applications. The list is a snapshot taken when you enter the branch:
- Order — frontmost app first, then the rest sorted by name
- Hotkeys —
1through9,0, thenathroughz(up to 36 apps; extras are omitted) - Action — activates the selected app and closes the palette
Space is reserved for this branch at the root; a root-level binding "space" in [bindings] will not be reachable. This branch is not configurable via TOML in v1.
Config file: ~/.config/rapidkey/rapidkey.toml
Reference (rewritten on each app launch): ~/.config/rapidkey/example.toml
| Option | Description |
|---|---|
leader |
Global shortcut to open the palette |
shell |
Shell for run commands (default: sh; name on PATH or absolute path) |
launch_at_login |
Start RapidKey at login (true / false) |
Chord — modifiers and key joined with +:
leader = "alt+space"
Modifiers: ctrl, alt, cmd, shift. Keys: a–z, A–Z, 0–9, punctuation (= - [ ] ' ; \ , / . \``), Shift symbols (! @ # $ % ^ & * ( ) _ + { } | : " < > ? ~), and space, tab, enter, esc, f1–f12`.
Keys refer to physical US QWERTY positions, not the character printed by your current keyboard layout.
Double-tap modifier — tap the same modifier twice within the configured window:
leader = "doubletap+ctrl"
Also accepts doubletap+alt, doubletap+cmd, doubletap+shift (alias: 2tap+…).
| Section | Purpose |
|---|---|
[panel] |
Where the palette appears: center, cursor, top, bottom; show_app_icons — bundle icons for open bindings and running apps (default true) |
[behavior] |
timeout_ms — auto-close after idle (0 = disabled); double_tap_ms — max gap between modifier taps (default 350); double_tap_min_ms — min gap, shorter pairs ignored as bounce (default 80); double_tap_cooldown_ms — ignore new double-taps after a trigger (default 500) |
[groups] |
Optional titles for key prefixes (shown in the palette header) |
[bindings] |
Key sequences and their actions |
Keys in a sequence are space-separated. For example, "f h" means press f, then h.
Supported keys match the leader list above: letters, digits, punctuation, and Shift symbols (e.g. ! for Shift+1). In TOML, quote keys that are special to the parser — for example "1", "!", "[", or "g \"" for a two-key sequence ending with ".
Each binding is an inline table with:
title— label in the palette (required)- Exactly one of:
run,open,url show_output— withrunonly: show live command output (defaultfalse)work_dir— withrunonly: working directory (absolute path or~)confirm— withrunonly: confirmation step in the palette before executing (defaultfalse);trueuses the binding title, or pass a custom string; press y to run, n or Esc to cancel
Example:
leader = "alt+space"
[panel]
position = "center"
[behavior]
timeout_ms = 0
double_tap_ms = 350
double_tap_min_ms = 80
double_tap_cooldown_ms = 500
[groups]
"f" = "Files"
"w" = "Web"
[bindings]
"t" = { title = "Terminal", open = "Terminal" }
"1" = { title = "Calculator", open = "Calculator" }
"!" = { title = "Notes", open = "Notes" }
"f h" = { title = "Home", run = "open ~" }
"f l" = { title = "List Home", run = "ls ~", show_output = true }
"w g" = { title = "Google", url = "https://www.google.com" }A group key (e.g. "f") must have bindings under that prefix (e.g. "f h", "f d") to appear as a navigable group.
The default "x e" binding uses open -t, which opens the file in the associated text editor (often TextEdit). Replace the run value in your config if you prefer a different GUI editor.
| Leader type | Permission |
|---|---|
Chord (e.g. alt+space) |
None beyond running the app |
| Double-tap modifier | Input Monitoring — System Settings → Privacy & Security → Input Monitoring → enable RapidKey |
If Input Monitoring is required but not granted, the leader will not fire. Use Grant Input Monitoring… in the menu bar to open the permission dialog again.
- Open
RapidKey.xcodeproj - Select the RapidKey scheme
- Run (⌘R)
xcodebuild -project RapidKey.xcodeproj -scheme RapidKey -configuration Release -derivedDataPath build build
open build/Build/Products/Release/RapidKey.appThe build/ directory is gitignored.
Maintainers: see dev-docs/releasing.md for publishing releases and Homebrew tap updates.
RapidKey/
App/ Entry point, menu bar, AppDelegate
Models/ Config, Action, Leader, palette models
Services/ Config load/watch, hotkeys, shell execution
Services/Config/ TOML leader/parse helpers
Features/CommandPalette/ Command palette UI and state
UI/ Floating panels, design tokens, key catcher
Resources/ Bundled default config template (config-body.toml)
MIT License — see LICENSE.
Copyright © 2026 Ivan Valkou
Ivan Valkou