An AI companionyou shape.And that reshapesitself around you.
Open source, self-hosted. A process that lives on your machine; its memory and personality are plain markdown files you own.
daemon setup asks where the thinking should happen, whose model, and a Telegram bot token. Pick offline and you need no API key at all — just Ollama.
Its personality evolves.
You write the seed — name, temperament, how it talks. From then on it watches how you actually respond and accumulates rules about dealing with you specifically. Those rules feed back into who it is. Every other companion has a personality file a human edits.
It speaks first, on its own judgement.
Not a reminder you scheduled, and not a canned line when you open the app. A background loop asks whether there is a reason to say something now, whether now is a bad moment, and whether it has already talked too much today — and stays silent unless all three line up.
Everything else — the memory graph, the reflection pass, recall scoring — is table stakes we borrow rather than claim.
Ten of that day's decisions, and the one that produced a message. BLOCKED is the deterministic gate — quiet hours, a 90-minute cooldown, a daily budget of three, and a cap of one open_loop. SILENT is the single model call that only runs once the gate has opened, deciding there was nothing worth saying. Run daemon proactive for one round of the same rules against your own machine's state.
Running and waiting. The five-minute loop is ticking; it has decided not to speak.
One process.
uvicorn plus an in-process scheduler — no Celery, no Redis, no Postgres, because there is one user. It installs as a LaunchAgent or systemd user unit, since something that speaks first must outlive your terminal.
Markdown is the source of truth.
Conversations, entity notes and the personality are plain wiki-linked files under data/, openable in Obsidian or cat. SQLite is a rebuildable index.
File ownership is split, deliberately.
The seed persona is yours and the code never writes to it; what it learns about you is its own file. That asymmetry is what stops an evolving personality from drifting into whatever agrees with you most.
Works today
- Conversation over Telegram, logged to markdown you can read
- Voice, both directions
- Memory: entity notes, a nightly reflection pass, recall that scores what matters
- Runs as a background service and survives a reboot
Not yet
- Speaking first ships off by default. Two switches to turn it on, and the speaker is the second one.
- Persona evolution is designed, not built. The seed file works; nothing writes back to it yet.
- Memory and personality are files on your machine. Nothing is synced.
- Text mode with a local model is fully offline. The
offlinepreset routes every task to Ollama and has no voice route at all. - Voice sends audio to the provider you chose, with your own key. Turn voice off and it does not.
- Telegram means your messages cross Telegram's servers. It is the first channel because it is the only one that reaches your phone for free.
- Hosted models are bring-your-own-key throughout, with a hard spend limit.