gvago/sift

Lean, agent-agnostic email triage assistant. Your LLM agent is the brain; sift is the config, scripts, and memory files. Never sends email.

★ 0Forks 0PythonGitHub ↗Compare

README

sift

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.

What it does

  • 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

What it is NOT

  • 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.

Requirements

  • 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

Install

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.

Setup

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.

Install notes (learned the hard way)

  • Homebrew formula is googleworkspace-cli, NOT gws (brew install gws gives you an unrelated git tool whose binary is also named gws).
  • Headless/agent hosts have no keychain: set GOOGLE_WORKSPACE_CLI_KEYRING_BACKEND=file and GOOGLE_WORKSPACE_CLI_CREDENTIALS_FILE=~/.config/gws/credentials.json in the shell profile.
  • To move an existing auth to another machine: gws auth export --unmasked > credentials.json on the authed machine, copy it plus ~/.config/gws/client_secret.json over, chmod 600. No browser needed on the target.
  • On Hermes hosts, skip scripts/notify.py and 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-only in config.yaml; flip to live after you trust a few digests.

Layout

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

Correcting it

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.

License

MIT

Contributors

gvago

Issues