- v0.2.23 — 2026-05-15
- v0.2.22 — 2026-05-15
- v0.2.21 — 2026-05-15
- v0.2.20 — 2026-05-14
- v0.2.19 — 2026-05-14
- v0.2.18 — 2026-05-14
- v0.2.17 — 2026-05-14
- v0.2.16 — 2026-05-14
- v0.2.15 — 2026-05-14
- v0.2.14 — 2026-05-14
- v0.2.13 — 2026-05-14
- v0.2.12 — 2026-05-14
- v0.2.11 — 2026-05-14
- v0.2.10 — 2026-05-14
- v0.2.9 — 2026-05-14
- v0.2.8 — 2026-05-14
- v0.2.7 — 2026-05-14
- v0.2.6 — 2026-05-14
- v0.2.5 — 2026-05-14
- v0.2.4 — 2026-04-25
- v0.2.3 — 2026-04-25
- v0.2.2 — 2026-04-25
- v0.2.1 — 2026-04-25
- v0.2.0 — 2026-04-25
- v0.1.9 — 2025-07-xx
- v0.1.8 — 2025-07-xx
- v0.1.7
After v0.2.22 auto-picked qwen2.5:3b-instruct (the lightest tool-capable model), the Discord bot responded fast but stopped following direct user commands:
user: @openclaw bootstrap 끝났으니 BOOTSTRAP.md 지워줘
bot: Understood, the BOOTSTRAP.md file has been read and the workspace is now ready to proceed.
Let's start by creating or updating our IDENTITY.md. We can then move on with any other bootstrap steps.
Would you like me to create a new IDENTITY.md file or update an existing one?
… (file is NOT deleted; bot loops back into onboarding chat)
This is case G — a separate failure mode from cases A–F. The bot is fast, tool-call format is correct, the watchdog doesn't fire — the model just can't decide to call a tool in response to an unambiguous user instruction. 3B-class models are weak at the multi-step reasoning chain "user said delete → I have a delete tool → I should call it" and instead fall back to conversational politeness.
1) Recommend gemma4:latest over qwen2.5:3b-instruct on 24GB+ RAM machines
gemma4:latest benchmarks on this MacBook Pro:
$ time curl -s http://127.0.0.1:11434/api/chat \
-d '{"model":"gemma4:latest","messages":[{"role":"user","content":"hi"}],"stream":false}'
{"model":"gemma4:latest","message":{"role":"assistant","content":"Hello! How can I help you today? 😊"}…
real 0m7.18s ← cold load
$ time curl -s … (second call)
real 0m0.27s ← warm
7.2s cold / 0.27s warm — well under the 120s idle watchdog. Plus vision + audio + thinking + tools capabilities native. Instruction-following is in a different league from 3B models on direct commands.
qwen2.5:3b-instruct is still recommended on 8GB–16GB machines where the 8.9GB cost of gemma4:latest is too much, with the explicit caveat that direct commands ("delete X", "fill in Y") may need rephrasing as a request.
2) New env var OPENCLAW_FORCE_DEFAULT_MODEL — pin the user's choice
./openclaw setup v0.2.22 auto-resorted by size. If a user explicitly moved gemma4:latest to models[0], the next setup run would silently overwrite it back to qwen2.5:3b-instruct. Fixed by giving optimize_default_ollama_model() a three-tier policy:
| Priority | Condition | Action |
|---|---|---|
| 1 | $OPENCLAW_FORCE_DEFAULT_MODEL is set and that model is registered |
Force it to models[0]. Skip auto-sort entirely. |
| 2 | Current models[0] is tools-capable |
Leave it alone. Respect user's explicit choice. |
| 3 | Current models[0] is NOT tools-capable (e.g., embedding-only, tinyllama) |
Swap to the smallest tools-capable model. |
For the live user's setup, added to openclaw-mgr/.env:
# === Locked default model (added 2026-05-15) ===
OPENCLAW_FORCE_DEFAULT_MODEL="gemma4:latest"openclaw-mgr/cmd/setup.sh:optimize_default_ollama_model()now takes a forced-model arg from$OPENCLAW_FORCE_DEFAULT_MODEL- Replaced "always sort by size" with the three-tier policy above
- Refactored repeated
compat.supportsToolsstamping intostamp_compat()helper - Added new outcome codes:
OPT_OK_FORCED,OPT_OK_FORCED_ALREADY,OPT_WARN_FORCED_NO_TOOLS,OPT_SKIP_FORCED_NOT_REGISTERED,OPT_OK_RESPECT_USER_CHOICE
openclaw-mgr/.env.example: documentedOPENCLAW_FORCE_DEFAULT_MODELwith a recommended-values tabledocs/GUIDE-DISCORD-BOT.md: case D RAM table updated (gemma4:latestis new 24GB+ default), new "default 모델을 영구 lock 하기" subsectiondocs/GUIDE-DAILY-USE.md: case D row updated; new row for case G (instruction-following regression on 3B models)openclaw-mgr/openclaw/openclaw-mgr/openclaw.ps1: VERSION → 0.2.23
The model wouldn't delete ~/.openclaw/workspace/BOOTSTRAP.md even when asked, so it was deleted directly on the host. Because the workspace dir is bind-mounted from ~/.openclaw/workspace/ into /home/node/.openclaw/workspace/, rm on the host is immediately visible to OpenClaw without restart. This pattern (host-side cleanup of onboarding artifacts) deserves its own subsection in a future docs update.
$ ./openclaw setup status
…
✓ default 모델: gemma4:latest ($OPENCLAW_FORCE_DEFAULT_MODEL 로 lock — 이미 정확)
$ docker logs openclaw-openclaw-gateway-1 | grep 'agent model'
[gateway] agent model: ollama/gemma4:latest
$ docker logs openclaw-openclaw-gateway-1 | grep 'logged in to discord'
[discord] logged in to discord as 1477667959601369139 (openclaw)
- Upstream PR for
OPENCLAW_HOST_PATH_PREFIX(v0.2.20 — would let sandbox.mode go back tonon-main) ./openclaw chat --warm-defaultflag (v0.2.22)- (new)
./openclaw cleanup-bootstrapcommand that safely deletesBOOTSTRAP.mdfrom the workspace and prints a confirmation — automate the host-side cleanup pattern this version introduced
Discord case D regression: llama3.1:8b-instruct-q4_K_M is still too heavy → auto-pick the lightest tool-capable model
After v0.2.21 swapped gemma4:26b (17GB, 55s cold-load) → llama3.1:8b-instruct-q4_K_M (4.6GB), the Discord bot still hit the 2-minute idle watchdog repeatedly:
[agent/embedded] Profile ollama:default timed out. Trying next account...
[llm-idle-timeout] ollama/llama3.1:8b-instruct-q4_K_M produced no reply before the idle watchdog
[agent/embedded] embedded run failover decision: stage=assistant decision=surface_error reason=timeout
A second symptom appeared and was briefly misdiagnosed as a separate bug ("case F"): instead of the generic "Something went wrong" reply, the bot would emit a literal incomplete tool-call JSON to the user channel:
{"name": "read", "parameters": {"path":"/home/node/.openclaw/workspace/IDENTITY.md"}}
Root cause is the same as case D: the model starts building a tool-call object, the watchdog cuts the lane mid-generation, and OpenClaw's tool-call parser sees an incomplete {...} object and falls back to emitting it as plain text. Confirmed by switching to a faster model — the JSON-bleed disappears entirely because the model now completes the tool call inside the watchdog window.
The Discord bot's first message processing isn't just "load model + reply"; it's:
- Load model into RAM (cold) — 30~55s for an 8B q4 model
- Process system prompt (workspace bootstrap chain: BOOTSTRAP.md, IDENTITY.md, SOUL.md, USER.md, AGENTS.md, HEARTBEAT.md, TOOLS.md = 7 files)
- Process tool schema definitions (gateway exposes dozens of tools)
- Generate the first response token
- Generate enough output for OpenClaw to parse a tool call
Steps 1–3 alone can already approach 2 minutes on q4 8B + 24GB RAM with other apps running. Step 4–5 push it over the watchdog deadline.
$ time curl -s -X POST http://127.0.0.1:11434/api/chat \
-H 'Content-Type: application/json' \
-d '{"model":"qwen2.5:3b-instruct","messages":[{"role":"user","content":"hi"}],"stream":false}' \
| head -c 100
{"model":"qwen2.5:3b-instruct","message":{"role":"assistant","content":"Hello! How can I help you today?"...
real 0m1.67s1.67 seconds end-to-end, including a warm load. The full Discord onboard conversation (IDENTITY/SOUL setup) now completes in ~3–5 seconds per message instead of timing out.
qwen2.5:3b-instruct is the new recommended default because:
- 1.8GB — comfortable on 8GB MacBooks, no contention with other apps on 24GB
"tools"capability declared in Ollama's/api/show(verified byOPENCLAW'ssupportsToolsMetacheck atdist/scan-jROPTmBi.js)- Cold load ~3s, warm load ~1.6s — both well under the 120s watchdog
- Multilingual (KO/EN strong), suitable for daily Discord commands
- Heavy work (sajupul-ee, coding, vision) can still target
gemma4:26b/qwen2.5-coder:14bvia explicit@openclaw use <model> …syntax
New function optimize_default_ollama_model() runs immediately after prune_bogus_ollama_models() during ./openclaw setup. It:
- Queries
/api/showfor every registered model to getcapabilities+size - Filters to models declaring
"tools"capability - Sorts by file size ascending
- Moves the smallest tool-capable model to
models[0](which OpenClaw uses as default) - Sets
compat.supportsTools = trueon every tool-capable entry (defensive, in case future OpenClaw versions check this field strictly)
$ ./openclaw setup --skip-confirm
…
✓ 설정 정리: openclaw.json 에서 실제 설치되지 않은 모델 항목 제거
✓ default 모델 자동 최적화: llama3.1:8b-instruct-q4_K_M (4.6GB) → qwen2.5:3b-instruct (1.8GB)
Why: 24GB RAM 노트북에선 첫 응답 ≤2분 안에 들어와야 OpenClaw 의 idle watchdog 가 안 자름.
무거운 모델은 그대로 등록돼 있으니 @openclaw use llama3.1:8b-instruct-q4_K_M 처럼 명시 호출 가능.If Ollama is unreachable, no tools-capable model is installed, or only one model is registered, the function emits a silent skip code and leaves the config untouched.
docs/GUIDE-DISCORD-BOT.mdcase D section: rewritten with the new RAM-to-model table (8GB/16GB/24GB/32GB+), explicit "why qwen2.5:3b" callout, and the v0.2.22 one-command fix (./openclaw setup --skip-confirm)docs/GUIDE-DAILY-USE.mdtroubleshooting matrix: case D row updated with new default; new row added explaining the JSON-bleed symptom (formerly "case F") as a D-byproduct, not a separate bugCHANGELOG(this file)
openclaw-mgr/cmd/setup.sh— addedoptimize_default_ollama_model()(~75 LOC python heredoc) + invocation block (~20 LOC)openclaw-mgr/openclaw—VERSION="0.2.22"openclaw-mgr/openclaw.ps1—$Version = '0.2.22'docs/GUIDE-DISCORD-BOT.md,docs/GUIDE-DAILY-USE.md,CHANGELOG.md
[gateway] agent model: ollama/qwen2.5:3b-instruct
[gateway] ready (7 plugins: acpx, bonjour, browser, device-pair, discord, phone-control, talk-voice; 5.8s)
[discord] logged in to discord as 1477667959601369139 (openclaw)
# Discord screenshot — bot responds in ~5s with full coherent BOOTSTRAP onboarding flow:
# > Hello, 묘냥. I've read the instructions in BOOTSTRAP.md...
# > Your name: ... Your nature: ... Your vibe: ... Your emoji: ...
# > Here's an example of what IDENTITY.md could look like: ```...```
- Upstream PR for
OPENCLAW_HOST_PATH_PREFIX(would let sandbox.mode go back fromoff→non-mainand restore defense-in-depth — see v0.2.20) - Add a
./openclaw chatflag--warm-defaultthat auto-pings the default model before opening the prompt (mirrors whatsetup.shpost-hook now does) - Document the watchdog timeout knob (if any exists in
openclaw.json) as a workaround for users on >32GB RAM who want to keep a heavier default
Even after v0.2.20 disabled the sub-container sandbox, the Discord bot still replied with the generic Something went wrong while processing your request. Please try again, or use /new to start a fresh session. to every message. Log inspection surfaced two distinct, independent failures:
[agent] agent/embedded Profile ollama:default timed out
[llm] llm-idle-timeout: ollama/gemma4:26b produced no reply before the idle watchdog
The first message picks whichever model is at index [0] of models.providers.ollama.models[] in ~/.openclaw/openclaw.json. ./openclaw setup (and OpenClaw's onboard) had been seeding gemma4:26b (17GB) at the front. On a 24GB MacBook Pro, the first call to that model loads weights for ~55s. OpenClaw's per-channel idle watchdog cuts the lane long before Ollama returns — the bot has no result to send, falls back to the generic apology, and the next message hits the same wall (model has to load again because the lane is fresh).
Fix — reorder the config array so the lightest viable model is first, plus warm it up
python3 -c '
import json
p = "/Users/mo/.openclaw/openclaw.json"
cfg = json.load(open(p))
m = cfg["models"]["providers"]["ollama"]["models"]
pref = "llama3.1:8b-instruct-q4_K_M" # 4.9GB, second-call load ~2.6s
cfg["models"]["providers"]["ollama"]["models"] = (
[x for x in m if x["id"] == pref] + [x for x in m if x["id"] != pref]
)
json.dump(cfg, open(p, "w"), indent=2)
'
# warm it once so the first Discord message doesn't pay the cold-load tax
curl -s -X POST http://127.0.0.1:11434/api/generate \
-H 'Content-Type: application/json' \
-d '{"model":"llama3.1:8b-instruct-q4_K_M","prompt":"hi","stream":false}' >/dev/null
cd ~/DEV/openclawAgent/openclaw-workspace/openclaw-mgr
./openclaw stop && ./openclaw startHeavier models (e.g. gemma4:26b, qwen2.5-coder:14b) are still usable, but only after the lighter default has been picked up and Ollama is warm. RAM guidance table added to docs/GUIDE-DISCORD-BOT.md case D.
[discord] channel exited: Cannot find module
'/home/node/.openclaw/plugin-runtime-deps/openclaw-unknown-a1b2c3d4/node_modules/@openclaw/plugin-sdk/dist/text-runtime.js'
[discord] channel exited: ENOENT: no such file or directory, open
'.../plugin-runtime-deps/openclaw-unknown-.../node_modules/@openclaw/account-core/dist/index.js'
OpenClaw's plugin loader tries to read its own version (process.env.OPENCLAW_VERSION or package.json#version), hashes that to a deps dir name, and bundle-installs ~26 runtime deps on first boot. In our containerized run on macOS, the version sometimes comes back empty — the loader falls back to a hash-based identifier openclaw-unknown-<hash>. That itself is fine. What broke was that a previous host-paths experiment (v0.2.20 unshipped overlay) had partially populated the deps directory and then died mid-install, leaving the bundle directory with directory entries but missing text-runtime.js, account-core.js, and a handful of other files. Subsequent boots saw the dir already exists, skipped reinstall, and crashed the Discord channel on first tool call.
Fix — purge the deps directory; OpenClaw reinstalls on next boot
trash ~/.openclaw/plugin-runtime-deps 2>/dev/null || rm -rf ~/.openclaw/plugin-runtime-deps
cd ~/DEV/openclawAgent/openclaw-workspace/openclaw-mgr
./openclaw stop && ./openclaw start
# verify — should see all 26 deps installed and bot logged in:
./openclaw logs | grep -iE 'installed bundled runtime deps|logged in to discord'
# [discord] installed bundled runtime deps in 3421ms: @buape/carbon, @discordjs/voice, …
# [discord] logged in to discord as 1477667959601369139 (openclaw)$ ./openclaw logs --tail 50 | grep -iE 'ready|logged in|channel exited'
[gateway] ready (6 plugins: bonjour, browser, device-pair, discord, phone-control, talk-voice)
[discord] logged in to discord as 1477667959601369139 (openclaw)
(no `channel exited` lines)
Discord bot responds to @openclaw 안녕 with a coherent reply in ~3 seconds. 🎉
docs/GUIDE-DISCORD-BOT.mdtroubleshooting expanded from 3 cases (A/B/C) to 5 (A/B/C/D/E), with full diagnosis + fix scripts and an RAM-to-model recommendation table.docs/GUIDE-DAILY-USE.mdtroubleshooting matrix gained two corresponding rows that link back to the Discord guide.- No code changes in this version — every fix is a config tweak the user applies manually.
setup.sh/install.shpatches to automate D + E are tracked as TODO (auto-pick lightest model as default, periodically prune staleopenclaw-unknown-*deps).
- Upstream PR for
OPENCLAW_HOST_PATH_PREFIXenv var to translate container paths to host paths — would let case C be solved properly and re-enablesandbox.mode = "non-main". - Auto-rank Ollama models by parameter count / file size in
cmd/setup.shso the lightest one is always at index[0].
After v0.2.19 fixed the docker.sock permission, a third variant surfaced:
[diagnostic] lane task error: lane=session:agent:main:discord:channel:<id>
error="Error response from daemon: mounts denied:
The path /home/node/.openclaw/sandboxes/agent-main-f331f052 is not
shared from the host and is not known to Docker."
Root cause (OpenClaw upstream limitation)
OpenClaw's appendWorkspaceMountArgs builds -v ${hostPath}:${containerPath} for the new sandbox sub-container, where hostPath is set to workspaceDir — which is whatever the running gateway sees in OPENCLAW_WORKSPACE_DIR (/home/node/.openclaw/workspace). That's a container-internal path. The Docker daemon runs on the host (or Docker Desktop's LinuxKit VM) and tries to find /home/node/.openclaw/... on the host filesystem — which doesn't exist. There is no env var or CLI flag in OpenClaw that exposes the actual host-side path:
grep -hroE 'process\.env\.[A-Z_]+(HOST|HOSTPATH)[A-Z_]*' /app/dist | sort -u
# (no OPENCLAW_HOST_* matches)The resolveSandboxHostPathViaExistingAncestor function only normalizes an already-host path; it doesn't translate from container space.
Experiment that didn't ship: openclaw-mgr/compose.host-paths.yml — an overlay that mounts $HOME/.openclaw and $HOME/DEV/openclawAgent at the same paths inside the container and overrides HOME, OPENCLAW_HOME, OPENCLAW_CONFIG_DIR, OPENCLAW_WORKSPACE_DIR, etc. to those host paths. In theory this makes OpenClaw's mount sources match real host paths. In practice it triggered an OpenClaw config-loader hang during gateway startup (>2 min in loading configuration… state, eventually unhealthy). Wires in start.sh and install.sh step_lockdown were left commented-out for the next attempt; the overlay file is kept in the tree but unreferenced.
Workaround that did ship — disable the sandbox sub-container layer
Set agents.defaults.sandbox.mode = "off" in ~/.openclaw/openclaw.json (valid values per upstream: off | non-main | all). The gateway then executes agent tool calls directly inside its own container without spawning a sub-sandbox — no docker-in-docker, no host-path translation needed.
The user's gateway came back as ready (7 plugins: ... discord ...) and [discord] logged in to discord as <id> (openclaw) immediately after the restart.
Trade-off (honestly documented)
sandbox: off loses one defense-in-depth layer — the per-tool-call sub-container that restricts workspace access, network, capabilities even further. The gateway container itself still has:
- read-only filesystem
cap_drop: [ALL]- non-root
nodeuser (uid 1000) - isolated network (default
network online --restartpath notwithstanding) - docker.sock access only through
group_addwe control
…so general use is still safe. For workflows that auto-execute untrusted code or open URLs the agent picked, the sub-sandbox is meaningful and mode: off is a real downgrade. Such workflows should wait until the upstream PR (TODO) lands.
openclaw-mgr/compose.host-paths.yml— new overlay file (currently unreferenced; preserved for the next host-path attempt)openclaw-mgr/cmd/start.sh—host_pathsvariable added but commented out with a note explaining the v0.2.20 hangopenclaw-mgr/cmd/install.sh step_lockdown— same commented-out wiring + note- User's
~/.openclaw/openclaw.json—agents.defaults.sandbox.modeset to"off"(manual fix applied during the session; rollback path preserved via timestamped.bak)
GUIDE-DISCORD-BOT.md"Something went wrong" entry now lists all three cases (A no-such-file, B permission-denied, C mounts-denied) with grep one-liner and per-case fix. Case C section includes the upstream-limitation explanation and the trade-off ofmode: off.GUIDE-DAILY-USE.mdtroubleshooting matrix gets the case-C row pointing at the GUIDE-DISCORD-BOT detail.- VERSION 0.2.19 → 0.2.20.
- File a PR against OpenClaw upstream to honor
OPENCLAW_HOST_PATH_PREFIX(or similar) soappendWorkspaceMountArgscan translate container paths back to host paths before calling docker.sock. - Once that ships, re-enable
compose.host-paths.ymland remove themode: offworkaround.
v0.2.17 fixed the docker.sock mount missing. After applying it, the error mutated:
v0.2.16-: Failed to inspect sandbox image: ... no such file or directory
v0.2.17-: Failed to inspect sandbox image: ... permission denied while
trying to connect to the docker API at unix:///var/run/docker.sock
Diagnosis inside the running container:
$ docker exec openclaw-openclaw-gateway-1 sh -c 'ls -la /var/run/docker.sock; id'
srw-rw---- 1 root root 0 May 13 13:55 /var/run/docker.sock
uid=1000(node) gid=1000(node) groups=1000(node),1(daemon)
On the host the socket is root:daemon (GID=1), but inside the container (macOS Docker Desktop) it appears as root:root (GID=0). install.sh step_sandbox was reading the host GID with stat -f '%g', which returns 1, and emitting only group_add: ["1"]. The node user is a member of group 1(daemon) but not group 0(root), so opening the socket from inside the container failed with permission denied.
install.sh step_sandbox(cmd/install.sh): when writingdocker-compose.sandbox.yml, always emitgroup_add: ["0"]first (root, required for macOS Docker Desktop), then the detected host GID if different. Now the container'snodeuser ends up ingroups=1000(node),0(root),1(daemon)and can talk to the socket regardless of platform.- User's existing
~/DEV/openclaw/docker-compose.sandbox.ymlwas patched in place to the same["0","1"]shape. Verified post-restart:docker exec ... docker info --format '{{.ServerVersion}}'returns29.4.0from inside the gateway. Plugins list back to7withdiscord.
- GUIDE-DAILY-USE.md 트러블슈팅 표: new row for the
permission deniedvariant with the manual patch one-liner. - GUIDE-DISCORD-BOT.md troubleshooting: the "Something went wrong" entry now distinguishes case A (
no such file, v0.2.17 fix) vs case B (permission denied, v0.2.19 fix) and shows the immediate patch + verification command.
VERSION 0.2.18 → 0.2.19.
User asked whether "how to turn on Ollama" was documented. It was — but scattered across six files (GUIDE-DAILY-USE Scenario 0 step 2, GUIDE-FIRST-USE troubleshooting row, GUIDE-MANUAL-INSTALL stage 3 table, TROUBLESHOOTING bind: address already in use, README network section, GUIDE-OLLAMA "어떻게 설치되나요?"). No single place compared the three host options or covered the on/off/restart/auto-start cycle end-to-end.
Added a new dedicated section in GUIDE-OLLAMA.md right after "어떻게 설치되나요?":
- Three-way comparison table — A) macOS app (
open -a Ollama), B)brew services start ollama, C) one-shotollama serve &— with columns for auto-restart behavior, menu-bar icon presence, recommended use case. Warning about port-11434 collision when two methods run simultaneously. - 🟢 켜기 — one command per method
- 🔴 끄기 — graceful (
osascript -e 'quit app "Ollama"',brew services stop,pkill -f "ollama serve") and emergency (pkill -9 -f ollama) - 🔄 재시작 — per-method restart one-liners
- ⚙️ 자동 시작 설정 — Login Items GUI path + an
osascriptone-liner that registersOllama.app. Plus the brew-services case which is auto-start by default. - ✅ 동작 확인 —
curl /api/tags,ollama list,ollama ps,lsof -iTCP:11434 - 🐛 자주 막히는 부분 — 6 entries (unsigned-developer warning on first open, bind-in-use, slow-first-request RAM-load,
OLLAMA_MODELSrelocation, containerhost.docker.internalreminder, isolated-mode block)
- GUIDE-DAILY-USE Scenario 0 step 2: callout pointing at the new consolidated section ("켜기/끄기/재시작/자동시작 종합").
- README (KO) 📖 row in Documentation Map: description now mentions "🔌 켜기·끄기·재시작·자동시작 종합 섹션 — 3방식 비교, 자동 시작 등록, 충돌 진단" so users scanning the map see GUIDE-OLLAMA goes beyond "what is Ollama".
VERSION 0.2.17 → 0.2.18. Docs only.
Bug fix — Discord bot replies "Something went wrong" after stop/start (sandbox compose overlay drop)
User's Discord bot was Online but every message got the generic OpenClaw error reply:
⚠️ Something went wrong while processing your request. Please try again, or use/newto start a fresh session.
Gateway logs revealed the actual cause:
[diagnostic] lane task error: lane=session:agent:main:discord:channel:...
error="Error: Failed to inspect sandbox image: failed to connect to the
docker API at unix:///var/run/docker.sock; ... no such file or directory"
The bot processes each message by spinning a sandbox sub-container, which needs /var/run/docker.sock mounted into the gateway container. install.sh step_sandbox generates ~/DEV/openclaw/docker-compose.sandbox.yml (the overlay that mounts the socket) and brings the gateway up with that overlay included — but neither cmd/start.sh nor step_lockdown referenced this overlay afterward. So the first ./openclaw stop && ./openclaw start (or any network online --restart / network isolated --restart) silently dropped the socket mount, and the bot stopped being able to invoke tools.
Symptom: docker inspect openclaw-openclaw-gateway-1 --format '{{range .Mounts}}{{.Source}} {{end}}' shows the workspace and config mounts but no /var/run/docker.sock. Plugins list shrinks from 7 (with discord) back to 6 because the discord channel can't run.
cmd/start.sh— now adds-f $OPENCLAW_DIR/docker-compose.sandbox.ymlto the compose args when that file exists. Same conditional include pattern already used forcompose.security.yml/compose.network.yml. If the overlay doesn't exist (sandbox disabled byOPENCLAW_SANDBOX=0, or never set up) the start path is unchanged.cmd/install.sh step_lockdown— same fix. Without this, the very last step of./openclaw install(the auto-lockdown to isolated) was already dropping the sandbox mount on first install, so the bot worked only between step_sandbox and step_lockdown — invisible to users until they tried Discord.
- GUIDE-DAILY-USE 트러블슈팅 표 — new row for "
Something went wrong while processing your request" with the docker.sock cause and thegit pull → stop → startrecovery. Includes a one-liner to verify the mount. - GUIDE-DISCORD-BOT 트러블슈팅 — new dedicated entry "봇이 응답으로 'Something went wrong...'" with the full diagnosis, log grep one-liner, mount verification, and history of the v0.2.16-and-earlier regression.
After patch + ./openclaw stop && start:
- Gateway healthy
- Mounts now include
/var/run/docker.sock -> /var/run/docker.sock - Plugins line:
ready (7 plugins: acpx, bonjour, browser, device-pair, **discord**, phone-control, talk-voice) discord client initialized as <id> (openclaw); awaiting gateway readiness— connected and ready to process messages.
VERSION 0.2.16 → 0.2.17.
User pointed out the TL;DR section had six host-side commands (start / chat / tui / stop / doctor) but no parallel "what do you actually type in Discord" reference, even though Discord is one of the primary interaction modes.
Added a 💬 Discord 에서 자주 쓰는 프롬프트 block right below the host cheat sheet:
① Bot alive check (@bot 살아있어?)
② Quick question in a channel
③ DM (plain text, no mention)
④ Workspace file write (with concrete path example, mobile-friendly)
⑤ /reset context clear
⑥ /agent model <name> switch
Plus a compact trigger-comparison table (mention / DM / slash / auto-respond channel) with "when to use" and "context length" columns. Closes with a direct link into GUIDE-DISCORD-BOT §12 ⓪ integrated scenario for the full Discord-only day walkthrough.
No code change; docs and CHANGELOG only.
VERSION 0.2.15 → 0.2.16.
v0.2.13 covered "laptop off → on" in GUIDE-DAILY-USE. v0.2.14 covered "from Discord, what do you type in each situation" in GUIDE-DISCORD-BOT §12. Both were thorough, but the user had to manually stitch the two together — there was no single place that showed the actual hour-by-hour flow of laptop off → power on → Discord all day → power off.
New GUIDE-DISCORD-BOT §12 ⓪ — 통합 시나리오 — a 9-station timeline (09:00 cold boot → 09:01 bot availability ping → 09:15 mobile away → 11:00 team channel → 13:00 lunch stop → 14:30 workspace file ops → 16:00 long task → 18:00 ops check → 22:00 shutdown) where each station carries:
- The host-side action (
./openclaw doctor,network online --restart,stop, etc.) - The Discord-side action (DM / mention / channel / slash command)
- Links into both GUIDE-DAILY-USE scenarios and the ①~⑧ detail cards in this same §12
Two reference tables under the timeline:
- One-line matrix (시간 / 상황 / 노트북 / Discord / 자세히 링크) for at-a-glance scanning
- Common stuck-points (7 hour-keyed gotchas) — bot offline despite host OK / mac sleep dropping container / wrong channel responding / file path off-workspace / OOM during long task / no host-shell perms / Docker auto-start not configured
- GUIDE-DAILY-USE Scenario 0 step 5: explicit callout linking the integrated scenario right where users finish cold-boot verification.
- GUIDE-DISCORD-BOT §12 prelude + TOC: ⓪ surfaces as the recommended entry point before drilling into ①~⑧.
- README (KO + EN) Documentation Map: 💬 row description now mentions ⓪ as a flagship "9-hour timeline" so the map signals the integrated walkthrough exists.
VERSION 0.2.14 → 0.2.15 (docs-only).
v0.2.12 added "how the bot works"; this release adds "in every situation, what do you actually type into Discord to make it do the thing". Eight scenario cards covering the bot-as-primary-interface modes — same format as GUIDE-DAILY-USE's scenario cards, but oriented around the Discord side.
Each card has four parts: when · what to type in Discord · what happens · limits.
① At the laptop — quick @mention vs TUI/chat trade-off (channel
history + team-shareable vs response speed + token cost).
② Mobile-only — DM with file-write prompts ("create
~/DEV/openclawAgent/daily-notes/2026-05-14.md and write …"),
with a "before you leave" 30-second host check.
③ Team collaboration — public-channel summarization / code review
with fenced diffs; "use threads" recommendation; DM-vs-channel
privacy guidance.
④ Workspace file ops — read/edit/append over the mounted
workspace; reminder that ~/Documents and friends are off-limits
by isolation design; large-file context-window caveat.
⑤ System ops / DevOps — doctor results / log filtering / status
queries via the bot. Calls out the security trade-off of giving
the bot host-shell powers; recommends DM or a dedicated
#ops-alerts whitelist channel.
⑥ Long-running task + completion ping — kick off, get pinged when
done; 2000-char limit caveat with auto-attach fallback.
⑦ Scheduled / recurring — "every weekday 9am summarize yesterday's
daily-notes to #notes"; notes that scheduler support depends on
OpenClaw build, with a host-side cron fallback example.
⑧ Cold-boot recovery — Discord-side test (@bot 살아있어?), the
fix sequence to run on the laptop, and a callout that "mobile
SSH (Tailscale + iSH/Termius) is the only escape if the laptop
itself is unreachable."
Plus a one-screen 상황별 빠른 매칭 표 mapping (where/when) → (recommended trigger / channel / caveat) for instant lookup.
- GUIDE-DAILY-USE TL;DR: explicit pointer to §12 for users who want Discord as their primary interface.
- README (KO + EN) Documentation Map: Discord row description now mentions the §12 8-case catalog so people scanning the map can tell that the guide goes well beyond setup.
No code change.
The previous "Scenario 1" treated everything as if Docker, Ollama, and the containers were already running. After a real power-off → power-on, none of that is guaranteed. This release adds:
- Scenario 0 — Cold boot (new). Detailed step-by-step for the case where the Mac was completely shut down:
- Auto-vs-manual matrix — for each component (Docker Desktop, Ollama menu bar, host models, OpenClaw containers, network mode, config files, workspace, Discord bot, web UI, TUI sessions) lists whether it auto-resumes, and what to do otherwise.
- 5-step procedure with timing — Docker daemon (30–60s wait loop one-liner) → Ollama probe → OpenClaw container auto-recovery check → network-mode review → start chatting (chat / TUI / web UI / Discord).
- 1-minute verification checklist — four ✓/✗ probes that confirm each layer, plus a one-liner condensation:
docker info && curl ollama && docker ps | grep openclaw && echo ALL OK. - Common cold-boot gotchas table — Docker still updating, Exited containers, Ollama app not up yet, last mode was isolated → web UI broken, Discord bot still reconnecting, fetch-failed model mismatch.
- Scenario 1 — refactored to the "warm" case (Mac woke from sleep, everything still up). Now points at Scenario 0 when starting from a true cold state.
- Scenario 3 — expanded into 3 shutdown levels: Level 1 (just macOS shutdown, 90% case), Level 2 (
./openclaw stopthen shutdown — multi-day idle), Level 3 (stop+quit Docker— long-term + RAM reclaim). Each with explicit commands and the matching restart cost. Includes pre-shutdown checklist (Discord activity, network mode persistence, backup) and a direct link back to Scenario 0.
- README (KO + EN): the 🔄 row description now enumerates the scenario list (cold boot, warm start, three shutdown levels, etc.) instead of a vague "morning start, shutdown".
VERSION 0.2.12 → 0.2.13 (docs-only).
The original guide stopped at "your bot is online and replied once". This release adds five new sections covering everyday operation, plus a one-screen cheat sheet:
- §7 봇과 대화하는 4가지 방법 — @mention / DM / slash commands (
/agent ask,/agent reset, etc.) / channel whitelist auto-respond. Per-trigger semantics: context length, when threads are useful, DM privacy. - §8 자주 쓰는 프롬프트 패턴 — one-liners, long-text summarization (with Discord's 2000-char limit caveat), code review with fenced diffs, workspace-aware prompts ("read MEMORY.md and …"), thread-based continued conversation,
/reset, in-Discord model switching. - §9 채널·서버별 동작 조정 — table of six tuning knobs (autoChannels / muteChannels / channelModels / channelPersonas / allowedGuilds / maxInputChars) with a concrete JSON example showing per-channel model assignment. Includes the "Copy Channel ID" walkthrough.
- §10 워크스페이스·인격을 봇으로 끌어오기 — how IDENTITY/SOUL/USER/AGENTS/MEMORY auto-load into the bot's system prompt (same as
./openclaw chat); editing those files reflects on the next message without restart; using the bot itself to append to MEMORY.md mid-conversation; multimodal attachments. - §11 봇 행동 관리 — temporary mute (Discord-side vs
./openclaw stop), permanent kick/ban, multi-server operation (same token vs separate bots), daily on/off pattern linked to GUIDE-DAILY-USE, disabling Discord while keeping the rest of OpenClaw. - 🎯 명령·인터랙션 cheat sheet — two compact tables (Discord-side actions, host-side commands) so users don't have to scroll the guide for everyday lookups.
- README (KO + EN) Documentation Map: the 💬 row description now lists what's actually inside (setup + daily-use sections + cheat sheet + troubleshooting cases) instead of just "create bot, invite, paste token".
docs/GUIDE-DAILY-USE.mdrelated-docs entry expands the description to point at the new §7–§11.
No code change.
OpenClaw upstream injects a hardcoded OLLAMA_DEFAULT_MODEL = "gemma4" (no tag) into the configured models list during onboard, even when the user's actual installed model is gemma4:26b. The TUI then picks the no-tag entry as default → Ollama treats it as gemma4:latest (which doesn't exist) → every request fails with fetch failed / LLM request failed: network connection error. Network reachability (host.docker.internal, online mode) is irrelevant — the call dies at HTTP 404 from Ollama itself.
./openclaw setupnow post-prunes — afteronboardreturns rc=0, setup.sh queries the host Ollama/api/tagsand removes anymodels.providers.ollama.models[].idthat isn't an actual installed tag. The pre-prune config is backed up to~/.openclaw/openclaw.json.bak-<timestamp>(perms 600). Skips silently if Ollama is unreachable (no destructive change when we can't verify). PrintsPRUNE_OK_DROPPED::<list>::<backup-path>outcome with a friendly summary.- Same mechanism shape as v0.2.8's Ollama URL pre-flight: upstream offers no env/flag to disable the bogus default, so the wrapper detects and corrects after the fact rather than fighting the wizard mid-flow.
- GUIDE-DAILY-USE.md — troubleshooting table gets a
fetch failed/LLM request failed: network connection errorrow. New subsection "🔬 현재 어떤 모델을 쓰는지 — openclaw.json 점검" with: 2-step diagnostic (ollama listvs config models), and three fixes ranked by preference — (A) rerun./openclaw setup --skip-confirmto trigger the auto-prune, (B)ollama pull <name>to make the bogus name actually exist, (C) manual JSON edit for emergencies. - GUIDE-DISCORD-BOT.md — troubleshooting gets "Bot Online but never replies / TUI says
fetch failed" entry that cross-links the daily-use diagnostic (same root cause). - README (KO) FAQ — new entry "TUI/Discord 봇이 메시지에 답 안 함 —
fetch failed" with the diagnostic one-liner, v0.2.11 quick fix, and link into the daily-use guide. - VERSION 0.2.8 → 0.2.11 (catching up to match prior unreleased doc-only bumps 0.2.9 / 0.2.10).
docs/GUIDE-DAILY-USE.md— the daily on/off loop that comes after install + setup. Six scenario-driven sections (morning start, stepping away, shutting down for the night, resuming a saved session, "something looks wrong", weekly/monthly maintenance), plus a "what gets persisted across stop/shutdown" table, plus a side-by-side comparison of every shutdown variant (./openclaw stopvs in-TUICtrl+Dvsdocker compose downvsdown -vvsuninstallvsuninstall --purge) with what each preserves and the matching restart command. Bilingual TLDR + KO body.
- README (KO + EN) Documentation Map: new 🔄 row pointing to the guide.
- README (KO) pipeline table row 4 (Maintain): now links the daily-use guide alongside the existing command catalog and cleanup references.
docs/GUIDE-FIRST-USE.md"5단계 — 일상 운영" section: callout banner directing readers to the deeper GUIDE-DAILY-USE.docs/GUIDE-DISCORD-BOT.mdanddocs/GUIDE-WEB-FETCH.mdrelated-docs tables: include the daily-use guide so users navigating between integration/operations guides find it.- The daily-use guide's own related-docs table back-links FIRST-USE, DISCORD-BOT, WEB-FETCH, TROUBLESHOOTING, OPENCLAW, and the README's command catalog + idempotency + network-toggle sections.
No code change.
docs/GUIDE-DISCORD-BOT.md— running OpenClaw as a Discord bot, end-to-end. Mirrors the Discord stage of the setup wizard but in much more depth: app creation, Message Content Intent (the most common first-time gotcha), OAuth2 URL Generator with the minimum-viable permission set, token paste vs external secret provider, first message test, and a troubleshooting section covering bot-offline, intent missing, slash commands not appearing, etc. Security section covers what a leaked token means and how to rotate. Bilingual TLDR + KO body with EN-friendly headings.
- README (KO + EN) Documentation Map: new 💬 row pointing to the guide.
- README (KO + EN) wizard walkthrough table: stage 11 (Skills / plugins / channels) now mentions Discord/Telegram/WhatsApp + links the new guide.
docs/GUIDE-FIRST-USE.md(KO + EN): the inline trail under./openclaw setupnow mentions Discord stage and points at the new doc.docs/GUIDE-WEB-FETCH.mdRelated-docs table: adds the Discord guide so users navigating between integration guides find it.
No code change.
- The OpenClaw onboard wizard's "Ollama base URL" prompt is hardcoded to default
http://127.0.0.1:11434. Inside the cli container, that resolves to the container itself — not the host — so the wizard dies withOllama could not be reached at http://127.0.0.1:11434→WizardCancelledError: Ollama not reachableeven when the host Ollama is fine. OpenClaw upstream reads no env var or CLI flag for this URL (verified by greppingprocess.env.OLLAMA*and the onboard option surface in/app/dist); the value can only be entered through the prompt. ./openclaw setupnow pre-flights this — before launching the wizard, it spins a one-shot--no-depscontainer and curlshttp://host.docker.internal:11434/api/tags. On success it prints a yellow boxed warning telling the user the exact value to type at the prompt:On failure (Ollama not running on the host, or network is in⚠ 마법사 안에서 "Ollama base URL" 단계가 나오면 다음을 입력 http://host.docker.internal:11434 기본값으로 보이는 http://127.0.0.1:11434 는 컨테이너 자신을 가리켜서 호스트 Ollama 에 닿지 못합니다.isolatedmode), it warns and offers to abort.- Post-run banner — if the wizard exits non-zero, setup.sh now suggests the URL fix specifically in addition to the generic "rerun to resume".
- README (KO + EN) wizard walkthrough table: added stage 8a (Ollama mode) and 8b (Ollama base URL
⚠️ trap) with the requiredhost.docker.internalvalue. Promoted the URL trap to one of the "most important answers" callout. - README (KO + EN) FAQ: new entry "setup wizard
Ollama not reachable— but my host Ollama is running" with the diagnosis, the one-line fix, and a verification command. - CHANGELOG v0.2.8.
- VERSION 0.2.7 → 0.2.8.
./openclaw setup— first-time / re-run OpenClaw onboard wizard, safely inside Docker. Wrapsdocker compose run --rm openclaw-cli onboardwith pre-flight checks (clone exists · Docker daemon up), idempotent re-run confirmation (existing config detected → ask before re-running, Enter keeps any answer), and post-run hand-off to./openclaw chatortui../openclaw setup status— read-only inspector: shows whether~/.openclaw/openclaw.jsonexists, last-modified time, and top-level config keys. Does not modify anything.
- Interactive model picker — without
-m, the script queriesollama listand prints a numbered menu of installed models with their sizes. Press Enter for the default (=.env'sOLLAMA_MODELSfirst entry if installed), or pick a number.- Embedding models (
*-embed-*, familyembed*) are filtered out — they can't chat. - Exactly one installed model → auto-picked. Zero installed → friendly
ollama pullrecommendations + exit. - Non-interactive contexts (
NONINTERACTIVE=1, piped stdin,--no-pick, or-m) skip the picker.
- Embedding models (
--no-pickflag — force the legacy "use.envdefault model" behavior.- Replaces the old "model X may not be installed, continue? [y/N]" warning with a real picker that shows what is installed.
- README (KO + EN): command catalog adds
setup; '첫 사용 / first use' section ② re-flowed around./openclaw setup→./openclaw chat; ③ documents the picker; dedicated chat section shows a sample picker menu. - README (KO + EN): new collapsible "마법사가 차례로 묻는 단계 / What the wizard asks" table inside the
setupdiscussion — 14 stages with recommended answers. Key callouts: stage #8 (auth-choice = ollama) lets users keep their already-installed local models without any API key, and stage #4 (gateway-bind = loopback) is the safest default. Links to upstreamdocs.openclaw.ai/cli/onboardfor the full 50+ provider surface. - GUIDE-FIRST-USE.md (KO + EN): Option B opens with
./openclaw setupinstead of a rawdocker compose runchain; Option C documents the picker. Inline stage list references the README walkthrough. - VERSION bumped 0.2.6 → 0.2.7.
docker compose exec openclaw-cli bash→docker compose run --rm openclaw-cli <subcommand>everywhere. The cli container's entrypoint isnode dist/index.js, which prints help and exits when invoked with no args — so the container is inExited (1)state andexecalways fails. The correct pattern isrun --rmper invocation. (README KO + EN, GUIDE-FIRST-USE.md, install.sh post-install banner.)claude→openclaw tui/openclaw onboard/openclaw agent. The actual CLI binary inside the container isopenclaw(/usr/local/bin/openclaw→/app/openclaw.mjs);claudedoes not exist on PATH. The previous instructions sent users into a dead end.- In-container workspace path:
/workspace→/home/node/.openclaw/workspace(matchesOPENCLAW_WORKSPACE_DIRenv indocker-compose.ymland the actual mount).
- Isolated mode blocks web UI — Docker's
internal: truenetwork also disables host → container port publishing (no docker-proxy spawned). Empirically confirmed viadocker inspectshowing requested but unrealized port bindings. The network-mode table now reportsisolated.WebUIas ✗ with a callout; both README andinstall.shpost-install banner now lead with./openclaw network online --restartfor browser access. - Empty/black Control Panel page is normal — this OpenClaw build's web UI is the admin Control Panel, not a chat interface. Added FAQ entries (KO + EN) directing users to
./openclaw chat,docker compose run --rm openclaw-cli tui, or one-shotagent.
openclaw chat— terminal REPL chat with the agent via host Ollama. Streams/api/chattoken-by-token; auto-loads workspace personality files (IDENTITY.md·SOUL.md·USER.md·AGENTS.md·MEMORY.md) into the system prompt. Slash commands:/exit/reset/model/history/help. Pure stdlib (curl+python3); no extra deps.
install.sh:validate_state()— at install start, cascade-unmarks state keys whose underlying artifacts are gone:OPENCLAW_DIR/.gitmissing → unmarkrepo_clonethroughsandbox(7 steps)OPENCLAW_DIR/.envmissing → unmarkenv_mergethroughsandbox(5 steps)docker-compose.sandbox.ymlmissing +docker.sockready → unmarksandbox- Fixes "install reports
[skip]for every step but final summary keeps warning 샌드박스 미설정" when the user manually deleted the clone or ran the first install while Docker Desktop was still booting.
step_sandboxdeferred marker — whendocker.sockis absent the step now setsSANDBOX_DEFERRED=1and the marker is cleared afterrun_step, so the next install retries instead of staying stuck atsandbox=done.validate_statealways returns 0 — guards against silentset -eexit when no markers need clearing (the function's final[ ] && infoshort-circuited to exit code 1).
compose.security.yml: drop duplicatesecurity_opt: [no-new-privileges:true]onopenclaw-gateway. Basedocker-compose.ymlalready declared it, so Compose v2 concatenated the sequences and rejected withservices.openclaw-gateway.security_opt items at 0 and 1 are equal. (The same fix was previously applied toopenclaw-clibut the matching change toopenclaw-gatewaywas missing.)
- README new section: 🎯 install 직후 — 첫 사용 / Right after install — first use — three entry points (browser web UI · container CLI ·
openclaw chat), how to verify, and a quick-reference for thenetwork online ↔ isolatedtoggle. - README idempotency section: documents
validate_stateartifact verification with a table of detection conditions and the markers that get auto-cleared. - README FAQ: new entry "install keeps printing
[skip]but nothing works" — explains the cause and the one-line recovery.
openclaw install: removed bulk Ollama model auto-download (step_ollama_modelsdeleted)openclaw install: newstep_ollama_check— detects and displays already-installed Ollama models before proceedingstep_compose_up/step_lockdown: pre-detect existing OpenClaw Docker images and containers, display them; use--pull missingto avoid re-downloading
openclaw install: added directory banner at start (shows exact paths before installing) and at completion (confirms actual paths created)- Installation: added directory summary in completion banner (tool path, future agent/config/backup locations)
- BUGFIX:
network.shisolated/onlinecompose overlays usedapp:→ fixed toopenclaw-gateway+openclaw-cli(network isolation was NOT working before this fix) OPENCLAW_DIRdefault fixed from~/openclaw→~/DEV/openclawin 8 scripts:start.sh,stop.sh,logs.sh,update.sh,backup.sh,restore.sh,uninstall.sh,detect.shsec_scan_compose(): sandbox overlay (docker-compose.sandbox.yml) now excluded from docker.sock false-positive check
- BUGFIX:
compose.security.yml+compose.network.ymlservice name fixed fromapp→openclaw-gateway/openclaw-cli(security overlays were NOT being applied before this fix) OPENCLAW_WORKSPACE_DIRdefault changed to~/DEV/openclawAgent(agent files visible in Finder)- Added
OPENCLAW_CONFIG_DIR,OPENCLAW_WORKSPACE_DIR,OPENCLAW_SANDBOXto.env.example - New
compose.ollama.yml— Ollama-in-Docker option (fallback, GPU acceleration not available) - Guide: added security principles section, M5 Pro 24GB model recommendations, no-global-install warnings
- Ollama step: updated with M5 Pro model table,
brew install ollamawarning
openclaw install: added Step 10 — sandbox setup (OPENCLAW_SANDBOX=1)docs/GUIDE-MANUAL-INSTALL.md: added Step 5c — Sandbox + Security Hardening (KO + EN)- Sandbox:
mode=non-main,scope=agent,workspaceAccess=noneviadocker-setup.sh - Install banner now shows sandbox activation hint
- Default
OPENCLAW_DIRchanged from~/openclawto~/DEV/openclaw(matches actual install location) - Updated all docs and
.env.exampleto reflect new path
- Installation: git clone is the default (no Homebrew required);
--brew(Homebrew tap) is opt-in openclaw install: removed auto-install of Homebrew and Docker via brew; now points to official sites (brew.sh, docker.com)README.md,README.en.md: updated to reflect new install options
- Previous release