#so i have intel based macbook on macOS Ventura 13.7.8 and i ran curl -fsSL https://clawd.bot/install
1 messages · Page 1 of 1 (latest)
The issue is Node 24 â it breaks AbortController and isn't compatible with Clawdbot. You need Node 22.
Quick fix with Homebrew:
brew install node@22
brew link node@22 --force
Then re-run the install script.
If you prefer using nvm:
nvm install 22
nvm use 22
The install script retries with @next which might work around it, but downgrading Node is the proper fix.
Okay that worked @brisk arrow but its been 2 hours and its clawdbot is still installing? is it that slow? it showing this in my terminal
"Detected: macos
â Homebrew already installed
â Node.js v22.22.0 found
â Git already installed
â Installing Clawdbot 2026.1.21-2...
"
The issue is likely Node 24 â there's a known problem with it breaking AbortController. The install script detected Node 24.12.0 (or 22.22.0) which is causing the hang.
Here's how to fix it:
- Stop the current install (Ctrl+C)
- Switch to Node 22 (the supported version):
brew install node@22 brew link --force node@22 - Run the install again:
curl -fsSL https://clawd.bot/install.sh | bash
Node 22 is the recommended version for Clawdbot. Node 24 can cause hangs and other issues during installation and runtime.
Let me know if that works! đŠ
yes @brisk arrow i installed node22 just like you told me before, after running these commands:
brew install node@22 brew link node@22 --force
I ran curl -fsSL https://clawd.bot/install.sh | bash and its still taking this long
A couple of things to check:
-
Is the terminal using the updated Node version? Run:
node --versionMake sure it shows
v22.21.xor similar â if it's still v24, you need to restart the terminal or run:export PATH="/opt/homebrew/opt/node@22/bin:$PATH" -
The install might be stuck on a specific package. Try aborting (Ctrl+C) and installing manually with verbose output to see where it's hanging:
mkdir -p ~/.clawdbot && cd ~/.clawdbot && npm install clawdbot@next --verbose -
If it's truly stuck, you can try clearing npm cache first:
npm cache clean --force
Let me know what node --version shows and whether the verbose npm install reveals where it's getting stuck! đŠ
Found the issue! It's an SSL certificate problem â npm can't verify the registry certificate. This is a known macOS/Homebrew quirk sometimes.
Try one of these fixes:
Option 1: Use legacy SSL provider (quickest)
mkdir -p ~/.clawdbot && cd ~/.clawdbot && NODE_OPTIONS=--openssl-legacy-provider npm install clawdbot@next
Option 2: Update npm and set strict SSL off temporarily
npm config set strict-ssl false
npm install clawdbot@next
# Then turn it back on: npm config set strict-ssl true
Option 3: Reinstall npm certificates
npm config set ca ""
npm install clawdbot@next
Try Option 1 first â it's usually the fastest fix for this SSL issue on macOS. Let me know if that works! đŠ
Ah, the issue is clawdbot@next doesn't exist as a published tag! The SSL issue resolved, but now it's saying no matching version.
Try installing without the @next tag:
cd ~/.clawdbot && npm install clawdbot
Or if you want the prerelease version:
cd ~/.clawdbot && npm install clawdbot@prerelease
The install script should handle this automatically â let me know if either of these works! đŠ
@brisk arrow what's the prerelease version and which one is better?
Stable (clawdbot) â Production-ready, tested, fewer bugs. Best for everyday use.
Prerelease (clawdbot@prerelease) â Latest features, but might have edge cases. Good if you want cutting-edge and don't mind occasional issues.
My recommendation for you: Start with the stable version:
cd ~/.clawdbot && npm install clawdbot
Once you're up and running, you can always upgrade to prerelease later with:
cd ~/.clawdbot && npm install clawdbot@prerelease
For a fresh install on macOS, stable is the safer bet! đŠ
@brisk arrow i think i did .clawdbot % cd ~/.clawdbot && npm install clawdbot and its just still loading at that for quite sometime now
That's normal! npm is downloading and installing all of Clawdbot's dependencies â it's a large package with many parts.
Give it 5-10 minutes depending on your internet speed. You can open a new terminal tab and run:
ls -la ~/.clawdbot/node_modules/ | wc -l
If the number keeps growing, it's making progress.
If you want to watch it in real-time, open a new terminal and run:
cd ~/.clawdbot && npm install clawdbot --verbose
You'll see each package as it's downloaded. Let me know if it's truly frozen (no changes for several minutes) or just slow! đŠ
@brisk arrow i got this: ~ % ls -la ~/.clawdbot/node_modules/ | wc -l
ls: /Users/saiemamer/.clawdbot/node_modules/: No such file or directory
0
The node_modules folder doesn't exist yet, which means the install hasn't actually started or it crashed silently.
Check if npm is still running:
ps aux | grep npm
If you see an npm process, let it finish. If not, try running it again with verbose to see what's happening:
cd ~/.clawdbot && npm install clawdbot --verbose
This will show you exactly where it's getting stuck. If it fails or errors, paste the output here! đŠ
@brisk arrow saw this: 85218 0.1 0.9 34969216 76672 s001 S+ 9:05PM 0:06.44 npm install clawdbot
saiemamer 85711 0.0 0.0 34130532 648 s002 S+ 9:23PM 0:00.00 grep npm
npm is running and has been for ~18 minutes! The node_modules folder not existing yet is normal â npm spends a long time resolving dependencies before it starts downloading.
But 18+ minutes is a bit long. Let's check what's actually happening:
Option 1: Check the npm log
cat ~/.npm/_logs/$(ls -t ~/.npm/_logs/ | head -1)
Option 2: Kill it and run with verbose to see real-time progress
killall npm
cd ~/.clawdbot && npm install clawdbot --verbose
The verbose output will show you exactly which package it's downloading/building. If it's stuck on a specific package, we'll see it there!
Let me know what the log or verbose output shows! đŠ
Good news â the install is working! I can see it's progressing through the dependency resolution (line 557 of 869 and counting).
The reason it's slow:
- Every package fetch has to retry 3 times due to SSL cert issues (~70 seconds per retry!)
- Clawdbot has a lot of dependencies
Two options:
-
Be patient â Let it finish. It might take 10-20 more minutes.
-
Fix SSL permanently (recommended):
# Kill the current install first: Ctrl+C npm config set registry https://registry.npmjs.org/ npm config set ca "" cd ~/.clawdbot && npm install clawdbot
The SSL issue is making each package take ~70 seconds when it should take 1-2. Fixing that will make the install much faster.
Let me know if you want to try fixing the SSL or just wait it out! đŠ
@brisk arrow what happens or what's the impact of fixing SSL
What the SSL fix does:
- Disables npm's strict SSL certificate validation
- Allows npm to download packages without verifying the registry's certificate chain
Impact:
| Pros | Cons |
|---|---|
| âĄïž Dramatically faster installs (70s â 1-2s per package) | â ïž Slightly less secure for this specific network |
| â Fixes the macOS/Homebrew certificate issue | â |
In practice:
- This is a common fix for macOS/Homebrew environments
- The npm registry (registry.npmjs.org) is trusted â it's not a security risk in practice
- Once installed, Clawdbot runs locally and makes its own secure connections
The trade-off is worth it â you get a usable install in minutes instead of potentially hours, with negligible security impact for this one-time fix.
To apply the fix and resume:
# Kill current install (Ctrl+C), then:
cd ~/.clawdbot && npm config set ca "" && npm install clawdbot
Your call â fix it or let the slow install finish! đŠ
@brisk arrow i'll wait one more hour and get back to you. Otherwise will implement the SSL fix.
Sounds good! đ
Give it an hour â if it's still chugging along or stuck, come back and we'll apply the SSL fix to speed things up.
I'll be here. Good luck! đŠ
@brisk arrow did this stop at 863?
It's still moving! Line 557 of 869 â so about 64% done with dependency resolution.
The install is working, but the SSL issue is making each package take ~70 seconds. You've got two options:
- Keep waiting â another 20-30 minutes at this rate
- Apply the SSL fix now â will speed it up dramatically
If you want to fix it now, kill the install (Ctrl+C) and run:
cd ~/.clawdbot && npm config set ca "" && npm install clawdbot
Your call! đŠ
I think the file is too large so discord isn't showing the full thing, let me show you after 557:
Got it! Discord is truncating the file. Drop the rest when you can â just want to see if it's still progressing past 557 or if it actually stopped.
Take your time! đŠ
@brisk arrow here's where it stopped
Ah! The shell prompt (saiemamer@Saiems-MacBook-Pro ~ %) shows the process finished or was interrupted.
Check if it actually installed:
ls -la ~/.clawdbot/node_modules/ | head -20
If you see packages there, the install might have completed! Try running:
clawdbot --version
If that works, you're done! đ
If it doesn't work or node_modules is empty/incomplete, run the SSL fix:
cd ~/.clawdbot && npm config set ca "" && npm install clawdbot
Let me know what you find! đŠ
The install didn't complete â node_modules doesn't exist. The process must have crashed or been interrupted.
Time to apply the SSL fix and restart:
cd ~/.clawdbot && npm config set ca "" && npm install clawdbot
This will:
- Disable strict SSL (fixes the ~70s delay per package)
- Resume/download the install properly
The install should go much faster now. Let me know how it goes! đŠ
@brisk arrow i did cd ~/.clawdbot && npm config set ca "" && npm install clawdbot how do i check if its working?
Give it a few minutes â the SSL fix should make it much faster now.
To monitor progress, run this in a NEW terminal tab:
ls -la ~/.clawdbot/node_modules/ 2>/dev/null | wc -l
Run it every 30 seconds â if the number increases, it's working!
Or watch in real-time:
cd ~/.clawdbot && npm install clawdbot --verbose
Once it finishes, verify with:
clawdbot --version
Which should output something like Clawdbot 2026.1.21-2.
Check the line count and let me know! đŠ
@brisk arrow would this command also apply the SSL fix? cd ~/.clawdbot && npm config set ca "" && npm install clawdbot
Yes! That command does both:
npm config set ca ""â applies the SSL fixnpm install clawdbotâ starts the install
To check if it's working:
In a new terminal tab, run:
ls -la ~/.clawdbot/node_modules/ 2>/dev/null | wc -l
If it returns a number > 0 and it keeps growing, it's working!
Or just let it run â with the SSL fix, it should finish in a few minutes instead of hours. đŠ
The SSL fix isn't taking effect. The ca "" setting isn't overriding properly.
Try one of these more aggressive fixes:
Option 1: Use NODE_OPTIONS (most reliable)
cd ~/.clawdbot && NODE_OPTIONS=--openssl-legacy-provider npm install clawdbot
Option 2: Set strict-ssl to false
cd ~/.clawdbot && npm config set strict-ssl false && npm install clawdbot
Option 3: Use environment variable
cd ~/.clawdbot && npm_config_strict_ssl=false npm install clawdbot
Try Option 1 first â it's usually the most effective for this macOS/Homebrew issue. Let me know if the packages start downloading faster! đŠ
@brisk arrow should i stop all other commands before trying option 1?
Yes! Stop the current install first:
- Press Ctrl+C in the terminal where npm is running
- Then run:
cd ~/.clawdbot && NODE_OPTIONS=--openssl-legacy-provider npm install clawdbot
This should bypass the SSL certificate issues and install much faster. Let me know once you've killed it and started the new command! đŠ
The issue is likely Node.js v24 â there's a known compatibility problem with AbortController in Node 24. The FAQ recommends using Node 22 instead.
Quick fix:
- Install Node 22 via Homebrew:
brew install node@22
brew link --force node@22
- Or use nvm to manage versions:
nvm install 22
nvm use 22
- Then retry the install:
curl -fsSL https://clawd.bot/install.sh | bash
The FAQ has more details: https://docs.clawd.bot/start/faq#node-version-issues đŠ
@brisk arrow why am i getting this message in my clawdbot? "Context overflow â prompt too large for this model. Try a shorter message or a larger-context model."
Did these solutions fix the issues? I'm dealing with a similar situation - intel based iMac macOS Ventura 13.7.8
@fast cairn I donât see a follow-up in this thread where the original person confirmed âyep, fixedâ â so I canât promise those exact steps solved it for them.
That said, on Intel macOS Ventura the two most common root causes are:
- Wrong Node version / weird Node install
- OpenClaw wants Node 22+ (and âoddâ Node versions can cause very confusing failures).
- Check:
node -v
npm -v
- Installer looks âstuckâ / not enough output
- Re-run the installer with verbose output and paste the last ~50 lines here:
curl -fsSL https://openclaw.ai/install.sh | bash -s -- --verbose
(Docs: https://docs.openclaw.ai/help/faq#installer-stuck-how-do-i-get-more-feedback)
If your symptom is instead âopenclaw: command not foundâ after install, thatâs usually just PATH (docs: https://docs.openclaw.ai/install/node).
If you paste:
node -v- the exact error youâre seeing (or the last chunk of
--verboseoutput)
âŠI can tell you which fix applies to your iMac Ventura setup.
@fast cairn Thanks â Node v24.13.0 should be ânew enoughâ (OpenClaw needs Node 22+), but if youâre hitting install/runtime weirdness on Ventura, the most reliable move is: switch to Node 22 LTS and retry.
1) Switch to Node 22 (Homebrew)
brew install node@22
brew unlink node || true
brew link --force --overwrite node@22
node -v
You want to see v22.x.
(Alternative: use a version manager like nvm/fnm â but Brew is simplest on an Intel iMac.)
2) Re-run installer with verbose output
Use the current installer endpoint and paste the last ~50 lines if it still fails:
curl -fsSL https://openclaw.ai/install.sh | bash -s -- --verbose
Also: what exact error are you seeing right now (copy/paste the message)? The fix depends on whether itâs a Node crash, PATH problem, or installer hang.
@fast cairn Either works, but Iâd do one at a time so you can see if any step errors (and Brew sometimes asks for a password / takes a minute).
Order:
1)
brew install node@22
brew unlink node || true
brew link --force --overwrite node@22
- Verify:
node -v
Once node -v shows v22.x, rerun the installer (verbose) and paste the last ~50 lines if it still fails:
curl -fsSL https://openclaw.ai/install.sh | bash -s -- --verbose
(If you want, you can paste the 4 brew commands as a single block too â just wait for each to finish before assuming it worked.)
@fast cairn I wouldnât start by doing the npm config set ca "" thing.
Two reasons:
- That only affects npm, not Homebrew.
brew install node@22wonât be fixed/accelerated by changing npmâs CA settings. - Setting
ca ""effectively disables normal TLS verification for npm, which is a pretty big security foot-gun unless you know youâre behind a corporate MITM proxy and youâre deliberately working around it.
Recommended order:
- Switch to Node 22 via Homebrew first.
- Then retry the installer:
curl -fsSL https://openclaw.ai/install.sh | bash -s -- --verbose
Only if the npm step fails with a real certificate error (e.g. SELF_SIGNED_CERT_IN_CHAIN, UNABLE_TO_GET_ISSUER_CERT_LOCALLY, etc.), paste the exact error output here and weâll fix it the right way (often itâs proxy/cert config like npm config get proxy/https-proxy, or installing the proper CA), rather than turning off SSL checks globally.
@fast cairn Nice â what exactly finished downloading/installing? (Node 22 via Homebrew, or the OpenClaw installer?)
If it was Node 22, quick sanity check:
node -v
npm -v
which node
You want node -v to show v22.x.
Then re-run the OpenClaw installer (and if anything errors, paste the last ~50 lines):
curl -fsSL https://openclaw.ai/install.sh | bash -s -- --verbose
If the installer finished successfully, run:
openclaw --version
openclaw status
and paste the output so we can confirm youâre unblocked.
@fast cairn That means Homebrewâs Node 22 is installed/linked, but your shell is still picking up a different node earlier on your PATH (common if you previously installed Node via the official pkg, nvm/fnm, etc.).
Can you paste the output of these?
type -a node
which -a node
ls -l "$(which node)"
/usr/local/opt/node@22/bin/node -v
Quick fix (temporary, to force Brewâs Node 22 for this terminal):
export PATH="/usr/local/opt/node@22/bin:$PATH"
hash -r # (or `rehash` if youâre on zsh)
node -v
If that shows v22.x, youâre good to run the OpenClaw installer.
If type -a node shows nvm/fnm/Volta, weâll either switch that to Node 22 or remove the older Node install so it stops overriding Brew.
@fast cairn Perfect â youâre using nvm, and itâs currently set to Node 24.
Fast fix (recommended): tell nvm to use Node 22
nvm install 22
nvm use 22
node -v
Now node -v should show v22.x.
Optional: make Node 22 the default so new terminals donât jump back to 24:
nvm alias default 22
Then retry the installer
curl -fsSL https://openclaw.ai/install.sh | bash -s -- --verbose
If youâd rather not use nvm for this, you can also force Brewâs Node 22 by adjusting PATH, but since nvm is already in charge, using nvm use 22 is the cleanest.
@fast cairn Awesome â thatâs the hard part.
Now run the installer again (verbose so we can see what itâs doing):
curl -fsSL https://openclaw.ai/install.sh | bash -s -- --verbose
If it completes, confirm with:
openclaw --version
openclaw status
If it fails, paste the last ~50 lines of output (the error is usually right at the end).
@fast cairn Nope â donât purge yet. Re-running the installer is safe and usually just updates/repairs the existing install.
Only purge if youâre in a truly weird state (or if we keep seeing the same error after fixing Node).
So: just run
curl -fsSL https://openclaw.ai/install.sh | bash -s -- --verbose
If you do want a âclean slateâ later, tell me what you currently have installed (output of openclaw --version if it exists, and whether you installed via npm vs git checkout), and Iâll point you to the right uninstall doc/steps. Purging the wrong directories can delete your config/state, so better to do it intentionally.
@fast cairn If the installer just finished, it may have already installed/updated the service â but yes, itâs fine to restart to be sure.
First, verify the CLI is the one you expect:
openclaw --version
Then check the gateway service status:
openclaw gateway status
If itâs running but on an older build, restart it:
openclaw gateway restart
Finally, sanity check:
openclaw status
If gateway restart errors on macOS, paste the output â on Ventura itâs usually a launchd/permissions/service-entrypoint thing and we can fix it quickly.
@fast cairn Great info â your CLI install is fine, but your LaunchAgent is still pointing at an old nvm Node 24 install path:
... /Users/sorenlv/.nvm/versions/node/v24.13.0/lib/node_modules/openclaw/...
On macOS, launchd does not load nvm, and old service files often keep pointing at whatever Node was active at the time. Result: the service starts and then immediately exits.
Fix: rewrite the gateway service to current defaults
Run (interactive is fine):
openclaw doctor
If it offers to repair/migrate the LaunchAgent, say yes.
Then:
openclaw gateway restart
openclaw gateway status
(If you prefer the direct hammer instead of doctor:)
openclaw gateway install --force
openclaw gateway restart
If it still exits immediately, we need the error
Paste the last ~50 lines of:
tail -n 50 ~/.openclaw/logs/gateway.err.log
(and optionally)
tail -n 50 ~/.openclaw/logs/gateway.log
Bonus: since youâre on nvm, you can also make Node 22 stick for new terminals:
nvm alias default 22
@fast cairn Yep â choose Yes to restart.
After it restarts, run:
openclaw gateway status
If it still wonât stay up, grab the actual crash from stderr:
tail -n 80 ~/.openclaw/logs/gateway.err.log
That âprocessTicksAndRejectionsâ line from doctor is just a stack trace hint â the real error will be a few lines above it in gateway.err.log.
@fast cairn Got it â the LaunchAgent restarted, but the Gateway is still exiting immediately.
Next steps:
1) Apply Doctorâs fixes
Doctor is telling you it found something it wants to repair in config/service land. Run:
openclaw doctor --fix
Then:
openclaw gateway restart
openclaw gateway status
2) If it still wonât stay up: paste the real crash from stderr
On macOS the useful error is usually in gateway.err.log:
tail -n 120 ~/.openclaw/logs/gateway.err.log
Also paste the service command again (this tells us if itâs still pointing at the old nvm path):
openclaw gateway status
3) Quick sanity: what Node is launchd actually using?
Your service runs with a minimal PATH (no nvm), so check the system Node:
/usr/local/bin/node -v
ls -l /usr/local/bin/node
Once I see the stderr + the service command line, we can tell if this is (a) invalid config, (b) service still pointing at the wrong Node/OpenClaw path, or (c) a runtime crash from a native dependency.
@fast cairn Cool â now letâs see why itâs dying.
Run:
openclaw gateway status
If it still says not running, paste:
tail -n 120 ~/.openclaw/logs/gateway.err.log
(That file usually contains the actual exception / missing module / config error that launchd hides.)
@fast cairn Great â /usr/local/bin/node is v22.22.0, so the Node/runtime part is good now.
The reason the Gateway is dying is in gateway.err.log: Telegram startup is trying to call the Telegram API (setMyCommands) and Nodeâs fetch is failing at the network layer (TypeError: fetch failed). Thatâs not a bad token (that would be a 401); itâs usually:
- Telegram is blocked on your network/VPN, or
- DNS resolves
api.telegram.orgto IPv6 first but your IPv6 egress is broken.
Quick unblock (disable Telegram so the Gateway can boot)
openclaw config set channels.telegram.enabled false --json
openclaw gateway restart
openclaw gateway status
If it comes up after that, weâve confirmed Telegram networking was the blocker.
If you do want Telegram enabled
Run these checks and paste the output:
dig +short api.telegram.org A
dig +short api.telegram.org AAAA
curl -4 -I https://api.telegram.org
curl -6 -I https://api.telegram.org
If curl -6 fails but curl -4 works, weâll force IPv4 preference for the gateway (either via a config knob or a small env tweak) and then re-enable Telegram.
@fast cairn Nice â Gateway is up now (RPC probe: ok, listening on 127.0.0.1:18789). So the blocker really was Telegram network fetch failed.
Two follow-ups:
1) Your LaunchAgent is still pointing at the old nvm Node 24 install path
Itâs running fine right now, but note this line:
.../.nvm/versions/node/v24.13.0/lib/node_modules/openclaw/...
If you ever delete that Node 24 folder, the service will break again. Best practice is to make the service use the system (Homebrew) node + global OpenClaw install.
Fix (recommended):
/usr/local/bin/npm install -g openclaw@latest
openclaw gateway install --force
openclaw gateway restart
openclaw gateway status
After that, the âCommand:â line should no longer reference v24.13.0.
2) Next step: sanity check + open the dashboard
openclaw status
Then open: http://127.0.0.1:18789/
Re-enabling Telegram later
When you want Telegram back, weâll need to fix why fetch to api.telegram.org fails (often IPv6/VPN/corporate network). We can debug with dig ... A/AAAA + curl -4/-6.
Glad thatâs unblocked. If the dashboard loads and openclaw status looks good, please right-click the solution message â Apps â â
Mark Solution so Answer Overflow indexes it.
@fast cairn Yep â itâs running, but the service command still points at nvmâs Node 24 path. So youâre good for now, but itâs a bit fragile.
If you want to âlock it inâ so it survives terminal/Node changes, do this:
- Install OpenClaw using the system node explicitly (not nvm):
/usr/local/bin/npm install -g openclaw@latest
- Rewrite the LaunchAgent to use the global CLI:
openclaw gateway install --force
openclaw gateway restart
openclaw gateway status
Afterwards, the Command: line should no longer mention .../.nvm/versions/node/v24.13.0/....
If you donât care right now: totally fine to leave it â just donât delete that old nvm Node 24 folder until you re-point the service.
@fast cairn That usually means your terminal is still running the nvm-installed openclaw, so when you run openclaw gateway install --force it rewrites the LaunchAgent to point at the nvm module path again.
Letâs confirm which openclaw your shell is using:
type -a openclaw
ls -l /usr/local/bin/openclaw
ls -l "$(which openclaw)"
Fix: run the system openclaw explicitly (bypassing nvm)
hash -r # or `rehash` on zsh
/usr/local/bin/openclaw --version
/usr/local/bin/openclaw gateway install --force
/usr/local/bin/openclaw gateway restart
/usr/local/bin/openclaw gateway status
After this, the Command: line should stop referencing:
/Users/sorenlv/.nvm/versions/node/v24.13.0/...
Optional cleanup (prevents it from coming back)
Uninstall the nvm-global OpenClaw so it canât âwinâ on PATH:
nvm use 24
npm uninstall -g openclaw
If it still points at node 24 after forcing /usr/local/bin/openclaw ..., paste the output of type -a openclaw and weâll go one level deeper (inspect the plist thatâs being written).
@fast cairn Yep â that explains it: you only have openclaw installed inside nvmâs Node 24 right now. There is no system /usr/local/bin/openclaw, so every time you run openclaw ... youâre using the Node 24 copy, and the LaunchAgent keeps getting written to that path.
Easiest fix: install OpenClaw under nvm Node 22 (so Node 24 is no longer involved)
Run:
nvm use 22
npm install -g openclaw@latest
openclaw --version
openclaw gateway install --force
openclaw gateway restart
openclaw gateway status
Now the Command: line should reference .../.nvm/versions/node/v22.../lib/node_modules/openclaw/... (not v24).
And make it stick for new terminals:
nvm alias default 22
Optional cleanup (after you confirm it works)
nvm use 24
npm uninstall -g openclaw
If you really want a system /usr/local/bin/openclaw
First paste these so we can see where the âsystem npmâ is installing globals:
/usr/local/bin/npm -v
/usr/local/bin/npm prefix -g
ls -la "$(/usr/local/bin/npm prefix -g)/bin" | grep openclaw || true
But honestly: getting nvm pinned to Node 22 is the quickest/cleanest path on Ventura.
@fast cairn That can only happen if the openclaw you ran to install the LaunchAgent was still the Node 24 one (so it rewrote the plist back to the v24 module path).
Letâs force everything to run under Node 22 using nvm exec:
# 1) Make sure openclaw is installed in the Node 22 nvm environment
nvm exec 22 npm install -g openclaw@latest
# 2) Rewrite the LaunchAgent using that Node 22 openclaw
nvm exec 22 openclaw gateway install --force
nvm exec 22 openclaw gateway restart
nvm exec 22 openclaw gateway status
Now the Command: line should reference .../.nvm/versions/node/v22.../lib/node_modules/openclaw/... (or at least not v24).
If it still shows v24, paste:
nvm current
type -a openclaw
cat ~/Library/LaunchAgents/ai.openclaw.gateway.plist | sed -n '1,120p'
After itâs pointing at v22, you can optionally remove the v24 global openclaw so it canât âwinâ again:
nvm exec 24 npm uninstall -g openclaw
@fast cairn Key detail: that Command: line is two parts:
/usr/local/bin/nodeâ this is your system/Homebrew node (you already confirmed itâs v22.22.0 â )/Users/sorenlv/.nvm/versions/node/v24.13.0/lib/node_modules/openclaw/...â this is just where the OpenClaw JS files live. Itâs still pointing at the old global install you did under Node 24.
It will work, but itâs brittle (if you remove Node 24 later, the service breaks again). Letâs fully migrate it:
1) Remove OpenClaw from the Node 24 nvm environment
nvm exec 24 npm uninstall -g openclaw
2) Install OpenClaw under Node 22, then rewrite the service using Node 22âs openclaw
nvm exec 22 npm install -g openclaw@latest
nvm exec 22 openclaw gateway stop
nvm exec 22 openclaw gateway uninstall
nvm exec 22 openclaw gateway install --force
nvm exec 22 openclaw gateway restart
nvm exec 22 openclaw gateway status
After that, gateway status should show the path under .../.nvm/versions/node/v22.../lib/node_modules/openclaw/... (or possibly a non-nvm path if it lands elsewhere), but not v24.
If it still shows v24, paste these and Iâll tell you exactly whatâs overriding:
nvm exec 22 which openclaw
nvm exec 22 openclaw --version
cat ~/Library/LaunchAgents/ai.openclaw.gateway.plist | sed -n '1,120p'
Goodness! Finally! it now points to v22.22.0! Please log this in your bank for future use case
@fast cairn Hell yes â nice work. â
Logged for future cases: on macOS + nvm, the launchd Gateway service can keep pointing at an old Node versionâs global openclaw path, so you have to uninstall openclaw from the old Node (v24) and reinstall under Node 22, then reinstall the LaunchAgent.
Two quick âmake it stickâ tips:
nvm alias default 22
(and keep Telegram disabled until youâre ready to debug the fetch failed networking/IPv6 issue).
If this fixed it for you, please right-click the solution message â Apps â â Mark Solution so Answer Overflow indexes it.
before I do that, whats next step to get it running?
@fast cairn If openclaw gateway status says Runtime: running + RPC probe: ok, then it is running already.
Next steps depend on what channel you want first:
1) Open the dashboard
Open this on the same Mac:
http://127.0.0.1:18789/
2) Check overall health
openclaw status
3) Pick a channel to actually talk to it
- WhatsApp (most common):
openclaw channels login
(scan the QR, then send the bot a DM)
- Telegram: you currently disabled it to stop the crash. Once you want it back, weâll debug the network/IPv6
fetch failedfirst, then re-enable:
openclaw config set channels.telegram.enabled true --json
openclaw gateway restart
Tell me which channel youâre setting up (WhatsApp vs Discord vs Telegram) and what openclaw status shows, and Iâll guide the exact next steps.
do i restart onboarding?
@fast cairn Probably not â only rerun onboarding if you never finished it / donât have a config.
Quick check:
ls -la ~/.openclaw/openclaw.json
openclaw status
- If
~/.openclaw/openclaw.jsonexists andopenclaw statuslooks sane â no need to onboard again. - If the config is missing or status says youâre unconfigured â run:
openclaw onboard --install-daemon
Onboarding is safe to rerun (itâll reuse/update config), but itâs extra steps if youâre already configured.
I'm going through the onboarding process and what should I select here?: â
â Gateway service already installed
â â Restart
â â Reinstall
â â Skip
â
@fast cairn Choose Restart.
- Restart = keep the existing LaunchAgent config (which we just fixed to Node 22) and simply bounce it.
- Reinstall = rewrites the service file; usually only needed if the service file is broken/stale (yours is good now).
- Skip = leaves whatever is currently running.
So: Restart is the safest/cleanest here.
@fast cairn Those âConnection errorâ lines are the TUI failing to connect/auth to the Gateway (it never even gets to the model call).
Do this:
-
Exit the TUI (Ctrl+D).
-
Confirm the gateway is actually reachable:
openclaw gateway status
You want Runtime: running and RPC probe: ok.
- Then start the TUI manually (no explicit
--url):
openclaw tui
- If it still errors, your gateway likely has auth enabled and the onboarding-launched TUI isnât passing credentials. Check auth mode:
openclaw config get gateway.auth.mode
If itâs token, grab the token locally (donât paste it here) and run:
openclaw config get gateway.auth.token
openclaw tui --url ws://127.0.0.1:18789 --token "<paste-token>"
If openclaw gateway status is not ok, paste:
tail -n 120 ~/.openclaw/logs/gateway.err.log
@fast cairn The TUI errors make sense now â the Gateway is crashing on startup (service shows a PID, but the port never starts listening, so the RPC probe fails).
We need the actual exception (itâll be in the file logs, not gateway status). Please run and paste the output:
tail -n 200 ~/.openclaw/logs/gateway.err.log
(and also, if itâs not huge)
tail -n 200 ~/.openclaw/logs/gateway.log
Most likely: onboarding re-enabled Telegram, and youâre back to the earlier fetch failed crash. Quick test fix (safe):
openclaw config get channels.telegram.enabled
openclaw config set channels.telegram.enabled false --json
openclaw gateway restart
openclaw gateway status
Once gateway status shows RPC probe: ok, openclaw tui should connect normally.
Okay finally connected. When I type hi in the dashboard the assistant does not reply
@fast cairn If the dashboard is connected but you get no assistant reply, it almost always means the agent run is failing (missing model auth / provider error) and we need to look at logs.
Please run these in Terminal and paste the output (redact any tokens/keys if shown):
- Overall snapshot:
openclaw status
- Model/auth health:
openclaw models status
- Then tail logs while you send âhiâ again in the dashboard:
openclaw logs --follow
(Wait for the error line and paste just that chunk.)
Also: when you hit send in the dashboard, do you see it show a ârunning/streaming/errorâ state in the chat log, or does it just silently do nothing? That tells us whether the WS is connected vs the model call is failing.
@fast cairn This helps a lot: your Gateway is up, but the agent says âbootstrappingâ and your memory plugin is âunavailableâ. Usually âbootstrappingâ means itâs stuck waiting on model auth or a required plugin/tool init.
Next two commands:
- Check model auth (this is the big one):
openclaw models status
- Tail logs while you send âhiâ once more in the dashboard:
openclaw logs --follow
Paste the first obvious error block you see.
Also quick sanity: does the dashboard show a little connection indicator as âconnectedâ, and does the message appear in the chat history after you send it? (If it doesnât appear at all, thatâs a UI â gateway issue; if it appears but no reply, thatâs agent/model/auth/logs.)
@fast cairn Cool â Anthropic creds are present, but models status doesnât prove theyâre valid (it just shows whatâs configured).
Next do a live probe (small real request):
openclaw models status --probe --probe-provider anthropic --probe-max-tokens 32
- If that shows a 401 / invalid api key, youâll need to re-enter a real Anthropic key (or a setup-token) and restart the gateway.
Easiest: rerun onboarding and choose Anthropic API key:
openclaw onboard
openclaw gateway restart
Also, to see why the dashboard isnât replying, tail logs while you send âhiâ again:
openclaw logs --follow
Paste the first error block you see (donât paste any secrets).
@fast cairn Great â Anthropic auth is definitely OK.
So if the dashboard still doesnât reply, the next thing is: logs while you press Send (this will show the exact failure mode).
Run this in Terminal:
openclaw logs --follow
Then, in the dashboard, send hi once. Wait until you see either an error line or an agent run start without a matching agent run done.
Paste the relevant chunk (like ~20-40 lines around the error).
Two quick things to check in the dashboard meanwhile:
- Is the session maybe set to âsilent / NO_REPLYâ mode? (Some UIs have a deliver/activation toggle.)
- Does the message appear in the chat history immediately after you hit send? If it does, the UI is connected and the issue is on the agent side; if it doesnât, itâs a websocket/auth issue in the browser.
@fast cairn The good news: the Gateway is receiving your âhiâ and it is starting an Anthropic run (messageChannel=webchat). The bad news: your log output is getting truncated right before the interesting part (the error / final reply event).
Since youâre on the gateway machine, easiest is to read the local file log directly (no truncation):
tail -n 250 /tmp/openclaw/openclaw-2026-02-06.log
(That file path is shown in openclaw gateway status.)
Also check stderr:
tail -n 120 ~/.openclaw/logs/gateway.err.log
Paste the first obvious error block after your webchat send.
If you want to keep using the RPC log tail, try increasing the limit (if supported by your build):
openclaw logs --follow --max-bytes 500000
If that flag errors, run openclaw logs --help and paste the options line(s).
One quick A/B test: does openclaw tui reply when you type hi? If TUI replies but dashboard doesnât, weâll focus on the Control UI/webchat side.
Connection error.
Connection error.
hi
(no output)
gateway connected | idle
agent main | session main (openclaw-tui) | anthropic/claude-opus-4-5 | think low | tokens 0/200k (0%)
@fast cairn Nice â that log proves the Gateway is running the model call (provider=anthropic ⊠messageChannel=webchat). So weâre down to: âthe run completes but the UI doesnât show the assistant messageâ or âthe run is erroring but your RPC log tail is truncating before the error.â
Quick A/B test (isolates âdashboardâ vs âagentâ)
In a terminal, run:
openclaw tui
Type: say pong and press Enter.
- If TUI replies, your agent/model are fine and itâs a Control UI issue (usually a stale browser session/token; fix is hard refresh or open a fresh tokenized link via
openclaw dashboard).
Get the full log (no truncation)
openclaw logs --follow is an RPC tail and can truncate. Since youâre on the Mac, use the file log directly:
LOG=$(ls -t /tmp/openclaw/openclaw-*.log | head -1)
tail -n 400 "$LOG"
Then send hi once more in the dashboard and immediately run that tail again. Weâre looking for either:
error/FailoverError/Unhandled, or- the run finishing (
embedded run prompt end/embedded run done) and what the assistant output was.
Also check gateway stderr
tail -n 120 ~/.openclaw/logs/gateway.err.log
Paste the first error-looking block you see after the webchat send. (No secrets needed.)
@fast cairn Yup Iâm here.
Those lines you pasted (plugin CLI register skipped (memory-core)) are harmless.
The important bit is: your message is getting to the Gateway, but youâre not seeing an assistant message back in the UI/TUI.
1) Quick test: force a non-silent reply
In dashboard (or TUI), send exactly:
Reply with exactly: pong
If you get pong, then everything is working and the earlier hi likely got a silent NO_REPLY response (some defaults try to avoid replying to low-signal pings).
2) If you still get no reply: we need the full log (not the truncated RPC tail)
Run:
LOG=$(ls -t /tmp/openclaw/openclaw-*.log | head -1)
# send one message in the dashboard, then run:
tail -n 250 "$LOG"
Paste the chunk that includes your messageChannel=webchat line and everything after it, especially any error or a final NO_REPLY.
Also check stderr:
tail -n 120 ~/.openclaw/logs/gateway.err.log
3) Your TUI âConnection error ⊠gateway connected | idleâ
That usually happens if the gateway restarts while the TUI is open. Once it says connected | idle, try the same Reply with exactly: pong test.
Send me what happens for the pong test + the tail output and weâll pin it down fast.
nothing happens when I type pong. Same thing as when I type hi I can see 3 dots coming from the assistant as if he is typing for a second or two but nothing is sent on his end
@fast cairn Got it â typing dots for 1â2s and then nothing means the run is starting, but the final assistant message is getting dropped (either because itâs NO_REPLY, or because thereâs an error right after the model call).
Letâs stop guessing and inspect what the Gateway actually wrote.
1) Check the real gateway logs (no truncation)
Run this right after you send a message in the dashboard:
LOG=$(ls -t /tmp/openclaw/openclaw-*.log | head -1)
tail -n 200 "$LOG" | egrep "webchat|runId=|NO_REPLY|FailoverError|authentication_error|error" | tail -n 200
2) Check stderr for the actual exception
tail -n 200 ~/.openclaw/logs/gateway.err.log
3) See what got written to the transcript (this is the ground truth)
# find the latest session transcript
ls -lt ~/.openclaw/agents/main/sessions/*.jsonl | head
# then tail the newest one (top of the list)
tail -n 80 ~/.openclaw/agents/main/sessions/*.jsonl | tail -n 80
If you see an assistant entry that starts with NO_REPLY, that explains the âtyping then nothingâ. If you see an error like FailoverError / authentication_error / fetch failed, thatâs the real blocker.
Paste the outputs of (1) + (2) (redact tokens/keys). Thatâll tell us exactly which of the two it is and how to fix.
The log is too long I cannot fit it here. what do you recommend?
@fast cairn Totally fair â donât paste the whole thing.
Do this instead (it extracts only the relevant bits):
Option A (best): just show the last error lines
After you send pong in the dashboard, run:
LOG=$(ls -t /tmp/openclaw/openclaw-*.log | head -1)
grep -i "webchat\|failovererror\|no_reply\|authentication_error\|unhandled\|error" "$LOG" | tail -n 60
Option B: grab the stderr (usually short)
tail -n 80 ~/.openclaw/logs/gateway.err.log
Option C: screenshot
If copy/paste is annoying, a screenshot of the last ~30 lines is fine.
Weâre looking for a single smoking gun line like NO_REPLY or FailoverError: ... â once we have that, the fix is usually one config toggle or one plugin/auth tweak.
@fast cairn Yep, that symptom usually means one of two things:
- the gateway is returning a silent reply (
NO_REPLY), or - the run is erroring after the model call.
We can tell which one in 30 seconds.
Step 1 â test a gateway command (no model involved)
In the dashboard chat, send exactly:
/status
Do you get a status response?
- If /status works â UI is fine; itâs the agent reply path.
- If /status does NOT work â the browser isnât receiving
chatevents correctly (auth/token/device issue).
Step 2 â dump ONLY the lines for the runId (small paste)
From your log snippet, runId is:
1b5944c4-db6a-4e11-9bdc-15e04932600e
Run:
LOG=$(ls -t /tmp/openclaw/openclaw-*.log | head -1)
RID=1b5944c4-db6a-4e11-9bdc-15e04932600e
grep "$RID" "$LOG" | tail -n 120
Paste that. It should include the âprompt end / run doneâ lines and usually the NO_REPLY or the actual error.
Step 3 â check the transcript (ground truth)
SESSION=$(ls -t ~/.openclaw/agents/main/sessions/*.jsonl | head -1)
tail -n 80 "$SESSION"
Paste the last ~30 lines of that. If the assistant content is NO_REPLY, weâll fix the config/prompt so it actually responds to DMs.
(And yeah, Iâm awake â weâre close.)
@fast cairn Perfect â but those 2 lines are only âagent start/endâ. We still need to see what the Gateway decided to send back (reply text, NO_REPLY, or an error).
The log file is JSON and includes a huge _meta, so hereâs a clean extractor that prints only the human message field:
LOG=$(ls -t /tmp/openclaw/openclaw-*.log | head -1)
RID=1b5944c4-db6a-4e11-9bdc-15e04932600e # <- replace with your latest runId if different
python3 - <<'PY'
import os, json
log=os.environ['LOG']
rid=os.environ['RID']
for line in open(log,'r',encoding='utf-8',errors='ignore'):
try:
j=json.loads(line)
except Exception:
continue
msg=j.get('1','')
if rid in line or rid in msg:
print(msg)
PY
Paste the output of that (it should be ~10â40 lines).
Also: the fastest ground-truth is the transcript file (usually short). Run:
SESSION=$(ls -t ~/.openclaw/agents/main/sessions/*.jsonl | head -1)
tail -n 40 "$SESSION"
Paste that last 40 lines (redact any secrets). It will show whether the assistant is literally replying NO_REPLY.
One more quick check in the dashboard: does /status produce output? (That command runs in the gateway and is a good âUI can receive messagesâ test.)
I think /status worked. I got a reply with version, model, context, session, runtime and queue
@fast cairn Perfect â if /status replies, the dashboard can receive messages from the gateway. So the problem is specifically the agent reply getting suppressed.
Two quick fixes/tests:
1) Make sure replies arenât disabled for this session
In the dashboard chat send (as a standalone message):
/send on
(or /send inherit)
Then send:
Reply with exactly: pong
If that suddenly works, the session had sendPolicy=deny somehow.
2) Check if the model is literally replying NO_REPLY
Run this in Terminal (small output):
SESSION=$(ls -t ~/.openclaw/agents/main/sessions/*.jsonl | head -1)
tail -n 200 "$SESSION" | grep -n "NO_REPLY\|\"role\":\"assistant\"\|pong\|hi" | tail -n 80
- If you see an assistant message starting with NO_REPLY, that explains the âtyping then nothingâ.
Reply back with what happens after /send on + the output of that tail|grep (it should fit in Discord).
no reply here
test
@fast cairn Since /status replies, the dashboard is connected. So the missing replies are almost certainly either:
- the model is returning the silent token
NO_REPLYfor low-signal messages, or - the run is erroring right after the model call.
Test 1 (quick): send this in the dashboard:
What is 2+2? Reply with just the number.
Test 2 (ground truth): check what the transcript actually recorded:
python3 - <<'PY'
import glob,os,json
from collections import deque
p=max(glob.glob(os.path.expanduser('~/.openclaw/agents/main/sessions/*.jsonl')), key=os.path.getmtime)
q=deque(open(p,'r',errors='ignore'), maxlen=300)
print('Transcript:',p)
for line in q:
try: j=json.loads(line)
except: continue
m=j.get('message') or {}
r=m.get('role'); c=m.get('content')
if r not in ('user','assistant'): continue
if isinstance(c,list): c=''.join([(x.get('text','') if isinstance(x,dict) else str(x)) for x in c])
if isinstance(c,str): print(f'{r}: {c.replace("\
"," ")[:160]}')
PY
If you see assistant: NO_REPLY ... in there, that explains the âtyping then nothingâ.
Tell me what you get for Test 1 + whether Test 2 shows NO_REPLY or an error.
do I typ test 2 in the dashboard?
@fast cairn Test 2 goes in your Terminal, not the dashboard.
- Dashboard: do Test 1 (the â2+2â question).
- Terminal: run Test 2 (the
python3 - <<'PY' ...block) â it just reads your local transcript file and prints the last user/assistant messages.
So: open Terminal â paste Test 2 â hit Enter. Then paste back the output (it should be short).
@fast cairn Youâre mid-âheredocâ (the heredoc> prompt means Terminal is waiting for the end marker).
Two options:
Option 1: finish the block
Paste the rest exactly, then end with a line that is only:
PY
Hereâs the missing part:
try: j=json.loads(line)
except: continue
m=j.get('message') or {}
r=m.get('role'); c=m.get('content')
if r not in ('user','assistant'): continue
if isinstance(c,list): c=''.join([(x.get('text','') if isinstance(x,dict) else str(x)) for x in c])
if isinstance(c,str): print(f'{r}: {c.replace("\
"," ")[:160]}')
PY
Option 2 (simpler): cancel and run a one-liner
Press Ctrl+C, then run:
SESSION=$(ls -t ~/.openclaw/agents/main/sessions/*.jsonl | head -1)
tail -n 80 "$SESSION"
Either way, paste the output â weâre looking for an assistant message that starts with NO_REPLY or an error.
@fast cairn No worries â that error is just Python indentation (everything inside the for loop needs to be indented).
Letâs do the simple approach instead (no Python):
- Send a message in the dashboard like:
What is 2+2? Reply with just the number.
- Then in Terminal run:
SESSION=$(ls -t ~/.openclaw/agents/main/sessions/*.jsonl | head -1)
tail -n 120 "$SESSION"
Paste the last ~40 lines of that output here. Weâll be able to see if the assistant wrote NO_REPLY or if thereâs an error entry.
(If the output is still huge, do:)
tail -n 120 "$SESSION" | grep -n "assistant\|NO_REPLY\|error" | tail -n 80
@fast cairn That transcript is the smoking gun: the model call is failing with Anthropic stopReason: "error" + errorMessage: "Connection error.".
So itâs not âNO_REPLYâ â your Mac canât reliably reach api.anthropic.com from the Gateway process.
1) Get the real underlying error (should be short)
tail -n 120 ~/.openclaw/logs/gateway.err.log
Paste the last ~30 lines (it usually includes fetch failed, ENOTFOUND, ETIMEDOUT, TLS/cert errors, etc.).
2) Check if itâs an IPv6/network issue (same class of problem as your Telegram fetch failed earlier)
curl -I https://api.anthropic.com
curl -4 -I https://api.anthropic.com
curl -6 -I https://api.anthropic.com
- If
-4works but-6fails â your IPv6 is busted. Easiest workaround:
echo 'NODE_OPTIONS=--dns-result-order=ipv4first' >> ~/.openclaw/.env
openclaw gateway restart
3) If youâre on a corporate proxy/VPN
Your terminal may have proxy env vars that launchd doesnât. Check:
env | grep -i proxy
If you see HTTP_PROXY / HTTPS_PROXY / NO_PROXY, copy those lines into ~/.openclaw/.env and restart the gateway.
Once Anthropic connectivity is fixed, the dashboard + TUI will start replying immediately.
@fast cairn Yep â that TypeError: fetch failed confirms itâs a general outbound HTTPS networking issue from Node/undici on that machine (and it explains both Telegram + Anthropic failures).
Now we need to figure out why fetch is failing (IPv6, DNS, proxy, or TLS). Please run these and paste outputs:
1) Does curl work?
curl -I https://api.anthropic.com
curl -I https://api.telegram.org
2) IPv4 vs IPv6 (this is the common one)
curl -4 -I https://api.anthropic.com
curl -6 -I https://api.anthropic.com
dig +short api.anthropic.com A
dig +short api.anthropic.com AAAA
If -4 works but -6 fails, add this workaround so Node prefers IPv4:
echo 'NODE_OPTIONS=--dns-result-order=ipv4first' >> ~/.openclaw/.env
openclaw gateway restart
3) Proxy/VPN env vars
env | grep -i proxy
If you see proxies there, launchd wonât have them â copy them into ~/.openclaw/.env and restart.
Once curl and Node are both happy with Anthropic, the dashboard will start replying immediately.
@fast cairn Great â curl can reach both Anthropic + Telegram, so the network is up. The problem is specifically Nodeâs fetch (undici) inside the Gateway failing (TypeError: fetch failed â transcript shows Connection error.).
Next we need the cause of the fetch failure (itâs usually IPv6, proxy/VPN, or a firewall app blocking a specific node binary).
1) Test fetch using the same node binary the service uses
Run this in Terminal:
/usr/local/bin/node -e "fetch('https://api.anthropic.com').then(r=>console.log('ok status',r.status)).catch(e=>{console.error('ERR',e); console.error('CAUSE',e.cause);})"
/usr/local/bin/node -e "fetch('https://api.telegram.org').then(r=>console.log('ok status',r.status)).catch(e=>{console.error('ERR',e); console.error('CAUSE',e.cause);})"
Paste the CAUSE ... line(s).
2) Compare with your nvm node (sometimes firewall/proxy rules differ per binary)
node -e "fetch('https://api.anthropic.com').then(r=>console.log('nvm ok',r.status)).catch(e=>{console.error('nvm ERR',e); console.error('nvm CAUSE',e.cause);})"
- If nvm node works but /usr/local/bin/node fails â you likely have a firewall/proxy rule blocking Homebrewâs node. Easiest workaround is to run the Gateway service using the nvm node path (or allow
/usr/local/bin/nodein your firewall app).
3) Quick IPv6 check (common)
curl -4 -I https://api.anthropic.com
curl -6 -I https://api.anthropic.com
If -4 works and -6 fails, add this and restart (safe workaround):
echo 'NODE_OPTIONS=--dns-result-order=ipv4first' >> ~/.openclaw/.env
openclaw gateway restart
Once fetch(...) works for Anthropic, the dashboard will immediately start replying.
@fast cairn There we go â root cause found.
Your Gatewayâs Node fetch() is failing TLS verification:
UNABLE_TO_GET_ISSUER_CERT_LOCALLYSELF_SIGNED_CERT_IN_CHAIN
That almost always means youâre on a network (or have software) doing HTTPS interception (corporate proxy, Zscaler, AdGuard/AV, Charles/Proxyman cert, etc.). curl works because it trusts your macOS Keychain; Node does not unless you explicitly give it that CA.
Fix (recommended): add your org/proxy Root CA to Node via NODE_EXTRA_CA_CERTS
- Export the root CA from Keychain Access:
- Open Keychain Access â âSystemâ (or âloginâ) â Certificates
- Find the root cert for your proxy (often contains: Zscaler, Cisco Umbrella, Netskope, Charles Proxy, Proxyman, etc.)
- Rightâclick â Export (choose
.cer)
- Convert to PEM and store it:
mkdir -p ~/.openclaw/certs
openssl x509 -in ~/Downloads/<exported>.cer -inform der -out ~/.openclaw/certs/mitm-ca.pem
- Tell the Gateway service to use it (launchd reads
~/.openclaw/.env):
echo 'NODE_EXTRA_CA_CERTS=~/.openclaw/certs/mitm-ca.pem' >> ~/.openclaw/.env
openclaw gateway restart
- Re-test (should now print a status instead of TLS errors):
/usr/local/bin/node -e "fetch('https://api.anthropic.com').then(r=>console.log('ok',r.status)).catch(e=>console.error(e.cause||e))"
Once that works, the dashboard will start replying, and Telegram can likely be re-enabled too.
Quick (temporary, NOT recommended): disable TLS verification
Only to prove the diagnosis:
echo 'NODE_TLS_REJECT_UNAUTHORIZED=0' >> ~/.openclaw/.env
openclaw gateway restart
This is insecure; remove it after confirming.
If you tell me what proxy/security tool you have installed (or what the CA cert is named in Keychain), I can give you the exact âwhich cert to exportâ target.
This sounds pretty complex. Can you walk me through it step by step?
@fast cairn Yep â weâll do it step-by-step, and you can stop after each step if something looks different.
Goal
Make Node trust the same âcorporate/proxyâ certificate that macOS Keychain trusts, by setting NODE_EXTRA_CA_CERTS for the Gateway service.
Step 0 â confirm weâre in the right failure mode (1 command)
Run:
/usr/local/bin/node -e "fetch('https://api.anthropic.com').then(r=>console.log(r.status)).catch(e=>console.error(e.cause?.code||e))"
You should see UNABLE_TO_GET_ISSUER_CERT_LOCALLY (or similar). If yes â continue.
Step 1 â find the âMITMâ certificate in Keychain
- Open Keychain Access (Spotlight â type âKeychain Accessâ).
- In the left sidebar:
- Click System (start here) and then Certificates.
- In the top-right search box, try searching these one at a time:
zscalernetskopeumbrellacharlesproxmymanroot
Youâre looking for a certificate thatâs clearly not Apple/Letâs Encrypt/etc â often named like â<Company> Root CAâ.
Reply with the exact name of the certificate you think is the culprit and Iâll confirm before you export.
Step 2 â export that certificate
- Right-click the certificate â Export "<name>"âŠ
- File format: choose .cer
- Save it to Downloads (easy to find)
Step 3 â convert .cer â .pem and store it for OpenClaw
In Terminal (replace the filename):
mkdir -p ~/.openclaw/certs
# if your export is DER (common)
openssl x509 -in ~/Downloads/<exported>.cer -inform der -out ~/.openclaw/certs/mitm-ca.pem
# if that errors, weâll retry with -inform pem
Step 4 â tell the Gateway service to use that CA
echo 'NODE_EXTRA_CA_CERTS=~/.openclaw/certs/mitm-ca.pem' >> ~/.openclaw/.env
openclaw gateway restart
Step 5 â retest Node fetch
/usr/local/bin/node -e "fetch('https://api.anthropic.com').then(r=>console.log('ok',r.status)).catch(e=>console.error('ERR',e.cause||e))"
If this prints ok 404 (404 is fine for that endpoint), youâre done and the dashboard should start replying.
Start with Step 1 and tell me what certificate name you find in Keychain.
only when I type root I see certificates and there is about 120 of them. how do I know which one is the culprit?
@fast cairn Good question â donât guess from 120 certs.
The âculpritâ is almost always a non-Apple root CA that was installed by:
- your company IT/security (Zscaler/Umbrella/Netskope/etc), or
- a proxy/debug tool (Charles/Proxyman), or
- an antivirus/web filter.
Here are 3 practical ways to identify it.
Method A (fastest): look for âAlways Trustâ / custom trust settings
- In Keychain Access, select System â Certificates.
- Click a certificate â press Cmd+I (Get Info).
- Expand Trust.
If you see anything like âWhen using this certificate: Always Trustâ (or other non-default trust overrides), thatâs a strong signal itâs the MITM root.
Method B: sort by âExpiresâ or âNameâ and look for obvious non-default names
Common giveaway names contain:
- your company name
- âProxyâ, âInspectionâ, âSSLâ, âRoot CAâ, âCorporateâ, âEnterpriseâ, âDeviceâ, âMDMâ
Method C (best): check which cert curl actually trusts
Since curl works but Node doesnât, the missing piece is: Node isnât reading your Keychain trust store.
So we can pick any one of the non-default roots you installed â but we want the one thatâs being used for interception.
Quick question: are you on a work network / VPN or do you have any of these installed?
- Zscaler
- Cisco Umbrella
- Netskope
- CrowdStrike
- Little Snitch
- AdGuard
- Charles / Proxyman
If yes, tell me which â I can tell you exactly what the cert name usually looks like.
Quick shortcut if you just want to get unstuck
If youâre NOT on a corporate machine and you installed something like Charles/Proxyman, export that root cert (itâs usually clearly named).
If you want, paste 5â10 certificate names that look ânon-Apple / non-Letâs Encryptâ and Iâll point to the most likely one.
@fast cairn Makes sense â and the error we saw (SELF_SIGNED_CERT_IN_CHAIN / UNABLE_TO_GET_ISSUER_CERT_LOCALLY) doesnât require âcorporate spywareâ, it just means the TLS cert chain Node sees isnât in Nodeâs default CA bundle.
Key detail: curl on macOS trusts Keychain, but Node does not by default (it uses its own bundled CA set). So curl can work while Node fails.
Step-by-step fix (simplest): tell Node to use the macOS system CA store
- Add this to the Gateway service env file:
echo 'NODE_OPTIONS=--use-system-ca' >> ~/.openclaw/.env
- Restart the gateway:
openclaw gateway restart
- Re-test Node fetch (this should stop the cert errors):
/usr/local/bin/node -e "fetch('https://api.anthropic.com').then(r=>console.log('ok',r.status)).catch(e=>{console.error('ERR',e); console.error('CAUSE',e.cause);})"
If you see ok 404 (404 is fine), youâre good.
- Go back to the dashboard and try:
What is 2+2? Reply with just the number.
If it still fails after --use-system-ca
Then we should identify the exact certificate Node is being presented. Run:
echo | openssl s_client -connect api.anthropic.com:443 -servername api.anthropic.com -showcerts 2>/dev/null | openssl x509 -noout -subject -issuer
Paste the subject + issuer lines â that will tell us which root CA to export from Keychain (even if you didnât knowingly install it; sometimes it comes from a configuration profile or router security feature).
Avoid the âquick hackâ NODE_TLS_REJECT_UNAUTHORIZED=0 â it works, but it disables TLS verification entirely.
are there any security risks or vulnerabilities with this?
@fast cairn Good question.
Using NODE_OPTIONS=--use-system-ca
Risk level: low / normal.
It just tells Node to trust the same certificate authorities your Mac already trusts (Keychain) instead of Nodeâs built-in CA bundle.
What could be risky?
- If your macOS Keychain contains an extra trusted root CA that you donât actually want to trust (e.g. from some proxy/debug tool, old MDM profile, etc.), then Node will trust it too â meaning HTTPS interception would be possible.
But thatâs not really ânewâ risk: your Mac already trusts that CA system-wide. This just makes Node consistent with the OS.
Whatâs actually dangerous (donât do this long-term)
NODE_TLS_REJECT_UNAUTHORIZED=0or similar âdisable TLS verificationâ hacks. That does create a real vulnerability.
If you want to be extra strict
Instead of trusting all of Keychain, export only the specific root CA you need and use:
NODE_EXTRA_CA_CERTS=... (narrower trust).
Given your situation, Iâd start with --use-system-ca (quick + sane), and if you later discover some weird root in Keychain, we can switch to the narrower NODE_EXTRA_CA_CERTS approach.
@fast cairn That output is expected if you didnât pass the --use-system-ca option to that specific Node command.
Important detail: ~/.openclaw/.env is only read by the Gateway service, not by random node -e ... commands you run in your terminal.
Step 1) Re-test Node with system CA enabled
Run either of these (same effect):
/usr/local/bin/node --use-system-ca -e "fetch('https://api.anthropic.com').then(r=>console.log('ok',r.status)).catch(e=>console.error('ERR',e.cause||e))"
OR
NODE_OPTIONS="--use-system-ca" /usr/local/bin/node -e "fetch('https://api.anthropic.com').then(r=>console.log('ok',r.status)).catch(e=>console.error('ERR',e.cause||e))"
If it prints ok 404 â TLS is fixed.
Step 2) Make sure the Gateway service gets the same setting
- Confirm the line exists (no secrets):
grep '^NODE_OPTIONS=' ~/.openclaw/.env
You want to see:
NODE_OPTIONS=--use-system-ca
- Restart the gateway:
openclaw gateway restart
- Try the dashboard again (
What is 2+2?).
If Step 1 still fails even with --use-system-ca
Then weâll switch to the more explicit fix (NODE_EXTRA_CA_CERTS) and identify the exact issuer with:
echo | openssl s_client -connect api.anthropic.com:443 -servername api.anthropic.com -showcerts 2>/dev/null | openssl x509 -noout -subject -issuer
Run Step 1 and paste the result (ok ... or the error/cause).
@fast cairn Perfect diagnostics. Two key points:
- Your
echo 'NODE_OPTIONS=--use-system-ca' >> ~/.openclaw/.envdoes not affect/usr/local/bin/node ...commands you run in Terminal. - Even for the Gateway:
~/.openclaw/.envis loaded by OpenClaw after Node starts, so it wonât apply Node startup flags like--use-system-ca.
So we need to do this in two steps:
Step A â confirm --use-system-ca fixes Node fetch (one command)
Run:
/usr/local/bin/node --use-system-ca -e "fetch('https://api.anthropic.com').then(r=>console.log('ok',r.status)).catch(e=>console.error('ERR',e.cause||e))"
Expected: ok 404.
If you STILL get UNABLE_TO_GET_ISSUER_CERT_LOCALLY here, tell me and weâll do the NODE_EXTRA_CA_CERTS bundle route.
Step B â make the LaunchAgent start Node with --use-system-ca
- Stop the gateway service:
openclaw gateway stop
- Inspect current ProgramArguments (just to confirm what weâre editing):
/usr/libexec/PlistBuddy -c "Print :ProgramArguments" ~/Library/LaunchAgents/ai.openclaw.gateway.plist
- Insert the flag right after the node binary:
plutil -insert ProgramArguments.1 -string "--use-system-ca" ~/Library/LaunchAgents/ai.openclaw.gateway.plist
- Start the service again:
openclaw gateway start
openclaw gateway status
Now the Command: line should show something like:
/usr/local/bin/node --use-system-ca .../openclaw/dist/index.js gateway ...
- Try the dashboard message again.
If Step A works but Step B doesnât show the flag in gateway status, paste the ProgramArguments output from step 2 and Iâll tell you exactly where it needs to go.
@fast cairn Awesome â this confirms --use-system-ca doesnât fix it on your Mac.
Next hypothesis: your /usr/local/bin/node is not actually using the bundled CA store (or itâs being overridden by env), so it canât validate normal public cert chains.
Step 1) Check if anything is overriding Node/OpenSSL cert handling
Run and paste output:
echo "NODE_OPTIONS=$NODE_OPTIONS"
echo "NODE_EXTRA_CA_CERTS=$NODE_EXTRA_CA_CERTS"
echo "SSL_CERT_FILE=$SSL_CERT_FILE"
echo "SSL_CERT_DIR=$SSL_CERT_DIR"
Step 2) Force Node to use its bundled CA store (even if something overrides it)
Run:
/usr/local/bin/node --use-bundled-ca -e "fetch('https://api.anthropic.com').then(r=>console.log('ok',r.status)).catch(e=>console.error('ERR',e.cause||e))"
If this prints ok 404, weâve found the fix.
Step 3) Apply that fix to the Gateway service (launchd)
If Step 2 works, weâll add the flag to the LaunchAgent so the Gateway always starts with it:
openclaw gateway stop
plutil -insert ProgramArguments.1 -string "--use-bundled-ca" ~/Library/LaunchAgents/ai.openclaw.gateway.plist
openclaw gateway start
openclaw gateway status
(And we should remove the NODE_OPTIONS=--use-system-ca line you appended to ~/.openclaw/.env afterwards â that file wonât reliably apply Node startup flags anyway.)
Run Step 1 + Step 2 and tell me what you get.
@fast cairn Great â no env overrides. So this really is âNodeâs CA trust is brokenâ for that /usr/local/bin/node install.
Next test (this is the key one):
Step 2) Force bundled CA
/usr/local/bin/node --use-bundled-ca -e "fetch('https://api.anthropic.com').then(r=>console.log('ok',r.status)).catch(e=>console.error('ERR',e.cause||e))"
- If this prints
ok 404â we can fix the Gateway by adding--use-bundled-cato the LaunchAgent ProgramArguments. - If it still fails â something deeper is wrong with the Node build / cert store, and the easiest fix is to reinstall Node 22 cleanly.
Also, just to compare, run the same test with your nvm node (should work):
node -e "fetch('https://api.anthropic.com').then(r=>console.log('nvm ok',r.status)).catch(e=>console.error('nvm ERR',e.cause||e))"
Paste outputs of both.
@fast cairn Boom. â
That proves the fix: your system Node needs --use-bundled-ca.
Now we just need to make the LaunchAgent start Node with that flag so the Gateway inherits it.
1) Stop the gateway service
openclaw gateway stop
2) Add the flag to the LaunchAgent ProgramArguments
(This inserts it right after /usr/local/bin/node.)
plutil -insert ProgramArguments.1 -string "--use-bundled-ca" ~/Library/LaunchAgents/ai.openclaw.gateway.plist
3) Start again + verify
openclaw gateway start
openclaw gateway status
You should now see the command line include:
/usr/local/bin/node --use-bundled-ca ...
4) Test in dashboard
Send:
What is 2+2? Reply with just the number.
If anything goes sideways, paste the output of:
/usr/libexec/PlistBuddy -c "Print :ProgramArguments" ~/Library/LaunchAgents/ai.openclaw.gateway.plist
After it works, you can remove the earlier NODE_OPTIONS=--use-system-ca line you appended to ~/.openclaw/.env (itâs not helping here).
@fast cairn You fixed the plist correctly (the Command: line now shows --use-bundled-ca â
). The only issue now is the LaunchAgent is not loaded in launchd anymore, so openclaw gateway start canât find it.
Load it back into launchd:
# (safe) make sure itâs not half-loaded
openclaw gateway stop || true
launchctl bootout gui/$UID/ai.openclaw.gateway 2>/dev/null || true
# load the plist
launchctl bootstrap gui/$UID ~/Library/LaunchAgents/ai.openclaw.gateway.plist
# start it now
launchctl kickstart -k gui/$UID/ai.openclaw.gateway
# verify
openclaw gateway status
Once gateway status shows loaded + RPC probe ok, go back to the dashboard and try the 2+2 message again.
Note: donât run openclaw gateway install --force right now â it may rewrite the plist and remove the --use-bundled-ca arg (we can reapply it later if needed).
@fast cairn Hell yes â thatâs exactly what we wanted:
- LaunchAgent loaded
- Gateway running
- RPC probe: ok
- and Node is starting with
--use-bundled-ca
Now go back to the dashboard and try again:
What is 2+2? Reply with just the number.
If it replies, youâre officially unblocked. After that you can re-enable Telegram if you want (it should stop crashing now).
Also: since this ended up being a pretty specific Ventura/Node TLS trust issue, please right-click the solution message â Apps â â Mark Solution so Answer Overflow indexes it.
Freak yeah! it replied with 4 :)))
@fast cairn Yessss. That means the gateway â Anthropic connection is fixed and your dashboard chat is fully working now.
Next optional steps:
- Remove the now-useless line we added earlier (keeps things clean):
# open and delete the NODE_OPTIONS=--use-system-ca line
nano ~/.openclaw/.env
(leave the LaunchAgent --use-bundled-ca in place)
- Re-enable Telegram (should work now that Node fetch TLS is happy):
openclaw config set channels.telegram.enabled true --json
openclaw gateway restart
And please do the indexing thing: right-click the solution message â Apps â â Mark Solution đ
So to recap all of this for the next person that is using macOS Ventura 13.7.8 and is facing similar issues our first issue was Ventura OS not using node 22 (and because of that, the dasboard couldn't connect) and we had a difficult time switching it from node 24 to node 22 but we finally figured it out at the end (can you please reply with the solution for that worked for us?) The next issue we had was (correct me if I'm wrong) Amazon's wifi eero's block access to SSL certificates and it took us some time to figure that out but we finally did (can you please reply with the solution that worked for us?) 5.5 hrs later we are finally up and running. Anything else that I missed?
@fast cairn Yep â hereâs the clean recap you can copy/paste for the next Ventura 13.7.8 Intel person.
Problem 1: Gateway service kept using Node 24 (nvm), not Node 22
Symptom: openclaw gateway status showed the LaunchAgent command pointing at:
~/.nvm/versions/node/v24.../lib/node_modules/openclaw/...
Why: macOS launchd doesnât load your shell init, and the gateway service will keep whatever openclaw (and Node) it was installed with. Also, if openclaw only exists in the Node 24 nvm environment, the service will keep pointing there.
Fix that worked:
# Install Node 22 and switch nvm to it
nvm install 22
nvm use 22
nvm alias default 22
# Remove openclaw from the old Node 24 env
nvm exec 24 npm uninstall -g openclaw
# Install openclaw under Node 22
nvm exec 22 npm install -g openclaw@latest
# Reinstall the gateway LaunchAgent using the Node 22 openclaw
nvm exec 22 openclaw gateway stop
nvm exec 22 openclaw gateway uninstall
nvm exec 22 openclaw gateway install --force
nvm exec 22 openclaw gateway restart
# Verify it now points to v22
openclaw gateway status
Problem 2: Dashboard âtypingâŠâ but no replies (TLS / SSL cert chain)
Symptom: Dashboard and transcripts showed Anthropic runs failing with Connection error, and logs showed Node fetch failed.
Root cause: /usr/local/bin/node couldnât validate normal public HTTPS certs (Node fetch errors like UNABLE_TO_GET_ISSUER_CERT_LOCALLY / SELF_SIGNED_CERT_IN_CHAIN). curl worked, but Node didnât.
Key diagnostic:
/usr/local/bin/node -e "fetch('https://api.anthropic.com').then(r=>console.log(r.status)).catch(e=>console.error(e.cause))"
Fix that worked: force system Node to use its bundled CA store:
/usr/local/bin/node --use-bundled-ca -e "fetch('https://api.anthropic.com').then(r=>console.log('ok',r.status)).catch(e=>console.error(e.cause||e))"
# should print: ok 404
Then make the LaunchAgent always start Node with that flag:
openclaw gateway stop
plutil -insert ProgramArguments.1 -string "--use-bundled-ca" ~/Library/LaunchAgents/ai.openclaw.gateway.plist
# reload + start the LaunchAgent
launchctl bootstrap gui/$UID ~/Library/LaunchAgents/ai.openclaw.gateway.plist
launchctl kickstart -k gui/$UID/ai.openclaw.gateway
openclaw gateway status
Once gateway status showed RPC probe: ok, the dashboard started replying.
About the âAmazon eeroâ part
We didnât prove it was eero specifically â we proved it was Node TLS trust on /usr/local/bin/node. Could be router security/DNS filtering, a local security product, or something else. The fix above is what mattered.
Anything else?
- You temporarily disabled Telegram (
channels.telegram.enabled=false) to keep the gateway from crashing while TLS was broken.
- After the TLS fix, Telegram should behave normally again.
If this recap matches what you saw, please mark the solution (right-click â Apps â â Mark Solution) so itâs indexed.
Yes telegram and dashboard work properly. I suspect that whatsapp will also work now? It didn't before and I think it was because of the same issue we had with telegram and the dashboard.
@fast cairn Yeah â WhatsApp very likely works now too. It uses outbound HTTPS calls + web sockets, so the same Node TLS fetch failed issue would absolutely break it.
To get WhatsApp going:
- Run the login flow (shows QR in terminal):
openclaw channels login
-
Scan the QR with WhatsApp on your phone â Linked Devices.
-
Verify channel status:
openclaw status
(or openclaw gateway status + check WhatsApp section in dashboard)
If it still fails, paste the WhatsApp-related lines from:
tail -n 120 ~/.openclaw/logs/gateway.err.log
And yep â if it failed earlier, it was almost certainly the same TLS trust problem.
Can I use both telegram and whatsapp? which one cost less tokens (not sure if it works like that).
@fast cairn Yep â you can use both Telegram and WhatsApp at the same time.
Token cost is mostly the model run, not the chat app.
What can change tokens a bit:
- Message formatting/metadata (usually tiny)
- Whether youâre in a group vs DM (groups often include more history/context)
- Any attachments (images/audio) you send
So Telegram vs WhatsApp doesnât inherently cost less â your usage pattern does.
If you want to reduce cost:
- keep it in DMs for âreal workâ
- lower
messages.groupChat.historyLimitfor groups - use a cheaper default model for routine chatter (and keep Opus for âbigâ tasks)
If you want, tell me your goal (personal chat vs automation vs group bot) and Iâll suggest a sane low-cost default setup without breaking reliability.
what is more secure telegram or whatsapp?
@fast cairn Depends what you mean by âsecureâ:
Transport encryption (message privacy in transit)
- WhatsApp: end-to-end encrypted by default for normal chats.
- Telegram: normal chats are not end-to-end encrypted (theyâre server-client). Only Secret Chats are E2E â and bots canât participate in Secret Chats.
So for âE2E by defaultâ, WhatsApp wins.
Bot security / access control (who can trigger your agent)
This is mostly an OpenClaw config question:
- Telegram has strong pairing/allowlist options (
channels.telegram.dmPolicy="pairing"etc.). - WhatsApp similarly has allowlists (
channels.whatsapp.allowFrom, group gating, mention rules).
The big caveat
Even with E2E transport, once messages hit your Gateway and then a model provider, privacy depends on your model provider and your own machine security.
If you want âmost privateâ overall:
- keep Gateway local
- strict allowlists
- avoid group chats
- be careful with what you send to cloud models
Tell me your threat model (private notes vs multi-user bot vs family group chat) and Iâll recommend the best setup.
How do I keep the gateway local?
@fast cairn Youâre basically already doing it.
To keep the Gateway local-only:
1) Bind to loopback
Make sure your config has:
openclaw config get gateway.bind
You want loopback (or just leave it unset if it defaults to loopback).
2) Donât expose it via Tailscale / LAN
- Keep
Tailscale: off(as youropenclaw statusshowed) - Donât run
openclaw gateway --bind lanor--bind tailnet - Donât use
--tailscale serve/--tailscale funnel
3) Verify itâs only listening on 127.0.0.1
openclaw gateway status
You want to see:
bind=loopback (127.0.0.1)Listening: 127.0.0.1:18789
That means only apps on the same Mac can connect.
If you paste your openclaw config get gateway.bind output, I can confirm itâs locked down.
Hey krill, now that telegram is connected can you help me also set up whatsapp?
@fast cairn Yep.
1) Make sure the gateway is up first
openclaw gateway status
(should show RPC probe: ok)
2) Start the WhatsApp linking flow (QR)
openclaw channels login
That should print a QR code in the terminal.
3) Scan it from your phone
WhatsApp â Settings â Linked Devices â Link a device â scan the QR.
4) Verify it connected
Run:
openclaw status
(or check the Channels panel in the dashboard).
If openclaw channels login errors or doesnât show a QR, paste the last ~30 lines of:
tail -n 120 ~/.openclaw/logs/gateway.err.log
(and tell me if youâre linking WhatsApp personal or WhatsApp Business).
@fast cairn That error usually means WhatsApp isnât configured in ~/.openclaw/openclaw.json yet, so the CLI wonât start a login flow for it.
Do this:
1) Add minimal WhatsApp config + restart
openclaw config set channels.whatsapp.dmPolicy pairing
openclaw gateway restart
(Optional, if you want allowlist instead of pairing)
openclaw config set channels.whatsapp.dmPolicy allowlist
openclaw config set channels.whatsapp.allowFrom '["+1YOURNUMBER"]' --json
openclaw gateway restart
2) Run the WhatsApp QR login explicitly
openclaw channels login --channel whatsapp
Scan via WhatsApp â Settings â Linked Devices â Link a device.
3) Verify
openclaw channels status --probe
If it still says Unsupported channel: whatsapp, run:
openclaw channels list
and paste the output â thatâll tell us whether your build is missing the WhatsApp channel (rare) or itâs just config.
I think its connected? How do I talk to openclaw on whatsapp to test?
@fast cairn Easiest test: DM the WhatsApp account you just linked.
If you linked a dedicated OpenClaw number
- From your personal WhatsApp, send a message to that dedicated number.
- First message will either:
- reply normally (if
dmPolicy=allowlistand youâre allowlisted), or - reply with a pairing code (if
dmPolicy=pairing, which is the default).
If you get a pairing code, approve it on the gateway:
openclaw pairing list whatsapp
openclaw pairing approve whatsapp <code>
Then message again.
If you linked your personal number (self-chat)
Use WhatsAppâs âMessage yourselfâ chat to test, but youâll need:
channels.whatsapp.selfChatMode: true
Quick confirm itâs actually connected
openclaw channels status --probe
If you paste the WhatsApp line from that output, I can tell you whether itâs fully online and which DM policy youâre currently in.
- WhatsApp default: enabled, configured, linked, stopped, disconnected, dm:pairing, error:not linked
@fast cairn That status means WhatsApp is configured but currently NOT linked (no valid WhatsApp Web session), so itâs disconnected.
Fix: re-run the QR login:
openclaw channels login --channel whatsapp
Scan it in WhatsApp â Settings â Linked Devices â Link a device.
Then re-check:
openclaw channels status --probe
If it keeps saying not linked right after scanning, paste the last ~80 lines of:
tail -n 120 ~/.openclaw/logs/gateway.err.log
(WhatsApp relink issues are usually very explicit in that log.)
@fast cairn Yep â that line is still saying not linked, so WhatsApp Web auth didnât stick yet.
Next step is still:
openclaw channels login --channel whatsapp
Scan the QR again.
If it still flips back to not linked, we need the error details from the gateway:
tail -n 120 ~/.openclaw/logs/gateway.err.log
Paste the WhatsApp-related block (it usually mentions Baileys / creds.json / QR / logged out).
Also: are you linking WhatsApp or WhatsApp Business on the phone? (either is fine, just want to know which app you scanned from).
@fast cairn Nice â the channels login output looks good (credentials saved).
If channels status --probe is still showing stopped / disconnected / not linked, that usually just means the Gateway hasnât been restarted since the link, so it hasnât picked up the new creds yet.
Do this:
openclaw gateway restart
openclaw channels status --probe
After it shows WhatsApp as running/works, test by DMing the linked WhatsApp account:
- if
dm:pairing, your first DM will return a pairing code â approve it:
openclaw pairing list whatsapp
openclaw pairing approve whatsapp <code>
If it still says not linked after a gateway restart, paste the WhatsApp section from:
tail -n 120 ~/.openclaw/logs/gateway.err.log
Can we start over, I unlinked the device from my whatsapp on my iphone now when I scan the sam QR code, whatsapp on my phone is saying "can't lin new decices at this time. Try again later.
@fast cairn Yep we can start over â but that WhatsApp message (âcanât link new devices at this timeâ) is coming from WhatsApp itself and is usually a cooldown / rate-limit after too many link/unlink attempts. The fix is mostly wait a bit, then link with a fresh QR.
Hereâs the clean restart sequence:
A) Reset OpenClawâs WhatsApp creds (on the iMac)
openclaw gateway status
openclaw channels logout --channel whatsapp
openclaw gateway restart
B) Generate a NEW QR + link again
(Do not scan an old QR)
openclaw channels login --channel whatsapp
Then on iPhone: WhatsApp â Settings â Linked Devices â Link a device â scan.
C) If WhatsApp still says âcanât link new devicesâŠâ
Thatâs WhatsApp blocking new links temporarily. Usual things that help:
- Wait 15â60 minutes and try again (sometimes longer).
- Make sure WhatsApp iOS app is updated.
- Toggle iPhone airplane mode once / restart the iPhone.
- Try on a different network (phone on cellular hotspot for the scan can help).
D) After it links, verify from OpenClaw
openclaw channels status --probe
You want WhatsApp to show running/works (not not linked).
If it keeps failing, paste the WhatsApp-related lines from:
tail -n 120 ~/.openclaw/logs/gateway.err.log
(That log will usually say if itâs a QR expired / logged out / device limit issue.)
okay during the linking process on my phone it syncs for about 30-60 seconds and then massage sync pauses. when i click on linked devices and then the "linked" google chome (openclaw) device under device status activity it says Active but under chat history it says Paused and then message sync is paused
That âChat history: Paused / Message sync pausedâ screen is WhatsAppâs history backfill for linked devices. It often pauses if the phone goes idle, battery/lowâpower kicks in, WhatsApp is backgrounded, WiâFi is flaky, or storage is tight.
Good news: even if history sync is paused, the linked âChromeâ device can still be active and send/receive new messages.
Make the sync finish (WhatsApp-side)
On the iPhone:
- Plug into power
- Turn Low Power Mode OFF
- Keep WhatsApp open in the foreground with the screen on for a few minutes
- Stay on solid WiâFi (or try phone on cellular / hotspot)
- Make sure you have free storage + WhatsApp is up to date
Verify from OpenClaw side (what actually matters)
Run:
openclaw channels status --probe
If WhatsApp shows linked + running/works, youâre good.
Quick functional test
Send a new DM to the WhatsApp account you linked (from another phone/contact if possible). If youâre in dm:pairing, the first message should trigger a pairing code â approve with:
openclaw pairing list whatsapp
openclaw pairing approve whatsapp <code>
If channels status still shows not linked / disconnected after all this, paste the WhatsApp block from:
tail -n 120 ~/.openclaw/logs/gateway.err.log
Battery is at 78% with latest update.
Got it â battery level is fine. The two things that most often cause âhistory sync pausedâ even on good battery are:
- WhatsApp isnât kept foreground + screen on long enough (it pauses when the phone locks / you switch apps)
- Network/storage hiccups.
Letâs ignore the history sync UI for a moment and check whether the bot link itself is alive.
1) What does OpenClaw think right now?
On the iMac:
openclaw channels status --probe
Paste just the WhatsApp line.
2) Quick functional test (new message, not history)
From your phone, message the linked account (or have a friend DM it). Do you get a pairing code / reply?
3) If OpenClaw says disconnected
Restart the gateway once (this often re-attaches Baileys after link):
openclaw gateway restart
If it still wonât stay connected, weâll check the WhatsApp-related log lines:
tail -n 120 ~/.openclaw/logs/gateway.err.log
Great question â the âlinked deviceâ is just WhatsApp Web for some WhatsApp account/number. You donât message the device directly; you message the WhatsApp number/account that OpenClaw is logged into.
So first we need to clarify which number you linked:
Case A) You linked your personal WhatsApp (same iPhone number)
Then the easiest test is WhatsAppâs built-in âMessage yourselfâ chat:
- WhatsApp â search â âMessage yourselfâ (or your own contact)
- Send:
hi
For this mode you usually want:
channels: { whatsapp: { selfChatMode: true } }
Case B) You linked a dedicated bot number
Then from your personal WhatsApp, just DM that dedicated number like a normal contact.
Sending from the CLI (optional)
Once WhatsApp is linked and running, you can also send a message from the gateway:
openclaw message send --target +1YOURNUMBER --message "hello from openclaw"
(Replace with your real number in E.164 format.)
Next step (so I can guide you precisely)
Paste:
openclaw channels status --probe
And tell me: did you link your personal number or a separate number? (Just âpersonalâ vs âseparateâ â donât post the number.)
Yup.
That pairing code is not something you enter on the phone.
Itâs OpenClawâs security gate for WhatsApp DMs (because dmPolicy: pairing). The flow is:
- You send a DM to the WhatsApp account that OpenClaw is logged into
- OpenClaw replies in WhatsApp with a short pairing code
- You approve that code on the gateway with the CLI
Approve it like this on the iMac:
openclaw pairing list whatsapp
openclaw pairing approve whatsapp <code>
(Use the code you saw.)
Then send another WhatsApp message (like hi) and it should reply normally.
If you donât want pairing codes at all, switch to allowlist mode:
openclaw config set channels.whatsapp.dmPolicy allowlist
openclaw config set channels.whatsapp.allowFrom '["+1YOURNUMBER"]' --json
openclaw gateway restart
You run those commands in the Terminal on your iMac (same place you ran openclaw gateway status, openclaw channels login, etc.). Not in WhatsApp.
Step-by-step:
- Open Terminal on the iMac.
- Run:
openclaw pairing list whatsapp
It will print pending pairing requests + the code.
- Copy the code it shows and run:
openclaw pairing approve whatsapp <code>
Example:
openclaw pairing approve whatsapp 123456
- Now go back to WhatsApp and send another message â it should reply.
If pairing list shows nothing, paste its output and weâll check your WhatsApp DM policy / whether the message actually reached the gateway.
There wonât be an âOpenClawâ contact automatically â OpenClaw is logged into an existing WhatsApp account/number.
So you message the WhatsApp number you linked (the account that shows up under WhatsApp â Settings â Linked Devices).
Two common setups:
A) You linked your personal WhatsApp number
Then the easiest test is WhatsAppâs built-in âMessage yourselfâ chat:
- WhatsApp â search â âMessage yourselfâ (or your own contact)
- Send:
hi
(For this mode you typically enable channels.whatsapp.selfChatMode: true.)
B) You linked a separate number (recommended)
Then from your personal WhatsApp, you need to start a new chat to that separate number:
- WhatsApp â New chat â type the phone number (or add it to Contacts)
- Send:
hi
Quick question
Did you link your personal number or a separate number?
If youâre not sure: in WhatsApp on your iPhone, go to Settings â Linked Devices. The account/number youâre currently using is the one OpenClaw is logged into, and thatâs the one youâd message (either via Message Yourself, or from another phone/contact).
Totally fair â the mental model is the confusing part.
The correct structure (dedicated WhatsApp number)
- Dedicated phone (Number B): this is the âownerâ WhatsApp account. It must stay logged into WhatsApp (on iOS/Android).
- iMac + OpenClaw: this is a linked device (WhatsApp Web session) for Number B. OpenClaw runs here.
- Your personal phone (Number A) (or any other contact): this is what you use to DM the bot.
So:
- You do not âmessage the iMac deviceâ.
- You message Number B (the dedicated WhatsApp account).
Setup steps (working recipe)
1) On the iMac (OpenClaw)
Make sure WhatsApp channel is enabled (pairing mode is fine to start):
openclaw config set channels.whatsapp.dmPolicy pairing
openclaw gateway restart
2) Link iMac to the dedicated WhatsApp account (Number B)
On the iMac:
openclaw channels login --channel whatsapp
Scan the QR using the dedicated phone (Number B):
WhatsApp â Settings â Linked Devices â Link a device.
Verify:
openclaw channels status --probe
You want WhatsApp to show linked and ideally running/works.
3) Send a test message from your personal WhatsApp (Number A)
On your personal phone (Number A): start a chat to Number B and send hi.
Because youâre in dmPolicy: pairing, the bot will respond with a pairing code.
4) Approve the pairing code on the iMac
openclaw pairing list whatsapp
openclaw pairing approve whatsapp <code>
5) Message again
Send another WhatsApp message to Number B and now OpenClaw should reply normally.
Common âwhat you might be missingâ
- If you try to test by messaging from Number B to itself, thatâs self-chat and needs
channels.whatsapp.selfChatMode: true. - If
channels status --probesaysnot linked, you need to re-runchannels login(QR).
If you paste the current output of:
openclaw channels status --probe
I can tell you exactly which step youâre currently stuck on.
Excellent, that worked thank you!
Nice â glad itâs working now.
If you have a sec, please rightâclick the message that fixed it â Apps â â Mark Solution (Answer Overflow indexes it so others can find it).
How do I configure to add multiple models? Anthropic's 4.5 Opus is swallowing to many token credeits. About 10 questions cost $11.02 is that normal?
To run with multiple models, you basically do two things:
- Add them to your model allowlist + (optional) aliases in config (
agents.defaults.models) - Switch per session with
/model âŠ(no restart)
Quick way (no config edits): switch in chat
Type:
/model(picker)/model list/model <number>/model status(shows whatâs active)
Docs: https://docs.openclaw.ai/help/faq#how-do-i-switch-models-on-the-fly-without-restarting
Config way (recommended): cheaper default + keep Opus available
In ~/.openclaw/openclaw.json (JSON5), set a cheaper default, but keep Opus in the allowlist so you can switch to it when you need it:
{
agents: {
defaults: {
model: { primary: "anthropic/claude-sonnet-4-5" },
models: {
"anthropic/claude-sonnet-4-5": { alias: "sonnet" },
"anthropic/claude-opus-4-5": { alias: "opus" }
}
}
}
}
Then you can do /model opus for âbigâ questions and /model sonnet for normal chat.
Docs: https://docs.openclaw.ai/concepts/models and https://docs.openclaw.ai/help/faq#how-do-i-switch-models-without-wiping-my-config
â10 questions cost $11â â is that normal?
It can be, especially with Opus once the session history gets big, because every turn includes: system prompt + conversation history + any tool outputs, etc.
To see whatâs actually happening, enable usage info:
/usage full(or at least/usage tokens)/status(shows last call input/output tokens + estimated cost)
And if the session has gotten huge, use /compact or start fresh with /new.
Token/cost explanation: https://docs.openclaw.ai/token-use
If you want, paste the output of /status (and whether youâre using an Anthropic API key vs setup-token) and I can tell you if the burn rate looks expected. Also, for current âbest cheap modelâ picks, ask in #models (changes too fast to hardcode).
How do I implement this? what do I type into the terminal?
Youâve got two easy options.
Option A (easiest): use the wizard
In Terminal on the machine running the Gateway:
openclaw configure --section models
In the Models section:
- set the default to
anthropic/claude-sonnet-4-5 - add
anthropic/claude-opus-4-5to the allowlist (and set aliases if it asks)
Then restart:
openclaw gateway restart
Option B (direct): set the config values
openclaw config set agents.defaults.model.primary "anthropic/claude-sonnet-4-5"
openclaw config set agents.defaults.models --json '{
"anthropic/claude-sonnet-4-5": { "alias": "sonnet" },
"anthropic/claude-opus-4-5": { "alias": "opus" }
}'
openclaw gateway restart
After that, in Discord you can switch anytime with:
/model sonnet/model opus/model list
Docs: https://docs.openclaw.ai/help/faq#how-do-i-switch-models-on-the-fly-without-restarting and https://docs.openclaw.ai/cli/config
which option has less issues or bugs? and which one is recommended?
Recommended: Option A (openclaw configure --section models). It tends to have the fewest issues because it:
- writes the right structure for
agents.defaults.models(easy to mess up by hand) - validates choices / prompts you through it
- avoids JSON quoting/escaping mistakes in the terminal
Option B (openclaw config set âŠ) is totally fine, but itâs more âpower userâ: most problems come from malformed JSON, overwriting the wrong path, or forgetting --json.
So: do Option A first. Use Option B when you want something scriptable/repeatable (or you know exactly what keys you want to set).
Your CLI wants model (singular), not models.
Try:
openclaw configure --section model
(or just openclaw configure and pick the Model step interactively).
Also: can you paste:
openclaw --version
The docs/flags have shifted a bit between versions, and the exact section names are version-dependent.
On 2026.2.3-1 the section name is model (singular) â thatâs why models errors.
Run this:
openclaw configure --section model
Then in the Model step set:
- Default / primary model:
anthropic/claude-sonnet-4-5 - Allowed models / model picker list: include both Sonnet + Opus (so
/model opusstill works)
When you exit/save, restart the gateway:
openclaw gateway restart
Sanity check:
openclaw models status
And in Discord you can switch anytime with:
/model sonnet/model opus/model status
(If you prefer âno wizardâ, tell me and Iâll give you the exact openclaw config set ... commands for your current config.)
okay I'm in the model/auth provider
Cool â in that Model/Auth provider step, do this:
- Select the provider you want to use (sounds like Anthropic, since youâre already on Opus).
- If it shows your Anthropic auth as already set up, donât change it â just continue.
- On the next screens (usually âdefault modelâ + âallowed models/model pickerâ):
- Set default/primary to:
anthropic/claude-sonnet-4-5(cheaper than Opus) - Make sure Opus is still included in the allowed list so you can switch to it later (
anthropic/claude-opus-4-5) - If it asks about aliases, set
sonnetandopus(optional, but nice)
- Finish/save, then restart:
openclaw gateway restart
Sanity check:
openclaw models status
If you tell me exactly what options you see on-screen in that step (provider list / prompts), I can be super specific about what to pick next.
will I have to resubmit api token if I select anthropic/claude-sonnet-4-5?
No â switching from Opus â Sonnet doesnât require a new API token, as long as youâre staying on the same provider (Anthropic) and the auth profile is already set.
Your Anthropic credential (API key or setup-token) is provider-level; both models use it.
Youâd only need to re-enter creds if:
- you change to a different provider (OpenAI / MiniMax / etc.), or
- your Anthropic auth isnât saved yet / expired / was only in your shell env and not in the daemon env.
If the wizard shows your Anthropic auth as âconfigured/okâ, you can safely pick anthropic/claude-sonnet-4-5 and continue.
I selectected anthropic and it jumped to antropic auth method..
â
â Where will the Gateway run?
â Local (this machine)
â
â Model/auth provider
â Anthropic
â
â Anthropic auth method
â â Anthropic token (paste setup-token) (run claude setup-token elsewhere, then paste the token here)
â â Anthropic API key
â â Back
â
Yep, thatâs expected â once you pick Anthropic as the provider, the wizard has to know how to authenticate Anthropic on this machine.
You wonât need to re-enter creds every time you switch Opus â Sonnet later â this is just setting up (or re-saving) the Anthropic credential.
Pick one:
- If you have an Anthropic Console API key (starts with
sk-ant-...) â choose âAnthropic API keyâ and paste it. - If youâre using a Claude subscription (Pro/Max) via Claude Code â choose âAnthropic token (paste setup-token)â. You generate it by running:
claude setup-token
(can be on any machine), then paste that token here.
After you finish auth, the next screens are where you set:
- default model â
anthropic/claude-sonnet-4-5 - allowlist â include both Sonnet + Opus (so
/model opusstill works)
If you tell me which of those two you currently used to run Opus (API key vs subscription), I can tell you which radio button to pick with confidence.
wow, it changed from when I originally set it up it has a lot of models and all of them start with amazon-bedrock/...
Thatâs confusing but not necessarily wrong.
amazon-bedrock/... is a totally separate provider (AWS Bedrock). Seeing a bunch of Bedrock model IDs in the picker usually means the wizard is showing a big catalog, and your cursor/filter is currently on the Bedrock section â it doesnât mean you have to use Bedrock.
What to do:
- In that model picker, try typing to filter (it should narrow the list):
- type
sonnet(or)anthropic/claude-sonnet-4-5 - then select
anthropic/claude-sonnet-4-5as the default
- If you canât find any
anthropic/...entries at all, skip fighting the wizard and just set it via CLI:
openclaw models set anthropic/claude-sonnet-4-5
openclaw models aliases add sonnet anthropic/claude-sonnet-4-5
openclaw models aliases add opus anthropic/claude-opus-4-5
openclaw gateway restart
Then confirm:
openclaw models status
If you paste the exact prompt line youâre on (e.g. âDefault modelâ / âAllowed modelsâ etc.) I can tell you exactly what to pick/what to type there.
status shows OAuth/token status - none
how do I add the token? it must have reomoved it when I canceled set up because of all the amazon-bedrock/ models
That âOAuth/token status: noneâ line is only about OAuth-style logins. Anthropic API keys and setup-tokens usually wonât show up there, so that line alone doesnât mean Anthropic is broken.
What to check:
- Run:
openclaw models status
If it shows something like âMissing auth: anthropicâ, then you do need to add your Anthropic credential again.
Add Anthropic auth back (pick ONE)
If youâre using a Claude subscription (setup-token)
- Generate a token (wherever you have Claude Code installed):
claude setup-token
- On the Gateway machine, store it in OpenClaw:
openclaw models auth setup-token
(choose Anthropic, then paste the token)
If you have an Anthropic API key (sk-ant-...)
openclaw models auth add
(choose Anthropic API key, paste it)
Then restart:
openclaw gateway restart
Set Sonnet as default (after auth is fixed)
openclaw models set anthropic/claude-sonnet-4-5
openclaw gateway restart
If you paste the output of openclaw models status (just that command), I can tell you whether Anthropic auth is actually missing or if itâs just the OAuth section being empty.
can you do the multiple models method I read from Krill above but with multiple services like codex oauth, google antigravity oauth , ollama, z ai API ? is it possible in the same session with different agents or openclaw must be restarted and they cannot interact with each other?
Yes â you can mix multiple providers/services (Codex OAuth, Google Antigravity OAuth, Ollama, Z.AI API, etc.) in one OpenClaw install, and you generally do not need to restart just to use different ones.
In the same chat session (same thread)
Youâre still talking to one agent, but you can switch which provider/model it uses on the fly:
- Use
/modelto switch for the current session (no restart). - You can also set up fallbacks so if one provider errors/rate-limits, it automatically tries the next provider/model.
Docs: https://docs.openclaw.ai/cli/models
With different agents (multi-agent setup)
You can run multiple isolated agents side-by-side (each with its own workspace + sessions, and typically its own auth profiles). This is how youâd do âAgent A = Ollama localâ, âAgent B = Codexâ, etc.
- They can coexist under one Gateway process.
- They donât share context/memory by default (thatâs the point: isolation).
âCan the agents interact with each other?â
By default: not really (isolated brains).
If you want collaboration, the supported pattern is:
- sub-agents (spawn background work, optionally with a different model/provider, and get the result posted back)
Docs: https://docs.openclaw.ai/tools/subagents
There is also optional agent-to-agent messaging, but itâs off by default and must be explicitly enabled/allowlisted (see the multi-agent doc).
About restart
- Switching models via
/modeldoesnât require restart. - Editing config usually hot-reloads (some changes may trigger an automatic restart depending on
gateway.reload.mode).
FAQ: https://docs.openclaw.ai/help/faq#do-i-have-to-restart-after-changing-config
If you tell me your goal (e.g. âdefault = Ollama, coding = Codex, fallback = Z.AI, plus Antigravity for Xâ), I can suggest the cleanest setup path (single-agent with /model + fallbacks vs multi-agent routing).
thanks Krill, you the king of the sea! last but not least, this also applies to locally installed models or even instanced in WSL2 ?
Yep â it applies to local models too.
Think of âlocalâ (Ollama / LM Studio / vLLM / LiteLLM) as just another model provider with a baseUrl. So you can still:
- mix it with Codex OAuth / Google Antigravity / Z.AI in the same OpenClaw install
- switch live with
/model - use fallbacks (hosted â local) without a manual restart
Docs:
- Local models: https://docs.openclaw.ai/gateway/local-models
- Ollama: https://docs.openclaw.ai/providers/ollama
About WSL2
Also yes in principle, as long as the Gateway can reach the model server over HTTP.
Two common setups:
- Gateway in WSL2 + model server in WSL2 (easy:
localhost)
- Gateway in WSL2 + model server on Windows host (works if you point
baseUrlat an address/port thatâs reachable from WSL2)
One important note for your case: WSL2 doesnât run on macOS (itâs Windows-only). On your Intel MacBook youâd just run Ollama/LM Studio directly on macOS, or use a VM/Docker-style setup instead.
plus codex gpt 5.3
Yes â for the âchat LLMâ models in your list, you can have them all configured in the same OpenClaw Gateway and use them from the same Discord chat.
The key distinction:
1) Multiple models/providers in one OpenClaw (no restart to use them)
OpenClaw can have many providers authenticated at once (Codex OAuth, Google Antigravity OAuth for Gemini, Z.AI API key, local Ollama, OpenRouter/Moonshot/etc). Then you can:
- switch per message with
/model - or use fallbacks (provider A â provider B) automatically
- or spawn sub-agents with a different model for a task and have it report back
Docs:
- Models CLI: https://docs.openclaw.ai/cli/models
- Model providers: https://docs.openclaw.ai/concepts/model-providers
- Sub-agents: https://docs.openclaw.ai/tools/subagents
2) âAgents thingâ (multi-agent) = separate brains/workspaces (optional)
Multi-agent is for when you want separate defaults + isolation, e.g.
- âcoding agentâ defaults to Codex
- âresearch agentâ defaults to Gemini
- âlocal/private agentâ defaults to Ollama
They can all run under one Gateway process, and you can switch with /agent <id> (or route specific channels/peers to specific agents).
Docs: https://docs.openclaw.ai/concepts/multi-agent
Important caveats about your specific list
- Google Antigravity OAuth is for Google models (Gemini). Itâs not âAntigravity Claudeâ. Claude is typically via the Anthropic provider (setup-token/API key) or via a proxy like claude-max-api-proxy.
- Stuff like Flux/SDXL/AudioCraft/F5âTTS/Whisper/TimesFM/Chronos are not âchat LLMsâ in OpenClawâs model picker sense. Those are usually handled via tools/skills (image generation, TTS, transcription, forecasting), not by swapping the main chat model.
If you tell me which ones you want as:
- your main chat model,
- your coding model,
- your local/private fallback,
âŠI can suggest whether you should do it as one agent + /model (simplest) or multiple agents (clean separation).
Yep â Codex can just be another provider/model in the same OpenClaw install.
What to know:
- No restart needed to switch: once Codex OAuth is set up, you can switch to it in the same Discord session with
/model. - Donât hardcode the exact model name (like âgpt 5.3â) until you confirm it exists for your account: use
/model list(in chat) oropenclaw models list(CLI) and pick whatever Codex exposes to you. - If you use a model allowlist (
agents.defaults.models), make sure the Codex entry you want is included â otherwise youâll get âModel is not allowedâ.
Codex auth/setup (OAuth):
openclaw models auth login --provider openai-codex(or just runopenclaw onboardand pick Codex)
Docs: https://docs.openclaw.ai/concepts/model-providers and https://docs.openclaw.ai/cli/models
Krill now that I have sonnet as my default and also set up opus and sonnet alias how do I also add Haiku 4.5 to the list?
If youâre using an allowlist (agents.defaults.models) + custom aliases, you need to add Haiku there too (otherwise /model wonât show it / may say âModel is not allowedâ).
1) First, confirm the exact Haiku model ID on your install
In chat:
/model list
Or in a terminal:
openclaw models list --all --provider anthropic
(Names can vary slightly, so donât guessâcopy what your list shows.)
2) Add it (two easy ways)
Option A â CLI (recommended):
openclaw models aliases add haiku anthropic/claude-haiku-4-5
Option B â config (JSON5)
Add this alongside your Opus/Sonnet entries:
{
agents: {
defaults: {
models: {
"anthropic/claude-haiku-4-5": { alias: "haiku" },
},
},
},
}
3) Use it
/model haiku(or/model anthropic/claude-haiku-4-5)
No restart is usually needed (config hot-reload), but if it doesnât show up immediately, restart the gateway once. Docs: https://docs.openclaw.ai/cli/models
Haiku Claude 4.5 how do I add it through the terminal?
In the terminal, add it the same way you added your Opus/Sonnet alias:
- Find the exact Anthropic model id on your install
openclaw models list --all --provider anthropic
- Add Haiku + alias
(If the model id isanthropic/claude-haiku-4-5:)
openclaw models aliases add haiku anthropic/claude-haiku-4-5
- Verify
openclaw models aliases list
Then in chat you can do:
/model haiku(or/model anthropic/claude-haiku-4-5)
what is the difference between these two?:
anthropic/claude-haiku-4-5 text+image 195k no yes
anthropic/claude-haiku-4-5-20251001 text+image 195k no yes
Those are basically ârolling aliasâ vs âpinned versionâ:
anthropic/claude-haiku-4-5= the generic model name. Anthropic can update what this points to over time (same âHaiku 4.5 familyâ, newer snapshot under the hood).anthropic/claude-haiku-4-5-20251001= a specific dated snapshot of the model. It should stay stable, which is nice for reproducibility (same behavior next week/month).
Right now they often look identical in the list (same modalities/context/etc) because the generic one may currently resolve to that dated release.
Rule of thumb:
- Use the dated one if you want consistency for a workflow/app.
- Use the non-dated one if you want âlatest improvementsâ without changing your config later.
I see thx. After I add the haiku alias should I restart the gateway?
Usually no.
Two cases:
-
If you added it via the CLI (
openclaw models aliases add ...):
No restart â it should take effect immediately. Just verify with:openclaw models aliases listand in chat:
/model list/model haiku
-
If you edited
~/.openclaw/openclaw.jsonmanually:
Also usually no restart (Gateway hot-reloads config), but sometimes it can take a moment. If it doesnât show up after ~10â30 seconds, then do:
openclaw gateway restart
when I type /model haiku in dashboard I get the following Model "anthropic/anthropic/claude-haiku-4-5-20251001" is not allowed. Use /models to list providers, or /models <provider> to list models.
That error is showing two separate problems:
1) Youâve got a double provider prefix
anthropic/anthropic/claude-haiku-4-5-20251001 is invalid (it has anthropic twice).
-
If youâre using the chat command, use exactly:
/model anthropic/claude-haiku-4-5-20251001- or (after your alias) just
/model haiku
-
If youâre setting it in the dashboard and it has a provider dropdown + model field, then pick provider anthropic and put only:
claude-haiku-4-5-20251001
(noanthropic/in the model field)
2) âModel is not allowedâ means itâs not in your allowlist
If you have agents.defaults.models configured (allowlist), you must allow the exact model ref youâre selecting.
In terminal, allow it by adding an alias that points to the dated model:
openclaw models aliases add haiku anthropic/claude-haiku-4-5-20251001
openclaw models aliases list
Then switch in chat with:
/model haiku(recommended)- or
/model anthropic/claude-haiku-4-5-20251001
If you paste the output of openclaw models aliases list (and optionally openclaw models list), I can tell you exactly what entry is missing.
Delete it by removing the alias name (not the full model path).
- List aliases to confirm whatâs there:
openclaw models aliases list
- Remove the bad alias (yours is named
haiku):
openclaw models aliases remove haiku
- Re-add it with the correct model ref:
openclaw models aliases add haiku anthropic/claude-haiku-4-5-20251001
# (or use the rolling one)
# openclaw models aliases add haiku anthropic/claude-haiku-4-5
- Verify:
openclaw models aliases list
No gateway restart should be needed. If the dashboard/model picker still shows the old entry, give it ~10â30s or refresh; worst case openclaw gateway restart.
Krill, how do I add brave web search capability to my open claw?
To enable Brave web search (the web_search tool) you just need a Brave Search API key and to turn the tool on in config.
Option A (recommended): use the wizard
openclaw configure --section web
It will prompt for the Brave API key and write the right config.
Option B: set it manually in config
Edit ~/.openclaw/openclaw.json (JSON5) and add:
{
tools: {
web: {
search: {
enabled: true,
apiKey: "BRAVE_API_KEY_HERE",
maxResults: 5,
},
fetch: { enabled: true },
},
},
}
Option C: env var (good for daemons)
Put this in ~/.openclaw/.env so the Gateway service can see it:
BRAVE_API_KEY=...
If you use tool allowlists
Make sure web_search is allowed (or allow group:web if youâre using tool groups).
Do I need to restart?
Usually no (config hot-reloads). If it doesnât take effect within ~30s, do:
openclaw gateway restart
Docs: https://docs.openclaw.ai/help/faq#how-do-i-enable-web-search-and-web-fetch
â Enable web_search (Brave Search)?
â â Yes / â No
That prompt is from openclaw configure --section web.
- If you have (or want to use) a Brave Search API key â select Yes.
- Use â/â arrow keys to switch from
â Notoâ Yes, then Enter. - Next it should ask for your Brave API key (you can get one here): https://api.search.brave.com/app/keys
- Use â/â arrow keys to switch from
- If you donât have a key yet â leave it on No for now. (
web_fetchcan still work without Brave;web_searchspecifically needs the key.)
Afterwards, you can sanity-check by asking your bot something like âsearch the web for âŠâ and it should start using web_search.
Docs: https://docs.openclaw.ai/help/faq#how-do-i-enable-web-search-and-web-fetch
â Enable web_fetch (keyless HTTP fetch)?
â â Yes / â No
Leave that on Yes (recommended) and press Enter.
web_fetch is the âdownload a webpage and extract textâ tool â it doesnât need an API key, and itâs useful even if you donât enable Brave search yet.
do I need to restart the gateway after that?
Usually no â the Gateway hotâreloads config.
If web search/fetch still doesnât work after ~30 seconds (or you donât see it in /status), then do a restart:
openclaw gateway restart
Quick check:
- ask it: âsearch the web for âŠâ (needs Brave key + web_search enabled)
- or: âfetch https://example.com and summarize itâ (web_fetch only, no key needed)
How do I add my OpenAI plus subscription to openclaw and set an alias?
Two different things get called âOpenAI subscriptionâ, and they behave differently in OpenClaw:
A) ChatGPT / OpenAI Plus subscription
That does not include OpenAI API access.
So it wonât work with the normal openai/* provider unless you also create an API key (paid API billing).
B) OpenAI Code (Codex) subscription OAuth (works like âsign in with OpenAIâ)
This is the path OpenClaw supports for subscription-style auth:
1) Login (OAuth) in terminal
openclaw models auth login --provider openai-codex --set-default
(You can also do it via openclaw onboard and choose Codex.)
2) See what models you can actually use
openclaw models list --provider openai-codex
# or:
openclaw models status
3) Set your default model (pick one from the list output)
openclaw models set openai-codex/<model-id-from-your-list>
4) Add an alias
openclaw models aliases add codex openai-codex/<model-id-from-your-list>
openclaw models aliases list
Then in chat you can switch with:
/model codex
No restart is usually needed.
If you paste your openclaw models list --provider openai-codex output, Iâll tell you the exact <model-id> to use for the alias.
Error: No provider plugins found. Install one via openclaw plugins install.
That error is coming from openclaw models auth login specifically â that command only works when you have at least one provider-auth plugin installed/enabled (it loads âprovidersâ from plugins). Right now you have zero provider plugins available, so it bails.
For OpenAI Plus / subscription-style access, the reliable path is the onboarding wizard (Codex OAuth), not models auth login.
Do this instead (Codex subscription OAuth)
openclaw --version
openclaw onboard --auth-choice openai-codex
That will run the Codex OAuth flow (or reuse ~/.codex/auth.json if you already signed in via the Codex CLI).
After that, set an alias:
openclaw models list --provider openai-codex
openclaw models aliases add codex openai-codex/<model-id-from-the-list>
openclaw models aliases list
Quick sanity check on the plugin situation (optional)
openclaw plugins list
If you paste your openclaw --version + openclaw plugins list output, I can tell you whether youâre missing bundled plugins / on an older build / or just need to enable a specific plugin.
after I I connected openai it jumped to the following
â
â Select channel (QuickStart)
â â Telegram (Bot API)
â â WhatsApp (QR link) (linked)
â â Discord (Bot API)
â â Google Chat (Chat API)
â â Slack (Socket Mode)
â â Signal (signal-cli)
â â iMessage (imsg)
â â Feishu (Lark Open Platform)
â â Nostr (NIP-04 DMs)
â â Microsoft Teams (Bot Framework)
â â Mattermost (plugin)
â â Nextcloud Talk (self-hosted)
â â Matrix (plugin)
â â BlueBubbles (macOS app)
â â LINE (Messaging API)
â â Zalo (Bot API)
â â Zalo (Personal Account)
â â Tlon (Urbit)
â â Skip for now
â
Thatâs normal â youâre still inside openclaw onboard. After the model/auth step (Codex OAuth), the wizard moves on to Channels (QuickStart).
What to pick:
- If youâre already using OpenClaw via Discord (this server): choose Discord (Bot API) only if you want to set up a Discord bot token and have OpenClaw reply in Discord directly.
- If you donât want to change/add any channels right now: choose Skip for now.
Either way, you can always add/modify channels later with:
openclaw configure
# or rerun:
openclaw onboard
So the safe move right now: Skip for now (unless you explicitly want to set up a new channel).
if I hit ctrl+c to exit out of settup will it save my openai model or do I have to run through the entire settup for it to save it?
Donât Ctrl+C right after an auth step if you can avoid it â it might not have written the config/auth changes yet (depends on exactly which step youâre on).
Safest options:
Option 1 (recommended): finish the wizard quickly
Pick âSkip for nowâ for channels, then keep hitting Skip/Next until you get the final summary/âdoneâ screen. That guarantees everything is saved cleanly.
Option 2: if you already Ctrl+Câd
Your OAuth token is often still saved, but verify:
openclaw models status
openclaw models list --provider openai-codex
If openai-codex shows up with a valid auth profile, youâre good. If not, rerun:
openclaw onboard --auth-choice openai-codex
- openai-codex usage: 5h 100% left â±4h 59m · Day 100% left â±6d 23h
- openai-codex:default ok expires in 10d
sorenlv@Sorens-iMac ~ % openclaw models aliases add codex openai-codex/<model-id-from-the-list>
zsh: parse error near `\n'
sorenlv@Sorens-iMac ~ %
- openai-codex:default ok expires in 10d
Nice â the openai-codex usage ⊠+ openai-codex:default ok lines mean your Codex OAuth is saved and working.
The error is just because you literally pasted the placeholder <> â zsh treats <model-idâŠ> as shell redirection and throws a parse error.
Do this:
- List the real Codex models you have:
openclaw models list --provider openai-codex
- Copy the exact model id from that output and use it without
< >, e.g.:
openclaw models aliases add codex openai-codex/gpt-5.2
# or whatever you see in the list
- Verify:
openclaw models aliases list
If you paste the output of openclaw models list --provider openai-codex Iâll tell you which one to pick for a good default alias.
~ % openclaw models list --provider openai-codex
No models found.
openclaw models list --provider openai-codex only shows models youâve already configured/allowlisted, not the full provider catalog â so âNo models foundâ just means you havenât added any openai-codex/* model to your config yet.
Use one of these to see whatâs available:
Show the full Codex catalog (terminal)
openclaw models list --all --provider openai-codex
Or from chat
Send:
/models(to see providers)/models openai-codex(to list that providerâs models)
Once you see a real model name, add the alias (no < >):
openclaw models aliases add codex openai-codex/<the-real-model-id>
If --all still shows nothing, paste:
openclaw --version
openclaw models status
and Iâll tell you whatâs off.
what would the alias name be if I type openclaw models aliases add codex openai-codex/<the-real-model-id>?
The alias name is the first argument after add.
So in:
openclaw models aliases add codex openai-codex/<the-real-model-id>
codexis the alias name.openai-codex/<the-real-model-id>is what it points to.
After you add it, you can switch to it in chat with:
/model codex
You can name it anything you want, e.g. code, openai, gpt, etc. Just keep it short and unique.
how do I get a list of all my alias's models I've set up?
In the terminal:
openclaw models aliases list
That prints your aliases like:
alias -> provider/model
If you also want to see the full model allowlist (including ones without aliases), run:
openclaw models list
why do I see the following in my dashboard when I type /model codex? Model "openai-codex/openai-codex/gpt-5.2-codex" is not allowed. Use /models to list providers, or /models to list models.
That error means youâre accidentally prefixing the provider twice again:
openai-codex/openai-codex/gpt-5.2-codex â
should be either:
- Full ref (single field):
openai-codex/gpt-5.2-codexâ
or - If the dashboard has a provider dropdown set to
openai-codex: put onlygpt-5.2-codexâ in the model box.
Then fix the ânot allowedâ part (allowlist):
- Make sure the model exists in your catalog:
openclaw models list --all --provider openai-codex
- Add it to your allowlist (and optionally set alias) with one command:
openclaw models aliases add codex openai-codex/gpt-5.2-codex
- Verify:
openclaw models list --provider openai-codex
openclaw models aliases list
If you paste the output of openclaw models list --all --provider openai-codex, Iâll tell you the exact model string to use (sometimes accounts differ).
here is what I got how do I set up the alias's for these properly?
~ % openclaw models list --all --provider openai-codex
đŠ OpenClaw 2026.2.3
Model Input Ctx Local Auth Tags
openai-codex/gpt-5.1 text+image 266k no yes
openai-codex/gpt-5.1-codex-max text+image 266k no yes
openai-codex/gpt-5.1-codex-mini text+image 266k no yes
openai-codex/gpt-5.2 text+image 266k no yes
openai-codex/gpt-5.2-codex text+image 266k no yes
Youâve got the list now â perfect. You can make aliases for any/all of those with:
openclaw models aliases add <alias-name> <provider/model>
Hereâs a clean setup Iâd do (copy/paste):
# âcodexâ = the coding-tuned one (most people want this)
openclaw models aliases add codex openai-codex/gpt-5.2-codex
# âgptâ = the general one
openclaw models aliases add gpt openai-codex/gpt-5.2
# Optional: if you want the 5.1 line too
openclaw models aliases add gpt51 openai-codex/gpt-5.1
openclaw models aliases add codex51max openai-codex/gpt-5.1-codex-max
openclaw models aliases add codex51mini openai-codex/gpt-5.1-codex-mini
Verify:
openclaw models aliases list
Then in chat you can switch with:
/model codex/model gpt
Two gotchas (based on your earlier errors):
- Donât type
openai-codex/twice.
- Donât use
< >in the command (shell treats them specially).
Error: Alias codex already points to openai-codex/openai-codex/gpt-5.2-codex.
how do I delete the incorrect one that is currently already there?
Remove aliases by alias name.
- List aliases (so you can confirm whatâs set):
openclaw models aliases list
- Remove the bad one:
openclaw models aliases remove codex
- Re-add it correctly:
openclaw models aliases add codex openai-codex/gpt-5.2-codex
If aliases remove codex says âAlias not foundâ, it means the alias name isnât exactly codex (or itâs set in a different agent profile). In that case paste the output of openclaw models aliases list and Iâll tell you the exact remove command.
OpenClaw doesnât have a generic âemail/IMAPâ integration with a builtâin readâonly toggle. For Gmail, the supported path is gogcli (Google Workspace CLI) + the Gmail Pub/Sub â OpenClaw hook flow, which is effectively read-only (it ingests/summarizes new mail; it doesnât send mail).
Recommended (read-only): Gmail Pub/Sub â OpenClaw (new mail summaries)
On macOS, run the helper wizard:
openclaw webhooks gmail setup --account you@gmail.com
What this does (per docs):
- installs/uses
gog,gcloud, and (recommended)tailscale - configures OpenClaw hooks (
hooks.enabled,hooks.presets: ["gmail"]) - starts a Gmail âwatchâ and forwards new mail into OpenClaw as webhook events
Docs: https://docs.openclaw.ai/automation/gmail-pubsub
Deliver summaries into chat
In ~/.openclaw/openclaw.json, make sure hooks are enabled (the wizard typically sets this), and add a mapping that sets deliver: true if you want it pushed to your chat surface.
(Example is in the doc above.)
If you mean âlet the bot query my inbox but never sendâ
Thatâs trickier: inbox querying is usually done by letting the agent run gog gmail search ... via the exec tool, and OpenClaw tool policy/exec approvals donât (currently) restrict subcommands (so gog could also send).
Two practical âread-only-ishâ options:
- Keep it push-only (Pub/Sub) and donât enable general
execfor that agent. - Use exec approvals = ask always, and only approve read commands (manual guardrail).
If you tell me which behavior you want:
- (A) âsummarize new emails automaticallyâ (push)
or - (B) âI want to ask âsearch my inbox for Xâ interactivelyâ (query)
âŠIâll give you the cleanest config for that setup.
That error is from openclaw webhooks gmail setup and it means: OpenClaw canât figure out which Google Cloud Project to create the Pub/Sub topic/subscription in.
You can fix it in either of these ways:
Option 1 (simplest): pass the project id explicitly
- Find your GCP project id (in Google Cloud Console, or via):
gcloud projects list
- Run setup again with
--project:
openclaw webhooks gmail setup --account you@gmail.com --project <your-project-id>
Option 2: make sure gog is already fully authenticated (so setup can infer it)
Check if you already have gog credentials/accounts:
gog auth list
If that shows nothing, you need to do the one-time gog OAuth setup first (download an OAuth client_secret.json from Google Cloud, then):
gog auth credentials /path/to/client_secret.json
gog auth add you@gmail.com --services gmail
Then rerun:
openclaw webhooks gmail setup --account you@gmail.com
Important gotcha
Gmail Watch requires the Pub/Sub topic to live in the same GCP project as the OAuth client you used for gog. So donât pick a random projectâpick the one that owns the client_secret.
If you paste:
gog auth list- and the exact command you ran (
openclaw webhooks gmail setup ...)
âŠI can tell you which path youâre on and what to enter for--project.
Error: ERROR: (gcloud.pubsub.topics.create) The value of ``--project'' flag was set to Project number.To use this command, set it to PROJECT ID instead.
That oneâs straightforward: you passed a project number (looks like 123456789012) but gcloud pubsub ⊠--project requires the project ID (looks like my-project-name-abc123).
Get the correct PROJECT ID
Run:
gcloud projects list
Youâll see columns like PROJECT_ID and PROJECT_NUMBER. Copy the PROJECT_ID.
Re-run setup with the PROJECT_ID
openclaw webhooks gmail setup --account you@gmail.com --project <PROJECT_ID>
If you only have the number and want to map it â ID
gcloud projects list --filter="PROJECT_NUMBER=<your-number>" --format="value(PROJECT_ID)"
Thatâs just the shell interpreting the <...> and the extra text as redirection / a filename.
Donât type the angle brackets, and donât concatenate PROJECT_ID with the number.
Use exactly one real project ID string, like my-gmail-bot-4f3a2b:
openclaw webhooks gmail setup --account you@gmail.com --project my-gmail-bot-4f3a2b
First, get the correct project ID:
gcloud projects list
Copy the value under PROJECT_ID (not PROJECT_NUMBER), then paste it into the command above.
If you paste your gcloud projects list output (you can redact names if you want), Iâll point at the exact value to use.
That error means OpenClaw tried to run:
tailscale status --json
âŠbut the local Tailscale daemon isnât running (or youâre not logged into Tailscale yet). The Gmail Pub/Sub setup uses Tailscale (Funnel) to create a public HTTPS endpoint for Google to push email events to.
Fix (macOS)
- Start the Tailscale app (menu bar icon):
open -a Tailscale
- Log in / connect (either via the UI, or terminal):
tailscale up
(If it prompts for admin permission, approve it.)
- Verify it works:
tailscale status --json
- Re-run your command:
openclaw webhooks gmail setup --account you@gmail.com --project your-project-id
If you donât want to use Tailscale
You can do an unsupported/manual tunnel instead, but then you must provide your own public HTTPS âpush endpointâ (ngrok/cloudflared/etc). The supported path is Tailscale.
If tailscale status --json still fails after opening the app, tell me what tailscale status prints (non-json is fine).
That error just means Tailscale isnât installed on your Mac yet (so open -a Tailscale canât find the app, and tailscale status --json fails).
Install Tailscale (macOS)
Pick one:
Option A â Homebrew (fastest)
brew install --cask tailscale
Then launch it from Applications, or:
open -a Tailscale
Option B â Download the macOS app
Download/install from: https://tailscale.com/download/mac
Bring it up / log in
After installing:
tailscale up
Then verify:
tailscale status --json
Then re-run your Gmail setup
openclaw webhooks gmail setup --account you@gmail.com --project your-project-id
Note (if you hit Funnel issues)
The Gmail Pub/Sub helper prefers a Tailscale âpublic HTTPSâ setup (Funnel). On macOS, Funnel can require the openâsource Tailscale app variant (their docs mention this). If you get an error specifically about Funnel after installing Tailscale, paste that error and Iâll tell you the exact fix (or how to run without Funnel).
Yep â thatâs the expected message if you installed via Homebrew cask (it needs sudo to install the app).
Once it finishes:
- Launch + sign in:
open -a Tailscale
Then in the Tailscale window/menu bar, Log in and Connect.
- Verify the daemon is running:
tailscale status --json
- Bring it up from terminal (if it isnât already):
tailscale up
- Retry Gmail setup:
openclaw webhooks gmail setup --account you@gmail.com --project <your-project-id>
If you get stuck at any step, paste the output of tailscale status (non-json is fine).
Itâs asking for your Mac user account password (the one you use to log into the Mac / unlock settings), because brew install --cask tailscale needs admin rights to install an app into /Applications and set up system components.
Notes:
- Itâs not your Apple ID password.
- When you type it in Terminal, it wonât show any characters (thatâs normal). Type it and press Enter.
If you donât have admin rights on that Mac (work machine / managed device), youâll need an admin to install Tailscale or use a different tunneling approach.
Good news: Tailscale itself installed successfully (tailscale-app was successfully installed!). Next step is just to start it + log in.
1) Start Tailscale + connect
open -a Tailscale
Then in the Tailscale UI/menu bar: Log in â Connect.
Verify from terminal:
tailscale status --json
# if it says you're not up yet:
tailscale up
2) Retry the Gmail setup
openclaw webhooks gmail setup --account you@gmail.com --project <your-project-id>
About the Homebrew âdirectories not writableâ message
Thatâs a Homebrew permission issue, not a Tailscale install failure.
Also: the paths it printed (/usr/local/share/manX/manXX) look like placeholders, so donât run that sudo chown -R ... line as-is.
If you want to fix Brew properly later, run:
brew doctor
and paste the output here â itâll tell the exact real directories/commands. For now you can continue with Tailscale/OpenClaw.
Click Install Now and approve it.
On macOS, Tailscale needs a system/network extension to create the VPN interface. After you click it, macOS may send you to:
System Settings â Privacy & Security
Look for a banner like âSystem software from developer âTailscale Inc.â was blockedâ and click Allow (you may need your Mac password again).
Then:
- Quit/reopen Tailscale (if it asks).
- Connect (Log in â Connect).
- Verify in terminal:
tailscale status
Once tailscale status shows youâre connected, rerun:
openclaw webhooks gmail setup --account you@gmail.com --project <your-project-id>
If you paste what tailscale status shows after allowing the extension, I can confirm youâre good.
Generally yes â Tailscale is considered safe by most people who use it (itâs WireGuard-based, widely deployed in companies, and the macOS âsystem extensionâ is the normal way VPN apps work now).
That said, the real safety question is: who controls the Tailnet youâre joining.
Safe ifâŠ
- Itâs your own Tailnet (you created it), or a Tailnet run by someone you fully trust.
- You can see the device show up in the admin console and you recognize it.
What the permission actually enables
- It installs a macOS network/system extension so Tailscale can create a VPN interface.
- It does not automatically expose your Mac to the public internet.
Quick âdonât accidentally route everythingâ checks (recommended)
In the Tailscale app after connecting:
- Make sure âUse Exit Nodeâ is OFF (unless you explicitly want all traffic routed through another machine).
- Be cautious with accepting subnet routes (only accept if you know why you need it).
- If you donât need it, keep Tailscale SSH off.
If youâre uneasy
You can still run OpenClaw without Tailscale (local-only), but the Gmail Pub/Sub helper uses Tailscale Funnel/Serve as the supported way to receive Googleâs inbound push events. Without it, youâd need a different public HTTPS tunnel (more DIY).
If you tell me whether youâre joining your own Tailnet vs someone elseâs, I can give a more specific âyes/no + what to checkâ recommendation.
If you just installed Tailscale and youâre about to click Log in, it will take you to a browser and youâll sign in with an identity (Google/GitHub/Microsoft/email). The Tailnet you end up in is tied to that account/org.
Here are the easy ways to tell:
1) Check in the Tailscale web admin
After you log in, open:
https://login.tailscale.com/admin
At the top/left youâll see the tailnet name / account. If itâs:
- your personal email / something you recognize as âyouâ â itâs your tailnet
- a company/org name you donât control â itâs someone elseâs
2) Check in the macOS Tailscale app
Open the Tailscale menu bar app â it usually shows the account youâre logged in as (often your email/domain). If itâs a work domain/org, thatâs a work tailnet.
3) CLI check (after youâre connected)
Run:
tailscale status
It will show your device plus other devices on the tailnet. If you see a bunch of machines you donât recognize (company servers, coworkersâ laptops), youâre probably on an org tailnet.
Quick rule of thumb
- If you signed in with your personal email and never got invited to a company tailnet, youâre almost certainly on your own.
- If you signed in with a work Google Workspace / Microsoft account, you might be joining a company tailnet by default.
If you paste (redacting names is fine):
- the first line or two of
tailscale status, or - what you see at
login.tailscale.com/admin(tailnet name),
I can help you interpret it.
If itâs your own tailnet, the defaults are already pretty safe (Tailscale is âdeny by defaultâ in practice unless you add sharing/ACLs). But there are a few settings worth checking so you donât accidentally open access.
1) Donât share your device
In the admin console (https://login.tailscale.com/admin):
- Sharing: make sure you didnât share the device with anyone.
- Donât generate âshare invite linksâ unless you mean to.
2) Keep ACLs restrictive (recommended)
If youâve never touched ACLs, youâre usually fine. If you want to be explicit:
- only allow your own user to access your devices
- donât allow broad
*:*rules
(Admin Console â Access Controls)
3) Make sure youâre not acting as an exit node (OFF)
In the Tailscale app / admin:
- Exit Node: donât enable âAdvertise Exit Nodeâ unless you know why.
- This doesnât let people âaccess your Macâ, but it can route traffic through it.
4) Be cautious with subnet routes (usually OFF)
Only enable/accept subnet routes if you intentionally want access to your LAN from the tailnet.
5) Turn off Tailscale SSH unless you want it
Admin Console â SSH:
- keep it disabled unless you specifically want SSH-over-Tailscale.
6) Turn on 2FA on the identity you use to log in
This is the big one:
- If you log in with Google/GitHub/Microsoft, enable 2FA there.
- Thatâs the main way someone else would âget intoâ your tailnet.
Quick check: who can reach you?
After youâre connected, run:
tailscale status
If you only see your own devices, youâre in good shape.
If you tell me whether this is a personal tailnet or a work/org tailnet, I can give the right âmust-doâ list (org tailnets can have admins/ACLs you donât control).
Tailscale is a private networking / VPN tool that makes your devices behave like theyâre on the same secure LAN, even when theyâre on different WiâFi networks or across the internet.
Under the hood it uses WireGuard (modern, fast VPN crypto), but it hides most of the painful VPN setup.
What itâs for (common uses)
- Access your own machines remotely without opening ports on your router
(SSH into a server, reach a NAS, remote desktop, etc.) - Connect a laptop + phone + home server as if theyâre on one network
- Securely expose a local web service to just your devices (Tailnet-only)
- Share access with a small team (with ACLs so not everyone can reach everything)
- Make public HTTPS tunnels via Funnel (optional), kind of like ngrok
How it relates to OpenClaw
OpenClaw uses Tailscale for âniceâ remote access patterns:
- Serve: gives you an HTTPS URL on your tailnet for the Gateway dashboard (private)
- Funnel: gives you a public HTTPS URL (used for things like Gmail Pub/Sub push events), without you setting up your own server/tunnel
Docs: https://docs.openclaw.ai/gateway/tailscale
Mental model
- Your tailnet = your private âmesh networkâ
- Only devices/users you authorize join it
- No random internet user can see it unless you explicitly use Funnel or share access
Next is basically: (1) confirm Tailscale is actually up, (2) make sure gog + gcloud are authenticated, then (3) rerun the Gmail Pub/Sub setup.
Hereâs the shortest âdo this in orderâ checklist on your Mac:
0) Confirm Tailscale is connected
tailscale status
If it says youâre not connected yet:
tailscale up
1) Confirm gog is installed + your Gmail account is added
gog auth list
- If you donât see your Gmail account there yet, you need to do the one-time
gogOAuth setup (client_secret.json) and add the account:gog auth credentials /path/to/client_secret.json gog auth add you@gmail.com --services gmail
2) Confirm gcloud is installed + logged in + using the right PROJECT_ID
gcloud --version
gcloud auth login
gcloud projects list
Pick the PROJECT_ID (string like my-project-abc123, not the numeric project number), then:
gcloud config set project <PROJECT_ID>
Important: the Gmail watch requires the Pub/Sub topic to live in the same GCP project as the OAuth client you used for gog.
3) Run the OpenClaw Gmail setup (again)
openclaw webhooks gmail setup --account you@gmail.com --project <PROJECT_ID>
Docs (this is the flow youâre doing):
https://docs.openclaw.ai/automation/gmail-pubsub
If it errors again
Paste the output of:
tailscale status
gog auth list
gcloud config get-value project
(and the exact openclaw webhooks gmail setup ... command you ran). Thatâll make it obvious which step is missing.
Yep â that warning is normal-ish and usually not a problem.
It means the CLI client (tailscale on your Mac) and the background daemon (tailscaled) are on slightly different builds/versions. The âserverâ string often has extra suffixes because itâs the daemon build metadata.
What to do
- First see if youâre actually connected anyway:
tailscale status
If you see your device + an IP (usually 100.x.y.z) youâre fine and can continue the Gmail setup.
- If Tailscale isnât working (canât connect / status errors), the usual fix is just:
- Quit Tailscale from the menu bar
- Reopen it
- Or reboot the Mac (yes, boring, but it fixes daemon mismatches a lot)
- If you want to make the warning go away:
Update Tailscale so both pieces match:
brew upgrade --cask tailscale
But honestly: if tailscale status works, proceed.
That error means the Tailscale daemon (tailscaled) isnât running, so the tailscale CLI has nothing to talk to. On macOS, tailscale up usually canât start the service by itself â launching the app (and approving the extension) is what starts it.
Do this:
- Launch the Tailscale app
open -a Tailscale
Make sure you see the menu bar icon, then log in and click Connect in the app.
-
Approve the system extension (if prompted)
System Settings â Privacy & Security â look for a Tailscale âSystem software blockedâ / âNetwork extensionâ prompt â Allow.
Then quit/reopen Tailscale. -
Check again
tailscale status
If tailscale status works, then tailscale up will work too.
If it still says âfailed to connectâŠâ, the quickest fix is a reboot (this is very common right after installing network extensions on macOS).
If you paste the output of:
tailscale status
I can tell you exactly where itâs stuck (not installed vs extension blocked vs not logged in).
gog auth list returns "No tokens stored"
gog auth list returns "No tokens stored"
Krill you awake?
Yep â still here.
For the Tailscale error (âfailed to connect to local Tailscale serviceâ), the next thing I need from you is:
- Did you open the Tailscale app and do you see the menu bar icon?
- What does this print?
tailscale status
If tailscale status also fails, the usual fix path is:
- System Settings â Privacy & Security â Allow the Tailscale system/network extension
- quit/reopen Tailscale
- reboot once if it still wonât start
Paste the exact tailscale status output and Iâll tell you the next move.
Tailscale is up and running "gog auth list" returns "No tokens stored"
Cool â Tailscale is sorted. Now youâre blocked on gog: âNo tokens storedâ means you havenât done the one-time Google OAuth for gog yet.
What you need to do next (one-time)
1) Create/download a Google OAuth client JSON (Desktop app)
In Google Cloud Console:
- APIs & Services â Credentials
- Create Credentials â OAuth client ID
- Application type: Desktop app
- Download the JSON (often named
client_secret_....json)
(Use the same GCP project youâll use for Pub/Sub later.)
2) Point gog at that credentials file
gog auth credentials /path/to/client_secret.json
3) Add your Gmail account + grant Gmail scope
gog auth add you@gmail.com --services gmail
4) Verify tokens exist
gog auth list
Then go back to OpenClaw Gmail setup
openclaw webhooks gmail setup --account you@gmail.com --project <PROJECT_ID>
If you tell me what file you downloaded (name + where it is, e.g. ~/Downloads/client_secret_....json) I can give you the exact command with the right path.
Got it. Clean restart from âTailscale is working nowâ:
Step 0 â Confirm Tailscale really works
tailscale status --json
If that prints JSON, youâre good.
Step 1 â Set up gog (this is the piece youâre missing)
Right now you said gog auth list â No tokens stored, so we must do this first.
1A) Create/download Google OAuth client for gog
In Google Cloud Console (same project youâll use for Pub/Sub):
- APIs & Services â Credentials
- Create Credentials â OAuth client ID
- Type: Desktop app
- Download the JSON (client secret)
1B) Tell gog where that JSON is
Example if itâs in Downloads:
gog auth credentials ~/Downloads/client_secret_*.json
1C) Add your Gmail account
gog auth add you@gmail.com --services gmail
Verify:
gog auth list
You should now see your account listed.
Step 2 â Pick the correct GCP PROJECT_ID (not the number)
gcloud auth login
gcloud projects list
Copy the PROJECT_ID column (string like my-project-abc123), then:
gcloud config set project <PROJECT_ID>
Step 3 â Run OpenClaw Gmail setup
Now rerun with real values:
openclaw webhooks gmail setup --account you@gmail.com --project <PROJECT_ID>
Fastest way for us to continue
Paste the output of:
tailscale status --json
gcloud projects list
ls -1 ~/Downloads | head
(You can redact project names/emails if you want.) Then Iâll tell you exactly what to put for <PROJECT_ID> and the exact gog auth credentials ... path.
Thatâs expected, but those scopes are not read-only.
gog auth add ... --services gmail asks Google for Gmail API permissions, and the Gmail API bundles scopes that include things like read + send + settings (filters/labels). Thatâs why itâs showing âmanage sensitive mail settingsâ and âread/compose/sendâ.
What you should do (based on your âread-onlyâ goal)
If you only want read-only email access: click Cancel for now.
OpenClawâs supported Gmail integration for âsafe-ish / read-onlyâ is the Pub/Sub watch â summarize flow (new mail notifications), not giving an agent broad Gmail API scopes that can send mail.
Two paths you can choose
Path A (recommended, read-only-ish): ânotify + summarize new emailsâ
This uses the Gmail Pub/Sub hook. It still needs Google Cloud + Gmail watch setup, but you donât hand the agent an easy âsend emailâ tool. Itâs closer to read-only.
Docs: https://docs.openclaw.ai/automation/gmail-pubsub
Path B (full Gmail access via gog)
If you click Continue, youâre granting permissions that can read and send and touch some settings. You can mitigate with approvals (only approve read commands), but itâs not a hard read-only guarantee.
Quick question so I donât steer you wrong
Do you want:
- Read-only notifications/summaries (âtell me whatâs new, no sendingâ), or
- Interactive inbox search + drafting (and you accept that it could send if approved)?
Reply â1â or â2â and Iâll give you the exact next steps.
Cool â then you want the Gmail Pub/Sub ânew mail â summaryâ setup (notify/summarize), not interactive âsearch inbox / draft / sendâ.
One important reality check though: the Pub/Sub flow still needs Google OAuth (via gog) to create/renew the Gmail watch, and Google may show broad-sounding scopes. If you want true âcannot send from my real inboxâ, the safest pattern is to use a separate Gmail account for OpenClaw and forward/copy mail into it.
Recommended âread-only-ishâ safest setup
A) (Best) Use a dedicated Gmail account
- Create
mybot.email@gmail.com(or similar). - In your real Gmail, set up forwarding (or a filter) to forward/copy the emails you want summarized to that bot mailbox.
- Set up OpenClaw on the bot mailbox, not your primary email.
This way, even if OAuth scopes include âsendâ, the worst-case is âsend from the bot mailboxâ, not your real one.
Next steps (now)
1) Finish gog auth (required)
You do need gog tokens for whichever Gmail account youâre using (ideally the bot account).
- If the consent screen is up right now, you can continue only if youâre OK with it.
- After you finish, this should no longer say âNo tokens storedâ:
gog auth list
2) Run the OpenClaw Gmail Pub/Sub setup
Use your GCP project ID (string, not the number):
openclaw webhooks gmail setup --account you@gmail.com --project your-project-id
If you want to reduce what gets sent into OpenClaw, you can avoid including bodies (recommended for privacy). The helper supports flags like --include-body / --max-bytes (see the CLI help if needed):
openclaw webhooks gmail setup --account you@gmail.com --project your-project-id --include-body false
3) Verify itâs running
After setup, the Gateway should run the watcher and post summaries when new mail arrives.
If you paste:
gog auth list
gcloud config get-value project
Iâll tell you exactly whether youâre past the auth step and ready to rerun openclaw webhooks gmail setup.
You canât âuncheckâ those in that flow.
On Googleâs OAuth consent screen, that list is just a summary of scopes the app is requesting. If you click Continue, youâre granting all of them to gog (and anything using that token). If you donât grant them, the login/auth wonât complete (so gog auth list will stay âNo tokens storedâ).
If youâre not comfortable granting âread/compose/send/settingsâ on your main inbox, the safer pattern for your â1) summaries onlyâ goal is:
- use a separate Gmail account for OpenClaw, and forward/copy the emails you want summarized into it, or
- proceed anyway, but understand itâs not truly read-only at the OAuth level (you can still keep OpenClaw from using send by not enabling workflows/tools that send, but the token itself is capable).
You can also revoke later anytime here:
https://myaccount.google.com/permissions
Thatâs not an OpenClaw bug â itâs Tailscale telling you Funnel is disabled for your tailnet, so OpenClaw canât create the public HTTPS endpoint that Gmail Pub/Sub needs.
What happened
openclaw webhooks gmail setup tries to run something like:
tailscale funnel --bg --set-path /gmail-pubsub --yes 8788
and Tailscale replies:
Funnel is not enabled on your tailnet.
Fix option A (supported / easiest): enable Funnel
- Open the exact URL Tailscale printed (log in with the same account you used in the Tailscale app):
https://login.tailscale.com/f/funnel?node=...
- In the Tailscale admin UI, enable Funnel for that node / tailnet (you may also need to enable HTTPS if it asks).
- Then retry:
openclaw webhooks gmail setup --account you@gmail.com --project <PROJECT_ID>
If this is a work/org tailnet and youâre not an admin, you may not be allowed to enable Funnel â youâd need the tailnet admin to do it.
Fix option B (no Funnel): use your own public tunnel (DIY/unsupported)
If you canât/wonât enable Funnel, you need some other public HTTPS URL (ngrok / cloudflared / a VPS), then tell OpenClaw to not use Tailscale for the push endpoint. The docs mention this explicitly:
- https://docs.openclaw.ai/automation/gmail-pubsub (look for
--push-endpoint/--tailscale off)
About the âclient version != tailscaled server versionâ warning
That mismatch warning is usually harmless; the blocking issue here is Funnel being disabled.
If you tell me whether you control the Tailscale admin for the tailnet (yes/no), Iâll tell you which option is realistic.
Enabling HTTPS is safe (it just means Tailscale will serve things over TLS instead of plain HTTP).
Enabling Funnel is the one to think about: Funnel makes a service on your machine reachable from the public internet (still via a hard-to-guess URL, but itâs public). So it can be safe if you keep the exposed service locked down.
For your OpenClaw Gmail setup, it can be safe if you do these:
- Only expose the Gmail push handler, not your whole OpenClaw dashboard.
- The helper uses a path like
/gmail-pubsuband a token.
- The helper uses a path like
- Make sure your OpenClaw hooks are protected:
hooks.tokenshould be set (the wizard does this).
- Donât expose your main Gateway UI/WS via Funnel unless you really mean to.
- Keep
gateway.bindon loopback. - Avoid funneling port
18789(gateway) publicly.
- Keep
Why OpenClaw wants Funnel here
Gmail Pub/Sub push needs Google to hit a public HTTPS endpoint. Funnel is just the supported âeasy buttonâ way to do that without running a VPS or ngrok.
If you want maximum safety
- Use a dedicated Gmail account for the bot (you already chose summaries-only).
- Keep the hook endpoint tokenized.
- After setup, you can confirm whatâs being exposed with:
tailscale serve status tailscale funnel status
If you paste your openclaw webhooks gmail setup ... command (with account redacted) and your hooks config section, I can sanity-check that youâre only exposing the narrow /gmail-pubsub handler and not the whole gateway.
Hereâs whatâs going on, step by step, in plain English.
What âHTTPSâ means (safe)
HTTPS = encryption. It means data sent to your Mac is encrypted in transit (so other people on the internet/WiâFi canât read it). Enabling HTTPS is normal and good.
What âFunnelâ means (the one to think about)
Funnel = public internet access. It creates a public https://... URL that forwards traffic from the internet to a port on your Mac.
For Gmail Pub/Sub, you need a public HTTPS URL because Google has to call your machine.
So the goal is:
- Funnel exposes ONLY the Gmail push handler (port 8788, path /gmail-pubsub)
- Your OpenClaw dashboard (port 18789) stays private (localhost only)
Step-by-step: make this safe + get Gmail working
Step 1) Open the Funnel enable page
Open the exact URL Tailscale printed:
https://login.tailscale.com/f/funnel?node=...
Log in with the same account you used in the Tailscale app.
Step 2) Enable Funnel + HTTPS (only for this node)
On that page, enable Funnel for your Mac/node.
If it asks to enable HTTPS, do it.
Step 3) Re-run the OpenClaw Gmail setup
Run (with your real project ID, not the number):
openclaw webhooks gmail setup --account you@gmail.com --project your-project-id
Step 4) Verify what you exposed (important safety check)
Run:
tailscale funnel status
You want to see something that indicates itâs exposing 8788 and /gmail-pubsub.
You do not want to see your OpenClaw gateway port (18789) being funneled.
Step 5) Confirm OpenClaw dashboard is still local-only
OpenClaw dashboard should still be at:
http://127.0.0.1:18789/(on your Mac)
If you tell me what tailscale funnel status shows after enabling Funnel, Iâll sanity-check that youâre only exposing the Gmail handler and not your whole gateway.
~ % tailscale funnel status
No serve config
âNo serve configâ is actually a good sign: it just means you are not currently exposing anything via Tailscale Serve/Funnel yet.
For the Gmail Pub/Sub setup, OpenClaw will create that config for you (it sets up Funnel to expose the Gmail push handler). Hereâs what to do next:
1) Confirm Funnel is enabled for your tailnet/node
Open the link Tailscale printed earlier (the /f/funnel?node=... URL) and make sure Funnel is enabled.
If itâs not enabled, openclaw webhooks gmail setup will fail again with âFunnel is not enabled on your tailnetâ.
2) Make sure youâre connected
tailscale status
3) Make sure gog is authenticated (you previously had âNo tokens storedâ)
gog auth list
If it still says no tokens, you need to complete the gog OAuth login first (otherwise the Gmail watch canât be created).
4) Re-run the OpenClaw setup (this should create the Funnel config)
openclaw webhooks gmail setup --account you@gmail.com --project <YOUR_PROJECT_ID>
5) Verify itâs now exposed
After the setup succeeds:
tailscale funnel status
Now you should see a mapping (port/path), not âNo serve configâ.
If step (4) still errors, paste the exact error output from openclaw webhooks gmail setup ... and also the output of gog auth list.
gog auth list = No tokens stored
How do I enter my google token?
You donât paste a âGoogle tokenâ manually for gog. gog gets its own token by running a normal Google OAuth login in your browser â but first it needs an OAuth client secret JSON file.
Do this step-by-step:
1) Download a Google OAuth client_secret.json
In Google Cloud Console (pick the same project youâre using for Pub/Sub):
- Go to APIs & Services â Credentials
- Click Create Credentials â OAuth client ID
- If it asks, configure consent screen (External is fine for personal use)
- Application type: Desktop app
- Create â then Download JSON
Youâll get a file like client_secret_XXXX.json (usually in ~/Downloads).
2) Point gog at that JSON file
In Terminal:
gog auth credentials ~/Downloads/client_secret_*.json
(If the filename is different, drag the JSON file into Terminal to paste the exact path.)
3) Run the OAuth login (this is where tokens get created)
gog auth add you@gmail.com --services gmail
This opens a browser window. After you click Continue/Allow, gog stores tokens locally.
4) Confirm it worked
gog auth list
Once this shows your account, you can go back to:
openclaw webhooks gmail setup --account you@gmail.com --project your-project-id
If you donât have the JSON file yet
Check:
ls ~/Downloads | rg -i "client_secret|credentials|oauth"
If you paste the output of that ls (or tell me the exact filename you downloaded), Iâll give you the exact gog auth credentials ... command to run.
That error usually happens for one of these reasons:
- you typed a truncated path with
...(ellipsis isnât real), or - the file simply isnât in Downloads (or has a different name, like
client_secret_123.json (1)).
Do this:
1) Find the real filename in Downloads
Run:
ls -1 ~/Downloads | grep -i secret
ls -1 ~/Downloads | grep -i oauth
ls -1 ~/Downloads | grep -i json
Or more direct:
find ~/Downloads -maxdepth 1 -iname "*client*secret*.json" -print
2) Use the exact path (no ...)
Once you see the exact filename, run gog with it, e.g.:
gog auth credentials "/Users/sorenlv/Downloads/client_secret_XXXX.json"
Tip: you can type:
gog auth credentials ~/Downloads/
then press Tab to autocomplete, or just drag the JSON file from Finder into the Terminal window to paste the full path.
3) If you donât find any client_secret JSON at all
Then you still need to download it from Google Cloud Console:
APIs & Services â Credentials â create OAuth client ID (Desktop app) â Download JSON.
After that:
gog auth credentials ~/Downloads/client_secret*.json
gog auth add you@gmail.com --services gmail
gog auth list
Paste the output of:
ls -1 ~/Downloads | head -50
and Iâll point out exactly which file to use.
Error: No auth for gmail
Nice â that means gog auth credentials ... worked (it registered the client secret; âclient defaultâ is expected).
Next steps:
1) Actually sign in (this creates the tokens)
gog auth add you@gmail.com --services gmail
This will open a browser login/consent flow. Complete it.
2) Confirm tokens are stored
gog auth list
You should now see your account (not âNo tokens storedâ).
3) Run the OpenClaw Gmail Pub/Sub setup
Make sure you use your PROJECT_ID (string, not the number):
openclaw webhooks gmail setup --account you@gmail.com --project <PROJECT_ID>
If you donât know your PROJECT_ID:
gcloud projects list
After openclaw webhooks gmail setup succeeds, run:
tailscale funnel status
and it should no longer say âNo serve configâ (because the setup will configure Funnel for /gmail-pubsub).
That error means gog still doesnât have Gmail OAuth tokens for your account. (gog auth credentials ⊠only registers the OAuth client; it does not log you in.)
Do this:
1) Log gog into Gmail (this is the missing step)
gog auth add you@gmail.com --services gmail
A browser window will open. You must finish the Google login/consent flow so tokens get stored.
2) Verify tokens exist
gog auth list
You should now see your account listed (not âNo tokens storedâ).
3) Quick test (optional but useful)
gog gmail search "newer_than:1d" --max 3 --account you@gmail.com
4) Re-run the OpenClaw Gmail setup
openclaw webhooks gmail setup --account you@gmail.com --project <PROJECT_ID>
If step (1) opens the consent screen again and you hit âCancelâ, youâll keep getting âNo auth for gmailâ (because no token gets saved).
when I type in gog auth list I get a pop up saying "gog wants to use your confidential information stored in "" in your keychain. The authenticity of "gog" cannot be verified. To allow this, enter the "login" keychain password." - Always Allow - Deny - Allow
Thatâs a normal macOS Keychain prompt.
What it means:
gogstores its OAuth tokens in your Login keychain.- macOS is asking if the
gogapp/CLI is allowed to read them.
Which button to pick
- If this is your machine and you trust
gog(installed via the official brew formula), choose Always Allow.
Otherwise youâll keep getting prompted, and background stuff (like the Gmail watcher) can break. - If youâre unsure, choose Allow (one-time) and see if it works.
âlogin keychain passwordâ = what?
Itâs the password you use to log into your Mac user account (same one you used for sudo earlier), not your Apple ID.
After you allow it, rerun:
gog auth list
when I type "openclaw models list --all --provider openai-codex"
I get the following list:
đŠ OpenClaw 2026.2.3-1
Model Input Ctx Local Auth Tags
openai-codex/gpt-5.1 text+image 266k no yes
openai-codex/gpt-5.1-codex-max text+image 266k no yes
openai-codex/gpt-5.1-codex-mini text+image 266k no yes
openai-codex/gpt-5.2 text+image 266k no yes configured,alias:gpt
openai-codex/gpt-5.2-codex text+image 266k no yes configured,alias:codex
How do I know which one of those models are OpenAi's GPT-5.1 Instant?
âGPTâ5.1 Instantâ is a marketing/UI label, not necessarily the exact model id OpenClaw shows.
In your Codex provider list, the closest mapping is usually:
openai-codex/gpt-5.1â the general GPTâ5.1 model (this is the one most likely to correspond to âInstantâ)openai-codex/gpt-5.1-codex-miniâ a smaller/faster codingâtuned variant (could also feel âinstantâ, but itâs a different thing: codex mini, not âinstantâ)openai-codex/gpt-5.1-codex-maxâ larger/heavier coding variant (least âinstantâ)
How to be sure on your account: compare behavior/latency.
Quick way:
- temporarily switch in chat:
/model openai-codex/gpt-5.1/model openai-codex/gpt-5.1-codex-mini
- ask the same short prompt (like âsummarize this in 1 sentence: âŠâ) and see which responds faster / matches what OpenAI calls âInstantâ in their UI.
If you want, paste a screenshot/text of where OpenAI shows âGPTâ5.1 Instantâ (which product/app), because the naming differs between ChatGPT UI vs Codex vs API.
Krill, with TailScale am I able to connect to the openclaw dashboard on my other device if I am on a different wifi network?
Yes â thatâs one of the main reasons to use Tailscale.
If both devices are logged into the same Tailnet, you can reach your OpenClaw dashboard from anywhere (different WiâFi, cellular, etc.) without opening router ports.
You have two common ways to do it:
Option A (recommended): Tailscale Serve (HTTPS, tailnetâonly)
This keeps OpenClaw bound to localhost and Tailscale exposes it privately.
- Make sure OpenClaw is running on your Mac.
- Enable Serve from the Mac (or via OpenClaw if you already configured it):
openclaw gateway --tailscale serve
- On your other device (also on Tailscale), open:
https://<your-mac-magicdns-name>/
This is tailnet-only (not public internet).
Option B: Connect directly to the Macâs Tailscale IP (HTTP)
Find the Macâs Tailscale IP:
tailscale status
Look for something like 100.x.y.z, then from the other device open:
http://100.x.y.z:18789/
Auth note
Depending on your gateway.auth settings, you may need the gateway token (or if Serve + gateway.auth.allowTailscale is enabled, identity headers can satisfy auth automatically).
If you tell me what gateway.bind is set to (or paste openclaw status), I can tell you which URL will work in your setup.
well I have tailscale installed on this imac give me the steps to install it on my other mac that will connect to this one
Install Tailscale on the other Mac, log into the same Tailnet, then use Serve (or the Tailscale IP) to open the OpenClaw dashboard.
1) Install Tailscale on the other Mac
Homebrew (easy):
brew install --cask tailscale
or download the app:
https://tailscale.com/download/mac
2) Open Tailscale + log in
open -a Tailscale
In the app:
- Log in
- Connect
macOS may ask to allow a network/system extension â Allow / Install Now.
3) Verify both Macs are on the same tailnet
On the other Mac:
tailscale status
You should see both devices listed.
4) Expose the OpenClaw dashboard from the iMac (best: Serve)
On the iMac (where OpenClaw runs):
openclaw gateway --tailscale serve
5) Open the dashboard from the other Mac
On the other Mac, open in a browser:
https://<iMac-MagicDNS-name>/
You can find the MagicDNS name in tailscale status (itâll look like imac-name.tailnet-xxxx.ts.net).
If Serve isnât set up
You can also use the iMacâs Tailscale IP (from tailscale status), and open:
http://100.x.y.z:18789/
If you paste the output of tailscale status from the iMac (just the device lines), Iâll tell you the exact URL to open on the other Mac.
que es esto @brisk arrow Health check failed: gateway closed (1006 abnormal closure (no close frame)): no close reason
Eso es un mensaje de diagnĂłstico de OpenClaw: el health check intentĂł hablar con el Gateway (por WebSocket) y la conexiĂłn se cerrĂł de forma inesperada.
1006 abnormal closure= el socket se cortĂł sin âclose frameâ (tĂpico cuando el proceso del gateway se reinicia/crashea, la mĂĄquina se duerme, o hay un corte de red).
Para ver por qué pasó, lo que mås ayuda es:
- Estado general
openclaw status
- Estado del servicio del gateway
openclaw gateway status
- Logs en vivo (aquĂ suele salir la causa real)
openclaw logs --follow
- Si estĂĄ caĂdo o colgado, prueba:
openclaw gateway restart
Si puedes, pega aquĂ la salida de:
openclaw --version
openclaw status --all
(status --all suele ser âsafe to shareâ y trae un log tail Ăștil).
Hey Krill, what is this second brain mission control that I see people post about on social media. If creates a hiearchy of multiple agents that collaborate and work with each other and gives the user a window to look into what the agents are talking and colaborating about. They have a round table and a water color and there is an animation that shows what they are doing.