You know the moment. You grab a microfiber cloth, drag it across the MacBook, and the screen fills with aaaaaaaaaaa. Something gets renamed. A shortcut fires. Once in a while a file quietly disappears and you find out three days later.
And the smudges? Invisible. A lit screen hides exactly the marks you're trying to remove, so you wipe blind and discover the streaks an hour later in a dark room.
The obvious workarounds don't work:
- Close the lid — now you can't clean the glass.
- Lock the screen — keyboard is still live, you're just wiping crumbs into a password field.
- Shut down — for 40 seconds of cleaning? Come on.
So I wrote WashMyMac. Menu bar app, 0 dependencies, MIT, free.
What it does
Hit ⌃⌥⌘W. Every display goes flat black. Keyboard, trackpad and mouse go dead — including ⌘Space, ⌘Tab, ⌘Q, volume, brightness and trackpad gestures. Wipe as hard as you want. Nothing reaches the OS.
Pure black, not a dimmed desktop and not a screensaver — a flat field where every fingerprint and dust speck actually shows up.
| Action | How |
|---|---|
| Start | ⌃⌥⌘W or menu bar → Wipe My Mac |
| Exit | ⌃⌥⌘U, held 1.5 s |
| Bring the hint back | ⌃⌥⌘ without U |
| Nothing works | auto-exit — 5 minutes out of the box |
The interesting part: an exit a cloth cannot press
Blocking input is easy. Getting out is the design problem — any exit shortcut a human can press, a cloth can press too, by accident, at the worst time.
The rule: ⌃⌥⌘U counts only when exactly those three modifiers and U are down. Not one extra key. A cloth always presses neighbours. It physically cannot satisfy the condition, no matter which direction you drag it. Shift down, or any second letter, and the ring resets to zero.
Plus auto-exit, one to thirty minutes, with deliberately no "never" option. It's the one guaranteed way out and I didn't want anyone turning it off.
Three layers, because macOS hands out input at three depths
| Layer | Blocks | Permission |
|---|---|---|
CGEventTap at session level |
Everything — keys, mouse, scroll, gestures, media keys, system hotkeys | Accessibility |
Window at CGShieldingWindowLevel()
|
Everything routed to the app; covers menu bar, Dock, the notch | — |
NSApplicationPresentationOptions |
⌘Tab, ⌘⌥⎋, Dock, menu bar, Apple menu shutdown | — |
The tap sits at the head of the event stream, ahead of the WindowServer, so it eats system hotkeys before anything else sees them.
Fun side effect: with every event swallowed, macOS becomes convinced nobody is home and starts dimming the display mid-wipe. So there's a DisplayKeeper holding a NoDisplaySleep assertion and declaring user activity every 20 seconds.
Second detail I care about: every layer is owned by the process. Kill the app and the tap dies, presentation options revert, the window vanishes. The lock cannot outlive the thing that created it. No daemon, nothing to get stuck.
There's also a dim pulsing beacon at the bottom once the hint fades — because a fully black display looks exactly like a dead one, and panic is not the feeling you want from a cleaning utility.
What it honestly can't block
macOS limits, not missing features:
- Power button / Touch ID — handled in hardware, sleeps or locks the Mac. Which makes it your emergency exit.
- Secure Input — if the frontmost app has it on (open password field, some terminals), the tap never sees keystrokes. Close it first.
- Caps Lock — LED toggles, keystroke is swallowed.
Install
Grab the .dmg from the latest release, drag it to Applications.
Two gotchas, both from ad-hoc signing:
- macOS blocks the first launch. Open it, let it fail, then System Settings → Privacy & Security → Open Anyway. One time.
- Move it to
/Applicationsbefore granting Accessibility. That permission is tied to the app's path and code hash, so relocating afterwards silently revokes it.
Without Accessibility the app still runs — black screen, dead ordinary keys — but system shortcuts slip through to the WindowServer, so ⌘Space opens Spotlight behind the black screen. The overlay shows an orange warning in that mode.
Or build it yourself:
./build.sh --install # → /Applications/WashMyMac.app
Xcode Command Line Tools is the only requirement. One script assembles the universal binary, the bundle, the localizations and the icon — the icon is drawn in code, so no binary assets in the source tree.
Want to look at the UI without locking yourself out:
/Applications/WashMyMac.app/Contents/MacOS/WashMyMac --preview
Add --unlocking, --beacon or --degraded for the other states.
macOS 13+, Apple Silicon and Intel, English and Russian, no telemetry, no network calls, plain Swift and AppKit.
Repo: github.com/AppsGanin/WashMyMac — a star helps more than you'd think, and issues are open if you break it in a creative way. 🧼


Top comments (0)