Skip to content
hoaiphongdevPublic

About

Keyly – A lightweight macOS menu bar app that reveals keyboard shortcuts on demand. Works with any app, supports custom configs

Topics

Resources

Stars

14 stars

Watchers

1 watching

Forks

Repository files navigation

Keyly

Keyly

Every shortcut of the app in front of you, one double-tap away.

Keyly is a free, open-source keyboard shortcut viewer for macOS, an alternative to CheatSheet and KeyCue.
Double-tap ⇪ Caps Lock and it shows all keyboard shortcuts of the active app, right from your menu bar.

Latest release macOS 12+ Apple silicon Swift 5.9 GPL-3.0 License

Docs · Install · Custom shortcuts · Templates · Compare · Changelog

Keyly — view all macOS keyboard shortcuts instantly


Install

Requires macOS 12 or later on a Mac with Apple silicon (M1 or newer).

With Homebrew:

brew install --cask hoaiphongdev/keyly/keyly

Or without Homebrew, open any terminal (Terminal, iTerm, Warp…) and run:

curl -fsSL https://raw.githubusercontent.com/hoaiphongdev/keyly/main/scripts/install.sh | bash

Already installed with curl? Switch to Homebrew with brew install --cask --adopt hoaiphongdev/keyly/keyly. Keyly keeps updating itself either way.

Then grant Accessibility permission when prompted (System Settings → Privacy & Security → Accessibility → Keyly). That's it — double-tap ⇪ Caps Lock.

Note

Keyly needs Accessibility access to watch for the double-tap and to read the menu bar shortcuts of other apps. It reads nothing else.

How it works

The Keyly shortcuts window showing Google Chrome's menu shortcuts and a custom Vimium group

You want to… Do this
See the shortcuts Double-tap ⇪ Caps Lock
Find one Just start typing
Clear the search esc
Close the window esc again, or click outside
Reload, open config, update ⚙︎ in the window's bottom-right corner

The K icon in the menu bar has About Keyly, Check for Updates... and Quit.

Features

Keyly features: instant shortcuts, real menu shortcuts, custom configs, modern UI

  • Real menu shortcuts — read live from the app's menu bar through the macOS Accessibility API, so they're always the ones the app actually uses.
  • Instant search — type to filter by action, menu or key; matches are highlighted.
  • Custom shortcuts — add anything menus don't show with plain-text .keyly files.
  • Community templates — ready-made sheets for 31 popular apps, one command to install.
  • Groups & global shortcuts — organise sheets into groups, and keep system-wide shortcuts in global.keyly.
  • Fits any screen — a multi-column layout that sizes itself to your display, even on a 13" MacBook.
  • Your trigger — Caps Lock by default, or any key combination you like, held or tapped.
  • Auto-update — signed updates through Sparkle; your Accessibility permission survives them.

Works with

Apps that work with Keyly

Keyly works with every app that has a menu bar. Some apps keep most shortcuts out of their menus (editors, design tools, terminals); for those, community templates fill the gaps:

Adobe Acrobat · After Effects · Animate · Illustrator · Lightroom Classic · Photoshop · Premiere Pro · Alacritty · Craft · Cursor · DataGrip · Evernote · Figma · Ghostty · IntelliJ IDEA · iTerm2 · Kitty · Notion · Obsidian · PhpStorm · Postman · PyCharm · Rider · RubyMine · RustRover · Sublime Text · TablePlus · VS Code · Warp · WebStorm · Windsurf

# Install a template (saved to ~/.config/keyly/templates/)
curl -sL https://raw.githubusercontent.com/hoaiphongdev/keyly/main/scripts/install-templates.sh | bash -s -- -t cursor.keyly
Option Meaning
-t <name> Template to install (.keyly is optional)
-n <name> Save it under another file name
-f Replace the file if it already exists

Custom shortcuts

Drop .keyly files in ~/.config/keyly/templates/ (files directly in ~/.config/keyly/ load too; when both folders have the same file name, the one saved last is used). Changes apply as soon as you save.

# Sheet Name: Safari Extras
# App: Safari

# Group: Browsing - Everyday navigation

[Tabs]
> Tab management
⇧⌘T | Reopen last tab
CMD+L       Open location

[Tools]
open -a Safari . | Open the current folder in Safari

Each shortcut line is a key combination and a description, written either way:

  • ⇧⌘T | Reopen last tab — split on |; use it when the left side has spaces
  • CMD+SHIFT+T Reopen last tab — split on a tab or two or more spaces

