AI / Automation April 7, 2026

OpenClaw Environment Variables & API Keys on Cloud Mac 2026: launchd vs Interactive Shell

MacXCode Engineering Team April 7, 2026 ~11 min read

Running OpenClaw on a leased Mac mini M4 usually means two different realities: engineers who ssh in, export keys in .zshrc, and see a healthy gateway — and a launchd LaunchAgent that starts the same binary at boot with none of those exports. In 2026, upstream added openclaw env-style helpers and clearer docs around ~/.openclaw/.env, but teams still hit token_missing loops when plists and dotenv files disagree. This guide maps precedence, shows how to align daemon and shell, and ties into Docker vs native npm, cron / launchd schedules, and gateway troubleshooting.

Why SSH “Works” While launchd “Forgets” Keys

  • Non-login daemons — LaunchAgents inherit a minimal environment; they do not source your interactive shell files.
  • Dual sources of truth — copying variables into both EnvironmentVariables in XML and ~/.openclaw/.env creates silent drift after upgrades.
  • Secret resolution edge cases — forcing gateway reinstalls can inline resolved secrets into plists; treat that as a security review trigger, not noise.
Rule: pick one documented source for provider URLs and API keys (typically ~/.openclaw/.env managed via CLI), then keep LaunchAgent plist thin — user, working directory, optional OPENCLAW_HOME only when required.

Precedence Cheat Sheet (Highest Wins)

Source Typical use Watch-outs
Process environment (parent) Manual foreground runs, CI wrappers Not persistent across reboots
~/.openclaw/.env Gateway daemon + CLI alignment File permissions; rotation discipline
openclaw.json env block Structured config beside workspace Keep out of public repos
LaunchAgent EnvironmentVariables BOOT-time fixed paths Can override .env unexpectedly if duplicated

Using openclaw env Instead of Hand-Editing Plists

When your build ships the subcommand, prefer:

openclaw env set ANTHROPIC_BASE_URL=https://proxy.internal
openclaw env list
openclaw env path

This keeps proxy and provider endpoints versioned next to the gateway’s expected config surface — a major quality-of-life upgrade versus XML surfing on a remote host. After changes, restart the gateway service using the same method you chose in install & deploy and re-run a single enqueue smoke test.

Plist Pitfalls We Still See in Production

  • Stale plist wins — an old EnvironmentVariables entry masks an updated .env file until someone notices mismatched model endpoints.
  • Plaintext surprises — never commit plists that contain live API keys; scrub before attaching to tickets.
  • PATH minimalism — daemons often lack Homebrew paths; either use absolute binaries in scripts or set PATH once, deliberately, in the plist.

Seven-Step Ops Checklist Before Declaring “Env Fixed”

  1. Identify runtime: foreground, LaunchAgent, or Docker bind-mount per container guide.
  2. Print effective config paths from the gateway logs (no secrets in screenshots).
  3. Consolidate keys into ~/.openclaw/.env or CLI-managed store.
  4. Strip duplicate keys from plist unless absolutely required.
  5. Restart daemon; confirm port 18789 behavior from gateway runbook.
  6. Validate from a fresh SSH session without manual exports — proves daemon parity.
  7. Document precedence in your internal wiki for on-call.

FAQ: OpenClaw Secrets on macOS Cloud Hosts

Question Answer
Should I check keys into Git? No — use private config stores and filesystem ACLs on the leased Mac; rotate if leaked.
Does Docker simplify env? It can, via compose env_file, but you still mount ~/.openclaw consistently — read the comparison article above.
Where do I host a 24/7 gateway? Compare HK / JP / KR / SG / US bare metal on pricing and follow help for SSH.

Why Dedicated Apple Silicon Matters for Always-On Agents

OpenClaw gateways are long-lived processes: idle power draw, stable NIC, and honest filesystem behavior matter more than burst CPU. A physical Mac mini M4 avoids the surprise suspends and noisy neighbors that break scheduled jobs from our launchd guide. MacXCode nodes pair that hardware with regions close to your Git and model API endpoints.

Bottom line: treat environment configuration as production data with a single source of truth, verify under the same runtime your automation uses, and keep plists boring. Next: provision a node or return to gateway diagnostics.

Dedicated Mac mini M4 for OpenClaw 24/7

SSH · VNC · HK / JP / KR / SG / US