Skip to content

Latest commit

 

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Clickity Clack

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


Why this exists

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.

Install

Option A — download the app

  1. Grab ClickityClack.zip from the latest release.

  2. Unzip it and drag ClickityClack.app into your Applications folder.

  3. 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

Option B — build it yourself

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.sh

That compiles a universal binary, installs it to /Applications, and launches it.

Then: grant Accessibility permission

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.

Using it

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.

Menu options

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

Using your own key

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.

Things worth knowing

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.

Troubleshooting

"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.

How it works

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, and flagsChanged all return nil — 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.

Uninstall

rm -rf /Applications/ClickityClack.app
tccutil reset Accessibility com.kushdaga.clickityclack
defaults delete com.kushdaga.clickityclack

License

MIT — see LICENSE. Do whatever you like with it.

About

A macOS menu bar app that switches your keyboard off on demand — double-tap Esc to keep clacking while you think, without typing anything.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages