A macOS menu bar app that switches your keyboard off, so you can keep typing without typing anything.
Double-tap Esc and your keyboard goes dead. Double-tap Esc again and it comes back.
macOS 13+ · Apple Silicon & Intel · ~200 KB · no dependencies · MIT
You're mid-thought. The sentence isn't ready yet, but your hands don't want to stop — the clack of a mechanical keyboard is part of thinking. So you keep typing, and now there's garbage in your prompt box, your editor, or worse, a Slack message you didn't mean to send.
Clickity Clack gives you a mute button for your keyboard. Hit it, clack away as long as you like, hit it again, and pick up exactly where you left off. Nothing you typed in between goes anywhere.
-
Grab
ClickityClack.zipfrom the latest release. -
Unzip it and drag ClickityClack.app into your Applications folder.
-
Right-click the app → Open, then click Open in the dialog.
That third step matters. The app isn't notarized by Apple (that needs a paid developer account), so double-clicking it the normal way gets you "Apple could not verify this app is free of malware." Right-click → Open is the standard way past that. If macOS still refuses, run this once:
xattr -dr com.apple.quarantine /Applications/ClickityClack.app
No Xcode project, no package manager, just the Swift compiler that ships with Xcode or the Command Line Tools:
git clone https://github.com/kush-daga/clickity-clack.git
cd clickity-clack
./install.shThat compiles a universal binary, installs it to /Applications, and launches it.
macOS prompts on first launch. Click Open System Settings, find ClickityClack in the list, and turn it on.
System Settings → Privacy & Security → Accessibility
This is non-negotiable — swallowing a keystroke before it reaches other apps is exactly what that permission governs. The app does nothing at all until you grant it, and the menu bar item will keep telling you so.
You do not need to restart the app after granting; it notices within a second.
A small keyboard icon appears in your menu bar. That's the whole interface.
Double-tap Esc — keyboard off. The icon turns red and a panel fades in to confirm.
Double-tap Esc again — keyboard back on.
Your mouse and trackpad keep working the entire time, so the menu bar icon is always there as an escape hatch. And quitting the app instantly restores the keyboard — the block only exists while the app is running.
| Item | What it does |
|---|---|
| Turn Keyboard Off / Back On | The same toggle, by mouse |
| Trigger Key | Esc, Right ⌘, Right ⌥, Right ⇧, F13, or any key you record |
| Double-tap Speed | How close the two taps must be — 250 / 400 / 600 ms |
| Show On-screen Confirmation | The "Keyboard Off" panel — turn it off if you find it noisy |
| Open at Login | Start automatically |
| Quit | Exits and restores the keyboard |
Trigger Key → Set Custom Key…
A panel appears; press the key you want. Anything works — letters, function keys, Fn,
Caps Lock, keypad keys, or either side of any modifier (left and right ⌘/⌥/⇧/⌃ are
told apart correctly). The keypress is swallowed while recording, so setting F13
doesn't fire F13 at whatever app is in front of you.
Your recorded key is kept as its own entry — "Custom: F13" — so you can switch between it and the presets without re-recording. The panel gives up after 15 seconds, and Cancel backs out.
Key names follow your active keyboard layout, so Dvorak and AZERTY users see the label printed on their own keycaps rather than a US-layout guess.
Pick a key you don't actually type. The toggle is a double-tap, so choosing a
means typing "aa" kills your keyboard. F13, Right ⌥, and Caps Lock are all good picks.
One Esc still gets through. The first tap of the pair reaches the app you're in;
only the second is swallowed. Catching the first would mean delaying every single Esc
by 400 ms to see whether a second one is coming, which would make Esc feel broken
everywhere. If a stray Esc is a problem for you (vim, modal dialogs), switch the trigger
to a key nothing else claims.
Password fields can't be blocked. Login windows, sudo prompts, and some password managers use macOS secure input, which sits below every event tap by design. Apple reserves that, and no app can intercept it — this one included. Your keystrokes go through normally there.
Nothing gets stuck. The app tracks which key presses it swallowed and swallows the matching releases too, so no app is ever left thinking you're still holding a key. If macOS disables the event tap (it does that on timeout or when secure input toggles), the app re-arms itself automatically.
Nothing is recorded. Keystrokes are inspected in memory and either passed along or
dropped. Nothing is logged, stored, or sent anywhere. There's no network code in this app
at all — read Sources/KeyboardBlocker.swift, it's about 200 lines.
"I granted permission but it still says it needs it." This happens when the app binary changes after the grant — macOS keys the permission to the exact build, so the toggle looks on while the grant is dead. Fix it by clearing the entry and granting fresh:
tccutil reset Accessibility com.kushdaga.clickityclack
open /Applications/ClickityClack.app(install.sh does this for you on every rebuild.)
"Double-tapping does nothing." Check the menu bar icon. If the menu shows the permission warning, see above. Otherwise you may be tapping too slowly — try Double-tap Speed → Relaxed (600 ms).
"I muted my keyboard and can't unmute it." Click the red keyboard icon in the menu bar → Turn Keyboard Back On. Your mouse always works. Worst case, quit the app from that same menu.
The whole thing is one CGEventTap installed at the session level, ahead of every
application:
- While unmuted, every event passes through untouched.
- While muted,
keyDown,keyUp, andflagsChangedall returnnil— the events die before any app sees them. - The trigger key is watched in both states, so the double-tap can always turn the keyboard back on. Modifier triggers fire on the press edge, detected via each key's own device-dependent flag bit so left and right are distinguished properly.
Sources/
main.swift entry point — menu bar only, no Dock icon
AppDelegate.swift status item, menu, preferences, permission flow
KeyboardBlocker.swift the event tap: blocking, double-tap detection, key recording
Keys.swift keycode → name (layout-aware), modifier press-edge detection
KeyRecorder.swift the "press any key" panel
HUD.swift the fading on-screen confirmation
build.sh compiles a universal .app into ./build
install.sh build + install to /Applications + launch
Rebuild after edits with ./install.sh.
rm -rf /Applications/ClickityClack.app
tccutil reset Accessibility com.kushdaga.clickityclack
defaults delete com.kushdaga.clickityclackMIT — see LICENSE. Do whatever you like with it.