Core use case
processInboundMessage and its port interfaces hold all business logic and have zero imports of concrete infrastructure — every entrypoint builds a Ports object and passes it in.
A family operating system, not just a chatbot. Message it on Telegram, WhatsApp, or email and it extracts events and tasks with an LLM; a companion admin web app handles everything chat can't — multi-user roles, medical records, and an EOS-style Rocks/Scorecard/Issues tracker.
FROM EXTRACTION BOT TO FAMILY OS
Personal Agent began as a single-channel proof of concept: send it a message, it extracts an event or task with an LLM and creates it in Google Calendar or Trello. That core still works exactly the same way, across email, Telegram, and WhatsApp, including photos and voice notes sent directly to the model as multimodal input.
What's grown around that core is a second, more conventional application: a session-authenticated admin web app for things chat was never going to handle well — multi-user accounts and roles, per-person calendars and medication reminders, family medical records, a baby exclusion-diet diary, and an EOS-inspired Rocks/Scorecard/Issues tracker for running the household like a small team.
Built solo, end to end — domain logic, every channel adapter, and the admin app.
PORTS & ADAPTERS
processInboundMessage is the only place business logic lives — it has no imports of Google, Trello, or OpenRouter SDKs. Every channel and every integration is an adapter implementing one of its port interfaces.
Not shown: Cloud Scheduler triggers daily, midday, and close-of-day digests, a weekly digest, and a standing watch for overdue tasks — all reusing the same channel adapters to send proactive messages back out.
WHAT EACH PIECE DOES
processInboundMessage and its port interfaces hold all business logic and have zero imports of concrete infrastructure — every entrypoint builds a Ports object and passes it in.
Telegram and WhatsApp are driving + driven adapters (they reply in-thread); email is driving-only, since replying was never built.
An OpenRouter adapter (Gemini 2.5 Flash) classifies tasks into categories and extracts structured events/tasks from text, photos, and voice notes — no separate transcription step.
Firestore-backed, responsible-aware duplicate detection, thread-aware follow-ups (a reply confirming a date updates the existing event), and short-term conversational context.
A conventional session-authenticated Express app: multi-user roles, family profiles with per-person Google OAuth and medication reminders, medical records, and a message log with rollback.
An EOS-inspired Rocks/Scorecard/Issues tracker, source and exception rules, and a standing watch for overdue tasks — running the household with the same discipline as a small team.
WHY IT'S BUILT THIS WAY