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

Discord9 of 10

Honest limits

About 5 minutes to read

On this page

Everything on this page is a thing she does not do. Read it before you promise any of it to the people in your server.

Reminders asked for in a channel do not ring there

The bot process starts no cron ticker, on purpose: cron delivers into the event queues of whichever process is ticking, and a second ticker would claim a due reminder and announce a private one into whichever channel happened to be listening.

So a reminder set from Discord is written to the shared database and rings where your screen is — the browser or the terminal — and waits if neither is open. She says so herself when she sets one:

It will not ring in this Discord channel: reminders ring where your screen is, the browser or the terminal, and wait if neither is open.

On a Discord-only install, with no web app and no terminal session ever running, it waits forever.

Only the owner can set one at all: cronjob is not on the guest list.

Approval cards for anything on the host need the owner

A card for something running on the machine she is installed on can only be answered by the account in KOTOBA_DISCORD_OWNER_ID. Not by a server administrator, not by whoever asked.

With no owner id set, that whole branch is unreachable anyway: the tools that touch the host are withheld from everybody.

There is no screen

A Discord message and an approval card with two buttons are the whole of what she can draw. No task list, no progress, no steps, no panels, no secure boxes. ask_user and open_link are withheld from everybody for that reason, and she is told plainly not to send anyone to look at something that is not there.

The one exception is a background job: when it finishes she posts her own summary of it in the channel it was asked for. That announcement is attributed to her person and is skipped when no owner id is set — which is moot, since without one nobody can start a job from Discord in the first place.

Her reply is not streamed

She shows the typing indicator while she works and posts the answer when the turn ends.

A background job runs with everything her person has

Only the owner can start one. It inherits the turn's exclusion — which for the owner is nearly nothing — so a job started from a Discord channel runs the full work-mode toolset on the host, including families that are never offered in an ordinary conversation: subagents, MCP installation, the credential tools. Its approval cards appear in that channel, and the host ones are still the owner's alone.

A guest can spend your credit

discord_voice is on the guest list, so any member can ask her into a voice channel. Once there she opens a transcriber per person who speaks and synthesises every sentence she says. A room is many people talking, and every message she answers is a full model turn.

The defaults hold this down: she answers only when named, she opens nothing for somebody who has not made a sound, and she leaves a channel she has been alone in for five minutes. A home channel undoes the first of those — in a home channel she answers everything.

One channel is one memory, shared by everybody in it

There is no per-person conversation inside a channel. What she reads back when she answers you includes what other people said there.

Only images and PDFs reach her eyes

Up to 8 MB and four per message. She is told to say plainly which ones did not arrive. Any other file type is skipped without a word — she does not see it and does not know it was there.

Reading a channel back is capped

discord_read_history reads at most 100 messages per channel by default and 400 at the outside, and fits what it read into about 12,000 characters by dropping from the middle — never the ends, because a summary needs where it started and where it ended. It says when a range was cut short.

It reads a channel back only if the person asking may see it. "No such channel" and "not yours to see" come back as the same sentence, so a guess about a private channel is not confirmed.

She will not take a secret here

A card asking for a key or a password is refused in a channel, with a sentence explaining why. Give her secrets in the terminal or in Settings.

Small things that surprise people

  • The bot will not start without the voice dependencies, even for text only. PyNaCl and the DAVE library come with the discord extra and all three are checked at startup.
  • Being the owner is not being an administrator. The four server-shaping tools are gated on Discord's own bit.
  • discord_people with no name given only works in a server. In a DM there is no roster, and it says so rather than listing everybody she has ever met.
  • A DM is answered by anyone at all unless you set KOTOBA_DISCORD_GUILDS.
  • The stall watchdog is a voice feature. A spoken turn is abandoned after 75 seconds of nothing happening or 10 minutes in total; a written turn has no such clock of its own. The bound there is the per-tool timeout inside the loop — 30 seconds by default, raised by the tools that need it (discord_voice takes 90, applying a plan takes 600).
  • The bot shares one database and one workspace with your other surfaces. A file she writes from Discord is the same file the web app's Files panel shows, under ~/.kotoba/files by default.