I have three Google accounts, two Microsoft tenants, five Slack workspaces, six GitHub orgs, and one calendar app that shows me one account at a time. the failure mode is boring: a lunch gets booked over a standing sync in a different account, nobody notices until both are happening. or an email that actually needed me sits under forty that didn't.
what I wanted wasn't another dashboard. I wanted to be interrupted only when it matters, get one message in the morning that lays out the day, and be able to answer that message and have things happen. so I built it, and today it's a plugin: sentinel.
the shape
every watcher is the same loop: poll a source every few minutes, remember what you've seen in a little sqlite file, and only page on things you haven't. first run is a silent baseline, so installing it doesn't detonate a hundred alerts. alerts batch, quiet hours hold rather than drop, and if the phone is unreachable they queue in an outbox and arrive marked (delayed).
four ship in the box:
calwatch— Google, Microsoft, or any ICS feed. pages on a new or changed event that conflicts with another, across all accounts. it knows that an invite mirrored into two accounts isn't a conflict, that a three-day trip isn't a meeting, and that your lawn-watering reminders don't block your time.mailwatch— Gmail and Graph. cheap rules drop promo/social/noreply noise, then oneclaude -pcall triages what's left into urgent / reply / fyi / noise. urgent pages you; reply goes in the brief.ghwatch— GitHub notifications viagh. mentions, assignments, review requests, comments on your threads, and newly opened issues in repos you care about. CI chatter ignored.slackwatch— as many workspaces as you have, user token, read-only. DMs and @mentions.
the hub merges them into one morning message. sections for watchers you haven't configured just don't appear. the calendar section includes prep notes written by Claude from the actual event bodies — the first one it wrote for me said "Flight lands Austin 11:15am CDT — lunch at Soto starts 11am, you'll already be late." which was correct, and which no calendar app would ever tell you.
reply to act
the alerts land on my phone, so the obvious next step was to let me answer them. anything I send to the same channel goes to a headless claude -p session on my workstation, with all my MCP servers and the watcher CLIs, one session per day so a bare "yes" refers to the last thing it proposed.
the first test I ran was "what do I have Tuesday, anything conflicting?" it answered correctly and then flagged, unprompted, that I had two flights to Austin two days apart. I said "yes look at that." it went into Gmail, found the Southwest change email, explained that a stale hand-made event was still sitting on the old date, and asked before deleting anything.
that last part is the whole design. the agent runs with permissions bypassed, because "act on my behalf" means exactly that. the guardrail is one rule in the system prompt: reads and self-only actions are free; anything that reaches another person is drafted and needs an explicit yes. say "just do it" in the original message and it skips the confirmation. it's a small rule and it's held up.
your own watcher in one file
the thing I actually wanted to preserve wasn't the four watchers, it was the pattern. so sentinel new draftwatch scaffolds a package where you write three functions — fetch, alert, brief — and everything else (baseline, dedupe, batching, quiet hours, outbox, CLI, brief and agent registration) is already there. there's a Claude Code skill that knows the whole workflow, so in a fresh session "set up a sentinel for my fantasy football league" is enough.
delivery
my own setup texts me through my phone on the session mesh, but the default for everyone else is ntfy: free push, no account, install the app and subscribe to a topic. a second topic is the reply channel. Pushover, Slack, email and desktop are there too. and a note from experience: on a Pixel, self-texts ride RCS and are invisible to Termux's SMS list, so sentinel can poll several inbound channels at once and you keep whichever one your phone honors.
install
/softwaresoftware:install sentinel then /sentinel:setup. python 3.11 with uv, the claude CLI, and whatever sources you feel like connecting — GitHub is zero-config, ICS feeds need a URL, Google/Microsoft/Slack are a one-time OAuth. daemons register through the daemon capability, so it survives reboots on Linux, macOS, and Windows. everything runs on your machine; the tokens never leave.
source and docs: github.com/softwaresoftware-dev/sentinel. site: sentinel.softwaresoftware.dev.