Kotoba

Where to start

What Kotoba isWho she is and where she runs, in one page
InstallingOne package, two commands
First runA key, a model, her first words
The approval gateHow she asks before she acts
The two voice modesLocal voice, or the agent tunnel
The soul fileChange who she is
RoadmapWhat grows next, and what was cut on purpose

Or a section

↑↓ move openesc close124 pages
All pages

Terminal and platforms2 of 10

Reading the header

About 4 minutes to read

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:

RowWhat it is telling you
MODELthe 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.
WORKher working folder, and how many files are in it right now — counted by walking it at launch.
VOICEtext 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.
TOOLShow many tools this process registered, and how many skills it can read.
MEMhow 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.

WindowColumnsRows kept
126 columns and wider3all six
64–1252all six
46–631MODEL WORK TOOLS KEYS
under 461MODEL 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, or KOTOBA_FORCE_PORTRAIT=none. The same variable also takes sixel and blocks, which force a rendering instead of letting the ladder pick;
  • fewer than 62 columns;
  • no unicode, or no colour at all — so --plain and --ascii each 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.