A lean, agent-agnostic email assistant harness. Your LLM agent (Hermes, Claude Code, Codex, Pi, ...) is the brain; sift is the plain-English config, the deterministic scripts, and the memory files it needs to triage your inbox every day.
No app. No database. No vector store. Files, a CLI, and a cron.
- Triages your inbox on a schedule, sends you a digest on Slack or Telegram
- Drafts replies in your tone (into your Drafts folder, it NEVER sends)
- Tracks reply-zero: who you owe a reply, who owes you
- Bulk unsubscribe and archive of newsletters you never read
- Blocks cold email
- Accepts/declines calendar invites inside your working hours
- Meeting briefs before events, built from your email, calendar, and its memory
- Learns: people, projects, tone, and rules live as markdown files it maintains
- It never sends email. Drafts only. Structurally, not just by prompt.
- It is not a service. It runs on your machine, on your cron, with your keys.
- An agent CLI: Hermes,
claude,codex, or anything that can run a prompt with shell access - gws for Gmail + Google Calendar (v1 is Gmail-only; IMAP backends welcome)
- A Slack or Telegram bot token for the digest DM
Any agent CLI (Hermes, Claude Code, Codex): clone this repo, then ask your agent to run the setup wizard (below). Cron calls runners/run.sh; set agent: in config.yaml.
Claude Code plugin: /plugin install <this-repo>, ships the sift skill plus /sift-setup and /sift-triage commands. Cowork/cloud sessions with scheduled tasks can run /sift-triage on a schedule; connect the Gmail/Calendar and Slack connectors, or use gws + notify.py as below.
Claude Desktop (manual mode): no shell cron. Connect the Gmail/Google Calendar and Slack connectors, add ASSISTANT.md as project instructions, and say "triage my inbox" when you want a pass. With Cowork's scheduled tasks, point a recurring task at the same instruction for an automated digest.
Ask your agent to run the setup wizard:
<your-agent> "Read skills/setup.md in this repo and walk me through setup."
It will interview you, set up Google auth, write config.yaml and memory/rules.md, bootstrap memory/tone.md from your sent mail, and install the cron.
- Homebrew formula is
googleworkspace-cli, NOTgws(brew install gwsgives you an unrelated git tool whose binary is also named gws). - Headless/agent hosts have no keychain: set
GOOGLE_WORKSPACE_CLI_KEYRING_BACKEND=fileandGOOGLE_WORKSPACE_CLI_CREDENTIALS_FILE=~/.config/gws/credentials.jsonin the shell profile. - To move an existing auth to another machine:
gws auth export --unmasked > credentials.jsonon the authed machine, copy it plus~/.config/gws/client_secret.jsonover, chmod 600. No browser needed on the target. - On Hermes hosts, skip
scripts/notify.pyand the runners/ cron: create a Hermes cron job whose prompt points at ASSISTANT.md and let its final response deliver to your Slack/Telegram DM (--deliver). - Start with
calendar.mode: report-onlyin config.yaml; flip to live after you trust a few digests.
ASSISTANT.md the brain: triage procedure, safety rails, memory maintenance
config.yaml your settings (created by setup; see config.example.yaml)
memory/ what it knows: people/, projects/, tone.md, rules.md
scripts/ deterministic plumbing (state ledger, unsubscribe)
runners/ one-line shims per agent CLI, used by cron
state.json reply-zero ledger + seen message ids
Reply to any digest message in plain English: "that wasn't urgent", "always archive these", "be more formal with her". It appends the correction to memory/rules.md or the person file. Memory is git-tracked; git log memory/ shows everything it ever learned, git revert undoes it.
MIT