daemon

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.

EARLY Public because the design decisions are worth arguing with, not because it is finished.
01  INSTALL
daemon — setup
$ curl -fsSL https://raw.githubusercontent.com/K2D2H4/Daemon/main/install.sh | bash
$ daemon setup
where should the thinking happen? [offline]
whose model? [ollama]
telegram bot token? [skip]
daemon is awake. say "hey daemon".

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.

02  WHAT IS ACTUALLY DIFFERENT

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.

03  IT SPEAKS FIRST
Morning. Three things happened while you were asleep.
Show me the important one.
daemon proactive — 2026-08-04
00:05 open_loop BLOCKED quiet hours: 23:00-09:00, and it is 00:05
03:20 silence BLOCKED quiet hours: 23:00-09:00, and it is 03:20
09:15 open_loop ALLOWED → telegram · Zoom in the foreground, so not the speaker
"You left the gate reason strings unfinished on Friday."
10:00 open_loop BLOCKED open_loop budget: 1 of 1 already spoken today
10:30 emotional BLOCKED cooldown: last spoke 75m ago, needs 90m
11:20 pattern_time SILENT gate open; nothing worth saying
13:45 emotional SILENT gate open; nothing worth saying
17:00 silence SILENT gate open; nothing worth saying
19:40 emotional SILENT gate open; nothing worth saying
23:10 open_loop BLOCKED quiet hours: 23:00-09:00, and it is 23:10

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.

04  STATES

Running and waiting. The five-minute loop is ticking; it has decided not to speak.

05  HOW IT IS PUT TOGETHER

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.

YOURS
# seed name: Ada temperament: dry, unhurried, never performs enthusiasm address me as: 준 opening: state the thing, then the reason Never write to this file. It is mine.
06  WHERE IT IS

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.

Full plan and milestones

07  YOUR DATA, AND WHERE IT GOES
  • Memory and personality are files on your machine. Nothing is synced.
  • Text mode with a local model is fully offline. The offline preset 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.
08  COMMANDS
daemon — help
daemon run — here, in this terminal
daemon install — keep it running after you close the terminal, and after a reboot
daemon voice — one spoken conversation
daemon reflect — consolidate a day into memory now
daemon proactive — one round of "is there a reason to speak?", and what it decided
daemon doctor — what is configured, reachable, indexed and remembered