TCC reprompts on every release — versioned binary path invalidates macOS Privacy grants
Resolved 💬 3 comments Opened May 13, 2026 by kaimintan Closed May 17, 2026
Summary
On macOS, Claude Code installs to ~/.local/share/claude/versions/<version>/. macOS TCC keys file-access grants to the absolute binary path. Every release moves the binary to a new versioned dir, invalidating prior grants. Result: Documents/Downloads/Desktop "Allow" prompts fire on the first directory crossing after each update.
Repro
- Grant Claude Code access to ~/Documents (click Allow on TCC prompt).
- Wait for auto-update (typically 1–3 days).
- Run any command that crosses into ~/Documents.
- TCC prompt fires again — label reads "<version>" (e.g. "2.1.140") because macOS uses the responsible-binary parent-dir name.
Evidence
TCC.db accumulated 24 stale grant rows across 10 Claude Code versions (2.1.119 → 2.1.140) over ~7 days on my machine.
sqlite3 ~/Library/Application\ Support/com.apple.TCC/TCC.db \
"SELECT COUNT(*), client FROM access WHERE client LIKE '%/.local/share/claude/versions/%' GROUP BY client;"
Returned 11 distinct versioned paths, all valid grants but only the current version's are reachable.
Suggested fix
- Stable wrapper binary at a fixed path (e.g.
~/.local/bin/claude) that execs the versioned binary. TCC grants the wrapper, which never moves. Currently~/.local/bin/claudeis a symlink — but TCC resolves symlinks at grant time and stores the target path, so it doesn't help. - Alternative: ship as a macOS .app bundle at
/Applications/Claude Code.app— TCC then keys grants to bundle ID, which is stable across versions.
Workaround
Grant Full Disk Access to the parent terminal (Terminal.app or iTerm) — Claude Code inherits its TCC permissions.
Env
- macOS Darwin 25.4.0
- Claude Code 2.1.140 (also seen on .119, .121, .123, .126, .128, .129, .131, .133, .137, .138, .139)
This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