Why I built it
AI agents like Claude and Codex ask for Device Control, Screen Recording, and Local Network access so they can work your Mac for you. They need it while they work, but macOS leaves every switch on until you go back into System Settings and turn each one off, three panes deep. I kept forgetting. Revoke puts all of those switches in the menu bar and turns them off for you.

What it does today
- Shows who has access: one row per app, with a switch for Device Control, Screen & Audio, and Local Network. The lock in the menu bar is open while an agent still has access.
- Takes it back in one click: switch an app off, or use Revoke All Watched. Apps from Anthropic and OpenAI are watched by default, and you can add any other.
- Or on its own: when an agent quits, after a time limit, or when the Mac sleeps or the screen locks.
- Blocks the local network: a network filter keeps a revoked app off your router, NAS, and other devices, including commands the agent runs, like
curlorssh. The internet keeps working. - Cleans up after deleted apps: macOS keeps permissions for apps that are gone or were replaced by a new version, and Revoke clears them.

How it's built
- Native. AppKit and SwiftUI, plus a NetworkExtension content filter that runs as a system extension. It only sees connections bound for your local network.
- Uses what Apple ships. Revoking goes through Apple's own
tccutil. Revoke reads the permissions list with Full Disk Access but can't write to it, because macOS doesn't let any app. - Offline. No account, no updater, and no telemetry. The filter drops connections and nothing else; settings stay on your Mac.
- Strict by default. Swift 6 with complete concurrency checking, every warning an error, and every release signed with a Developer ID and notarized by Apple.
What it can't do
- Grant access. macOS keeps that for System Settings, so switching access on opens the right pane, and you approve it there.
- Stop Bonjour discovery. macOS looks for devices on an app's behalf, so the filter can block connecting to them but not always finding them.
On Windows
Revoke for Windows does the same job from the notification area, but Windows gates far less: any app you run can read the screen and drive other apps without asking. So instead of taking back a permission, Revoke stops the app and everything it started, like Claude Code sessions, Codex's helpers, and MCP servers.
- One switch per lever: running, opening at sign-in, the Windows services agents install, screen capture, camera, microphone, location, and the network.
- Closes what agents opened: Claude installs a service that runs as LocalSystem, starts with Windows, and lets any device on your network connect to it. Revoke can stop it, set it to start only when Claude needs it, and switch off its firewall rules.
- No admin unless it needs it: privacy and startup switches are yours to change. Services and firewall rules go through an optional helper that only makes changes that tighten things or undo its own.
- Same rules: no account, no updater, nothing leaves the PC, and every warning an error. It isn't code-signed yet, so Windows names an unknown publisher.


Try it
On a Mac, with Homebrew:
brew install --cask benjweaver/revoke/revokeOr download the zip from Releases and move Revoke to Applications. Give it Full Disk Access when it asks, and install the network filter from its settings.
On Windows, in PowerShell:
irm https://raw.githubusercontent.com/benjweaver/revoke-windows/main/packaging/windows/install.ps1 | iexIt needs no admin rights, and checks the download before installing it. Or download the zip from Releases and run Revoke.exe. Both are free software under the GPL.