- Install-wide environment variables — identity, container limits, logging, credentials. They apply to the whole install.
- Per-group container config in the database — each agent group has a row in the
container_configstable controlling its provider, model, mounts, packages, and MCP servers.
Environment variables
Variables come from two sources, and the distinction matters:- A small set is read from
.envat the project root by NanoClaw’s own parser. These work with a plain “edit.env, restart” flow. Values are not loaded intoprocess.env, so secrets don’t leak to child processes; a value already in the process environment takes precedence. - The process-only settings listed below are read from
process.envonly. The launchd plist and systemd unit that setup generates setPATHandHOME, plus the outbound proxy variables when a proxy is configured (see Environment variables). The nohup wrapper loads only that proxy file. None of them source.env. Putting these variables in.envhas no effect; you have to set them in the service environment (see Applying changes).
Read from .env
Host and setup settings
Host-only settings need the service environment or an exported value in your dev shell. Setup also readsNANOCLAW_HARDENED_IMAGE and NANOCLAW_AGENT_IMAGE_REF from .env, with the process environment taking precedence.
Containers
See the environment variables reference for the full list.
CONTAINER_TIMEOUT, IDLE_TIMEOUT, MAX_CONCURRENT_CONTAINERS, CONTAINER_MAX_OUTPUT_SIZE, and MAX_MESSAGES_PER_PROMPT were removed from the code and are no longer read — setting any of them has no effect. Container idle/stuck detection is now handled by the periodic host-sweep loop (src/host-sweep.ts), not a per-container timeout env var. The sweep’s two kill timers are set install-wide with NANOCLAW_ABSOLUTE_CEILING_MS and NANOCLAW_CLAIM_STUCK_MS (above).
See Hardening for the full egress lockdown and sandboxing story.
Per-group container config
Each agent group has a row in thecontainer_configs table (the central SQLite database). At spawn time NanoClaw materializes it to groups/<folder>/container.json — don’t edit that file by hand, it’s overwritten on every spawn. The full per-field reference, including the variable tables for the whole install, lives in the environment variables and container configuration references.
Fields per group:
To change a group’s config, ask the agent in that group, or use
ncl. For adding MCP servers, mounts, and providers, see Extending NanoClaw and Ollama integration.
Applying changes
.env-read variables: edit .env, then restart the service:
NANOCLAW_DEFAULT_MODEL, NANOCLAW_FAST_MODE, or another spawn-time setting, also run ncl groups restart --id <group-id> for each affected group to apply it.
Process-environment variables: add them to the service definition, then reload it.
- macOS: edit
~/Library/LaunchAgents/com.nanoclaw-v2-<slug>.plist, add a key to theEnvironmentVariablesdict, thenlaunchctl unload+launchctl loadthe plist. - Linux (systemd): add an
Environment=KEY=valueline to the unit, thensystemctl --user daemon-reload && systemctl --user restart nanoclaw-v2-<slug>. - Dev shell:
export LOG_LEVEL=debugbeforepnpm run dev.
ncl groups restart --id <group-id> --rebuild). See the container configuration reference for per-field semantics.
See Installation for service management details and finding your install slug.