Alexandria
The paper mail arrives, gets scanned, and disappears into a folder nobody opens. Alexandria reads it, files it, and puts the things with deadlines in front of me at eight in the morning — without a single page leaving the house.
- Role
- Sole author & architect
- Status
- Running daily
- Built
- 2026
- Runs on
- Local hardware only
What it does
A document scanner drops PDFs onto a network share. From there the pipeline is automatic:
- Read it. Scanned pages are images, not text, so every page goes through on-device OCR.
- Classify it. A local language model decides what kind of document it is — a bill, a notice, a statement, junk.
- File it. The document is renamed and filed where it belongs.
- Extract the obligation. If there is a due date or an amount, it becomes a structured fact with a date attached.
- Surface it. A morning briefing lists what is due, what changed, and what needs an answer.
Alongside the mail pipeline it keeps a searchable index of personal documents, triages email into what actually needs a reply, and proposes calendar entries and tasks.
The decision worth explaining
The first version asked the language model to decide whether something deserved an alert. It was wrong in a way that took a while to see: the model would read a notice with no due date printed on it and produce one anyway — a plausible date, correctly formatted, entirely invented. It would also give different answers to identical inputs, even with the sampling temperature set to zero.
A language model can read, summarize, and suggest. It does not get to decide that something is urgent.
Anything that raises an alert needs a rule in code — something I can read, test, and point at when it misfires.
So the alerting logic moved out of the prompt and into a deterministic parser with tests around it. The model still does what it is genuinely good at: turning a wall of scanned text into a short, readable summary. The part that wakes me up is code.
That split is the whole design philosophy, and it is the part I would want to talk about in an interview. A system that is confidently wrong about a deadline is worse than no system, because you stop checking.
Privacy was a constraint, not a feature
This thing reads tax documents, medical bills, and bank statements. That ruled out every hosted model before the first line was written.
- Inference is local. Models run on hardware I own. No document text is sent to an external service.
- OCR is on-device using the operating system's own vision framework — fast, accurate, and offline.
- Nothing writes to my calendar without me. The assistant proposes; I approve; then it acts. There is no path where it books something on its own.
- The API surface is tested for it. There is a test module whose only job is to check that the endpoints fail closed.
Deadline tracking
The module I use most watches for job-posting notification emails and turns them into tracked items with their real filing deadlines, a submission checklist, and a flag for whether I am actually eligible to apply. It is a small, unglamorous parser. It is also the reason I have not missed a filing date.
The same machinery handles bills: a due date extracted from a scanned notice becomes a dated fact, and dated facts show up in the briefing before they are late rather than after.
How it was built
I specified and directed this system, working with AI coding agents to implement it — I own the architecture, the guardrails, and the decision about what counts as done. The front-end work across my projects is my own; for Python services like this one, my contribution is the design, the constraints, and the judgment about what the system is allowed to do. That distinction matters to me, so I state it rather than letting a reader assume.
The discipline that makes the approach work is the same one that makes any delegation work: know what you are asking for, know what correct looks like, and do not accept output you cannot test.
Honest limits
- It is built for exactly one user on one machine. It is not multi-tenant and was never meant to be.
- The local models are small. They summarize well; they are not asked to reason about anything consequential, for the reason described above.
- OCR on a bad scan is still a bad scan. Low-contrast and skewed pages are the usual failure.
- Classification of unusual documents needs correcting more often than I would like. The filing is a suggestion I can override, not a verdict.
Seeing the code
The repository is private — it is wired into my own accounts and documents, so publishing it is not something I can meaningfully do. If you are evaluating me and want to look at the code or walk through the architecture, ask me and I will arrange read access or a screen share.