MechKeys
Mechanical keyboard sounds for macOS. Choose what switch your Mac sounds like, then decide how acoustically dampened it feels. It lives in the menu bar, and it never records what you type.
curl -fsSL https://theysap.com/install/mechkeys | bash
Your Mac, with a keyboard worth listening to
MechKeys plays a short mechanical keypress sound for every key you press, anywhere in macOS: Safari, Terminal, VS Code, Slack, Notes, a Spotlight query.
The sounds are recordings of real switches, not synthesised approximations. Five profiles, each with its own transient, body and ring, and a dampening control that models packing a keyboard with foam and gaskets rather than simply turning it down.
Different keys sound different. The spacebar is pitched down and rattles like a stabilised key, Return is heavier, Delete and Tab sit in between. Modifiers sound too, a little deeper than a letter, and there is a switch for them if that wears thin. Each category has its own level and pitch trim, and can be turned off entirely.
It does not sound like a loop. Five separate recordings of an ordinary key, never the same one twice in a row, with up to ±2 dB of level and ±18 cents of pitch on each press. Turn variation to zero and it means it: the same sample, every time.
Five switches to sound like
Each profile is recorded from a real switch. The names identify the recording; MechKeys is not affiliated with or endorsed by any manufacturer.
One slider, six things at once
This is the part that is not just a preset picker. It models packing a keyboard with foam, silicone and plate gaskets, and it is neither a delay nor a volume control.
Underneath, one slider position drives six DSP parameters: a low-pass that sweeps logarithmically from 19 kHz down to 1.25 kHz, a high shelf, a parametric cut aimed at that profile’s own ring, a low-mid shelf that puts body back, gentle compression, and transient softening applied to the sample itself. All six are exposed under Advanced if you want to set them by hand.
Measured on the shipping signal chain, end to end: the proportion of energy above 3 kHz falls from 0.56 to 0.0007, nearly three orders of magnitude, monotonically, while the level only drops to about half, and the sound still starts in the very first sample. Those three properties are asserted by tests on every run, because “not a volume control” and “not a delay” are claims that are easy to make and easy to quietly break.
Requirements
Installing
One line. It checks this Mac can run MechKeys, verifies the download against the checksum published beside it, and puts the app in Applications.
curl -fsSL https://theysap.com/install/mechkeys | bash
Installed this way, nothing is blocked on first launch: macOS attaches its quarantine flag to what a browser downloads, not to what curl fetches, so the app opens straight away. Do read it before piping it into a shell: that URL serves the script as plain text, and it is the same file that lives in the repository. MECHKEYS_VERSION pins a version, and MECHKEYS_NO_LAUNCH=1 skips the launch at the end.
Or install it by hand
- Download the .dmg and open it.
- Drag MechKeys into Applications.
- Open it from Applications, then follow the step below, once.
That first launch is blocked. Here is how to get past it
A .dmg downloaded in a browser carries the quarantine flag, so macOS will refuse to open what is inside it, with “Apple could not verify ‘MechKeys’ is free of malware…”, offering only Done and Move to Bin.
To be plain about what that means: macOS is not reporting that it found anything. It is reporting that it cannot tell who built the app. MechKeys is signed, but not notarised, because notarising requires a paid Apple Developer ID. The signature is self-issued, so Gatekeeper refuses, exactly as designed. The Control-click → Open shortcut that used to bypass this was removed in macOS 15.
- Double-click MechKeys, and click Done on the warning.
- Open System Settings → Privacy & Security and scroll down to Security. It now says “MechKeys was blocked to protect your Mac.”
- Click Open Anyway, authenticate, and confirm.
- The warning is about identity, not content. macOS is not saying it found anything in the app. It is saying it cannot tell who built it, because the build is not notarised, and notarisation needs a paid Apple Developer Program membership, not a different app.
- The source is public and MIT licensed. Every line the app runs is in the repository, including the build script that produces the release and the tests that hold the audio claims on this page to account.
- Releases are built by GitHub Actions from that source, not uploaded from anyone’s laptop, and every .dmg ships with a
SHA256SUMS.txtbeside it. Runshasum -a 256on your download and compare; the installer does exactly that before it puts anything in Applications. - It asks for one permission, and it is the obvious one. Accessibility, so it can be told that a key went down. No microphone, no Screen Recording, no Camera, no Full Disk Access. See what it asks for below for what that permission can and cannot see.
Or, in one line. This is exactly what those steps amount to, removing the quarantine flag macOS attached to the download:
xattr -dr com.apple.quarantine /Applications/MechKeys.app
This is a first-launch problem only. MechKeys checks for a newer release a few seconds after launch and every six hours after that, and tells you only when there is one. Download & Restart fetches the disk image, checks it against the SHA256SUMS.txt published with the release, refuses it if they disagree, and puts it in place. Your settings and your Accessibility permission both survive. Turn the check off in Configure → General if you would rather it never reached the network on its own.
What it asks for
One permission, and it is unavoidable. The other is optional, and refusing it costs you only the convenience it buys.
- macOS has exactly one door, and this is it. Learning that a key was pressed in another application means creating a
CGEventTap, and macOS gatesCGEvent.tapCreatebehind Accessibility. There is no narrower permission, no “keypress timing only” entitlement, and no supported alternative. An app that makes a sound when you type has to ask for this or do nothing. - The tap is created listen-only. macOS will not let a listen-only tap modify, block or inject keystrokes even if it tried to. It is told a key went down; it cannot answer back.
- The character never leaves the callback. Inside it, the keycode becomes one of six categories — standard, space, enter, backspace, tab, modifier — and then goes out of scope. What reaches the audio system is that six-case value.
KeyEventhas three fields and nowhere to put a character, so nothing downstream can log one. Switching MechKeys off does not mute it; the tap is torn down. - The App Sandbox is deliberately off, because a sandboxed process is not permitted to create a
CGEventTapat all. The hardened runtime is on. That is the trade the tap forces, and it is worth knowing about rather than burying. - Nothing else is asked for. No microphone — MechKeys plays audio, it does not record any. No Screen Recording, Camera or Full Disk Access; it reads its own bundle and writes one
UserDefaultskey. One network request, to ask GitHub for its own latest release tag, which you can switch off in Configure → General. No identifiers, no analytics, no crash reporting, no account.
The Apple Developer Program is the missing piece in both of these
The blocked first launch and the Accessibility permission are usually met as two unrelated annoyances. They are the same fact wearing two hats: macOS decides who an app is from its code signature, and a signature Apple has not vouched for is treated accordingly in both places.
That vouching is notarisation, and notarisation needs a paid Apple Developer Program membership. Signing on its own has not been enough since macOS 10.15.
So the signature you are being asked to trust is doing real work already: it is the reason a MechKeys update does not silently cost you the permission it needs to make any sound. What it is not doing is buying Apple’s countersignature, which is a membership fee rather than anything about the code. The build and the release workflow already do the whole of notarisation — signing, stapling, importing the certificate on a clean CI runner — the moment the repository is given the right secrets, and TECHNICAL.md has the exact steps.