Environment Variables: Sources and Precedence Order
Learn where OpenClaw loads environment variables and how precedence works across process, dotenv, global, config, and shell sources. Essential for operators configuring provider keys and service values.
Read this when
- You need to know which env vars are loaded, and in what order
- You are debugging missing API keys in the Gateway
- You are documenting provider auth or deployment environments
OpenClaw gathers environment variables from a variety of locations. The primary guideline is never overwrite existing values. For a systemd service installed by OpenClaw, the global .env can only override service values that OpenClaw itself marked as managed; any service values set by the operator continue to take priority.
Workspace .env files are considered a less trusted source: before precedence rules are applied, OpenClaw discards provider credentials and protected runtime controls from workspace .env.
Precedence (highest to lowest)
- Process environment (the variables already present in the Gateway process, inherited from the parent shell or daemon).
.envin the current working directory (the dotenv default; does not override; provider credentials and protected runtime controls are ignored).- Global
.envlocated at~/.openclaw/.env(also known as$OPENCLAW_STATE_DIR/.env; suggested for provider API keys; does not override, except for recorded OpenClaw-managed systemd service values). - Config
envblock within~/.openclaw/openclaw.json(only applied when the value is absent). - Optional login-shell import (
env.shellEnv.enabledorOPENCLAW_LOAD_SHELL_ENV=1), applied only for expected keys that are missing.
On fresh Ubuntu installations using the default state directory, OpenClaw also treats ~/.config/openclaw/gateway.env as a compatibility fallback after the global .env. When both files exist but conflict, ~/.openclaw/.env is kept by OpenClaw and a warning is emitted.
If the config file is absent entirely, step 4 is skipped; shell import still executes when enabled.
Supported operator-facing variables
The following variables form the supported environment contract for operators. Undocumented OPENCLAW_* variables are internal implementation details and can be removed without any notice.
Paths and instances
| Variable | Purpose |
|---|---|
OPENCLAW_HOME | Override the home directory used for OpenClaw path defaults. |
OPENCLAW_STATE_DIR | Override the mutable state directory. |
OPENCLAW_CONFIG_PATH | Override the active config file path. |
OPENCLAW_WORKSPACE_DIR | Override the default agent workspace. |
OPENCLAW_PROFILE | Select a named profile and its isolated defaults. |
OPENCLAW_GIT_DIR | Override the source checkout used by development-channel updates. |
OPENCLAW_INCLUDE_ROOTS | Allow $include to resolve from additional roots. |
Gateway and authentication
| Variable | Purpose |
|---|---|
OPENCLAW_GATEWAY_URL | Override the remote Gateway URL used by clients. |
OPENCLAW_GATEWAY_PORT | Override the local Gateway port. |
OPENCLAW_GATEWAY_TOKEN | Supply token authentication for Gateway servers and clients. |
OPENCLAW_GATEWAY_PASSWORD | Supply password authentication for Gateway servers and clients. |
Provider credentials
Core and bundled provider plugins recognize the following credential and provider-selection variables. When scoped credentials are needed rather than a single process-wide value, prefer each provider's config or SecretRef fields.
AI_GATEWAY_API_KEY, ANTHROPIC_ADMIN_API_KEY, ANTHROPIC_ADMIN_KEY, ANTHROPIC_API_KEY, ANTHROPIC_OAUTH_TOKEN, ARCEEAI_API_KEY, AZURE_OPENAI_API_KEY, AZURE_SPEECH_API_KEY, AZURE_SPEECH_KEY, AZURE_SPEECH_REGION, BASETEN_API_KEY, BRAVE_API_KEY, BYTEPLUS_API_KEY, BYTEPLUS_SEED_SPEECH_API_KEY, CEREBRAS_API_KEY, CHUTES_API_KEY, CHUTES_OAUTH_TOKEN, CLAWROUTER_API_KEY, CLOUDFLARE_AI_GATEWAY_API_KEY, CODEX_API_KEY, COHERE_API_KEY, COMFY_API_KEY, COMFY_CLOUD_API_KEY, COPILOT_GITHUB_TOKEN, DASHSCOPE_API_KEY, DEEPGRAM_API_KEY, DEEPINFRA_API_KEY, DEEPSEEK_API_KEY, ELEVENLABS_API_KEY, EXA_API_KEY, FAL_API_KEY, FAL_KEY, FEATHERLESS_API_KEY, FIRECRAWL_API_KEY, FIREWORKS_API_KEY, GCLOUD_PROJECT, GEMINI_API_KEY, GH_TOKEN, GITHUB_TOKEN, GMI_API_KEY, GOOGLE_API_KEY, GOOGLE_APPLICATION_CREDENTIALS, GOOGLE_CLOUD_API_KEY, GOOGLE_CLOUD_LOCATION, GOOGLE_CLOUD_PROJECT, GRADIUM_API_KEY, GROQ_API_KEY, HF_TOKEN, HUGGINGFACE_HUB_TOKEN, INWORLD_API_KEY, KILOCODE_API_KEY, KIMICODE_API_KEY, KIMI_API_KEY, LITELLM_API_KEY, LM_API_TOKEN, LONGCAT_API_KEY, MINIMAX_API_KEY, MINIMAX_CODE_PLAN_KEY, MINIMAX_CODING_API_KEY, MINIMAX_OAUTH_TOKEN, MISTRAL_API_KEY, MODELSTUDIO_API_KEY, MODEL_API_KEY, MOONSHOT_API_KEY, NOVITA_API_KEY, NVIDIA_API_KEY, OLLAMA_API_KEY, OPENAI_ADMIN_KEY, OPENAI_API_KEY, OPENCODE_API_KEY, OPENCODE_ZEN_API_KEY, OPENROUTER_API_KEY, PARALLEL_API_KEY, PERPLEXITY_API_KEY, PIXVERSE_API_KEY, QIANFAN_API_KEY, QWEN_API_KEY, QWEN_TOKEN_PLAN_API_KEY, RUNWAYML_API_SECRET, RUNWAY_API_KEY, SENSEAUDIO_API_KEY, SGLANG_API_KEY, SPEECH_KEY, SPEECH_REGION, STEPFUN_API_KEY, SYNTHETIC_API_KEY, TAVILY_API_KEY, TOGETHER_API_KEY, TOKENHUB_API_KEY, TOKENPLAN_API_KEY, VENICE_API_KEY, VLLM_API_KEY, VOLCANO_ENGINE_API_KEY, VOLCENGINE_TTS_API_KEY, VOLCENGINE_TTS_APPID, VOLCENGINE_TTS_TOKEN, VOYAGE_API_KEY, VYDRA_API_KEY, XAI_API_KEY, XIAOMI_API_KEY, XIAOMI_TOKEN_PLAN_API_KEY, XI_API_KEY, ZAI_API_KEY, and Z_AI_API_KEY.
Third-party plugins that you install may add their own credential variables through their manifests. Those variables belong to the plugin that declares them, not to OpenClaw itself.
Logging and diagnostics
| Variable | Purpose |
|---|---|
OPENCLAW_LOG_LEVEL | Override the log level for both files and the console. |
OPENCLAW_DEBUG_MODEL_TRANSPORT | Turn on timing diagnostics for model transport. |
OPENCLAW_DEBUG_MODEL_PAYLOAD | Pick diagnostics that show redacted model payloads. |
OPENCLAW_DEBUG_SSE | Choose SSE timing or event-peek diagnostics. |
OPENCLAW_DEBUG_CODE_MODE | Enable diagnostics for code-mode surfaces. |
OPENCLAW_DIAGNOSTICS | Turn on named diagnostic flags, or switch all of them off with 0. |
OPENCLAW_DIAGNOSTICS_TIMELINE_PATH | Point timeline diagnostics at a specific JSONL path. |
OPENCLAW_DIAGNOSTICS_EVENT_LOOP | Include event-loop samples in timeline diagnostics. |
Feature and runtime toggles
| Variable | Purpose |
|---|---|
OPENCLAW_LOAD_SHELL_ENV | Pull in missing expected variables from the login shell. |
OPENCLAW_SHELL_ENV_TIMEOUT_MS | Set how long the login-shell import waits. |
OPENCLAW_EXEC_SHELL_SNAPSHOT | Turn off exec shell snapshots using 0. |
OPENCLAW_OFFLINE | Stop pinned agent helper binaries from being downloaded. |
OPENCLAW_BROWSER_HEADLESS | Make managed browser launches headed (0) or headless (1). |
OPENCLAW_DISABLE_BONJOUR | Force Bonjour advertising on (0) or off (1). |
OPENCLAW_NO_AUTO_UPDATE | Turn off automatic update applies. |
OPENCLAW_ALLOW_INSECURE_PRIVATE_WS | Permit trusted private-DNS ws:// connections as a break-glass override. |
OPENCLAW_ALLOW_MULTI_GATEWAY | Let multiple Gateway processes run while keeping per-state ownership locks. |
OPENCLAW_SKIP_CHANNELS | Launch the Gateway without channel transports for troubleshooting. |
OPENCLAW_THEME | Force the TUI palette to light or dark. |
Provider credentials and workspace .env
Avoid keeping provider API keys solely in a workspace .env. OpenClaw refuses a broad range of provider credential and endpoint-redirect keys from workspace .env files, covering every known provider auth env var (such as GEMINI_API_KEY, GOOGLE_API_KEY, XAI_API_KEY, MISTRAL_API_KEY, GROQ_API_KEY, DEEPSEEK_API_KEY, PERPLEXITY_API_KEY, BRAVE_API_KEY, TAVILY_API_KEY, EXA_API_KEY, FIRECRAWL_API_KEY), as well as any key that ends in _API_HOST, _BASE_URL, _ENDPOINT, or _HOMESERVER, and the complete OPENCLAW_*, CLAWHUB_*, ANTHROPIC_API_KEY_*, and OPENAI_API_KEY_* namespaces.
Instead, get provider credentials from one of these trusted places:
- The Gateway process environment, for instance a shell, launchd/systemd unit, container secret, or CI secret.
- The global runtime dotenv file located at
~/.openclaw/.envor$OPENCLAW_STATE_DIR/.env. - The config
envblock inside~/.openclaw/openclaw.json. - Optional login-shell import, when
env.shellEnv.enabledorOPENCLAW_LOAD_SHELL_ENV=1is on.
If provider keys or endpoint routing values were previously kept only in a workspace .env, relocate them to one of the trusted sources described above. A workspace .env can still supply ordinary project variables that are not credentials, endpoint redirects, host overrides, or OPENCLAW_* runtime controls.
The security rationale is covered in Workspace .env files.
Config env block
Inline environment variables are set under env.vars (these values do not override others):
{
env: {
vars: {
OPENROUTER_API_KEY: "sk-or-...",
GROQ_API_KEY: "gsk-...",
},
},
}
The config env.vars block accepts only literal string values. It does not expand
file:... values; for instance, XAI_API_KEY: "file:secrets/xai-api-key.txt"
is handed to providers exactly as that string.
For provider keys backed by files, use a SecretRef on the credential field that supports it:
{
secrets: {
providers: {
xai_key_file: {
source: "file",
path: "~/.openclaw/secrets/xai-api-key.txt",
mode: "singleValue",
},
},
},
models: {
providers: {
xai: {
apiKey: { source: "file", provider: "xai_key_file", id: "value" },
},
},
},
}
Refer to Secrets Management and the SecretRef credential surface for the list of supported fields.
Shell env import
env.shellEnv launches your login shell and imports only missing expected keys:
{
env: {
shellEnv: {
enabled: true,
timeoutMs: 15000,
},
},
}
Environment variable equivalents:
OPENCLAW_LOAD_SHELL_ENV=1OPENCLAW_SHELL_ENV_TIMEOUT_MS=15000(defaults to15000)
With Bash, the import relies on an interactive login shell (bash -lic) so that PS1 gets initialized
before login startup files execute. Bash reads /etc/profile plus the first available user login
profile (~/.bash_profile, ~/.bash_login, or ~/.profile); many login profiles also source
~/.bashrc. Keep those files quiet and bounded because their output, long-running work, or
failures can impact OpenClaw startup. Other shells use noninteractive login startup (-l -c).
This interactive Bash mode applies only to explicit shell env imports; automatic executable PATH
discovery during normal Gateway commands stays noninteractive.
Exec shell snapshots
On non-Windows Gateway hosts, bash and zsh exec commands use a startup snapshot by default.
Set OPENCLAW_EXEC_SHELL_SNAPSHOT=0 in the Gateway process environment to turn off this path.
Values false, no, and off also turn it off. Per-call exec.env values cannot enable or disable
snapshots or redirect the snapshot cache.
Runtime-injected env vars
OpenClaw also adds context markers to spawned child processes:
OPENCLAW_SHELL=exec: set for commands run through theexectool.OPENCLAW_SHELL=acp-client: set foropenclaw acp clientwhen it spawns the ACP bridge process.OPENCLAW_SHELL=tui-local: set for local TUI!shell commands.OPENCLAW_CLI=1: set for child processes spawned by the CLI entry point.
These are runtime markers, not required user config. They can be used in shell/profile logic to apply context-specific rules.
UI env vars
OPENCLAW_THEME=light: force the light TUI palette when your terminal has a light background.OPENCLAW_THEME=dark: force the dark TUI palette.COLORFGBG: if your terminal exports it, OpenClaw uses the background color hint to auto-pick the TUI palette.
Env var substitution in config
You can reference env vars directly in config string values using ${VAR_NAME} syntax:
{
models: {
providers: {
"vercel-gateway": {
apiKey: "${VERCEL_GATEWAY_API_KEY}",
},
},
},
}
A missing or empty variable remains visible as ${VAR_NAME} and emits a warning. Consumers that require the value treat it as unavailable. Use $${VAR_NAME} when the literal ${VAR_NAME} text is intended.
See Configuration: Env var substitution for full details.
Secret refs vs ${ENV} strings
OpenClaw supports two env-driven patterns:
${VAR}string substitution in config values.- SecretRef objects (
{ source: "env", provider: "default", id: "VAR" }) for fields that support secrets references.
Both resolve from process env at activation time. SecretRef details are documented in Secrets Management.
The config env block itself does not resolve SecretRefs or file:...
shorthand values.
Path-related env vars
| Variable | Purpose |
|---|---|
OPENCLAW_HOME | Points OpenClaw's internal default paths at a different home directory (covering ~/.openclaw/, agent folders, sessions, credentials, installer onboarding, and the default dev checkout). Handy when OpenClaw runs under a dedicated service account. |
OPENCLAW_STATE_DIR | Redirects the state directory elsewhere (default is ~/.openclaw). |
OPENCLAW_CONFIG_PATH | Changes where the config file is read from (default is ~/.openclaw/openclaw.json). |
OPENCLAW_INCLUDE_ROOTS | A path-list of directories where $include directives can resolve files beyond the config directory (default: none, so $include stays inside the config dir). Tilde expansion applies. |
Agent helper tool downloads
Assign OPENCLAW_OFFLINE=1 to stop OpenClaw from fetching its pinned fd
and ripgrep helper binaries. Helpers already present under the OpenClaw tools
directory and working system binaries are still usable; a helper that is absent
remains unavailable rather than prompting a network fetch.
Logging
| Variable | Purpose |
|---|---|
OPENCLAW_LOG_LEVEL | Sets the log level for both file and console output (for instance debug, trace). Overrides logging.level and logging.consoleLevel from config. Invalid values are dropped with a warning. |
OPENCLAW_DEBUG_MODEL_TRANSPORT | Produces targeted model request/response timing diagnostics at info level without turning on global debug logging. |
OPENCLAW_DEBUG_MODEL_PAYLOAD | Model payload diagnostics: choose summary, tools, or full-redacted. full-redacted gets truncated and redacted but can still expose prompt/message text. |
OPENCLAW_DEBUG_SSE | Streaming diagnostics: events reports first/done timing, peek adds the first five redacted SSE events. |
OPENCLAW_DEBUG_CODE_MODE | Code-mode model-surface diagnostics, covering provider-tool hiding and compact control/direct enforcement. |
OPENCLAW_HOME
When this is set, OPENCLAW_HOME swaps in a different home directory (replacing $HOME / os.homedir()) for OpenClaw's internal path defaults. That includes the default state directory, config path, agent directories, credentials, installer onboarding workspace, and the default dev checkout that openclaw update --channel dev relies on.
OPENCLAW_HOME does not give you control over the OS account's native Gateway service. Gateway service-management commands treat a relocated home as isolated state; use the OS account home plus a named profile when you need a separate native service identity.
Precedence: OPENCLAW_HOME > $HOME > USERPROFILE > Termux PREFIX home fallback on Android > os.homedir()
Example (macOS LaunchDaemon):
<key>EnvironmentVariables</key>
<dict>
<key>OPENCLAW_HOME</key>
<string>/Users/user</string>
</dict>
A tilde path (e.g. ~/svc) is also valid for OPENCLAW_HOME, and it gets expanded through the same OS home fallback chain before use.
Explicit path variables like OPENCLAW_STATE_DIR, OPENCLAW_CONFIG_PATH, and OPENCLAW_GIT_DIR still win. OS-account tasks, including shell startup file detection, package-manager setup, and host ~ expansion, may still reference the real system home.
nvm users: web_fetch TLS failures
When Node.js came from nvm rather than the system package manager, the built-in fetch() picks up
nvm's bundled CA store, which can lack modern root CAs (ISRG Root X1/X2 for Let's Encrypt,
DigiCert Global Root G2, and others). As a result, web_fetch fails with "fetch failed" on most HTTPS sites.
On Linux, OpenClaw spots nvm automatically and applies the fix in the real startup environment:
openclaw gateway installplacesNODE_EXTRA_CA_CERTSinto the systemd service environment- the
openclawCLI entrypoint re-execs itself withNODE_EXTRA_CA_CERTSset before Node starts
Manual fix (for older versions or direct node ... launches):
Export the variable before launching OpenClaw:
export NODE_EXTRA_CA_CERTS=/etc/ssl/certs/ca-certificates.crt
openclaw gateway run
Do not depend on ~/.openclaw/.env alone when setting this variable, since Node checks NODE_EXTRA_CA_CERTS during startup.
Legacy environment variables
Environment variables with the OPENCLAW_* prefix are the only ones OpenClaw recognizes. Any variables using the older CLAWDBOT_* or MOLTBOT_* prefixes from previous versions are disregarded without notice.
When the Gateway process starts, if any of those legacy variables remain set, OpenClaw triggers a single Node deprecation warning (OPENCLAW_LEGACY_ENV_VARS) that reports the prefixes it found and how many there are. To fix this, swap each legacy prefix for OPENCLAW_ (for instance, change CLAWDBOT_GATEWAY_TOKEN into OPENCLAW_GATEWAY_TOKEN); the outdated names have no effect.