A macOS menu bar app that suppresses input from specific HID pointing devices -- solving the ghost-touch / rogue touchscreen problem.
External touchscreens can send phantom touch events -- ghost taps, erratic cursor movement, or unwanted clicks. macOS provides no built-in way to disable a specific pointing device without physically unplugging it.
Untouchable sits in your menu bar and lists every HID pointing device connected to your Mac. Toggle any device off and its events are completely suppressed at the IOKit level. No phantom touches, no erratic cursor. Toggle it back on and input resumes instantly.
- Enumerates all HID pointing devices (mice, trackpads, touchscreens, digitizers) including built-in trackpads
- Per-device suppression toggle -- seized devices produce zero events system-wide
- Remembers blocked devices across launches (persisted in UserDefaults)
- Auto-reapplies suppression on launch, device reconnect, and system wake
- Live connect/disconnect detection
- TCC permission status: warns in the menu bar when Input Monitoring permission is missing
- Single-instance enforcement: prevents ghost touches from competing seizures
- Runs silently in the menu bar (no Dock icon, no window)
- Launch at Login support
Download the latest .dmg from Releases, drag to /Applications, and launch.
Release builds are Developer ID-signed and notarised by the maintainer; contributors can build and run unsigned locally. See RELEASING.md.
git clone https://github.com/lotech/Untouchable.git
cd Untouchable
./scripts/build.shThe interactive build menu lets you:
+---------------------------------------+
| Untouchable Builder |
+---------------------------------------+
| 1) Pull latest from GitHub |
| 2) Open in Xcode |
| 3) Build (Release) |
| 4) Build (Debug) |
| 5) Install to /Applications |
| 6) Build + Install (Release) |
| 7) Pull + Build + Install |
| 8) Launch Untouchable |
| 9) Clean build directory |
| 0) Quit |
+---------------------------------------+
Just run ./scripts/build.sh with no arguments to get this menu -- the flags
(--pull, --open, --build, --install, --clean, --reset-tcc) are
optional shortcuts for CI/scripting and are never required.
build.sh is for local development (build and run on your own Mac).
Publishing a signed, notarised release for users is a separate, maintainer-only
flow in scripts/release.sh -- see RELEASING.md.
- macOS 13.0 (Ventura) or later
- Xcode 15+ to build from source
- Input Monitoring permission (macOS will prompt on first launch)
- Enumerate --
IOHIDManagermatches all HID devices with usage pages for mice, pointers, touchscreens, and digitizers. - Seize -- For blocked devices,
IOHIDDeviceOpenis called withkIOHIDOptionsTypeSeizeDevice, giving Untouchable exclusive ownership. The OS receives zero events from the seized device. - Discard -- A no-op input callback is registered (required by IOKit) that simply drops all events.
- Release --
IOHIDDeviceCloserestores normal input instantly.
Blocked devices are stored as VendorID:ProductID strings in UserDefaults and re-applied automatically on launch.
Untouchable/
App/
UntouchableApp.swift # @main, MenuBarExtra entry point
AppDelegate.swift # NSApplicationDelegate lifecycle
HID/
HIDDevice.swift # Model: vendor, product, name, blocked state
HIDDeviceManager.swift # IOHIDManager wrapper, enumeration, callbacks
HIDEventSuppressor.swift # Seize/release exclusive device ownership
UI/
MenuBarView.swift # SwiftUI menu content
AboutView.swift # About window and view
Settings/
AppSettings.swift # UserDefaults persistence
LoginItem/
LoginItemManager.swift # SMAppService wrapper
Untouchable requires Input Monitoring permission to enumerate and seize HID devices. macOS will prompt you the first time the app runs. You can manage this in System Settings > Privacy & Security > Input Monitoring.
The app does not:
- Collect or transmit any data
- Log keystrokes or input events
- Require network access
- Phone home in any way
See CONTRIBUTING.md for guidelines.
MIT -- free to use, modify, and distribute.
