Skip to content

Ports, volumes and secret files

This page lists where each part of Thermite listens, which networks join them, where they keep their state, and which secret files they read. It covers each way of running Thermite: the local compose stack, rigs that control sets up on machines over SSH or with a join command, rigs on Kubernetes clusters, and RunPod test pods. The glossary explains the terms; How the parts fit together and Trust between control and rigs explain the design.

PortWho listensWho connectsSetting
8800/tcpControl: the dashboard (/ui), the REST API (/v1), MCP (/mcp) and /metricsPeople, scripts and agents; every rig’s supervisorTHERMITE_CONTROL_LISTEN, default 0.0.0.0:8800
8700/tcpThe harness APIThe rig’s own supervisor. Inside the harness container, its workers and tools on 127.0.0.1THERMITE_LISTEN, default 0.0.0.0:8700
noneThe supervisorOutside pull mode it listens on no port. It connects out to its harness and to control
8790/tcpThe supervisor of a rig in pull mode, on every interfaceControl alone, through RunPod’s proxy, under a random path. Everything else gets an empty 404THERMITE_TUNNEL_PORT, 8790 in control’s launch values and in the one-container rig image
A free port on 127.0.0.1The supervisor in pull mode: its own calls to control wait there for control’s next exchangeThe supervisor alone: the port takes only a token that lives in the supervisor’s memory, and answers anything else with an empty 404Chosen at start
22/tcp, or the machine’s ownA machine’s SSH serverControl, to check the machine and set rigs up on itThe machine’s SSH port on the Providers page, 22 by default
The cluster’s API serverKubernetesControl’s kubectl, to set rigs up on a cluster, and later to stop, start, restart, update or remove themThe cluster’s kubeconfig
8000/tcpA RunPod test pod’s probeControl, through RunPod’s proxy, at an address with a random token in its pathFixed
8810/tcpThe dashboard demo (scripts/dashboard-demo.ts)A browser--port

Two Unix sockets matter too:

SocketInWho uses it
/run/thermite/broker.sockThe harness containerThe harness’s controller asks the broker, which runs as root, to start work as a role’s user. Socket 0660, root and group thermite; directory 0750
/run/engine.sockControl, with compose.lifecycle.yaml onlyControl restarts compose rigs through the container engine’s socket. For development only
  • Control’s port is published on the host at 127.0.0.1 only, port THERMITE_CONTROL_PORT (default 8800): http://127.0.0.1:8800/ui.
  • The harness’s port is not published. Supervisors reach it as http://harness:8700 (and http://harness-2:8700 with the two-rigs profile).
  • Supervisors reach control as http://control:8800.
  • A rig’s supervisor reaches control at THERMITE_CONTROL_PUBLIC_URL, control’s address for rigs.
  • On a machine, the supervisor reaches its harness at http://thermite-<rig>-harness:8700.
  • On a cluster, a Service thermite-<rig>-harness serves port 8700 to the supervisor.
NetworkKindMembers
rigInternal: no way outharness, supervisor
rig2Internalharness-2, supervisor-2 (the two-rigs profile)
controlNormalcontrol, supervisor, supervisor-2
egressNormal: the way outharness, supervisor, harness-2, supervisor-2

The harness is not on the control network. Control and the harness also get the host name host.docker.internal, so they can reach a model server on the host. A release’s compose file also has an init service, which makes the local tokens: it has no network at all (network_mode: none).

Control’s Quadlet units make two Podman networks for each rig. Both containers join both.

NetworkKind
thermite-<rig>Internal: the harness and the supervisor only
thermite-<rig>-egressThe way out of the rig

For a rig in a namespace control creates, or one joined with a namespace join command, control adds two NetworkPolicies:

PolicyRule
thermite-<rig>-harness-netIn: only from the rig’s supervisor, on port 8700. Out: DNS (port 53, UDP and TCP), and addresses outside the private ranges of RFC 1918
thermite-<rig>-supervisor-netIn: nothing

In a slot, a namespace the cluster’s operators made for Thermite, the operators write the policies. Control refuses a slot unless some egress policy selects the harness and every egress rule that selects it reaches only DNS or addresses outside the private ranges. NetworkPolicies need a cluster network plugin that enforces them.

