colonizer
install
docs Configuration

#Configuration

Every environment variable, with its full meaning, is in install.md; this page is where settings live and what bounds a colony.

#Where settings live

Module settings live in ~/.config/colonizer/modules.json and are edited in the UI. The answers to the live map and usage data questions live beside it, in telemetry.json and usage.json, and usage-last.json beside those keeps the last usage batch built. The built-in dependencies and supply-chain loop keeps its settings in supply-chain-loop.json; it is off, with an empty allowlist, until you opt a repository or org in. Process settings come from the environment. There is one more for usage data: COLONIZER_TELEMETRY_ENDPOINT names the collector it is posted to, at most once a day — with no default, so unset means nothing is ever sent (docs/usage-data.md). The rest:

VariableDefaultMeaning
COLONIZER_BIND127.0.0.1:7878Listen address
COLONIZER_NO_BROWSER–Set to skip auto-opening the cockpit sign-in link
COLONIZER_ALLOWED_HOSTS–Extra Host names to accept, comma separated
COLONIZER_GATEWAY_BIND127.0.0.1:41750Provider gateway; colonies reach it through host.microsandbox.internal
COLONIZER_DATA_DIR~/.local/share/colonizerClones, worktrees, colonies, mesh state
COLONIZER_CONFIG_DIR~/.config/colonizerModule config and saved tokens
COLONIZER_CLAUDE_BINauto-detectedNative Claude Code binary to mount
COLONIZER_HOMEnext to the binary, or dist/Bundled app assets
COLONIZER_APP~/.local/share/colonizer/appThe symlink an install moves; what an update follows
COLONIZER_UPDATE_CHECKon0 keeps the update check off whatever Settings says — then no request is made at all
COLONIZER_RELEASES_URLGitHub's latest release for this repoWhere the update check looks
DO_NOT_TRACK, COLONIZER_TELEMETRY=off–Keep the live map and usage data off whatever Settings says
CI=true–Also keeps usage data off; the live map does not read it
COLONIZER_TELEMETRY_URLhttps://telemetry.colonizer.devWhere live map heartbeats go
COLONIZER_MASTER_KEY– (secrets saved in plaintext, 0600)Encrypts the secrets the mothership saves, at rest; see below

#COLONIZER_MASTER_KEY

COLONIZER_MASTER_KEY encrypts the secrets saved under the config directory (the GitHub and Claude tokens, the model provider keys, the mem0 key and the webhook signing secret) with ChaCha20-Poly1305, keyed by the SHA-256 of its value, and writes each one as a .enc file beside where the plaintext would be, removing the plaintext. Unset or blank, secrets are written in plaintext (0600) and any stale .enc is removed. A .enc file with content is read with the key or not at all: without the key, or with the wrong one, the secret counts as missing, never falls back to an old plaintext copy. It protects a copied, synced or backed-up config directory, not a machine where something runs as you, since that can read the variable too. Use a long random value (32 or more random bytes): the single SHA-256 does no key stretching. Another machine with a copy of the directory needs the same value. To rotate, set a new value and save each secret again; if the key is lost, delete the .enc files and enter the secrets again.

#The system keychain

When the macOS Keychain or the Linux Secret Service answers a startup probe, newly saved secrets go there instead of to files (existing files stay until you move them on the cockpit's Secrets page, which also shows where each one lives). On macOS the Keychain ties an item to the binary that wrote it, so build with COLONIZER_CODESIGN_IDENTITY set (see scripts/install.sh) to keep access across rebuilds. A release install run with it set records the identity in ~/.local/share/colonizer/codesign-identity, and every later install or in-place update re-signs the new host binary with it before switching, so colonizer update does not lose the Keychain either; delete that file to stop re-signing (docs/updates.md).

#Per-colony limits

Three limits bound one colony, all sandbox module settings (Settings → Modules → sandbox); budget_usd and host_disk take an override per org, the token budget does not. All default to 0 — unlimited — on purpose: there is no dollar figure, token count or byte count that suits every deployment, and a default that silently stopped running colonies on upgrade would be a surprise.

Disk cleanup is a built-in loop every install has, off until you switch it on (Loops → Disk cleanup, or colonizer loop enable disk-cleanup). It runs hourly, and early whenever free space falls under 15%, removing build output (target/, node_modules/, .next/, dist/) from finished colonies, reclaimable worktrees and orphan microVMs — never live colonies, uncommitted or unpushed work, .git, ~/.cargo or caches. Its preview lists what a run would remove, with sizes, before you turn it on; archives and your own build directories are opt-in categories (docs/loops.md).

An org's own budget or quota beats the sandbox default, and an org set to 0 opts out of a global limit. Routed providers need pricing — dollars per million tokens for input, output, cached read, cache write and thinking — to count toward the budget; an unpriced provider still counts its tokens but contributes $0, so a colony that spends only through one never reaches budget_usd and is never stopped for spend — budget_tokens is what holds it.

#The spend journal

Every colony-scoped row of the spend journal (<data>/spend.jsonl) names the colony (session) and the agent module that ran it (agent), and splits its spend by who measured it: the agent's own turn-end estimate (first-party traffic never passes the gateway) against the gateway's metered price for routed providers. node scripts/colony-report.mjs --costs reads the journal back grouped per colony and per harness × model, by default over the same last-30-days window the spend history answers (docs/protocol.md §6.8).

#colonizer.toml

A few things belong in neither the UI nor the environment. They live in ~/.config/colonizer/colonizer.toml, which you write and Colonizer only reads — a missing file means the defaults:

[publish]
# Who the commit and the pull request body name as co-author: `true` (the default) is the
# github.com/colonizer-settlers account, `co_author = { name = "…", email = "…" }` names
# someone else, and `false` turns the commit trailer, the PR-body trailer and the findings
# credit off. The address must belong to the account or GitHub shows it as plain text —
# for a user account that is the ID-prefixed noreply form. An unreadable or malformed file
# falls back to the defaults, so co-author stays on.
co_author = true