docs/platforms/mac/permissions.md
macOS permission grants are fragile. TCC associates a permission grant with the app's code signature, bundle identifier, and on-disk path. If any of those change, macOS treats the app as new and may drop or hide prompts.
dist/OpenClaw.app).Ad-hoc signatures generate a new identity every build. macOS will forget previous grants, and prompts can disappear entirely until the stale entries are cleared.
Prefer granting Accessibility to OpenClaw.app, Peekaboo.app, or another signed
helper with its own bundle identifier instead of a generic node binary.
macOS TCC grants Accessibility to the code identity of the process it sees. If a
Homebrew, nvm, pnpm, or npm workflow causes a shared node executable to
receive Accessibility, any JavaScript package launched through that same
executable may inherit GUI automation privileges.
Treat a node entry in System Settings as broad permission for that Node
runtime, not as permission for one npm package. Avoid granting Accessibility to
node unless you trust every script and package launched through that exact
Node install.
If you accidentally granted Accessibility to node, remove that entry from
System Settings -> Privacy & Security -> Accessibility. Then grant the signed
app or helper that should own UI automation.
tccutil and try again.Example resets (replace bundle ID as needed):
sudo tccutil reset Accessibility ai.openclaw.mac
sudo tccutil reset ScreenCapture ai.openclaw.mac
sudo tccutil reset AppleEvents
macOS may also gate Desktop, Documents, and Downloads for terminal/background processes. If file reads or directory listings hang, grant access to the same process context that performs file operations (for example Terminal/iTerm, LaunchAgent-launched app, or SSH process).
Workaround: move files into the OpenClaw workspace (~/.openclaw/workspace) if you want to avoid per-folder grants.
If you are testing permissions, always sign with a real certificate. Ad-hoc builds are only acceptable for quick local runs where permissions do not matter.