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

  1. Grant Claude Code access to ~/Documents (click Allow on TCC prompt).
  2. Wait for auto-update (typically 1–3 days).
  3. Run any command that crosses into ~/Documents.
  4. 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/claude is 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)

View original on GitHub ↗

This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