Every other project here is a prototype arguing for something. This one is software two people depend on. It runs in production on Fly.io, it wakes a phone up at 6:30am with a briefing, and if it breaks, someone in the house misses a dentist appointment.
Built with Lia Martinez — 76 of 116 commits are mine, mostly the agent layer, the local-model routing, and the voice capture; the product direction was shared.
The decision
One shared thread, not two assistants. Both adults and the agent are in the same conversation, and either person can see what the other asked it. That sounds like a small architectural choice and it is the entire product. A private assistant per person produces two divergent models of the household and no shared memory. A shared thread means the answer to “did anyone book the car service” exists in one place.
The second decision was routing by cost, not by capability worship. Suggestion chips, auto-titles and intent classification try a local Qwen 3B first and fall back to Haiku; only the main conversation always goes to Sonnet. Every inference is logged to a table so the routing can be evaluated rather than assumed. A household tool that costs meaningful money per day gets deleted.
What it cost
Specialist agents — @Dear for journalling, @Chef for meals, @Tutor for homework — each seemed obviously good and each added a way for the thread to feel crowded. They are now toggleable in settings, which is an admission that we could not decide.
The bigger cost is that the product is inseparable from the household. It knows names, schedules, a child’s school. That makes it the most real thing in this portfolio and the least showable.
About these screenshots
These were captured against a throwaway fixture instance with invented names and an empty message history. The chat is empty because it is a fresh database, not because the product is unused — the real thread is not something to publish, and staging fake conversation in it would be inventing evidence for a claim the rest of this portfolio spends its time arguing against.
What I’d change next
The dashboard answers “what now?” well and the chat answers “what did we decide?” badly. Decisions get made in the thread and then have to be re-derived by scrolling. The thing to build is a decision log the agent writes to as a side effect of conversation — not another surface to maintain by hand.