Skip to content
← Back to work

AI Assistant

A capture system with no rules engine. Send it anything from your phone; a language model decides what it is and files it. In daily use.

Stack
Python 3.12 · Anthropic Claude · Model Context Protocol · Telegram · Google Calendar/Gmail APIs · hexagonal architecture
My role
Sole engineer — architecture, build, and operation. Running in personal daily use.

Problem

Personal capture tools all fail at the same moment: they make you decide where something goes at the instant you think of it. That is precisely when you have the least patience for filing. A thought arrives while you are driving, or mid-conversation, or at 2am — and the honest options are to interrupt what you are doing and file it properly, or to lose it.

Most tools answer this with structure: more folders, more tags, more required fields. That raises the cost of capture, which is the opposite of what the moment needs. The earlier version of this system answered it with a rules engine — keyword matching and token extraction to guess where a message belonged. It worked until it didn’t, and every failure produced another rule.

Approach

Delete the rules engine. This version sends the raw message to Claude and lets the model return a structured classification. Task, reminder, event, journal entry, dream, note, grocery item — the model reads it the way a person would, and the routing table became data rather than code. It mirrors the workspace’s own routing map, so the assistant’s understanding stays in sync with the system it serves instead of drifting from it.

Three decisions did the real work:

Never lose a capture. Anything the model can’t confidently classify lands in an inbox rather than being dropped. The cost of a misfile is one triage step; the cost of a silent drop is a lost thought. The system optimizes hard for the former, and that asymmetry is deliberate — it is why the thing is trustworthy enough to actually use.

Append-only audit log. Every capture is written as an NDJSON event to a dated history file. The system is fully replayable: you can reconstruct exactly what was captured, when, and where it was routed. When an LLM makes the decisions, being able to audit those decisions after the fact stops being a nice-to-have.

Ports before adapters. Every external system — the filesystem, Google Calendar, the audit log, the model itself — sits behind an abstract port, and business logic depends only on ports. Swapping the LLM or adding an integration means writing an adapter, not touching the core. That discipline is what let the classifier be replaced wholesale without rewriting the application around it.

Outcome

Released and in daily personal use, with two modes over Telegram: free-text capture, and explicit commands for calendar, groceries, a generated morning brief aggregated from across the workspace, and inbox triage.

It is also exposed as an MCP server, so the same task, calendar, and reading-list tools are callable by other agents rather than being locked behind the chat interface — the capability is reusable infrastructure, not a feature of one bot.

The wider point: this is a production LLM system where the model is load-bearing, not decorative. It makes the routing decisions, it is wrapped in guardrails that assume it will sometimes be wrong, and every decision it makes is auditable afterward.

Want the detail behind this one?

Confirm your email on the Ask-my-AI page and you can interrogate the specifics — architecture decisions, trade-offs, what broke.