Install

Clean-macOS install for other devs. Assumes you have admin on the machine and command-line comfort. About 10 minutes end-to-end, most of which is granting permissions.

Install flow — verification gates in green, decision in orange.

1 · Prerequisites

Four things have to be on the machine before anything else:

ToolWhyInstall
uvPython package manager. Drives rbridge + venv.brew install uv
bd (beads)Issue tracker — source of truth for the Beads lane.See beads-kanban for the install path.
gitClone this repo.Bundled with Xcode CLT: xcode-select --install
Reminders.appThe control surface. Pre-installed on macOS.Already there. Just open it once so iCloud registers the calendar store.
Voice and Sessions lanes are independent. If you only want voice mailboxes or session triggers, you can skip bd — the daemon does not require any beads project to be registered. Doctor will flag it but won't refuse to run.

2 · Clone

cd ~/Documents/development      # or anywhere; this is a personal location
git clone git@github.com:doublej/reminders-beads-bridge.git
cd reminders-beads-bridge

3 · Install Python deps

uv sync

This creates .venv/ and installs the two PyObjC frameworks (EventKit, Cocoa) plus dev tools. Takes ~30s on a warm cache.

4 · Run doctor

uv run rbridge doctor

Three things get checked:

5 · Grant permissions

If doctor flagged Reminders permission, the dialog has already fired once. macOS sometimes loses the request — open it manually:

open "x-apple.systempreferences:com.apple.preference.security?Privacy_Reminders"

Find uv (or your shell process) in the list and toggle it on. Also check Privacy & Security → Automation → your terminal app should have a checkbox for Reminders.

If doctor still fails after granting permission, the cached approval might be stale. Toggle the permission off then on again, or run tccutil reset Reminders and re-run doctor — macOS will re-prompt cleanly.

6 · One-shot sync

uv run rbridge sync

Prints the number of visible projects reconciled. If you have a ~/.beads-kanban-projects.json, you should see new Beads: <project> lists appear in Reminders.app within a second. If you don't have one yet, this just creates the four control lists (! Beads: Readme, Beads: Projects, Beads: Settings, Beads: Activity) and exits clean.

7 · Install the launchd agent

The repo ships a plist template under launchd/. Two paths inside it are absolute — you need to adjust them to your machine before loading.

# Copy + edit
cp launchd/com.jurrejan.reminders-bridge.plist ~/Library/LaunchAgents/com.<you>.reminders-bridge.plist
$EDITOR ~/Library/LaunchAgents/com.<you>.reminders-bridge.plist

Replace inside the copied plist:

Then load:

launchctl load ~/Library/LaunchAgents/com.<you>.reminders-bridge.plist

8 · Verify

tail -f ~/Library/Logs/reminders-bridge.log

You should see a sync cycle line every 5 seconds. Open Reminders.app — the ! Beads: Readme list sorts to the top.

Updating

cd ~/Documents/development/reminders-beads-bridge
git pull
uv sync
launchctl unload ~/Library/LaunchAgents/com.<you>.reminders-bridge.plist
launchctl load   ~/Library/LaunchAgents/com.<you>.reminders-bridge.plist

Uninstalling

launchctl unload ~/Library/LaunchAgents/com.<you>.reminders-bridge.plist
rm ~/Library/LaunchAgents/com.<you>.reminders-bridge.plist
rm -rf ~/.claude/reminders-bridge-state.json \
       ~/.claude/reminders-bridge-sessions.json \
       ~/.claude/reminders-bridge-captures.json \
       ~/.claude/voice-mailboxes/
# Lists in Reminders.app stay — delete them by hand if you want them gone.

Optional: install rbridge as a global CLI

If you want to invoke rbridge from anywhere (handy for rbridge mailbox open from inside a Claude Code session in a different repo):

uv tool install /Users/<you>/Documents/development/reminders-beads-bridge

Re-run with --force --reinstall after pulling updates.

Troubleshooting

SymptomFix
Doctor fails with "Reminders permission denied" repeatedly.tccutil reset Reminders, re-run doctor, accept the dialog.
launchd loads but log is empty.Check launchctl print gui/$(id -u)/com.<you>.reminders-bridge for last exit status. The PATH or HOME env var in the plist is the usual culprit.
Reminders appear briefly then disappear.iCloud is fighting the daemon. Make sure the calendar source is "On My Mac" (or iCloud, consistently) — mixed sources cause delete/recreate cycles. Settings → Reminders.app → Default List.
bd: command not foundBeads not on PATH. If you don't need beads sync, ignore — voice and sessions still work.

Once it's running, head to voice mailboxes or sessions for the lanes that don't need any beads setup.