← Personal System

The mail & calendar system

My mailbox is triaged twice a day, so the inbox only ever holds what actually needs me. Triage runs in layers. Cheapest first. Rules on the mail server act at the moment of delivery, before my laptop is even involved. Then a deterministic rules engine (plain Python, no model in it) handles the obvious - known senders swept on fixed lists, with the people who matter checked first so a rule can never bury someone important, newsletters deleted recoverably, promotions and receipts filed. Only what survives all of that reaches judgement, which reads the full thread properly and decides whether I have already replied, whether it needs a reply, a task, or nothing at all.

What comes out the other side is a dashboard rather than a pile. Everything still outstanding sits in one place - replies drafted and ready for me to check, tasks created from whatever needs doing, and an awaiting view of threads where I have replied and am waiting on the other person. Filed and deleted mail is still logged day by day. Nothing disappears without a trace.

It never sends anything, and that is a design choice. Every reply the system writes is prepared as a draft in Outlook, in my own voice, threaded exactly as if I'd clicked reply myself, and left there for me to read, edit and send. Every call the system makes to my mailbox has every send action explicitly blocked, regardless of what else that call is allowed to do. The only way an email actually leaves is me pressing send. A system that drafts well is useful, whereas a system that sends on its own is a liability I don't want however good the drafts get.

The mailbox access itself is deliberately narrow. The connectors are custom-built MCP servers for Outlook, because the off-the-shelf options for a Microsoft 365 mailbox are far thinner than Gmail's and none of them offered what this setup needed most, which was permissions split finely enough to withhold sending entirely. Building them myself made that split possible. Reading, filing and drafting are separate capabilities, and the send capability simply isn't granted to the triage system at all, so the no-send rule is enforced by what the system can reach and not by asking it nicely. My university address forwards into the main mailbox and is swept into its own folder on arrival, so one triage covers both lives.

Corrections make it better over time rather than needing a rebuild. If I keep marking a sender's mail the same way, that sender graduates into the automatic rules and stops needing a judgement call at all. If I correct where something got filed, or the tone of a draft, that correction is recorded and applied going forward, so the system needs fewer judgement calls the longer it runs.

Threads with people in my network log themselves against those people automatically. A separate daily process scans mail threads, matches the senders against the people I already track, and writes a dated note for each thread linked to the right person so it shows up on their page. The same account access also feeds my calendar into the daily surfaces, which means meetings, tasks and mail all arrive in one place each morning instead of three separate checks.