Troubleshooting the server

The Dungeon Master that narrates fights without rolling, repeats itself, or takes minutes; missing content; missing pictures; voice that connects to silence; players who cannot reach the server; a lost key; and where to read the logs.

Server

The Dungeon Master

It narrates fights but never rolls anything

is off or unreliable. On , start the server with --jinja. Make sure DM_THINKING=0 is not set: under the long prompt a non-thinking model surfaces tool calls about one in five. Keep presence_penalty at 0 in any server-side preset. With a remote key, confirm the model supports function calling. Run Test backend in the : the tool-call step is the one that fails.

It repeats itself or forgets what just happened

A that is too small, so the prompt is being truncated. Serve a local model with a 64K window (-c 65536); the server reads the real window from llama.cpp and packs against it. For an unknown endpoint the server assumes 16K unless OPENAI_COMPAT_CONTEXT says otherwise; OpenAI models are packed against 128K. The at the table shows what was cut.

Turns take minutes

Expect 1.5 to 3 minutes per full turn on a single local GPU, longer in combat. Beyond that: cap the on the server to about 1024 to 2048 tokens, check that a picture or a render is not queued ahead of the turn on the same GPU, and consider a smaller .

The table says "The model is unavailable" now and then

A local model server (llama-server, ) closed an idle connection just as a request arrived on it. Since 0.26.2 the server asks again once on a fresh connection. A backend that is down, refuses, or times out still fails, and 's log line names what the backend said.

A turn crashed and the table is stuck

The lead can send the turn back in from the . It resumes from the persisted conversation, nothing is re-rolled, and no context is lost. The server log names the failed request.

The reasoning model rejects a parameter

The server drops the named field and retries, up to three fields per request. If a strict vendor still refuses, check the model name and that the ends in /v1.

A local model's turns end empty, or a fight ends mid-fight

The prompt ran out of window. The tool definitions alone take about 27,000 tokens on every call; since 0.24.9 the budget counts them and scales the reply reserve to the window, and the Context tab shows a Tool definitions row. Serve at least a 64K window, and update a server older than 0.24.9.

Content and characters

Most spells, monsters or subclasses are missing

No . Run node scripts/import-open5e.mjs, or download open5e.sqlite.gz from the release and point CONTENT_DB_PATH at it, then restart. The image and the apps carry the pack already.

Continue is disabled in the builder

A panel still has picks to make; each reads "N still to choose", and the reason sits beside Continue with Show me, which jumps to the missing pick. A rogue or a level 3 or higher bard was blocked at the Calling step before server 0.21.2; update.

Pictures, narration, ambience

No portraits, scene art or covers

The is down, busy, or on another address. Placeholders are by design so the session continues. Check the URL in Admin, Images, and from use host.docker.internal rather than 127.0.0.1. On an integrated GPU, a render waits behind the Dungeon Master's .

Narration is on but silent

The speech server in Admin, Speech is wrong, switched off, or not running; press Test . The passage says why at the table and the server log shows the failed request. Each listener also has a mute and a volume in the .

Ambience does nothing

The is missing: an install without public/ambience, or an that has not downloaded it yet. Admin, Sound library downloads it, or npm run fetch-ambience -- --pack on a source install.

Voice

The microphone button does nothing

Plain http in a browser. Browsers grant the microphone on or localhost only. The apps are exempt.

Everyone connects, then silence

With the transport: the (44444, UDP and TCP) is closed or not forwarded, or the is unset behind NAT or . A Cloudflare-proxied voice domain has the same effect. See Voice chat setup.

Reaching the server

My party cannot reach it on the LAN

Bind to all interfaces (npm run start:lan or dev:lan, or ) and allow port 3005 through the host firewall. Players use the host's LAN address, not localhost. The server's own QR button (bottom right of every page) encodes the address for a phone.

Share links point at 127.0.0.1 or a Docker address

Set the in Admin, Server settings, or APP_PUBLIC_URL. The QR button and invite links are built from it.

The sign-up form asks for a Setup code

The server has no accounts yet. Its log prints the one-time code at every start, with a link that fills it in (under Docker: docker compose logs | grep -A12 "no accounts yet"). The first account cannot use Discord. See First run and accounts.

Sign-ups refused, or "invite-only"

The . Open it, mint an , or let the player in with a live . See First run and accounts.

Discord sign-in fails

The redirect URI in the Discord application must be exactly <public-url>/api/auth/discord/callback, and the Public URL must match how players reach the server.

The database

I lost the encryption key

There is no recovery path. Under the key is stored at data/.db-key in the data volume and was printed once on first boot: retrieve it from the volume or the logs before that container is gone. A includes it.

"The built-in engine cannot decrypt an encrypted database"

The native SQLite module did not load, so the server fell back to Node's built-in engine, which cannot read an encrypted file. Reinstall dependencies (npm install) on a supported platform, or force the driver with ODM_SQLITE_DRIVER=native to see the real load error.

The container never becomes healthy

docker compose logs. A wrong or changed key is the usual cause; the image is glibc-based on purpose, so an Alpine variant will not run the native modules.

Logs

A host install writes to standard output and logs/; to docker compose logs -f. DM_DEBUG=1 logs every prompt and for a Dungeon Master problem. When you open an issue, include the server version (the account menu's About, which copies the exact build), the backend and model, and the log lines around the failure.

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