macOS permissions¶
chatwire requires two macOS privacy grants to function. Both must be given to the specific Python binary that chatwire runs as — the path shown in chatwire doctor.
Quick summary¶
| Permission | Required | Purpose |
|---|---|---|
| Full Disk Access | Yes | Read ~/Library/Messages/chat.db |
| Automation → Messages | Yes | Send messages via AppleScript |
| Contacts | Recommended | Resolve phone/email → display names |
| Accessibility | No | Not used by chatwire |
Both critical permissions must show ✓ in chatwire doctor before the bridge can relay messages.
Full Disk Access¶
Why it's needed¶
~/Library/Messages/chat.db is in a TCC-protected directory. Without Full Disk Access, the Python process gets "permission denied" when it opens the database — and the bridge sees no messages.
How to grant (macOS 13 Ventura and later)¶
- Open System Settings → Privacy & Security → Full Disk Access
- Click the lock icon at the bottom-left and authenticate
- Click + (add)
- In the file picker, press
Cmd+Shift+Gand paste the path to the Python binary: - pipx install:
~/.local/pipx/venvs/chatwire/bin/python3.13(adjust minor version) - python.org + pipx:
/Library/Frameworks/Python.framework/Versions/3.13/bin/python3.13 - uv:
~/.local/share/uv/tools/chatwire/bin/python3.13 - Homebrew:
/opt/homebrew/bin/python3(Apple Silicon) or/usr/local/bin/python3(Intel) - Toggle the entry on (blue checkbox)
- Return to the terminal and run
chatwire doctor
How to grant (macOS 12 Monterey)¶
Same process, but the app is called System Preferences (not System Settings). Navigate to System Preferences → Security & Privacy → Privacy → Full Disk Access.
Finding the exact binary path¶
Run chatwire doctor — it prints the Python binary path in the "Python" check line. That path is the exact binary that needs FDA.
If you don't have chatwire installed yet, use this to find the pipx venv Python:
Automation → Messages¶
Why it's needed¶
The bridge sends iMessages via AppleScript:
The Automation permission allows the Python binary to control Messages.app via Apple Events.
How to grant¶
- Open System Settings → Privacy & Security → Automation
- Find your Python binary in the list and expand it
- Check the box next to Messages
If Python doesn't appear in the list yet, trigger the first prompt:
- Open Script Editor (in Applications/Utilities)
- Paste and run:
tell application "Messages" to get every service - macOS will show a permission dialog — allow it
- Python should now appear in the Automation list
Verify¶
Contacts (recommended)¶
Without Contacts access, chatwire shows raw phone numbers and email addresses instead of display names. The bridge functions correctly, but the web UI is harder to use.
How to grant¶
- Open System Settings → Privacy & Security → Contacts
- Find your Python binary and toggle it on
chatwire reads the Contacts database directly from:
This is a read-only file access — chatwire never modifies Contacts.
The TCC identity problem¶
macOS TCC tracks each Python binary as a distinct identity using its code signature and path. This means:
- A python.org Python binary and a Homebrew Python binary are different identities, even on the same machine.
- Granting FDA to python.org's Python does not grant FDA to Homebrew's Python.
- Upgrading Python to a new minor version (3.12 → 3.13) creates a new binary path — you must re-grant.
Checking which binary needs the grant¶
Look for the line:
The binary path is what needs the grant, not the version number.
After upgrading Python¶
If you install a new Python version and the old one is no longer at the same path:
- Run
chatwire doctorto see the new binary path - Go to System Settings → Privacy & Security → Full Disk Access
- Remove the old entry (toggle off, then click
-) - Add the new binary path with
+ - Repeat for Automation → Messages
- Restart the bridge:
launchctl kickstart -k gui/$(id -u)/dev.chatwire.bridge
TCC reset (troubleshooting)¶
If you need to start fresh with permissions:
# Reset Full Disk Access grants
tccutil reset SystemPolicyAllFiles
# Reset Automation grants
tccutil reset AppleEvents
These commands remove all FDA or Automation grants for all apps — not just chatwire. After resetting, re-grant the permission to the chatwire Python binary.
Note: tccutil reset may require disabling SIP (System Integrity Protection) on some macOS versions. Use it only when the normal grant process isn't working.
Setup wizard permissions step¶
The web setup wizard at http://127.0.0.1:8723/setup shows the current permission status and has Open Settings buttons that deep-link to the correct pane. The wizard page auto-polls every 30 seconds, so once you grant a permission and return to the browser, the check turns green automatically.
See First run for the full wizard walkthrough.