Skip to content

Gateway on macOS

OpenClaw.app no longer bundles Node/Bun or the Gateway runtime. The macOS app expects an external openclaw CLI install, does not spawn the Gateway as a child process, and manages a per-user launchd service to keep the Gateway running (or attaches to an existing local Gateway if one is already running).

On a fresh Mac, choose This Mac during onboarding. The app runs its signed, bundled installer before the Gateway wizard, installs a user-space Node runtime and the matching openclaw CLI under ~/.openclaw, then installs and starts the per-user launchd service. This path does not require Terminal, Homebrew, or administrator access.

The app bundles the installer script, not the Node or Gateway payload. Setup therefore needs an internet connection to download the runtime and matching OpenClaw package.

Node 24 is recommended for a manual install. Node 22 LTS, currently 22.19+, also works. Then install openclaw globally:

Terminal window
npm install -g openclaw@<version>

Use Retry setup after a failed automatic setup. If that still fails, install the CLI manually with the command above, then choose Check again in onboarding. Node remains the recommended Gateway runtime.

Label:

  • ai.openclaw.gateway (or ai.openclaw.<profile>; legacy com.openclaw.* may remain)

Plist location (per-user):

  • ~/Library/LaunchAgents/ai.openclaw.gateway.plist (or ~/Library/LaunchAgents/ai.openclaw.<profile>.plist)

Manager:

  • The macOS app owns LaunchAgent install/update in Local mode.
  • The CLI can also install it: openclaw gateway install.

Behavior:

  • “OpenClaw Active” enables/disables the LaunchAgent.
  • App quit does not stop the gateway (launchd keeps it alive).
  • If a Gateway is already running on the configured port, the app attaches to it instead of starting a new one.

Logging:

  • launchd stdout: ~/Library/Logs/openclaw/gateway.log (profiles use gateway-<profile>.log)
  • launchd stderr: suppressed

The macOS app checks the Gateway version against its own version. Onboarding automatically runs managed setup when an existing CLI is missing or incompatible. Use Retry setup to repeat the installation or Check again after repairing an external CLI.

Keep OpenClaw state on a local, non-synced disk. Avoid iCloud Drive and other cloud-synced folders because sync latency and file locks can affect sessions, credentials, and Gateway state.

Set OPENCLAW_STATE_DIR to a local path only when you need an override. openclaw doctor warns about common cloud-synced state paths and recommends moving back to local storage. See environment variables and Doctor.

Use the macOS debug CLI from a source checkout to exercise the same Gateway WebSocket handshake and discovery logic the app uses:

Terminal window
cd apps/macos
swift run openclaw-mac connect --json
swift run openclaw-mac discover --timeout 3000 --json

connect accepts --url, --token, --timeout, and --json. discover accepts --timeout, --json, and --include-local. Compare discovery output with openclaw gateway discover --json when you need to separate CLI discovery from app-side connection issues.

Terminal window
openclaw --version
OPENCLAW_SKIP_CHANNELS=1 \
OPENCLAW_SKIP_CANVAS_HOST=1 \
openclaw gateway --port 18999 --bind loopback

Then:

Terminal window
openclaw gateway call health --url ws://127.0.0.1:18999 --timeout 3000