Reminders.app rendered as an industrial control panel — lists shown as LCD-style displays, daemon switches and gauges around the edges, with HOST UNDER FULL CONTROL displayed in the central readout.
macOS daemon · v0.1

rbridge

Apple Reminders as a control surface.

One daemon that turns Reminders.app into a workspace for Beads issues, Claude Code / Codex sessions, and voice exchanges with Claude Voice. Same surface, three lanes, zero new UI to learn.

install
# clone + install + launch $ git clone git@github.com:doublej/reminders-beads-bridge.git $ cd reminders-beads-bridge && uv sync $ uv run rbridge doctor # verify permissions $ uv run rbridge run # or load the launchd plist

Three lanes, one surface

Each lane is independent. Use any without the others.

Beads sync

One Reminders list per beads project, one reminder per issue. Edit notes on your phone, check it to close, add a reminder to file a bug.

Sync cycle →

Sessions

Two reminders lists fire claude / codex sessions: interactive Ghostty, headless capture, or multi-turn chat right inside the reminder body.

Session modes →

Voice mailboxes

The project agent composes a brief, the daemon drops it in Voice: <slug>, the user walks with the voice agent, responses come back as reminders.

Voice flow →

The shape of the system

Three roles, two devices, one iCloud-synced calendar store. The daemon brokers everything on the Mac side; on iOS, Claude iOS drives Reminders directly through native reminder_*_v0 tools.

iCloud bridges the iOS and macOS calendar stores; rbridge sees both via EventKit on the Mac.

The dashed lines are asynchronous — iCloud delivers reminders at its own pace (seconds to minutes depending on network). The daemon's 5-second poll is what bounds visible latency on the Mac side.

Why Reminders.app

Three properties no other UI gives you for free on Apple devices:

Always there

Pre-installed on every Mac, iPhone, iPad. No login, no app to launch, no battery cost beyond what's already running.

iCloud-synced

Edits propagate cross-device with zero infrastructure. Add a bead from your phone in airplane mode — it lands when you reconnect.

Scriptable

EventKit on macOS gives a stable Python / PyObjC binding. Reminders are objects with titles, bodies, priorities, completion flags, and a changed notification.

The cost: no real-time push channel from the daemon to iOS — the in-process EKEventStoreChanged notification only fires for local edits on the host Mac. Hence the 5-second poll. For a personal control surface, that's well under the "feels instant" threshold.

Where to go next

Get it running

Clean-macOS install: prerequisites, clone, doctor, launchd. About 10 minutes.

Install →

Read the daemon

Module map, ownership boundaries, what the sync cycle does every 5 seconds.

Architecture →

See it in action

Three end-to-end scenarios — capture from iPhone, voice walk, chat session.

Scenarios →