Home / Projects / Email Triage

Email Triage

A Claude-powered email triage system that categorizes, scores, and drafts replies across every Gmail and Outlook account you connect. Built for people whose inbox is the bottleneck.

Category  AI · Productivity Stack  TypeScript · React 19 · Postgres · Redis LLM  Anthropic Claude Status  Live in staging

The problem

Most knowledge workers don’t have an email problem — they have a triage problem. The signal is in the inbox, but it’s buried under newsletters, notifications, polite no-thanks, and threads that have already concluded without anyone deciding to close them. The cost of fixing this with rules is high; the cost of delegating is higher. We wanted something that read every message, decided what mattered, and saved a draft reply when one was obvious.

What we built

Email Triage connects to one or more Gmail or Outlook accounts via OAuth and continuously syncs new messages into Postgres. A worker queue (Bull on Redis) feeds each thread to Claude with a prompt tuned for short, deterministic JSON output: category (one of seven), priority (1–10), summary, and an optional draft reply.

The frontend is a React 19 PWA with TanStack Query. It works offline once seeded, sends push notifications when something high-priority lands, and groups inbox views by AI-assigned category. Stripe handles billing on a per-account-per-month plan. Passport.js fronts the OAuth flows.

The AI angle

The interesting work isn’t the prompt — it’s everything around it. We log every Claude call against the email, the model version, the temperature, and the user’s eventual override (did they re-categorise, did they actually send the draft). That gives us an evaluation set that grows by itself, which we re-run nightly against new prompt candidates before we ship them. The gap between a good AI feature and a great one is whether you can answer the question “is this prompt better than yesterday’s?” with data instead of vibes.

How it’s used

  • Solo founders connect their personal and business Gmail and let the priority score decide what gets opened first.
  • Customer support teams use the categoriser as a pre-filter before email even reaches the helpdesk.
  • Anyone with three+ inboxes uses the unified view and stops switching tabs.

What it taught us

That LLMs are good enough at email categorisation that the bottleneck moved to the boring stuff — OAuth refresh tokens, Gmail’s push subscription quirks, Outlook’s pagination, push notification permissions on iOS PWAs. Half the codebase is plumbing that earns no podium time but decides whether the product feels reliable. That layer now lives in our shared infrastructure for every product that follows.