Problem
During an active job search my inbox mixed recruiter screens, assessment deadlines, calendar nudges, and newsletter noise. I kept missing time-sensitive threads because everything looked equally urgent in a flat list.
Who it is for
Individual contributors and job seekers who need a fast triage pass before they write. Recruiters visiting julianrieder.com get a safe sample queue with no Gmail connection.
What it does
The copilot classifies each message into act now, follow up, waiting, or noise, explains why in plain language, and drafts a short reply for high-priority buckets. Owner unlock adds paste mode, local session persistence, exports, and optional API enhance without changing public demo behavior.
How I built it
Next.js App Router UI with triage logic in TypeScript. Local embeddings plus a logistic and kNN ensemble classify messages without a paid LLM API. Drafts are template maps keyed by message id for the sample corpus, with fallbacks for pasted mail.
Tradeoff: local models are cheap and auditable, but calibration and promotional noise remain active research areas.
Error analysis (in-house held-out)
Internal regression only (not published as headline metrics).
Representative mis-buckets from the in-house eval set. Most mistakes are follow-up vs waiting vs act-now collisions when marketing keywords or deadline phrases appear without real urgency.
email-6: expected follow-up, got act-nowinb-021: expected follow-up, got act-nowinb-025: expected act-now, got waitinginb-036: expected act-now, got waitinginb-043: expected act-now, got waiting
Next steps: add a second pass with lightweight embeddings for ambiguous threads, and downgrade act-now when the body says no action needed or auto-pay is on.
Limitations and next steps
- No live mailbox sync by design (privacy and demo safety).
- Pasted emails depend on a simple delimiter format.
- Newsletter and promotion recall needs more boundary training.