Every keyboard shortcut on your Mac, in one place.
A menu bar app that reads the menus of every running application and shows you the whole
map — grouped by app, searchable, and exportable to PDF or PNG. Press ⌥⌘/ and
there it is.
Version 1.2.1 · Free · macOS 14+ · Apple silicon & Intel
Shortcut Map
1,256 shortcuts across 22 apps · 7 conflicts
Search apps, menus, or a chord like ⇧ ⌘ · ? for help
Click item to filter by shortcut
Search by chord click to build one — order doesn't matter
⌃⌥⇧⌘fn←→↑↓↩⇥␣⌫⌦⎋⇞⇟↖↘
⚠ Conflicts
Export
All running apps ⌘ 1
Running
Terminal ⌘ 2
Mail ⌘ 3
Numbers ⌘ 4
Photos ⌘ 5
Notes ⌘ 6
Preview ⌘ 7
macOS System ⌘ 8
Terminal 42
⌘ KClear Scrollback
Edit
⌘ NNew Window
Shell
⌘ TNew Tab
Shell
⌃ ←Move Left
Window ▸ Move & Resize
⌥ ⌘ IInspector
Shell
Notes 31
⇧ ⌘ NNew Folder
File
⌥ ⌘ CChecklist
Format
Mail 54
⌘ ⌫Move to Trash
Message
⇧ ⌘ DSend
Message
⌥ ⌘ SSidebar
View ▸ customized
⌘ RReply
Message
⇧ ⌘ RReply All
Message
⇧ ⌘ JMove to Junk
Message
macOS System 28
⌘ ␣Show Spotlight search
Keyboard Shortcuts
⇧ ⌘ 4Save picture of selected area
Keyboard Shortcuts
⌃ ←Move left a space
Keyboard Shortcuts
⌃ ↑Mission Control
Keyboard Shortcuts
Numbers 67
⌥ ⌘ KAdd Link
Format
Shortcut Map 1.2.1 — macOS 27.0⌘ 1 all running · ⌘ 2–9 by app · ⌘ 0 actual size · Esc to close
Yellow marks a conflict — the same chord bound twice, or an app shortcut that a system
hotkey swallows before the app ever sees it.
What's new in 1.2.1
A clearer notice about your macOS version. If your Mac runs an older macOS than
the one Shortcut Map was built on, the notice explaining that used to end by telling you to
rebuild the app — which only makes sense if you have the source. It now says plainly that
this is normal for an app you download, and points at the two things that help: check for
an update, and report it if an update does not.
1.2.0 — Intel Macs, and macOS 27
Shortcut Map runs on Intel Macs. The download is now a universal build, so it
works on a Mac with an Intel processor as well as on Apple silicon. Nothing changes if you
are already using it — same app, same install command, and the same one updates both.
Ready for macOS 27. Shortcut Map has been checked against macOS 27, so it no
longer warns that it is running on a newer macOS than it has been tested on. All three
places it reads shortcuts from — the menus of running apps, the system keyboard shortcuts,
and the ones you have customized yourself — were confirmed to still work there.
1.1.1 — a bigger map shows more
A bigger map now shows more, not just bigger. Making the map larger used to leave a
band of empty space down the right of every card, because the extra width went to the cards
already on screen rather than to another column of them. The width a larger size cannot use
is now turned into a column instead: on a large map at 130%, two columns of apps become
three. A card is only ever narrowed slightly to make one fit, and never enough to start
cutting into the shortcut names.
1.1.0 — resize the map from the keyboard
Resize the map from the keyboard.⌘+ and ⌘− step the whole
map through the same sizes the Settings pane offers — text, chords, rows and the spacing
between them together — and ⌘0 goes back to the actual size. The size you land
on is remembered between launches and across updates, so it only has to be chosen once.
The app list moved up a number.⌘0 now means actual size, the way it
does everywhere else on the Mac, so ⌘1 is every running app and ⌘2
through ⌘9 jump to one. The sidebar, the footer and the ⌘/ guide all
show the new numbers.
1.0.0 — filter by chord, and a size that fits you
Click any shortcut to use it as a filter. The map drops everything else and shows
only that chord — every app that uses it, with the one you clicked outlined. For a flagged
row that is what it collides with; for anything else it is who else has claimed the same
keys. A chord used in one place says so. esc steps back out.
Search by chord without typing one. A row of clickable keys sits under the search
box: ⌘⇧⌥⌃fn and the keys you
cannot type into a text field — the arrows, tab, return, delete, escape, page up and down.
Click them in any order; ⌘⇧ and ⇧⌘ now find the same shortcuts.
Bigger, easier-to-read key combinations. Every chord is 20% larger with a space
between each key, so ⌥ ⇧ ⌘ A reads as four keys instead of one dense mark.
Set the size of the whole map. Settings (⌘,) has a size control from 90%
to 200% that scales the text, the chords and the spacing together. It is remembered between
launches and across updates.
Hidden shortcuts no longer count as conflicts. Hiding BetterTouchTool's triggers or
the universal shortcuts now leaves them out of conflict detection as well as out of the map,
so nothing is flagged because of a row you have chosen not to see.
0.9.3 — an installer that checks before it reports
The installer tells the truth about "Open at Login". Re-running it could report "Not
set to open at login" without having checked, which read as though updating had cleared the
setting. It now checks first, leaves an existing setting alone, and ends by stating what the
setting actually is.
0.9.2 — an honest update check
"Check for Updates" no longer claims you are up to date when it could not check. If it
cannot reach GitHub — offline, or GitHub having a bad day — it now says so, rather than giving
you an all-clear it has no way of knowing is true. The once-a-day automatic check stays quiet
as before, and a failed check is retried next time you launch rather than waiting a day.
0.9.1 — Settings in front, on the right screen
Settings opens in front of the map, on the same screen. It was opening behind the map,
and on a second monitor it could land on a different display entirely. The map itself now opens
on the screen you are working on rather than the one it was last left on, keeping the size you
chose.
Every color the map draws is now in Settings. The selection highlight, the pin and the
update button were using your Mac's own accent color, and the warning banner was a fixed orange
— so there were colors on screen that Settings knew nothing about. There are six per appearance
now.
Contrast is reported as the color actually renders. Each row shows what a thin glyph
achieves, not just the color's flat contrast, since the two differ by a lot. The light defaults
were deepened so none of them sit close to the line.
0.9.0 — light and dark
Light and dark, following your Mac. The map now matches whatever appearance macOS is
set to and switches with it. Settings can pin it to one or the other if you would rather it
stayed put.
Two real palettes, not one inverted. Each appearance has its own surfaces, its own
text color and its own four accents, because a color that works on a dark key chip does not
work on a light one — the dark yellow measures about 1.4:1 against a light chip. Choosing your
own colors in one appearance leaves the other alone.
Thin glyphs are accounted for. A ⌘, is mostly antialiasing, so what you
actually see is a blend with the chip behind it — and that costs much more contrast on a light
chip than on a dark one. The light accents are deeper than they look like they need to be for
exactly this reason, measured rather than guessed.
Dimmed text is stronger in dark mode. The sidebar counts and footer had been checked
on cards but not on the panel behind them, where they were below the readable minimum.
0.8.0 — colors you can change
The colors are yours to change.⌘, opens Settings: the four accent colors,
and how much of your desktop shows through the map. What reads well for one person does not
for the next, and the defaults were only ever one person's eyes.
A color-blind friendly preset. The default yellow and green sit close together if you
have deuteranopia or protanopia, so one preset avoids the red–green axis entirely — orange,
blue, purple and pale steel. There is a high-contrast preset too.
Every choice tells you what it costs. Each color shows the contrast ratio it actually
achieves, measured against the worst case, and says so plainly when a color will be hard to
read. The background slider stops where text would stop being legible: what you can choose is
wide, but it does not include unreadable.
The color legend in the ? guide now shows the real thing. It was drawing
its own imitation key chips, which had missed the contrast fix in 0.7.2 — so the legend was
harder to read than the map it was describing.
0.7.2 — readable over any wallpaper
The map is readable whatever is behind it. The overlay blurs your desktop, and a
light wallpaper was showing through enough to wash the text out — a key chip's glyph could
end up almost the same shade as the chip. It now paints its own background, so how legible
the map is no longer depends on your wallpaper.
Every label and key chip is checked against the WCAG AA standard at build time,
measured against the brightest desktop the blur can pass through, so this cannot quietly
come back.
0.7.1 — open at login
It can open at login. The installer asks once, and the menu bar icon has an
Open at Login switch either way. A menu bar app that is not running looks exactly
like one that was never installed, so this is worth being asked about.
Collapse and expand all works while you are looking at one app. With a single app
selected the cards are its menus rather than apps, and the button was collapsing the wrong
thing — so it appeared to do nothing.
0.7.0 — tooltips that explain
Hover anything to find out what it is. The warning icon now names what a shortcut
actually collides with, rather than just saying there is a clash — which app, and which
command.
Every chip explains itself. Hover one for the full menu path, why it is the color
it is, and whether it is dimmed because the menu item is currently disabled.
The rest of the interface too — the toolbar, the app list, and the per-app header,
which now tells you when that app's menus were last read.
0.6.1
Minor text label corrections.
0.6.0 — a ? guide, and colors that say who owns a chord
Press ? for a guide. The app's own keys, what every color means, and
what each toolbar control does — without leaving the map.
Colors now say who owns a chord. Yellow a conflict, cyan a BetterTouchTool
trigger, green a macOS system shortcut, violet one that nearly every app has. Knowing
macOS owns ⌃← explains a clash better than flagging it twice.
The BetterTouchTool menu says what it is doing — how many conflicts it is
excluding, and which of its options affect the whole map rather than only the conflicts
list.
0.5.2 — pinning and the version line
After unpinning, clicking outside the overlay closes it again. The footer no longer shows
two unlabelled macOS versions.
0.5.1 — a grip you can grab
A corner grip you can actually grab. 0.5.0 made the overlay resizable, but with no
frame and no grip there was nothing to aim at. There is now a visible handle in the
bottom-right corner, with a proper resize cursor.
0.5.0 — resize, pin, and one-click update checks
Resize it, and pin it. Size the overlay to suit you — the size and position are
remembered. The pin keeps it on screen when you switch apps, instead of dismissing, which
is what you want while copying a shortcut into something else.
"Check for Updates" now just checks. Click it and it looks immediately, then
installs what it finds. It works whether or not the daily automatic check is switched on,
which is now a separate item rather than something you toggle to force a check.
0.4.0 — one app, full screen
Select one app and it fills the screen. Instead of a single narrow card, the app
opens out into its own menus — File, Edit, View, Window — as separate panels across the
full width, in the order the menus actually appear rather than alphabetically.
0.3.1 — BetterTouchTool fixes
Conflicts on arrow keys are found again. A trigger like ⌃⌘→ was being
compared against a hidden fn flag that only raw key events carry, never menus
— so BTT could quietly take an arrow shortcut from an app and it would never be reported.
On one machine that was five real conflicts nobody could see.
BetterTouchTool is no longer listed as "not running", and hiding it now hides it
everywhere rather than only in the conflicts list.
0.3.0 — one-click updating
Updating is one click. When a new version is published the menu bar icon grows a
badge, and so does the overlay next to the app's name. Clicking it downloads the build,
checks it, installs it and reopens — no Terminal, and your Accessibility permission and
settings are kept.
It checks who built it, not just where it came from. An update only installs if it
is signed with the same certificate as the copy already running. A build substituted or
re-signed by anyone else is refused, wherever it was downloaded from.
Nothing is left broken if it goes wrong. Anything unexpected — no write access, a
signature mismatch, a failed download — falls back to the install command here, and a failed
swap puts the working app back.
The name is a link. Clicking "Shortcut Map" in the overlay opens this page.
Plus everything from 0.2.0: BetterTouchTool support, instant cached loading, hiding the
shortcuts every app has, ⌘1–⌘9 navigation, pinning, and a
clean uninstall.
Reads the real thing. It walks the menu bar of every running app, so the map
shows what your apps actually define — not a list somebody typed out once.
Includes the system. Spotlight, Mission Control, screenshots, and anything you
rebound in System Settings, with your customizations taking precedence.
Finds conflicts. Two commands on one chord, or a system hotkey shadowing an app's,
get called out in yellow with a conflicts-only view.
Knows about BetterTouchTool. BTT's global triggers are invisible to every macOS
API, so they are read from BTT's own store and shown in cyan — and since a BTT binding
stealing a chord is usually deliberate, you can highlight, hide, or exclude them from
conflicts entirely.
Gets out of the way.⌘1 for everything running, ⌘2–⌘9
to jump to one app, click a title to collapse it, pin the ones you use to the top-left.
Exports. A paginated PDF or a single PNG, honoring whatever you have filtered.
Install
curl -fsSL https://github.com/dharmaje/shortcut-map/releases/download/latest/install.sh | sh
It downloads the disk image, copies the app to /Applications, and opens it.
On first launch macOS asks for Accessibility access — Shortcut Map reads the menu bars of
running apps, so it shows very little without it.
The installer also asks whether to open Shortcut Map when you log in. Answering no is
the default, and the menu bar icon's Open at Login switches it either way afterwards.
A scripted install can answer in advance with SHORTCUTMAP_LOGIN_ITEM=1 or
=0.
Why Terminal and not a download button?
Shortcut Map is ad-hoc signed, not notarized, because there is no paid Apple Developer
account behind it. Anything a browser downloads gets macOS's quarantine flag, and for
an unnotarized app that produces a Gatekeeper dialog with no way through — the old
Control-click → Open escape hatch is gone. Files fetched by curl are never
quarantined, so the Terminal route avoids the problem rather than fighting it.
If you would rather have the disk image, take
the DMG,
drag the app to Applications, and then run this once:
Run the install command again. It is a plain overwrite and always fetches the newest build;
your pinned and collapsed apps, and your colors, are kept.
The app checks once a day whether a newer release exists and, if so, says so in the menu bar
and hands you the command. That check is the only network request Shortcut Map ever
makes, and you can switch it off in the same menu — with it off, the app makes none at all.
Updating should not disturb your Accessibility grant: release builds are signed with a
stable identity, so macOS recognizes the new version as the same app. If it does ask again,
granting it once more is all that is needed.
Uninstalling
Either drag ShortcutMap.app to the Trash, or:
curl -fsSL https://github.com/dharmaje/shortcut-map/releases/download/latest/uninstall.sh | sh
The menu bar icon also has Uninstall Shortcut Map…, which does the same thing from
inside the app.
What it leaves behind, if you just use the Trash
~/Library/Application Support/ShortcutMap/ — the scan cache
~/Library/Preferences/us.epel.ShortcutMap.plist — pinned apps and settings
a login item, if you turned Open at Login on — that one is held by macOS rather
than by a file, so dragging the app to the Trash leaves it pointing at nothing
That is the whole list. The uninstaller and the in-app Uninstall remove all of it.
macOS will not let any app remove its own Accessibility entry, so that one is left for you in
System Settings.
What it can't see
Shortcuts with no menu item are invisible to every API involved here, so the map will not
include them:
an editor's internal keymap — VS Code's command palette bindings, Vim inside a terminal
browser chrome shortcuts that aren't in a menu
global hotkeys other apps registered for themselves
Electron and Catalyst apps also fill in their submenus lazily, so a first scan can
under-report; rescanning fixes it, and every app card shows when it was last read.
Found a problem, or want something?
Bug reports and feature requests both live on GitHub, with a short form for each.
Both need a free GitHub account — GitHub does not allow anonymous issues, and there is
no way around that short of running a form service, which this project does not.
Report a bug
— what happened, how to reproduce it, and your macOS version
Request a feature
— the problem you are trying to solve matters more than the solution
The app source is private, but this is the right place for both. Issues are public, and a
shortcut map can reveal which applications you use — redact anything you would rather not
publish before pasting output.
About that permission
Accessibility access is a serious thing to hand out, so plainly: Shortcut Map reads
menu item titles and their key equivalents from running applications. It does not read
keystrokes and does not watch what you type. It makes one kind of network request — a
once-a-day check of this project's GitHub releases, which you can switch off in the menu bar, and
which sends nothing about your Mac. Nothing else leaves the machine: not the shortcut map, not
the list of apps you have installed.
The source is not published, so take none of that on trust alone. The
uninstaller lists every file the app creates, and Little Snitch, Lulu or macOS's own firewall
will show you exactly what it talks to — the one claim above that matters most, and the easiest
to check for yourself.