Settings¶
How she's configured — her organs, her channels, the app's appearance, her lifecycle, and the one irreversible action. URL: /persona/{id}/settings, with a sub-tab per section: /persona/{id}/settings/{tab}.
A strip of sub-tabs runs across the top; the body shows the active one. The sub-tabs are: Mind, Imagination, Mouth, Eye, Ear, Teacher, Researcher (the seven organs), then Channels, Appearance, Lifecycle, and Danger. The persona record this screen edits comes from GET /api/personas.
Organ cards¶
The first seven tabs each configure one organ. They share one control (the organ card). Each shows what the organ does, its current state, and a form to set or change it.
The seven slots and what each is for:
| Tab | Slot | What it does | Required? |
|---|---|---|---|
| Mind | thinking |
Every thought runs through this model — recognize, decide, reflect, remember. | Yes |
| Imagination | imagination |
Draws images. | No |
| Mouth | mouth |
Turns text into voice. | No |
| Eye | eye |
Looks at images you send. (Skip if her Mind already sees — most modern ones do.) | No |
| Ear | ear |
Turns voice notes into text. | No |
| Teacher | teacher |
A stronger model she consults rarely, for hard questions. | No |
| Researcher | researcher |
Reads documents (PDF, csv, json, txt, md) without flooding her memory. PDF needs an Anthropic or Gemini model. | No |
The tab is labeled Mind but the slot it writes is thinking — that mapping matters when you call the API directly.
State and the configurator¶
An organ is either set (shows provider, model, URL, with Change and — if optional — Remove) or empty (a prompt to add one). Either way, the form behind it is the organ configurator, the same control as in Onboarding. Pick Local or Cloud:
- Local (Ollama): just a Model name (e.g.
qwen2.5:14b) and an optional URL (defaulthttp://127.0.0.1:11434). No provider, no key. - Cloud: pick a provider tile, then URL (base endpoint, pre-filled — no
/v1), API key (stored locally), and Model.
Provider tiles: Anthropic, OpenAI, Gemini, xAI, DeepSeek, Together, OpenAI-compatible. Of these, anthropic, openai, gemini, and xai are handled natively; deepseek, together, and openai_compat route through the OpenAI-compatible client — any OpenAI-protocol endpoint works via the OpenAI-compatible tile.
Save and remove¶
| Action | What it does | API call |
|---|---|---|
| Save | Set or change this organ. | POST /api/persona/{id}/update with { "<slot>": { "provider", "model", "url", "api_key" } } |
| Remove | Clear this organ (optional organs only). | POST /api/persona/{id}/update with { "clear_<slot>": true } |
Both go through /update. The slot name is thinking for the Mind tab, otherwise the lowercase organ name (eye, ear, …). Changing an organ restarts her if she's running — the card warns you ("she'll lose this conversation's working memory but her diary is safe"). Her saved API key is never returned to the screen, so the form is blank when you re-open a set organ to change it.
The card doesn't validate the model — the endpoint does
Save sends your input straight to /update, which validates the provider/model/key against the real provider and returns 400 with a reason if it can't be prepared. The screen surfaces that message.
Channels¶
Ways to reach her from outside this browser. She lives on this machine; channels are how you talk to her from elsewhere. The web channel is always on and can't be removed. Today's external channels are Telegram and Discord (bot tokens).
Each external channel has three states:
- Not connected — a Connect button opens a token form.
- Verifying (added but not yet paired) — a pairing form appears: open the bot, send
/start, and paste the one-time code it replies with. - Connected (paired) — shows the handle and a Remove button.
The controls and their endpoints:
| Control | What it does | API call |
|---|---|---|
| Connect (paste token) | Validate the bot token and add the channel. | POST /api/persona/{id}/channels with { "kind": "telegram"\|"discord", "credentials": { "token": "<token>" } } |
| Pair (paste code) | Bind the channel to your account so she only listens to you. | POST /api/persona/{id}/pair with { "code": "<code>" } |
| Remove | Drop the channel. | DELETE /api/persona/{id}/channels/{channel_name} |
channel_name for removal is the channel's handle (the name from her persona record). Adding or removing a channel restarts her to pick up (or drop) the gateway. Until you've paired a verified channel, she won't act on messages from it.
Appearance¶
How the app looks to you. One control:
| Field | Options | Effect |
|---|---|---|
| Theme | Dark, Light, System | Sets the UI theme. |
This is purely client-side — the choice is saved in your browser's localStorage (eg.theme) and applied immediately. It has no API call and is per-browser, not per-persona; it isn't stored in her files.
Lifecycle¶
The same lifecycle controls as the Status screen, here for when you're already configuring her. Shows her current status, then buttons:
| Button | What it does | API call |
|---|---|---|
| Wake her up | Bring her to active. | POST .../update { "status": "active" } |
| Send her to sleep | Full nightly ritual. | POST .../sleep |
| Stop | Abrupt pause — tear down her agent now, no ritual. | POST .../stop |
| Restart | Restart her process. | POST .../restart |
| Hibernate | Park her until you wake her. | POST .../update { "status": "hibernate" } |
Unlike the Status screen (which shows only the transitions valid from her current state), this tab always shows all five — including Stop, which the Status screen doesn't. Stop differs from Hibernate: Stop tears down the running agent but leaves her status as-is; Hibernate sets her status to hibernate. And both differ from Sleep, which keeps her running through her consolidate-and-diary ritual. See Lifecycle for exact transitions.
Danger¶
The one decision that can't be undone: Delete {name}. Her diary, her memory, her instructions — all gone. Without her recovery phrase and a saved diary file, deletion is permanent.
The button opens a confirm dialog that requires you to type her name to proceed. On confirm it calls POST /api/persona/{id}/delete, which stops her if running and removes her from disk, then returns you to the home screen.
Permanent
There is no undo. If you might want her back, export her diary first (GET .../export) and keep her recovery phrase.
Related¶
- Lifecycle —
update(organs + status),sleep,stop,restart,delete. - Channels — add, remove, and pair channels.
- Create and migrate — the same organ fields, at creation time.
- Vocabulary — the seven organs, channels, the three statuses.
- Onboarding — the configurator's first appearance.