# IronClaw control-plane configuration — copy to .env and edit: # # cp .env.example .env && docker compose up -d # # Every value is OPTIONAL for boot: the stack comes up with none of these set (the # admin token is auto-minted, see below). Set what you need, leave the rest blank. # .env holds secrets — it is git-ignored; never commit it. # ─── Model credential (held host-side; NEVER enters a sandbox) ─────────────── # Set at least one provider to make agents able to call a model. Anthropic is the # default/primary; the model-proxy injects the key host-side so it never reaches # sandboxed agent code. ANTHROPIC_API_KEY= # Optional alternative providers (allowlisted only when their key is present): OPENAI_API_KEY= OPENROUTER_API_KEY= # ─── OR: route models through a credential gateway (e.g. OneCLI) ────────────── # Instead of a provider key above, point the model-proxy at a host-local credential # gateway that injects the real credential at request time — so NEITHER the control- # plane NOR the sandbox ever holds a model key. The URL carries the per-agent gateway # token as Basic userinfo (sent as Proxy-Authorization on CONNECT); the gateway # terminates TLS with its own CA (loopback only). Example: OneCLI powering a ChatGPT/ # Codex agent. From a container use host.docker.internal (NOT 127.0.0.1): # IRONCLAW_MODEL_GATEWAY_URL=http://x:aoc_@host.docker.internal:10255 IRONCLAW_MODEL_GATEWAY_URL= # Comma-separated hosts the gateway serves (allowlisted in the model-proxy), e.g.: # IRONCLAW_MODEL_GATEWAY_HOSTS=chatgpt.com IRONCLAW_MODEL_GATEWAY_HOSTS= # Deployment-wide default provider/model for agent groups that don't pin one — set to # codex / gpt-5.5 to make every agent use the Codex gateway above: IRONCLAW_DEV_PROVIDER= IRONCLAW_DEV_MODEL= # ─── Admin / API token ─────────────────────────────────────────────────────── # Bearer token for the control-plane admin API (used by ironctl and the web UI). # Leave BLANK to have it minted on first run and printed ONCE in the logs # (`docker compose logs controlplane`) — claim it immediately, there is no recovery. # Set it yourself to manage the secret in your own vault and skip minting. IRONCLAW_API_TOKEN= # ─── Channel adapters (each registers only when its token/URL is set) ───────── SLACK_BOT_TOKEN= DISCORD_BOT_TOKEN= TELEGRAM_BOT_TOKEN= # Microsoft Teams via an Incoming Webhook URL: IRONCLAW_TEAMS_WEBHOOK_URL= IRONCLAW_MATTERMOST_WEBHOOK_URL= # Signal via a signal-cli REST bridge (URL + the registered sender number): IRONCLAW_SIGNAL_CLI_URL= IRONCLAW_SIGNAL_NUMBER= # iMessage bridge (macOS hosts only; set to 1 to enable): IRONCLAW_IMESSAGE_ENABLE= # ─── Daemon / container tuning (sensible defaults; override only if needed) ─── # Image reference compose runs. Pin a release tag instead of latest for production: # IRONCLAW_IMAGE=ghcr.io/ironsecco/ironclaw-controlplane:v0.1.0 IRONCLAW_IMAGE= # Listen address INSIDE the container (compose maps it to host 127.0.0.1:8787). IRONCLAW_API_ADDR=0.0.0.0:8787 # Structured log format: json (default, for log shippers) or text (human-readable). IRONCLAW_LOG_FORMAT=json # Durable state directory inside the container (backed by the ironclaw-state volume). IRONCLAW_STATE_DIR=/var/lib/ironclaw/state # Set to 1 to seed a tiny dev owner/agent-group for local testing (NOT for production). IRONCLAW_DEV=0