Where a key lives

The one page to read before pasting an API key: the three places a text or image backend can be set (the device, the campaign, the server), which one wins, who can see a key, and what needs tool calling.

Desktop appAndroid appServer

An AI backend is a , a model name and usually an . The app can hold that trio in three places. Which place you use depends on where the world lives.

The three places

PlaceWhere you set itCoversWho sees the key
The deviceThe app's Story AI screen (home screen, Story AI button)Every campaign on that device's world, new or oldOnly the server inside the app. Never players, never the campaign's settings.
The campaignThe 's story fields, on a self-hosted serverThat campaign onlyOnly an administrator can set a campaign's own backend address or key; a campaign anyone else owns uses the server's. It is scrubbed from every snapshot other members receive.
The serverAdmin, Server settings, and Images; or Every campaign that has no setting of its ownAdministrators only.

Resolution is campaign, then , then environment, then built-in default. On an the Story AI choice is written to the world's admin settings, which is why every campaign follows it and why the Setup tab shows the device's choice rather than asking again.

What each door needs

DoorNeedsWhere
OpenAIA key; models default to gpt-5.1 and gpt-5-miniOpenAI and compatible keys
or another router, model id, keyOpenRouter
Local model (, , , )A base URL on your network; usually no keyLocal models
An Claude Code, Codex, opencode or Grok Build signed in on the computer; no keyBring your own agent
PicturesAn OpenAI key, , or the Image providers

Tool calling is not optional

The Dungeon Master asks the model to call tools for every roll, every hit point and every . A model or endpoint without narrates a fight it never actually starts. Pick a model whose card advertises tool or function calling, and on a self-hosted server run Test backend in the , which checks a real tool call.

Two models, not one

Every backend can name a second, cheaper for summaries, compaction, checks and . Leaving it blank sends everything to the story model, which works and costs more. On OpenAI the defaults are gpt-5.1 for the story and gpt-5-mini for utility; on a local server, anything in the 4B to 8B class is plenty.

Keys are secrets

  • A key is stored on the server that uses it and sent to the provider over . It is never sent to a browser or another player, and a saved key only goes to the host it was saved for.
  • On a shared server, the administrator decides whose tables may spend a paid AI backend, and Admin, Usage shows the tokens each account and campaign used.
  • On a self-hosted server, keys belong in the or .env.server, never in code or a shared file.
  • If you ever set a per-campaign key on server 0.12.0, rotate it: that release leaked campaign keys into member snapshots and 0.12.1 fixed it.
  • A contains the server's settings and environment file, so it contains your keys.

Privacy

With a remote key, each 's prompt (the story so far, the sheets, the scene, the ) goes to the provider. With a local model or a , nothing leaves your machine. See What leaves your machine.

Checked against desktop and Android app 0.17.2 and server 0.26.2 on 2026-10-11. Something wrong or missing? Open an issue.

Download · v0.17.2
Server app · v0.26.2

Optional. Runs the table for a whole group on one machine that stays on. Everyone else just installs the app.

Free & open source · MIT licensed · served from GitHub releases