xorcise up creates everything it needs and never overwrites what you have edited, which leaves a short list of things you actually set: a judge model, optionally a terrain model, the mission library switch, and ports if the defaults collide.
What the first start creates
xorcise up checks its prerequisites before it writes anything, then bootstraps in order: it creates ~/.xorcise, scaffolds config.toml and a .env file at mode 0600, brings a fresh database to the current schema, provisions a local Headscale control plane with a self-signed TLS certificate, and starts the brain. Re-running up repeats the same path harmlessly — a scaffold is never overwritten, and provisioning is idempotent, so up also repairs a control plane whose containers disappeared after a reboot.
Everything lands under ~/.xorcise, or under XORCISE_HOME if you set it before starting:
One file in there is load-bearing and unmarked:
headscale/.owned. It is the only thing that tells xorcise down that the running Headscale container and its volume belong to XORCISE. Delete it by hand and those resources are orphaned permanently — nothing will ever clean them up.

The Settings page. Everything editable here is written to ~/.xorcise/.env, never to config.toml.
Where configuration lives
Four sources feed one settings object. Highest wins:.env, not config.toml. And a XORCISE_* variable exported in your shell beats anything either file says, including for a CLI that is only talking to an already-running brain.
The Settings page never writes config.toml. Every value it can change is written to ~/.xorcise/.env as a XORCISE_MODEL_*, XORCISE_JUDGE_*, XORCISE_TERRAIN_*, or XORCISE_CATALOG_ENABLED variable, and the file is re-chmoded to 0600 on every write. config.toml is world-readable and holds only non-secret shape, which is why the two are kept apart.
The page groups its cards under three headings: Evaluation for how runs are graded, Mission Library & Runtime for the catalog and your environment, and Diagnostics for system health and connection. Every field name below matches a card in one of those groups. For the exhaustive list of keys, types, defaults, and their environment-variable names, see Configuration keys.
Configure the judge model
The judge produces half of every score, and XORCISE ships no model. Bring your own OpenAI-compatible endpoint and key. Grading sends the distilled transcript of a run to whatever provider you point it at, so this is the setting that decides where your run content goes.- CLI
- Web UI
--key '' clears the key. Passing no options at all is a usage error rather than a silent no-op.xorcise config test calls the model and exits non-zero when it cannot, so it can gate a script, and the Test button on the card does the same thing. Test uses the saved key, not unsaved edits, so save first.
The key is write-only. Reading configuration back — over the API, in the UI, or with
xorcise config show — returns only a four-character hint, never the key itself.Bound the judge prompt
A long lab run can produce a judge prompt larger than the model’s context window, at which point the judge half is unreachable and the score degrades to deterministic-only. Two caps exist for exactly that failure, and they are the controls to reach for before you change models. The per-span cap defaults to 2000 tokens. It trims each span’s body to a head-and-tail window with a marker in between, so every action survives while a few enormous tool outputs stop dominating the transcript. Setting it to0 disables trimming.
The pre-flight transcript cap is off by default. Turned on, it rejects a run before the judge is called if the estimated prompt exceeds the ceiling. It is off deliberately: the local count is an estimate, so XORCISE prefers to let the call go through and surface the provider’s real error than to reject a prompt that would have fit.
- CLI
- Web UI
--transcript-max-tokens 0 to turn the pre-flight cap back off.Configure the terrain model
Terrain attribution maps each host and action on the terrain map back to the agent step that caused it, and it does that with a model call. By default it reuses your judge model and needs no configuration of its own. Override it only when you want attribution on a different model — each field you leave unset keeps falling back to the judge’s.- CLI
- Web UI
xorcise config test-terrain to call whichever model is currently effective.Connect the mission library
The hosted XORCISE library is free and needs no API key, account, or sign-in of any kind — the client sends no credential. Acatalog_key setting exists and is read by nothing. Connecting it makes library missions appear in the catalog and pullable on demand, including automatically at run start; pulling one contacts the hosted catalog and a container registry, and sends nothing about your runs.
- CLI
- Web UI
xorcise catalog disconnect to turn it off and xorcise catalog status to check it.xorcise catalog status reports the saved setting and a live probe as two separate lines, and a saved preference is never reported as a verified connection. Disconnected means an empty remote library, not a stubbed one — your own ingested missions are unaffected.
Change ports
XORCISE binds two planes: the REST API and web UI on3001, and the OpenTelemetry receiver on 4318. There is no third plane. If a port is busy, up scans up to 50 ports above it, moves, and prints a notice per move — so read the address up prints rather than assuming the default.
To pin different ports, set them before starting — as a flag on up, or as keys in ~/.xorcise/config.toml, which is a flat file whose keys are the setting names:
xorcise status and xorcise ui keep working without being told. There is no web UI equivalent.
Check your install
Three questions have three different answers: are the prerequisites on this host satisfied, are the ports answering, and what does the running instance believe about itself.- CLI
- Web UI
doctor checks prerequisites and prints an exact fix per failure. xorcise status probes the REST plane, the OTLP plane, and the Docker daemon. xorcise system asks the running instance what it sees, including its role, topology, and database schema.Upgrade XORCISE
up brings a schema-less database to the current version, but it will not migrate a database that already has data. That refusal is deliberate: migrating populated data stays an explicit decision, so up stops with database is behind the schema instead of touching your runs.
~/.xorcise is destroyed by any of that — the package upgrade touches only site-packages, and up re-renders the Headscale config and re-provisions its container idempotently. Run xorcise db upgrade only when up tells you the database is behind; there is no downgrade path, so back up xorcise.db before rolling a version back.
If the migration fails with migration history mismatch, the database was stamped by a different build of XORCISE. Back up xorcise.db, then either run the build that created it or re-initialise from scratch.
Uninstall XORCISE
Order matters here, and getting it wrong leaves Docker resources behind with nothing left on the machine that knows how to find them.~/.xorcise. Doing it after pip uninstall is not possible. XORCISE never removes Docker images, so reclaim those yourself with docker system prune -a when you are ready.
Related pages
Configuration keys
Every setting, its type, default, and environment variable.
Troubleshooting
Symptom-first fixes for start, run, and grading failures.