Written modifiers become symbols — CMD/COMMAND → ⌘, CTRL/CONTROL → ⌃, OPT/OPTION/ALT → ⌥, SHIFT → ⇧ — as do named keys like ENTER, TAB, ESC, SPACE, DELETE, HOME, END, PGUP, PGDN, F1–F20 and the arrows.

Directive What it does
# App: … Required. The app: its name (Figma), bundle id (com.figma.Desktop) or path (/Applications/Figma.app)
# Sheet Name: … Optional label for the file
# Hide Default: true Show only your shortcuts, not the app's menu shortcuts
# Group: Name - Description Put the following categories in a card (# Group: none ends it)
[Category] Start a category
> Description Subtitle for the current category
\#, \[, \> A shortcut whose key starts with #, [ or > (e.g. \## Heading 2)

Directives ignore case. A sheet matches by name too, so it keeps working when the app lives in ~/Applications, comes from Setapp or is a newer year (Adobe Photoshop 2024 matches Photoshop 2025).

Shortcuts in templates/global.keyly appear for every app — the place for system shortcuts like ⌘Tab that no menu lists.

A line Keyly can't read is skipped and the rest of the file still loads. Problems show up under ⚠︎ config problems in the shortcuts window's ⚙︎ menu (click one to jump to the line) and in Console.app under com.keyly.

Settings

~/.config/keyly/setting.conf is created on first launch with every option commented out. Remove the # in front of a line to change it.

super_key = ctrl+k
trigger_type = hold
hold_duration = 400ms
Key Values
super_key capslock (default), a modifier such as cmd, or a combination: ctrl+k, Command + Shift + K, ⌃⌥Space. Names: cmd/command/⌘, ctrl/control/⌃, alt/opt/option/⌥, shift/⇧, fn; enter is Return, del is ⌫. fn can't be combined with arrows, F keys, Home/End or Page Up/Down, since macOS reports fn for those keys on its own
trigger_type press or hold. Default press for capslock (which can only be pressed), hold for any other key
press_count Taps in a row for press, 1–4 (default 2, each within half a second of the last). With a modifier alone such as cmd, a tap counts when you let go, and any other key in between cancels it, so ⌘C never opens Keyly
hold_duration How long to hold for hold: 0.5, 0.5s or 500ms, between 0.1s and 3s (default 0.5)
screen_width_ratio Widest the window gets, as a share of the screen: 0.1–1.0 or 70% (default 0.7)

Settings are forgiving: names and values ignore case, quotes and a trailing # comment are fine, a number outside its range is clamped, and anything Keyly can't read falls back to its default and shows up in the ⚙︎ menu, with a suggestion for typos.

Updates

Keyly checks for a new version every 6 hours. When one is out, the menu bar icon gets a red dot and an Update to x.y.z… item; you can also use Check for Updates... at any time. Every release is signed with the same certificate, so the Accessibility permission stays granted.

Installed with Homebrew? Keyly still updates itself. To update through Homebrew instead, run brew upgrade --cask --greedy keyly.

Important

Coming from 1.7.3 or older? Those builds have no updater. Run the install command once more and grant Accessibility again; updates are automatic from then on.

Development

Requires macOS 12+, Swift 5.9 and just.

just build     # debug build
just dev       # run with KEYLY_DEV=1: shows the window without keyboard monitoring
just prod      # release build and run
Release process
  1. One-time setup — create the signing certificate and Sparkle EdDSA keys, then add the GitHub secrets the scripts print (KEYLY_CERT_P12_BASE64, KEYLY_CERT_PASSWORD, SPARKLE_PRIVATE_KEY):

    just setup-signing

    Back up ~/.keyly-signing. Replacing the certificate resets every user's Accessibility permission, and losing the EdDSA key means installed copies can no longer verify updates. Never change both in the same release.

  2. Release — add a ## [x.y.z] section to CHANGELOG.md, commit, then:

    just release 1.9.0

    This pushes the tag keyly-1.9.0. GitHub Actions builds and signs Keyly.dmg, generates appcast.xml and publishes both to the release. Tags with a suffix (keyly-1.9.0-rc1) become prereleases that the app ignores.

License

Keyly is licensed under the GNU General Public License v3.0 (GPL-3.0). Releases up to 1.10.1 were published under MIT.

Copyright (c) 2025 Nguyễn Hoài Phong · Made with ❤️ by hoaiphongdev

About

Keyly – A lightweight macOS menu bar app that reveals keyboard shortcuts on demand. Works with any app, supports custom configs

Topics

Resources

Stars

14 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages