docs/tools/browser-linux-troubleshooting.md
OpenClaw's browser control server fails to launch Chrome/Brave/Edge/Chromium with the error:
{"error":"Error: Failed to start Chrome CDP on port 18800 for profile \"openclaw\"."}
On Ubuntu (and many Linux distros), the default Chromium installation is a snap package. Snap's AppArmor confinement interferes with how OpenClaw spawns and monitors the browser process.
The apt install chromium command installs a stub package that redirects to snap:
Note, selecting 'chromium-browser' instead of 'chromium'
chromium-browser is already the newest version (2:1snap1-0ubuntu2).
This is NOT a real browser - it's just a wrapper.
Other common Linux launch failures:
The profile appears to be in use by another Chromium process means Chrome
found stale Singleton* lock files in the managed profile directory. OpenClaw
removes those locks and retries once when the lock points at a dead or
different-host process.Missing X server or $DISPLAY means a visible browser was explicitly
requested on a host without a desktop session. By default, local managed
profiles now fall back to headless mode on Linux when DISPLAY and
WAYLAND_DISPLAY are both unset. If you set OPENCLAW_BROWSER_HEADLESS=0,
browser.headless: false, or browser.profiles.<name>.headless: false,
remove that headed override, set OPENCLAW_BROWSER_HEADLESS=1, start Xvfb,
run openclaw browser start --headless for a one-shot managed launch, or run
OpenClaw in a real desktop session.Install the official Google Chrome .deb package, which is not sandboxed by snap:
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
sudo dpkg -i google-chrome-stable_current_amd64.deb
sudo apt --fix-broken install -y # if there are dependency errors
Then update your OpenClaw config (~/.openclaw/openclaw.json):
{
"browser": {
"enabled": true,
"executablePath": "/usr/bin/google-chrome-stable",
"headless": true,
"noSandbox": true
}
}
If you must use snap Chromium, configure OpenClaw to attach to a manually-started browser:
{
"browser": {
"enabled": true,
"attachOnly": true,
"headless": true,
"noSandbox": true
}
}
chromium-browser --headless --no-sandbox --disable-gpu \
--remote-debugging-port=18800 \
--user-data-dir=$HOME/.openclaw/browser/openclaw/user-data \
about:blank &
# ~/.config/systemd/user/openclaw-browser.service
[Unit]
Description=OpenClaw Browser (Chrome CDP)
After=network.target
[Service]
ExecStart=/snap/bin/chromium --headless --no-sandbox --disable-gpu --remote-debugging-port=18800 --user-data-dir=%h/.openclaw/browser/openclaw/user-data about:blank
Restart=on-failure
RestartSec=5
[Install]
WantedBy=default.target
Enable with: systemctl --user enable --now openclaw-browser.service
Check status:
curl -s http://127.0.0.1:18791/ | jq '{running, pid, chosenBrowser}'
Test browsing:
curl -s -X POST http://127.0.0.1:18791/start
curl -s http://127.0.0.1:18791/tabs
| Option | Description | Default |
|---|---|---|
browser.enabled | Enable browser control | true |
browser.executablePath | Path to a Chromium-based browser binary (Chrome/Brave/Edge/Chromium) | auto-detected (prefers default browser when Chromium-based) |
browser.headless | Run without GUI | false |
OPENCLAW_BROWSER_HEADLESS | Per-process override for local managed browser headless mode | unset |
browser.noSandbox | Add --no-sandbox flag (needed for some Linux setups) | false |
browser.attachOnly | Don't launch browser, only attach to existing | false |
browser.cdpPort | Chrome DevTools Protocol port | 18800 |
browser.localLaunchTimeoutMs | Local managed Chrome discovery timeout | 15000 |
browser.localCdpReadyTimeoutMs | Local managed post-launch CDP readiness timeout | 8000 |
On Raspberry Pi, older VPS hosts, or slow storage, raise
browser.localLaunchTimeoutMs when Chrome needs more time to expose its CDP HTTP
endpoint. Raise browser.localCdpReadyTimeoutMs when launch succeeds but
openclaw browser start still reports not reachable after start. Values must
be positive integers up to 120000 ms; invalid config values are rejected.
You're using an existing-session / Chrome MCP profile. OpenClaw can see local Chrome,
but there are no open tabs available to attach to.
Fix options:
openclaw browser start --browser-profile openclaw
(or set browser.defaultProfile: "openclaw").--browser-profile user.Notes:
user is host-only. For Linux servers, containers, or remote hosts, prefer CDP profiles.user / other existing-session profiles keep the current Chrome MCP limits:
ref-driven actions, one-file upload hooks, no dialog timeout overrides, no
wait --load networkidle, and no responsebody, PDF export, download
interception, or batch actions.openclaw profiles auto-assign cdpPort/cdpUrl; only set those for remote CDP.http://, https://, ws://, and wss://.
Use HTTP(S) for /json/version discovery, or WS(S) when your browser
service gives you a direct DevTools socket URL.