Terminal and platforms2 of 10
Reading the header
On this page
The header is printed once, at launch, and never repaints. Every value in it is asked of the process that is about to answer you — the tool registry, the runtime settings, the open database — not read off a config file. A header that names a model this process is not on would be worse than no header.
At 96 columns it looks like this:
KOTOBA ● LIVE ( ・ω・ ) you're connected — just type
She talks. She listens. She does. ▴ ▪ ◦
MODEL gpt-5.4-mini · OpenAI TOOLS 29 ready · 4 skills
WORK ~/.kotoba/files · 12 files MEM 6 topics · 1.2k turns
VOICE local · expressive KEYS /help · @file · alt-enter
on this machine — I ask before anything that isn't a plain read
────────────────────────────────────────────────────────────────────────────────
The top row
The nameplate carries whatever soul_config.name says — first run lets you rename her, and the
plate follows. It is clamped to 16 cells and scrubbed, because it is a string somebody typed into a
database.
● LIVE is the one claim the header makes about the process, so it is spent only on a real
terminal. Pipe the output to a file and the chip is not printed: a transcript on disk saying LIVE
would be a lie left in a file. The setup wizard reuses the same banner without it — no key exists
yet, and just type would be an instruction that does not work.
The face is her kaomoji, still. The clause beside it shortens as the window narrows:
you're connected — just type, then just type, then nothing.
The grid
Six facts. Each is a live reading:
| Row | What it is telling you |
|---|---|
MODEL | the model and provider that will serve your turns. OpenAI · no key yet when no client could be built at all. OpenAI · wrong model when the provider does not serve the model name that is set — which is what /set provider xai on its own leaves behind, since provider and model are two settings and only one moved. It never calls the provider to find out; whether a key works is what kotoba doctor is for. |
WORK | her working folder, and how many files are in it right now — counted by walking it at launch. |
VOICE | text only · no voice extra without the voice extra, text only · no key with no ElevenLabs key, agent · ElevenLabs tunnel in agent mode, otherwise the mode and the TTS engine (local · expressive). Both modes need a key, so without one neither is claimed. |
TOOLS | how many tools this process registered, and how many skills it can read. |
MEM | how many memory topics she has, and how many turns are in the database. |
KEYS | /help · @file · alt-enter — the only place those two keys are advertised outside /help. |
What the grid drops when the window is narrow
The rows are ranked, and a narrow window keeps the useful ones. KEYS is rank 1 and MEM is rank 6,
so MEM is the first to go.
| Window | Columns | Rows kept |
|---|---|---|
| 126 columns and wider | 3 | all six |
| 64–125 | 2 | all six |
| 46–63 | 1 | MODEL WORK TOOLS KEYS |
| under 46 | 1 | MODEL WORK KEYS |
Values are cut, never wrapped, and each column starts at a fixed pitch — a long model name cannot push the next column somewhere else.
The clause underneath
The last line appears only when the sandbox backend is local, and it is the one sentence that
explains every approval you will ever see:
on this machine — I ask before anything that isn't a plain read
It has short forms for narrow windows: on this machine — reads pass, the rest asks, then
on this machine — I ask first. Under docker or none there is no clause, because the sentence
would not be true.
The clause is chosen by window width alone. It does not consult the platform — so on a Windows host
running local, where every command asks and there is no plain-read exemption, this line still reads
as though there were one. Trust /settings security and /approvals there, not this row. See
Platform support.
Her portrait
Beside the header, on terminals that earn it, she is drawn as pixel art rather than as a kaomoji. The ladder is measured at launch, in this order, and any one of these drops her to the kaomoji:
- output is not a terminal;
--no-face, orKOTOBA_FORCE_PORTRAIT=none. The same variable also takessixelandblocks, which force a rendering instead of letting the ladder pick;- fewer than 62 columns;
- no unicode, or no colour at all — so
--plainand--asciieach remove her too; - Pillow is not installed, or the face art is missing.
Past that: sixel if the terminal answered the DA1 query advertising it, which also needs chafa
on your PATH; otherwise half-blocks, which additionally need 24-bit colour and at least 88
columns. Only the sixel tier gets a face on every reply — half-blocks cost nine rows each, which is
a wall.
The kaomoji is a face too. Nothing else about the terminal changes when the portrait is refused.
/clear
/clear wipes the screen and reprints this header. Only the MODEL line will have moved — /set
re-asks it on every successful write. Everything else is still the launch reading, because a command
that is not a turn has no business re-walking your workdir or counting your turns again.
