Inbox Zero with AI — The Field Guide

I went from 37,000 unread emails (plus Linear issues and LinkedIn correspondence) to a handful of items, and I stay there, by triaging with an AI agent instead of reading everything myself.


1. The problem is triage, not writing

The problem is not “writing emails.” An AI that drafts your emails saves you minutes. The real cost of a founder’s inbox is triage: thousands of messages where 99% are newsletters, receipts, notifications, and cold pitches, and the dangerous 1% — a lawyer waiting on a signature, an investor question, an intro — is buried in between.

Working with Claude Code, the human almost never has the AI send email on their behalf (drafts are always reviewed, and most replies the human still writes personally). Instead the AI does the part humans are terrible at:

  • Reads everything — every one of tens of thousands of messages gets classified; nothing is skimmed past.
  • Applies your standing rules — “always trash this sender,” “always surface customer signals,” — consistently, forever.
  • Surfaces a numbered list of only the items that genuinely need a human decision, each with a real summary (amounts, deadlines, links, who’s waiting).
  • You issue verdicts in a single prompt like this (The numbers refer to email threads in a numbered list): 

    1 arc (means archive), 2 del (means delete), 3 todo (means add to my todo list), 5 dra (means draft a reply), 7 imp (means move to important inbox in superhuman), 9 det (means more details).

    Requests for “more details” trigger the AI to re-read the actual thread and report the current state.
  • AI executes your one-word verdicts — you reply “3 arc, 4 del, 7 dra, 9 todo,” and it happens.
  • Captures obligations into a todo file so archiving an email never means losing the commitment inside it.
  • The same loop then works on your todo backlogLinear inbox, and LinkedIn correspondence — any pile of items too big to face.

Result: inbox at zero, a todo list triaged from hundreds of stale items down to a few dozen live ones. The human spends their time on verdicts and real replies, not on reading.

It’s RELAXING. Instead of hustling through a list, you sit back and relax and consider what truly needs doing for each important situation, and how to approach it.

2. How a triage session works

The rhythm is a propose → approve → execute loop, repeated at whatever altitude you’re working at:

  1. Sweep. The AI enumerates everything in scope (full pagination — never just the first page) using read-only tools. For big sweeps it fans out subagents to classify in parallel.
  2. Classify. Every item gets a proposed action: archive (concluded, informational), trash (promos, spam, spent notifications), todo (contains an obligation — capture it self-contained, then archive), or surface (needs your reply or decision — never auto-archived).
  3. Auto-handle the standing rules. Categories you’ve pre-authorized (“calendar invites → trash, they’re in my calendar app”; “this sender → always delete”) execute without asking. Everything else waits.
  4. Present one numbered list. Each surfaced item gets a summary that leads with the concrete facts: dollar amounts, deadlines, action links, names and emails. Numbers are stable so you can answer in shorthand.
  5. You issue verdicts in a single message: 1 arc, 2 del, 3 todo, 5 draft a reply, 7 move to important, 9 more details. Requests for “more details” trigger the AI to re-read the actual thread and report the current state (often discovering an item is already resolved, or more urgent than it looked).
  6. Delegation is a triage verdict. Many “todos” are really someone else’s job — the verdict is “Slack this to them and ask if they’ll own it,” and the AI sends it (drafts of external email are always shown first; internal Slack messages you dictate get sent directly). You never copy and paste and massage an email into slack message or a linear ticket — you just tell your AI to do that.
  7. Execute + iterate. The AI executes exactly what you directed, and you repeat on the next slice. Early sessions are long (the backlog); steady-state sessions are minutes.
  8. Learn. At the end of a session, the AI proposes new standing rules based on the decisions you made (“you deleted this sender three times — want an always-trash rule?”). The rulebook compounds; every session gets shorter.

3. Setup, step by step

(a) Claude Code

  1. Install: npm install -g @anthropic-ai/claude-code (or the native installer from Anthropic’s docs).
  2. Run claude in a terminal, sign in with your Anthropic account (Pro/Max subscription or API billing).
  3. That’s it — Claude Code is a terminal agent that can run commands, read/write files, and (next step) talk to your email.

(b) Superhuman Mail MCP (the polished-email layer)

