all apps

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
or Download .dmg

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.

red tap / clack. Gateron Ink Red. Linear and smooth, with a quiet, rounded bottom-out.
brown thock. Drop Holy Panda. Deep tactile, dark and rounded, with a full bottom-out.
blue CLICK. Kailh Box Navy. Tactile and clicky, and the loudest and sharpest of the five.
black clack. Gateron Ink Black. Heavy linear, a substantial bottom-out with a firm clack.
yellow creamy. NovelKeys Cream. Smooth, creamy linear. Even and unfussy.

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.

0%Undampened. Full high-frequency energy, sharp transient, a long ring.
25%Lightly dampened. Softened transient, top end pulled back a little.
50%Noticeably smoother. Reduced sharpness and resonance, fuller and rounder.
75%Strongly softened. Highs substantially reduced, very little ring left.
100%Heavily dampened. Soft attack, filtered highs, minimal ringing — a muffled thud.

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

macOS26 or later
chipApple silicon
permissionAccessibility, once. Without it the app runs, and makes no sound
lives inThe menu bar. There is no Dock icon
licenceMIT. Free, and the source is on GitHub

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

  1. Download the .dmg and open it.
  2. Drag MechKeys into Applications.
  3. 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.

  1. Double-click MechKeys, and click Done on the warning.
  2. Open System Settings → Privacy & Security and scroll down to Security. It now says “MechKeys was blocked to protect your Mac.”
  3. Click Open Anyway, authenticate, and confirm.
Why this is safe to click past
  • 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.txt beside it. Run shasum -a 256 on 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.
Being straight with you about the limit: the checksum proves your download is the file that was published, not who published it. Anyone able to publish a release to that repository could ship code to every install. That is true of any app distributed without notarisation, and it is the honest reason to read the source if it matters to you.

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.

Accessibility Asked on first launch. It is what allows the listen-only event tap that reports that a key was pressed. Without it, no sounds at all — profiles, Test Sound and every setting still work.
Login item Starts the app when you log in, if you turn on Launch at Login. Without it, start it yourself.
Why Accessibility, and why there is nothing smaller to ask for
  • macOS has exactly one door, and this is it. Learning that a key was pressed in another application means creating a CGEventTap, and macOS gates CGEvent.tapCreate behind 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. KeyEvent has 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 CGEventTap at 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 UserDefaults key. 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.
Changed your mind? System Settings → Privacy & Security → Accessibility → MechKeys. Turning it off stops the sounds and nothing else; the rest of the app carries on.

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.

ad-hoc signed First launch refused. And the Accessibility grant is lost on every update, because an ad-hoc signature changes with each build, so every new copy is a different app as far as macOS is concerned.
self-signed What is published today. First launch is still refused the same way — but it is the same signature in every release, so the Accessibility permission you grant once survives updates instead of quietly disappearing.
notarised Needs the paid membership. The dialog becomes the ordinary “…is an app downloaded from the Internet. Are you sure?” with an Open button, and the permission survives. Nothing else about the app changes.

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.