A 24/7 Discord-based AI companion for the Cutillo household. Runs as a supervised TypeScript service that lives inside the family server and acts as a shared household brain — a single "voice" across 21 Discord channels that handles check-ins, curfew tracking, chore reminders, and family-wide announcements.
Built inside AIOS (my personal AI Operating System). This repo is a public overview — the running code is private because it's wired into family infrastructure, Discord IDs, and Notion configuration.
- Answers kids on demand. DMs to BMO trigger intent-routed replies — curfew status, Pulse survey questions, homework reminders, "is dinner ready" style questions.
- Runs scheduled family rituals. Morning briefings, evening Pulse check-ins, weekend plans, reminders — all fired by a scheduler and delivered to the right channel.
- Watches for state changes. Device online/offline events, curfew boundaries, calendar changes — surfaced to the relevant channel with the right tone.
- One voice across channels. Tone adapts per channel and per person, but the underlying personality stays consistent — BMO sounds like BMO whether it's talking to a 12-year-old about chores or posting a weekly family digest.
| Layer | Tech |
|---|---|
| Runtime | Node.js + TypeScript, discord.js |
| LLM | Anthropic Claude (natural replies, intent classification) |
| Config store | Notion (6 databases — Capabilities, Channels, People, Personality, Pulse Questions, Incidents) |
| Supervision | macOS launchd with auto-restart |
| Control surface | /bmo slash command + a live ops page in AIOS |
BMO doesn't ship with hard-coded behaviors. Every thing it does is a capability row in Notion, executed by one of six executor types:
graph TD
DM[💬 DM from family] --> Match
Cron[⏰ Scheduled tick] --> Match
Event[📡 State change] --> Match
Match[🧭 Capability match] --> Reg[(📋 Notion · 20 capabilities · 6 databases)]
Match --> Type{Executor type}
Type --> IR[intent-response]
Type --> SS[scheduled-summary]
Type --> SW[state-watcher]
Type --> SV[survey]
Type --> EA[external-api]
Type --> SR[static-response]
IR --> Discord[💬 Discord channel or DM]
SS --> Discord
SW --> Discord
SV --> Discord
EA --> Discord
SR --> Discord
scheduled-summary— cron-style, composes and posts a digestintent-response— matches a DM to an intent, repliesstate-watcher— reacts to external state changes (devices, calendar, curfew)survey— runs a multi-step Pulse check-in with stored resultsexternal-api— calls a third-party service and formats the resultstatic-response— deterministic fallback for known prompts
Why this matters: I add new behaviors by writing a Notion row — no code change, no redeploy. Today BMO has 20 active capabilities across those six types. Same registry drives admin dashboards inside AIOS.
- Agent-style LLM orchestration without reaching for a framework — explicit executor types, deterministic fallback paths, clear separation of intent vs. side effect
- Config-as-data architecture — Notion as the editable source of truth for a production system
- Real-world durability — runs unattended under
launchd, recovers from network blips, gets daily use by three kids - Voice consistency at scale — one personality model, 21 channel contexts, guided by a central Personality database
- AIOS — Personal AI OS host; Next.js dashboard orchestrating 16+ household and business modules
- Household Voice Control — Voice-interface layer bridging Alexa to a local AI OS via custom skill + Lambda
- Household Digest — AI-composed daily digest pipeline; Gmail, Calendar, M365 to Discord every morning
Part of the AIOS portfolio. See the profile README for the full system map.