ContainerPathHolds
Control/var/lib/thermite-control (THERMITE_CONTROL_DIR)control.db (rigs, reports, commands, providers, MCP servers with their secrets and sign-ins sealed, Thermite’s knowledge base, the audit log); control-signing.key (0600) and control-signing.pub; secrets.key, which seals every key and sign-in control stores; kits/, kits written or uploaded on the New campaign page; exports/, the exports of rigs without a results repository
Control/keyscontrol-signing.pub, copied there for rigs (THERMITE_CONTROL_PUBKEY_EXPORT)
Harness/var/lib/thermiteThe ledger and the rig’s report key (ledger/), git mirrors (git/), kits (kits/), imports (imports/), models (models/), builds (builds/), the model route control set (model-route.json, root only), the rig’s settings (rig-settings.json) and its copy of each run’s past research (knowledge/<run>/)
Harness/scratchWorkspaces, lane caches, the judge’s runs and each run’s research folder (thermite/research/<run>/, with its knowledge/). Emptied at every start
Harness/inboxRead-only: project and kit bundles and model files the supervisor fetched
Harness/outboxExports, written by the harness
Harness/keysRead-only: control’s public key
Supervisor/var/lib/thermite-supervisorIts relay and export state, the exports waiting to be sent to control (export-uploads.json), where each run’s past research sync is (kb-state.json), its local results repository (results.git/), its fetch caches, advisor records and the ssh home (home/). In pull mode also tunnel/ (THERMITE_TUNNEL_DIR, 0700: the pod’s keys, its enrollment and the nonces it has seen) and enrolled/ (THERMITE_TUNNEL_ENROLLED_DIR: control.pub, rig.json and rig.env for the harness)
Supervisor/inboxRead and write: what it fetches for the harness
Supervisor/outboxRead-only: the harness’s exports
Supervisor/resultsCompose only: the local results repository the rigs share
Supervisor/etc/thermite/advisorsCompose only, read-only: the advisors file, if there is one

A full reset empties the harness’s state, scratch and outbox, keeping only the rig’s report key, and the supervisor’s home, keeping only a pull mode rig’s tunnel/ and enrolled/. Control’s knowledge base keeps the items the rig’s runs reported before. See Stop, restart, remove or reset a rig.

Volume or folderMounted inAtMode
control-statecontrol/var/lib/thermite-controlread-write
control-pubcontrol; harness, harness-2/keysread-write in control; read-only in the harnesses
harness-state, harness2-stateharness, harness-2/var/lib/thermiteread-write
harness-scratch, harness2-scratchharness, harness-2/scratchread-write
./.dev/inbox (a folder)harnesses and supervisors/inboxread-only in the harnesses; read-write in the supervisors
outbox, outbox2a harness and its supervisor/outboxread-write in the harness; read-only in the supervisor
supervisor-home, supervisor2-homesupervisor, supervisor-2/var/lib/thermite-supervisorread-write
resultsboth supervisors/resultsread-write. The default results repository is file:///results/results.git
./.dev/advisors (a folder)both supervisors/etc/thermite/advisorsread-only
. (the folder that holds compose.yaml)init, in a release’s compose file/workread-write. It runs as root, with only the capabilities CHOWN, DAC_OVERRIDE and FOWNER

The init service makes the .dev/ folders, next to compose.yaml: it runs thermite local init with that folder mounted at /work. In a checkout of the source code, npm run dev:init makes the same folders. docker compose down -v removes the named volumes; without -v they keep their state.

WhatWhere
The rig’s files$HOME/.local/share/thermite/rigs/<rig> for a user, /var/lib/thermite/rigs/<rig> for root. Mode 0700: only the rig’s user may open it. Its keys/ folder is 0755, so that the harness’s controller, which is not the container’s root, can read control’s public key
The units$HOME/.config/containers/systemd for a user, /etc/containers/systemd for root: thermite-<rig>.network, thermite-<rig>-egress.network, thermite-<rig>-harness.container, thermite-<rig>-supervisor.container
The servicesthermite-<rig>-harness.service, thermite-<rig>-supervisor.service
Podman volumeHarnessSupervisor
thermite-<rig>-state/var/lib/thermite
thermite-<rig>-scratch/scratch
thermite-<rig>-inbox/inbox, read-only/inbox, read-write
thermite-<rig>-outbox/outbox, read-write/outbox, read-only
thermite-<rig>-supervisor/var/lib/thermite-supervisor

Removing a rig removes these five volumes, the two networks, the unit files and the rig’s folder.

ObjectWhat
PersistentVolumeClaim thermite-<rig>-dataOne volume, ReadWriteOnce, 100 GB unless set (1 to 10,000 GB), in the cluster’s default storage class unless one is named
Its subpathsstate → /var/lib/thermite; scratch → /scratch; inbox → /inbox (read-only in the harness); outbox → /outbox (read-only in the supervisor); supervisor → /var/lib/thermite-supervisor
Init container prepareRuns the harness image to make the folders and set their owners before each pod starts

Both pods run on the same node, so they can share the volume. An update to control’s images or address (Update to these images, Try the update again or Give it control’s new address on the rig’s page) applies the rig’s two Deployments again and leaves its volume claim, its Secret and its Service as they are, so the rig keeps its state and its tokens.

A test pod has one container disk: 40 GB unless set, 10 to 2,000 GB. Control removes the pod, and its disk, when the test ends.