Optional but excellent if you use Superhuman: it gives Claude clean thread reading, split (Important/Other) awareness, draft composition in your voice, and safe archive/trash operations.

  1. Have a Superhuman account on the mailbox you want to triage.
  2. In Claude’s connector settings (claude.ai → Settings → Connectors), add Superhuman Mail (https://mcp.mail.superhuman.com/mcp) and complete the sign-in. Connectors added there are available inside Claude Code too.
  3. To triage a second mailbox, ask Claude to run Superhuman’s add_account — it returns a link; open it, sign into the other account, approve. (Links expire in 10 minutes.)

(c) Gmail CLI (the bulk-operations layer)

The MCP is great for reading and polished drafts; for bulk clearing thousands of messages you want direct Gmail API access. Don’t write this yourself — paste this to Claude Code:

Build me a single-file Python Gmail CLI at ~/email/gmail (no dependencies beyond stdlib) that authenticates via OAuth (Desktop-app credentials JSON from Google Cloud Console, scope gmail.modify, tokens cached in ~/.gmail_api/tokens.json with auto-refresh). Support a GMAIL_ACCOUNT=<name> env var for multiple accounts (tokens.<name>.json). Commands: inbox [max]search "query" [max]message <id>archive <id>read <id>trash <id>reply <id> <body>send <to> <subj> <body>bulk-archive (batchModify, ids from args or stdin, 1000/call), bulk-trash (per-message loop — batchModify is unreliable for TRASH), and raw GET/POST <endpoint>. Also write ~/email/setup_gmail_auth.py that runs the one-time OAuth flow via a localhost redirect.

One-time Google setup: create a project in Google Cloud Console → enable the Gmail API → create OAuth credentials of type “Desktop app” → download the JSON to ~/.gmail_api/credentials.json → run the setup script and approve in the browser. Repeat per account.

(d) The ~/ai_todo/ directory

This is the triage home. Everything lives together so a session launched from here auto-loads the rules:

~/ai_todo/
  CLAUDE.md            ← one line: @triage.md
  triage.md            ← your rulebook (template below)
  todo.md              ← operational todos
  how-to.md            ← notes on which tool to use for what (Claude maintains this)
  .claude/settings.json ← pre-approved permissions so triage runs prompt-free
  <saved attachments>  ← files pulled from emails, each referenced by a todo

Suggested .claude/settings.json (adjust the path to your CLI):

{
  "permissions": {
    "allow": [
      "Bash(~/email/gmail message *)",
      "Bash(~/email/gmail search *)",
      "Bash(~/email/gmail inbox *)",
      "Bash(~/email/gmail raw *)",
      "mcp__claude_ai_Superhuman_Mail__get_thread",
      "mcp__claude_ai_Superhuman_Mail__list_threads",
      "mcp__claude_ai_Superhuman_Mail__list_splits"
    ]
  }
}

(Only read-only operations are pre-approved. Sends, archives, and trashes still prompt — or run under the propose-then-approve workflow.)

(e) todo.md

Start it as a skeleton; triage fills it:

# AI TODO

# 1. SALES
# 2. LEGAL & CORPORATE
# 3. FINANCE
# 4. CUSTOMER SUCCESS
# 5. HIRING & TEAM
# 6. PRODUCT & ENGINEERING
# 7. PERSONAL

Category headers in ALL CAPS; each captured todo must be self-contained (names, emails, links, deadlines, amounts — never “see the email”).

(f) The rulebook: triage.md

Claude Code auto-loads a file named CLAUDE.md from the directory you launch it in. To keep the rulebook readable under its own name, make CLAUDE.md a one-liner that imports it:

@triage.md

Then put all rules in triage.mdThis file is the whole system. It encodes your judgment, and it grows: end every session by asking Claude to propose rule updates based on the decisions you just made.

(g) A redacted triage.md template (adapt every bracketed placeholder)

# Email & Todo Triage Rules

## Mandate
**INBOX ZERO IS THE MANDATE — "leave the pile" is NEVER an option.** Drive the
inbox to literally zero by appropriately treating every single message: archive
it, trash it, capture it as a todo, or surface it for my reply/decision (and
after I reply, archive it). Never propose stopping with a residual pile. This
applies to every connected account. Inbox zero means zero threads READ and
unread — sweep on `in:inbox`, not `is:unread`.

## Approval policy — propose, then I approve
Claude PROPOSES; I approve. Never archive, trash, create a todo, or send/reply
autonomously — classify everything, QUEUE the actions, present ONE numbered
list (sender, subject, proposed action), and execute only what I direct.
Exceptions: the standing auto-handle rules below run without asking.

**ALWAYS show me any draft email (reply or new message) BEFORE sending. Never
auto-send.** This applies to subagents too.

**After sending ANY reply, immediately ARCHIVE that thread** (sending
re-surfaces it into the inbox — a reply isn't done until the thread is archived).

**Draft tone: warm but professional and courteous.** No breezy filler. When
sharing a scheduling link use exactly: "Here is my scheduling link if that is
convenient for you: [YOUR-SCHEDULING-LINK]".

## Numbering & summaries
- Assign a globally-unique number to every surfaced item; never reuse numbers
  within a session. Keep the number→thread map in a scratchpad file.
- Summaries lead with the key facts, never vague one-liners: dollar amounts,
  deadlines, reference numbers, names + emails, and ACTUAL action/signing links
  (DocuSign etc.) pasted in — withhold a link only if it looks like phishing.
- KEEP SURFACED ITEMS UNREAD — classify with metadata-only reads so surfaced
  threads stay visible in my unread view.

## Shorthand commands for email N:
- "N arc" — archive + mark read
- "N del " — trash
- "N todo" — write a self-contained todo (todo = todo + archive, always both)
- "N see" — print the email verbatim with context; don't archive
- "N lea" — leave it, no action
- "N sch" — draft a reply offering my scheduling link (show me before sending)
- "N quo" — quote the whole thread, stripped of boilerplate
- "N det" — re-read the live thread and report details of the current state

## Classification rules
QUEUE FOR ARCHIVE:
- Concluded threads (last substantive message is mine, or a pure pleasantry)
- Work handed off to a teammate
- Receipts, payment confirmations, calendar accept/declines, system notices
- E-sign COMPLETED/void/expired receipts; e-sign REQUESTS get a todo with the
  actual signing link first, THEN archive (I sign from the todo)
- Meeting recaps → mine action items assigned to ME into todo.md, then archive.
  Meeting PREP emails have no todos — archive without mining.

QUEUE FOR TRASH:
- Promos, cold pitches, newsletters, travel deals, financial product pitches
- Security alerts (sign-in notices, password resets), OTP codes, spent notices
- LinkedIn promotional digests ("people you may know", "N new invitations",
  "who viewed your profile"). BUT LinkedIn is a real inbound channel for me:
  SURFACE genuine person-to-person DMs and connection invites from legitimate
  people (personal note, real shared context, someone I plausibly met live —
  cross-check names against my recent calendar/conferences). TRASH recruiter
  and cold-sales invitations. When in doubt, SURFACE.

SURFACE (never auto-archive):
- Threads awaiting my reply or decision
- Critical customers, investors, advisors, and lawyers with an open ask
  (list them BY NAME here — keyword searches miss them):
  - [CUSTOMER-1, contacts…]  - [INVESTOR-1, email…]  - [LAWFIRM, emails…]
- ANY key customer signal — even inside automated support buckets. Never archive without surfacing.
- Anything genuinely ambiguous — leave it in place and list it.

## Standing auto-handle rules (these OVERRIDE the approval policy)
- Calendar notifications split → TRASH without asking (events live in my calendar)
- News/newsletter split → TRASH without asking
- Docs-comment notifications → summarize for me, then archive
- [SENDER-X] → always TRASH   ·   [LIST-Y] → always archive
- [Add one every time you repeat the same verdict three times]

## Tools (adapt to your stack)
- MCP for reading threads cleanly and for archive/trash (mark_done + mark_read)
- CLI for sending and for BULK operations: `~/email/gmail …`
- Bulk clears: Gmail batchModify (archive, 1000 ids/call); trash per-message
  (batchModify is flaky for TRASH). batchModify only touches the ids you pass —
  expand multi-message threads first.
- Replying on a FORWARDED thread goes to the forwarder, not the original
  sender — send a NEW email to the real address instead.
- CLI sends are immediate with no undo — hence: always show drafts first.
- Slack API can't see Slack Connect (external) users or post to shared
  channels — a failed user search never means "not on Slack"; use a draft or email.

## Todos
- Self-contained (all info needed to act, never "go back to the email")
- todo = todo + archive, never double-list
- Attachments saved to ~/ai_todo/ are always paired with a todo referencing
  the file path, and vice versa

## End of session
Review what happened and propose new rules for this file based on the
patterns and decisions made during the session.

(h) Everything else worth knowing

  • Linear inbox: same loop works. Give Claude a Linear API key (env var), and it can pull your notifications via GraphQL, summarize each @mention with issue context, post your dictated replies, and bulk-mark read. Ask Claude to set it up; add the learned commands to triage.md.
  • LinkedIn: there’s no good API for personal accounts. The pattern that works: (1) forward LinkedIn notification emails to the account Claude triages, and rule-file how to sort real humans from noise; (2) periodically request your LinkedIn data export (Settings → Data privacy → Get a copy of your data) — Connections.csvInvitations.csv, and messages.csv let Claude answer “how do I know this person?” and “who did I meet at that conference?” definitively.
  • Privacy & safety: this setup gives an AI read/write access to your entire mailbox. Use it on a machine you control, keep OAuth token files private (chmod 600), pre-approve only read-only commands, and keep the human-approval rule for anything destructive or outward-facing. The always-show-drafts rule is the single most important line in the file.
  • Multiple accounts: the pattern scales — one rulebook, per-account sections for account-specific standing rules, GMAIL_ACCOUNT=<name> for the CLI, acting_email for the MCP.
  • Expectations: the first session is hours (that’s the 37,000). After the backlog is gone, a daily/weekly sweep is minutes: the standing rules handle ~90% automatically and you issue a dozen one-word verdicts on the rest. The compounding asset is triage.md — treat it like code, and let Claude propose diffs to it at the end of every session.
  • Archiving is reversible; trash is not (after 30 days). When bulk-clearing, archive by default and reserve trash for true junk — and always protect-scan for real people before any bulk action.