2026-01-08 22:37:06 +01:00
---
2026-01-30 03:15:10 +01:00
summary: "Where OpenClaw loads environment variables and the precedence order"
2026-01-08 22:37:06 +01:00
read_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
2026-01-31 16:04:03 -05:00
title: "Environment Variables"
2026-01-08 22:37:06 +01:00
---
2026-01-31 21:13:13 +09:00
2026-01-08 22:37:06 +01:00
# Environment variables
2026-01-30 03:15:10 +01:00
OpenClaw pulls environment variables from multiple sources. The rule is **never override existing values** .
2026-01-08 22:37:06 +01:00
## Precedence (highest → lowest)
2026-01-31 21:13:13 +09:00
1. **Process environment** (what the Gateway process already has from the parent shell/daemon).
2. ** `.env` in the current working directory** (dotenv default; does not override).
3. **Global `.env`** at `~/.openclaw/.env` (aka `$OPENCLAW_STATE_DIR/.env` ; does not override).
4. **Config `env` block** in `~/.openclaw/openclaw.json` (applied only if missing).
5. **Optional login-shell import** (`env.shellEnv.enabled` or `OPENCLAW_LOAD_SHELL_ENV=1` ), applied only for missing expected keys.
2026-01-08 22:37:06 +01:00
If the config file is missing entirely, step 4 is skipped; shell import still runs if enabled.
## Config `env` block
Two equivalent ways to set inline env vars (both are non-overriding):
```json5
{
env: {
OPENROUTER_API_KEY: "sk-or-...",
vars: {
2026-01-31 21:13:13 +09:00
GROQ_API_KEY: "gsk-...",
},
},
2026-01-08 22:37:06 +01:00
}
```
## Shell env import
`env.shellEnv` runs your login shell and imports only **missing** expected keys:
```json5
{
env: {
shellEnv: {
enabled: true,
2026-01-31 21:13:13 +09:00
timeoutMs: 15000,
},
},
2026-01-08 22:37:06 +01:00
}
```
Env var equivalents:
2026-01-31 21:13:13 +09:00
2026-01-30 03:15:10 +01:00
- `OPENCLAW_LOAD_SHELL_ENV=1`
- `OPENCLAW_SHELL_ENV_TIMEOUT_MS=15000`
2026-01-08 22:37:06 +01:00
2026-01-16 16:32:07 -05:00
## Env var substitution in config
You can reference env vars directly in config string values using `${VAR_NAME}` syntax:
```json5
{
models: {
providers: {
"vercel-gateway": {
2026-01-31 21:13:13 +09:00
apiKey: "${VERCEL_GATEWAY_API_KEY}",
},
},
},
2026-01-16 16:32:07 -05:00
}
```
See [Configuration: Env var substitution ](/gateway/configuration#env-var-substitution-in-config ) for full details.
2026-02-08 16:20:13 -05:00
## Path-related env vars
| Variable | Purpose |
| ---------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `OPENCLAW_HOME` | Override the home directory used for all internal path resolution (`~/.openclaw/` , agent dirs, sessions, credentials). Useful when running OpenClaw as a dedicated service user. |
| `OPENCLAW_STATE_DIR` | Override the state directory (default `~/.openclaw` ). |
| `OPENCLAW_CONFIG_PATH` | Override the config file path (default `~/.openclaw/openclaw.json` ). |
2026-02-22 18:15:13 +08:00
## Logging
| Variable | Purpose |
| -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `OPENCLAW_LOG_LEVEL` | Override log level for both file and console (e.g. `debug` , `trace` ). Takes precedence over `logging.level` and `logging.consoleLevel` in config. Invalid values are ignored with a warning. |
2026-02-08 16:20:13 -05:00
### `OPENCLAW_HOME`
When set, `OPENCLAW_HOME` replaces the system home directory (`$HOME` / `os.homedir()` ) for all internal path resolution. This enables full filesystem isolation for headless service accounts.
**Precedence:** `OPENCLAW_HOME` > `$HOME` > `USERPROFILE` > `os.homedir()`
**Example** (macOS LaunchDaemon):
```xml
< key > EnvironmentVariables< / key >
< dict >
< key > OPENCLAW_HOME< / key >
< string > /Users/kira< / string >
< / dict >
```
`OPENCLAW_HOME` can also be set to a tilde path (e.g. `~/svc` ), which gets expanded using `$HOME` before use.
2026-01-08 22:37:06 +01:00
## Related
- [Gateway configuration ](/gateway/configuration )
2026-01-24 09:49:35 +00:00
- [FAQ: env vars and .env loading ](/help/faq#env-vars-and-env-loading )
2026-01-08 22:37:06 +01:00
- [Models overview ](/concepts/models )