How it works#
browser ──ws── Node server ──┬─ the brain (Claude Code, Cursor, opencode, or Ollama)
└─ a worker thread draws her, via anime-character-creator- The browser shows her and the chat. It talks to the server over a WebSocket.
- The Node server runs TypeScript directly (no build step), starts the brain, and keeps the conversation, her current look and your settings.
- The brain is the model that answers. Each brain implements one small interface,
Provider, so the page never needs to know how a particular brain speaks. A new brain only has to implement it. - The renderer is a worker thread (
src/render-worker.ts) that loads the creator's TypeScript and returns her as SVG. It is cut off and restarted if one drawing takes longer than 15 seconds.
Tags: how a reply drives her face#
Her replies carry small plain-text tags, which the server strips before you see them. They are provider-agnostic, so any brain can use them.
| Tag | What it does |
|---|---|
[emotion:happy] | sets her face. emotions.json maps each emotion to face settings; the server renders a few mouth openings and a blink for it, and the page flips between them while text streams |
[gesture:wave], [gesture:cheer] | raise an arm for a moment (two pose frames) |
[avatar hair_color=#ff88cc glasses=true] | changes her look; every key is validated, and rejected ones are reported back to her on her next turn |
[image path/to/file.png] | shows a picture from the project folder under her message |
[demo] | starts the same sequence as /show; the page plays it, because tags in a streaming reply would all fire at once |
In chat, a line that is only an action wrapped in asterisks, such as *she moves a step closer*, is shown in its own italic bubble instead of with what she says. The voice and the speech bubble over her picture skip it. Work mode leaves those asterisks as ordinary emphasis. [narration] she moves a step closer [/narration] is the same bubble in either mode.
Her current look is saved in data/avatar.json. With a picture pack on, [avatar ...] tags are
ignored, and so are gestures unless the pack has pose pictures for them; she is told which.
What is saved where#
| Place | What |
|---|---|
data/settings.json | name, brain, models, pre-approved tools, work folder, picture pack |
data/avatar.json | her current look |
data/looks/ | your saved looks, one file each |
data/frames/ | your own picture packs |
data/custom.css | your interface changes |
data/phone-devices.json | the phones you allowed (only a hash of each one's key), readable only by you |
workspace/ | her own folder in chat mode |
All of it is git-ignored and yours. Permission modes and phone access are deliberately not saved: they are off at every start.
Made with AI coding agents, mostly Claude Code. This documentation was written by Claude Code. Details