Lock every input on your Mac so you can clean the screen and keyboard without shutting down. Open WipeShield, click Start Cleaning Mode β the screen goes pure black, and every keystroke, trackpad gesture, mouse move, scroll and media key is dropped at the system level. Press esc when you're done. That's it.
You want to wipe your MacBook's screen or keyboard, but:
- you don't want to shut down, and with the system lock screen any key press wakes the display and types into the password field;
- a stray key leaves garbage in the document you're editing;
- a stray trackpad swipe triggers pinch-zoom in the screen-sharing window you left open.
WipeShield covers every display with a pure-black shield and discards all input events β nothing lights up, nothing gets typed, nothing leaks to any app.
| WipeShield | KeyboardCleanTool | pristine_screen | LUCE | |
|---|---|---|---|---|
| Blocks keyboard | β | β | β | β |
| Blocks mouse / trackpad / scroll / gestures | β | β | β cursor flies around | β (mouse is the unlock) |
| Blocks media keys (brightness / volume / backlight / playback) | β | β | β | β |
| Full-screen black shield | β | β screen stays on | β | β |
| Exit | single esc key |
hotkey combo | β | click a button |
| Prevents sleep / screensaver / auto-lock | β | β | β | brightness check only |
| Fail-safe (never "fake locked") | β | β | β | partial |
| Auto-exit on lid close | β | β | β | β |
| Launch-and-click + global hotkey | β β₯βK | β | β | β |
| Native, zero dependencies | β ~750 KB universal | β | Flutter | SwiftUI |
| Minimum macOS | 10.15 | β | unknown | 14 |
| Open source | β MIT | β | β | β |
"Fail-safe" means: if the input blocker ever becomes invalid (permission revoked, system policy), WipeShield immediately ends cleaning mode and tells you, instead of leaving a black screen that looks locked but isn't.
Download WipeShield-<version>-universal.zip from Releases, unzip, and drag WipeShield.app to /Applications.
- Builds are ad-hoc signed (no Apple Developer certificate yet), so on first launch: right-click the app β Open β Open. After that it opens normally.
- Requires macOS 10.15 or later. Universal binary (Apple Silicon + Intel).
Blocking system input requires the Accessibility permission (every tool in this category needs it):
- On first launch WipeShield shows a guide β click Open System Settings;
- In System Settings β Privacy & Security β Accessibility, allow WipeShield;
- Back in the dialog, click Granted, Retry.
| Action | Effect |
|---|---|
Open app β Start Cleaning Mode (or β₯βK anywhere) |
Screen goes black, all input blocked |
Press esc |
Exit cleaning mode, back to the main window |
| Power key | Native system behavior (short press = sleep dialog, hold = shutdown) |
| Close window (red button) | App stays in the Dock; click the Dock icon to bring the window back |
βQ |
Quit |
While cleaning, the app holds a power assertion so the display never sleeps, the screensaver never starts, and auto-lock never kicks in. Closing the lid or putting the system to sleep automatically ends cleaning mode, so you can't get stuck behind the shield.
~1,000 lines of dependency-free Swift:
- Input blocking β a session-level
CGEventTap(head-insert) subscribes to all event types and applies a whitelist:esctriggers exit; the power key (NX_KEY_TYPE_POWER) passes through; everything else is dropped β including media keys (NX_SYSDEFINED, subtype 8), trackpad gestures, pressure and tablet events. A disabled tap is re-enabled, or cleaning mode is terminated β never a "fake lock". - Visual shield β one borderless, pure-black window per display at screen-saver level (1000), joining all Spaces (including full-screen apps), rebuilt automatically when displays change.
- State keeping β
IOPMAssertionCreateWithName(PreventUserIdleDisplaySleep)blocks sleep/screensaver;NSWorkspace.willSleepends the session as a safety net.
- Touch Bar (2016β2019 MacBook Pro): the Touch Bar is separate hardware; touching it still lights it up (the input itself is blocked).
- Notification banners may float above the shield; enable Do Not Disturb while cleaning.
- System-level gestures like three-finger desktop swipe are handled below the session event tap and may still work.
- "Launch at Login" is macOS 13+ only.
- Distributing outside Releases with your own Developer ID requires re-signing + notarization.
No network access, no data collection, no third-party code. The entire codebase is readable in an afternoon.
Requirements: Xcode Command Line Tools (xcode-select --install).
./scripts/build.sh # build universal WipeShield.app (icon, dual-arch, lipo, sign)- The build script auto-deploys to
/Applicationsand stops a running instance; setSKIP_DEPLOY=1to skip (CI does). - It signs with a local certificate named WipeShield Dev if present (so the Accessibility permission survives rebuilds β see
scripts/create_cert.sh), otherwise falls back to ad-hoc. - Automated-test safety net:
WipeShield.app/Contents/MacOS/WipeShield --self-test <seconds>exits cleanly after N seconds;--self-test-startadditionally triggers the start path once.
Releases are built by GitHub Actions (.github/workflows/release.yml) on tag push.