FileRead bySettingHolds
The owner’s tokenControlTHERMITE_CONTROL_ADMIN_TOKEN_FILEFor local use. Deployed, control takes the token’s SHA-256 instead (THERMITE_CONTROL_ADMIN_TOKEN_SHA256). See Tokens and roles
The operator’s, agent’s and reader’s tokensControlTHERMITE_CONTROL_OPERATOR_TOKEN_FILE, THERMITE_CONTROL_AGENT_TOKEN_FILE, THERMITE_CONTROL_READ_TOKEN_FILEOptional, as above
The rig tokens fileControlTHERMITE_CONTROL_RIG_TOKENS_FILE{"<rig>": "<token>"} for rigs not enrolled through control. Read once, at start
The secrets keyControlTHERMITE_CONTROL_SECRETS_KEY_FILE, default secrets.key in control’s state folderThe key that seals every provider key, Git access, machine key, kubeconfig, RunPod key, and MCP server’s key, client secret and sign-in. Made on first start
Control’s signing keyControlcontrol-signing.key in control’s state folder, 0600Signs every command to rigs. Made on first start
The supervisor tokenHarness and supervisorTHERMITE_SUPERVISOR_TOKEN_FILE (harness), THERMITE_HARNESS_TOKEN_FILE (supervisor)The token the supervisor uses with its harness. Required
The proposer tokenHarnessTHERMITE_PROPOSER_TOKEN_FILEOptional: lets a person or script submit changes with thermite submit
The model keyHarnessTHERMITE_MODEL_API_KEY_FILEThe agents’ model key, when the rig’s own settings give the model. A model from control comes with its key instead
The rig’s control tokenSupervisorTHERMITE_CONTROL_TOKEN_FILEThe rig’s token for control
Control’s public keyHarnessTHERMITE_CONTROL_PUBKEY_FILEChecks every command’s signature. The harness waits up to 120 s for it at start. In pull mode, enrollment leaves it in control.pub in THERMITE_TUNNEL_ENROLLED_DIR; in the one-container rig image, root checks its SHA-256 against the launch’s and copies it to THERMITE_CONTROL_PUBKEY_FILE before the harness starts
The rig’s report keyHarnessledger/rig-signing.key in its state, 0600Signs the rig’s reports. Made on first start
The pod’s keysSupervisor, in pull modekeys.json in THERMITE_TUNNEL_DIR, 0600Sign the pod’s answers to control and open what control seals to the pod. Made on first start; control pins their public halves at enrollment
The enrollment codeSupervisor, in pull modeTHERMITE_TUNNEL_ENROLL_CODE in the pod’s environmentA one-time code. It never crosses the network, and the first enrollment spends it. The supervisor takes it out of its own environment at start
The results repository keySupervisorTHERMITE_RESULTS_KEY_FILE, THERMITE_RESULTS_KNOWN_HOSTSOptional: an SSH deploy key that can write to the results repository, and its host key. See Set up the results repository
A knowledge base tokenSupervisorkb.token_file in the advisors fileOptional
A Hugging Face tokenSupervisorTHERMITE_HF_TOKEN_FILEOptional: for gated model files. Sent to Hugging Face only, never to the harness
An MCP server’s key, client secret or OAuth sign-inControlEntered in Settings › Providers › MCP servers, or signed in on the server’s page; kept sealed in control.dbOptional. Control hands a rig the server’s sign-in as headers (an access token for OAuth and a client, never the refresh token or the client secret) only when a run it assigned that rig names the server. The supervisor and the harness keep it in memory; no lane can read it. See Who holds your keys

At start, the harness’s broker reads its secret files as root, gives their values only to the controller, and closes their folder to 0700. If a secret file and its folder both stay readable by other users, it stops with fatal: a secret file stays readable by other users.

Way of runningFilesMounted at
ComposeThe init service (docker compose run --rm init), or npm run dev:init in a checkout, writes them to .dev/secrets/, mode 0644: control-admin-token, control-operator-token, control-rig-tokens.json, control-rig-token, harness-supervisor-token, harness-proposer-token, model-api-key, and the second rig’s control-rig-token-2, harness2-supervisor-token, harness2-proposer-token/run/secrets/<name> (control-rig-tokens.json as control-rig-tokens), each only in the containers that use it
thermite rig add --out DIRsecrets/control-rig-token and secrets/harness-supervisor-token (0600, in a 0700 folder); keys/control-signing.pub and keys/control-signing.fingerprint; rig.env with THERMITE_RIG_ID and CONTROL_URL; README.txtWherever your own deployment puts them
Machines (over SSH or a join command)secrets/control-rig-token, secrets/harness-supervisor-token, keys/control-signing.pub, keys/control-signing.fingerprint, in the rig’s folder/run/secrets/<name> and /keys, read-only
KubernetesA Secret thermite-<rig> with control-rig-token, harness-supervisor-token and control-signing.pubEach key as its own read-only file, at /run/secrets/<name> or /keys/control-signing.pub
RunPod test podsNone: the probe’s report token is in the pod’s environment

Control also writes short-lived files while it works: an SSH key and known hosts for each SSH call, and a kubeconfig for each kubectl call. Each is 0600 in its own 0700 temporary folder and is removed after the call. Who holds your keys explains which keys are kept where.