The problem
A personal assistant is not just good chat. People expect it to remember preferences, routines and context, and to actually show up on time: reminders, quiet hours, wake-up calls, repeating rules.
Channels that reach out first, like push and phone, need clear controls and a trail you can audit.
What we built
To the user, Lyla is one continuous thread. Underneath, conversation episodes, a rule engine, structured memory and per-channel runtimes all share the same user state, so context created in chat carries into a push notification or a phone call.
Chat, rules, memory, relationship stage, routines, push and phone run on one Express and TypeScript backend with Supabase, OpenAI and Anthropic, scheduled with node-cron and validated with Zod.
By the numbers
- 177
- Commits in the first month
- 3
- Channels: chat, push, phone
- 7
- Domains sharing one user state
Stack
- Express
- TypeScript
- Supabase
- OpenAI
- Anthropic
- node-cron
- Zod