Claude Code plugin · alerts, morning brief, reply-to-act

Watchers that page you.
One morning brief.
Reply to act.

sentinel watches your calendars, inboxes, GitHub and Slack in the background and only interrupts you when something actually needs you. Every morning you get one message with the day laid out. And because it lands on your phone, you can text back — a headless Claude with your tools does the work and answers in the same thread.

07:00 · sentinel🧭 Tuesday Aug 18 📅 3 events, 1 all-day · 11:00 lunch overlaps Arctype Sync 11:30 · you land 10:15, lunch at 11 — tight 📧 0 urgent, 2 need reply · Tim: Re: Four Two 🐙 12 assigned, 1 review waiting 💬 quiet
11:42 · sentinel📧 Urgent mail • Nicole Abel: flight change for Thursday — needs a yes by 3pm
11:44 · youtell her yes to the 8am, and add it to my calendar
11:45 · ClaudeDrafted to Nicole: "Yes to the 8am on Thursday, thanks!" — reply yes to send. Calendar hold added Thu 8:00–10:15.
11:45 · youyes
11:46 · ClaudeSent. Hold is now a confirmed event.

What's in the box

Four watchers, one hub, and a scaffolder for the rest.

WatcherSourcesPages you whenIn the brief
calwatchGoogle (any number of accounts), Microsoft 365, any ICS feeda new or changed event conflicts with another — across all accounts. Mirrored invites, all-day items, multi-day trips and reminder calendars don't count.today's agenda plus Claude prep notes: unanswered invites, in-person locations, back-to-back, deadlines hiding in descriptions
mailwatchGmail (multi-account), Microsoft GraphClaude triages new mail as urgent — a person waiting, a deadline, money, security. Cheap rules drop promo, social and newsletter noise first.what needs a reply from the last 24 h, threads collapsed
ghwatchGitHub notifications via ghmention · assigned · review requested · comment on your thread · new issue or PR in repos you care about. CI noise ignored.open issues assigned to you (freshest first, with age), reviews waiting, mentions
slackwatchany number of Slack workspaces (user token, read-only)DMs, group DMs, @you, keywords you chooseDMs and mentions per workspace
sentinel— (the hub)—merges everything into one message at your brief time, retries alerts from an outbox when your phone is unreachable, runs the reply-to-act agent
sentinel new …anythingyou decide, in ~30 lines of Pythonauto-added
1morning message, not five. Sections for watchers you haven't configured simply don't appear.
0alerts on first run. Every watcher baselines silently, then only pages on things it hasn't seen.
22:30–06:30quiet hours by default. Alerts are held, not dropped, and arrive when you're up.

Reply to act

Text it back. Claude does the work.

Anything you send to the alert channel — a push topic or a text to your own number — is handed to a headless claude -p session running on your machine with your MCP servers (calendar, mail, chat, code hosting, the phone itself) and the watcher CLIs. One conversation per day, so "yes", "no" and "send" refer to whatever it last proposed. It answers in the same thread, short enough to read on a phone.

Reads and self-only actions: just done

"What's on Tuesday, anything conflicting?" · "Decline the 11:30." · "Label everything from that recruiter." · "Why do I have two flights to Austin?" — it reads your real data and answers with what it found, not what it guessed.

Anything that reaches another person: drafted first

Email, chat, invites, review comments — it shows the exact text and recipient and waits for your "yes". Say "just do it" in the original message and it skips the confirmation. That rule is the safeguard for running with permissions bypassed, which is what acting on your behalf needs.

Your own watcher

"Set up a sentinel for my fantasy league."

Say that in Claude Code and the /sentinel:new skill scaffolds a package where you edit exactly one file. Baseline, dedupe, batching, quiet hours, outbox retry, CLI, and registration into the brief and the agent are already handled by the engine.

# draftwatch/source.py — the only file you write
def fetch(cfg):            # the current window of items, each with a stable "key"
    ...
def alert(item, cfg):      # one-line reason to page NOW, or None
    return "you're on the clock" if item["mine"] and item["on_the_clock"] else None
def brief(items, cfg):     # a few plain-text lines for the morning message
    ...
by hand
sentinel new draftwatch --title "Draft" --emoji "🏈"

Delivery

Wherever you actually look.

The default is ntfy: free push notifications with no account — install the app, subscribe to a topic, done. Post to a second topic from the same app and that's your reply channel. If your phone is already on the session mesh, alerts can be real SMS and your self-texts are commands.

ntfy push (default)SMS via your own phonePushoverSlackemaildesktop

Install

Two commands in Claude Code.

The setup skill asks who you are and how to reach you, sends a test, walks through only the sources you want, and registers the daemons so everything survives a reboot — Linux, macOS, and Windows.

1 · install the plugin
/softwaresoftware:install sentinel
2 · configure
/sentinel:setup
first time on this machine? add the marketplace
claude plugin marketplace add softwaresoftware-dev/softwaresoftware-plugins

Needs Python 3.11+ with uv and the claude CLI; gh for GitHub. Sources are optional and independent — GitHub is zero-config, ICS calendar feeds need a URL, Google, Microsoft and Slack need a one-time OAuth. Details in docs/accounts.md. Everything runs locally; your tokens never leave your machine.