A macOS keyboard-shortcut HUD. Press a global hotkey and a panel slides in showing every keyboard shortcut available in the frontmost app, plus the macOS system shortcuts — searchable, multi-column, light/dark adaptive.
- macOS 14 (Sonoma) or later
- Double-click
ShortcutHUD.appto launch it (or build from source — see below) - A
⌘icon appears in your menu bar - Grant Accessibility and Input Monitoring permission when prompted
⌘⌥⌃⇧ / (the hyper-key plus forward slash). Configurable in Settings.
When you press the hotkey the HUD opens an adaptive multi-column grid of every shortcut it can find for your current keyboard, grouped into one outer pane per source:
- Apple — the macOS system menu (Force Quit, Lock Screen, Log Out, …) shared by every app.
- Frontmost app — the captured app's menu bar walked via the Accessibility API. Each top-level menu (File, Edit, View, …) is an inner section inside the app's pane.
- Jorvik utilities — every running Jorvik app publishes its registered global hotkeys via
JorvikHotkeyRegistry; ShortcutHUD reads each one's bindings (BrowserCommander, Browser Notes, ScreenLock, WindowPin, ActiveSpace, …). Bindings tagged.browserare surfaced only when a web browser is frontmost. - Per-app overrides — any app's
NSUserKeyEquivalentsoverrides (System Settings → Keyboard → App Shortcuts). - Hotkey utilities — top-level
{keyCode, modifierFlags}preference dicts as written by Rectangle, theKeyboardShortcutsSwift library, and similar window-management / hotkey tools. - macOS Services — entries with a
key_equivalentinpbs.plist. - Hammerspoon —
hs.hotkey.bind(...)calls in~/.hammerspoon/*.lua. - Keyboard Maestro — HotKey-triggered macros in the macros plist.
- macOS — the system symbolic hotkeys (
CopySymbolicHotKeys).
| Action | Key |
|---|---|
| Filter | type to fuzzy-match against title and path |
| Move selection | ↑ / ↓ |
| Activate selected | ↩ |
| Dismiss | ⎋ or click outside |
Activating an app shortcut invokes the corresponding menu item in the captured app. Sources where ShortcutHUD can only observe the binding (Rectangle, Hammerspoon, Services, …) are list-only — press the actual hotkey to fire them.
- Bindings owned by apps that aren't running. Hammerspoon is dead, Rectangle quit — those entries don't appear, because the binding wouldn't fire anyway.
- Bindings to keys not on any connected keyboard. F13–F20 and the numeric keypad are dropped on a MacBook-only setup; plug a Magic Keyboard with Numeric Keypad in and they reappear automatically. Detection is by HID product name.
The HUD is resizable from any edge and draggable from the background (anywhere that isn't a row or the search field). The size and position persist across launches.
Click the menu-bar icon → Settings…
- Keyboard Shortcut — record any combination
- Accessibility — status + grant button
- Input Monitoring — status + grant button
- Menu bar icon pill — optional grey background for stronger contrast on busy or wallpaper-tinted menu bars (off by default)
- Launch at Login — start automatically when you log in
Auto-updates are handled by Sparkle. Use the Check for Updates… entry in the menu to check on demand; Sparkle's prompt offers an "Automatically download and install updates in the future" checkbox the first time an update is available.
Used to read the menu structure of the captured app and to invoke menu items. Prompted automatically on first launch.
Grant in: System Settings → Privacy & Security → Accessibility
Used by the global hotkey listener (a CGEventTap). Prompted automatically on first launch.
Grant in: System Settings → Privacy & Security → Input Monitoring
The menu-bar icon shows a ⚠️ glyph if the event tap failed to install (typically because Input Monitoring is missing). After granting, the icon clears automatically — no relaunch required.
ShortcutHUD installs its hotkey tap with tailAppendEventTap, so it sits after any other session-level event taps in the chain. If you use HyperCaps (or another tool that synthesises modifier flags), ShortcutHUD will see your transformed key events correctly. Tools that consume events fully — for example a hyper-key remap that converts caps-/ into a different shortcut entirely — will hide that input from ShortcutHUD by design.
ShortcutHUD uses Swift Package Manager. No Xcode project is required.
cd ~/Desktop/"Jorvik Software"/ShortcutHUD
gmake build
open .build/ShortcutHUD.appRequires GNU Make 4.x — brew install make installs it as gmake. The target is defined in the shared release.mk from jorvik-release/.
To regenerate the app icon from generate_icon.swift:
swift generate_icon.swiftThis rebuilds the .iconset and produces Resources/AppIcon.icns.
- Global hotkey — a
CGEventTapatcgSessionEventTap/tailAppendEventTaplistens for the configuredkeyDown. On match it posts a notification consumed by the main thread. - Menu enumeration —
AXUIElementCopyAttributeValuewalks the frontmost app's menu bar recursively, collectingAXMenuItemtitles, key equivalents, modifier masks, and AX glyph codes. The Apple menu (always the first child of the menu bar) is split off into its own outer pane; everything else nests under a pane named after the captured app. - Jorvik registry — every other running Jorvik app is queried via
JorvikHotkeyRegistry.read(from:), which reads each app's published list of registered hotkeys (action title, keyCode, modifiers, active context). Entries marked.browserare filtered out unless the captured app's bundle ID is registered as anhttphandler — so BrowserCommander and Browser Notes only surface when a real web browser is frontmost. - Per-app preferences sweep — every plist in
~/Library/Preferences/whose owning app is currently running is read for two patterns:NSUserKeyEquivalentsdictionaries and top-level{keyCode, modifierFlags}entries. - System sources —
CopySymbolicHotKeys(HIToolbox) for macOS shortcuts,pbs.plistNSServicesStatusfor the Services menu, theNSGlobalDomainNSUserKeyEquivalentsfor global menu overrides. - Tool-specific parsers —
~/.hammerspoon/*.luais regex-scanned forhs.hotkey.bind(...)and modal:bind(...)calls;~/Library/Application Support/Keyboard Maestro/Keyboard Maestro Macros.plistis walked for HotKey triggers. Both gated on the providing process being alive. - Keyboard-capability filter —
IOHIDManagerenumerates connected keyboards; their product names are matched against known Apple layouts (built-in MacBook, Magic Keyboard with/without Numeric Keypad). Shortcuts bound to keys not on any connected keyboard are dropped. - Activation — for an app shortcut, the captured
AXUIElementis invoked viaAXUIElementPerformAction(_, kAXPressAction). Other sources are list-only.
All disk and AX work runs on a background queue with hard timeouts so a slow target can't hang the HUD opening.
- Activation is app-menu-only. Bindings discovered through preference sweeps, Hammerspoon, Keyboard Maestro, or
CopySymbolicHotKeysare list-only — the HUD displays them but can't fire them. Press the actual hotkey to invoke. - Disabled menu items are listed but greyed out; activating them does nothing.
- Carbon hotkeys without a corresponding plist don't appear unless the app stores its binding in one of the patterns above. Apps that register via
RegisterEventHotKeypurely in code, with no on-disk record, are invisible. - Hammerspoon Lua parser is a regex, not a real interpreter.
hs.hotkey.bindcalls inside complex expressions, behind variables, or computed dynamically may be missed. - Third-party non-Apple keyboards are assumed to have every key (so we don't over-filter). If your external 60% reports as "MyKeyboard" rather than a recognised Apple model, F13+ shortcuts will still appear even though you can't type them.
Check the menu-bar icon. If it shows ⚠️, Input Monitoring is missing — open Settings → Grant Access. If the icon is ⌘ and the hotkey still does nothing, another tool higher in the event-tap chain may be consuming the event before it reaches ShortcutHUD.
The captured app didn't expose its menus to the Accessibility API. Some Electron apps and games do this. There is no workaround at the OS level.
The HUD always opens on the active space and the screen containing the cursor. If the HUD has been dragged, resize/move state is restored on next open. To reset, delete the saved frame:
defaults delete cc.jorviksoftware.ShortcutHUD "NSWindow Frame ShortcutHUD.HUDPanel"ShortcutHUD is provided by Jorvik Software. If you find it useful, consider buying me a coffee.