Skip to content

Latest commit

 

History

History
770 lines (555 loc) · 53.9 KB

File metadata and controls

770 lines (555 loc) · 53.9 KB

Changelog

📖 목차 / Contents


v0.2.23 — 2026-05-15

Discord case G + respect user's explicit model choice

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.

Two-part fix

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"

Files changed

  • 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.supportsTools stamping into stamp_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: documented OPENCLAW_FORCE_DEFAULT_MODEL with a recommended-values table
  • docs/GUIDE-DISCORD-BOT.md: case D RAM table updated (gemma4:latest is new 24GB+ default), new "default 모델을 영구 lock 하기" subsection
  • docs/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

Side note — BOOTSTRAP.md deletion is now a manual step

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.

Verified

$ ./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)

Carried TODO

  • Upstream PR for OPENCLAW_HOST_PATH_PREFIX (v0.2.20 — would let sandbox.mode go back to non-main)
  • ./openclaw chat --warm-default flag (v0.2.22)
  • (new) ./openclaw cleanup-bootstrap command that safely deletes BOOTSTRAP.md from the workspace and prints a confirmation — automate the host-side cleanup pattern this version introduced

v0.2.22 — 2026-05-15

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.

Why 4.6GB is still too heavy on 24GB RAM

The Discord bot's first message processing isn't just "load model + reply"; it's:

  1. Load model into RAM (cold) — 30~55s for an 8B q4 model
  2. Process system prompt (workspace bootstrap chain: BOOTSTRAP.md, IDENTITY.md, SOUL.md, USER.md, AGENTS.md, HEARTBEAT.md, TOOLS.md = 7 files)
  3. Process tool schema definitions (gateway exposes dozens of tools)
  4. Generate the first response token
  5. 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.

Fix — qwen2.5:3b-instruct as the new default + automated model ranking

$ 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.67s

1.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 by OPENCLAW's supportsToolsMeta check at dist/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:14b via explicit @openclaw use <model> … syntax

Automation: cmd/setup.sh now ranks models post-onboard

New function optimize_default_ollama_model() runs immediately after prune_bogus_ollama_models() during ./openclaw setup. It:

  1. Queries /api/show for every registered model to get capabilities + size
  2. Filters to models declaring "tools" capability
  3. Sorts by file size ascending
  4. Moves the smallest tool-capable model to models[0] (which OpenClaw uses as default)
  5. Sets compat.supportsTools = true on 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

  • docs/GUIDE-DISCORD-BOT.md case 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.md troubleshooting 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 bug
  • CHANGELOG (this file)

Files changed

  • openclaw-mgr/cmd/setup.sh — added optimize_default_ollama_model() (~75 LOC python heredoc) + invocation block (~20 LOC)
  • openclaw-mgr/openclawVERSION="0.2.22"
  • openclaw-mgr/openclaw.ps1$Version = '0.2.22'
  • docs/GUIDE-DISCORD-BOT.md, docs/GUIDE-DAILY-USE.md, CHANGELOG.md

Verified on the live setup

[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: ```...```

Carried TODO (now smaller)

  • Upstream PR for OPENCLAW_HOST_PATH_PREFIX (would let sandbox.mode go back from offnon-main and restore defense-in-depth — see v0.2.20)
  • Add a ./openclaw chat flag --warm-default that auto-pings the default model before opening the prompt (mirrors what setup.sh post-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

v0.2.21 — 2026-05-15

Discord "Something went wrong" — two new root causes after v0.2.20 sandbox-off (cases D + E)

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:

Case D — model too heavy for first-load watchdog

[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 start

Heavier 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.

Case E — plugin-runtime-deps/openclaw-unknown-<hash>/ left half-populated

[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)

Result after applying D + E (with v0.2.20 sandbox-off already in place)

$ ./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

  • docs/GUIDE-DISCORD-BOT.md troubleshooting 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.md troubleshooting 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.sh patches to automate D + E are tracked as TODO (auto-pick lightest model as default, periodically prune stale openclaw-unknown-* deps).

TODO (carried from v0.2.20)

  • Upstream PR for OPENCLAW_HOST_PATH_PREFIX env var to translate container paths to host paths — would let case C be solved properly and re-enable sandbox.mode = "non-main".
  • Auto-rank Ollama models by parameter count / file size in cmd/setup.sh so the lightest one is always at index [0].

v0.2.20 — 2026-05-14

Discord "Something went wrong" case C — host-path mismatch in sandbox sub-container creation

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 node user (uid 1000)
  • isolated network (default network online --restart path notwithstanding)
  • docker.sock access only through group_add we 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.

Changes

  • openclaw-mgr/compose.host-paths.yml — new overlay file (currently unreferenced; preserved for the next host-path attempt)
  • openclaw-mgr/cmd/start.shhost_paths variable added but commented out with a note explaining the v0.2.20 hang
  • openclaw-mgr/cmd/install.sh step_lockdown — same commented-out wiring + note
  • User's ~/.openclaw/openclaw.jsonagents.defaults.sandbox.mode set to "off" (manual fix applied during the session; rollback path preserved via timestamped .bak)

Documentation

  • 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 of mode: off.
  • GUIDE-DAILY-USE.md troubleshooting matrix gets the case-C row pointing at the GUIDE-DISCORD-BOT detail.
  • VERSION 0.2.19 → 0.2.20.

TODO (future)

  • File a PR against OpenClaw upstream to honor OPENCLAW_HOST_PATH_PREFIX (or similar) so appendWorkspaceMountArgs can translate container paths back to host paths before calling docker.sock.
  • Once that ships, re-enable compose.host-paths.yml and remove the mode: off workaround.

v0.2.19 — 2026-05-14

Bug fix — Discord bot still "Something went wrong" after v0.2.17 (permission denied on docker.sock)

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 writing docker-compose.sandbox.yml, always emit group_add: ["0"] first (root, required for macOS Docker Desktop), then the detected host GID if different. Now the container's node user ends up in groups=1000(node),0(root),1(daemon) and can talk to the socket regardless of platform.
  • User's existing ~/DEV/openclaw/docker-compose.sandbox.yml was patched in place to the same ["0","1"] shape. Verified post-restart: docker exec ... docker info --format '{{.ServerVersion}}' returns 29.4.0 from inside the gateway. Plugins list back to 7 with discord.

Documentation

  • GUIDE-DAILY-USE.md 트러블슈팅 표: new row for the permission denied variant 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.


v0.2.18 — 2026-05-14

GUIDE-OLLAMA.md — consolidated 🔌 켜기·끄기·재시작·자동시작 section

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-shot ollama 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 osascript one-liner that registers Ollama.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_MODELS relocation, container host.docker.internal reminder, isolated-mode block)

Cross-linking

  • 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.


v0.2.17 — 2026-05-14

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 /new to 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.yml to the compose args when that file exists. Same conditional include pattern already used for compose.security.yml / compose.network.yml. If the overlay doesn't exist (sandbox disabled by OPENCLAW_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.

Documentation

  • GUIDE-DAILY-USE 트러블슈팅 표 — new row for "Something went wrong while processing your request" with the docker.sock cause and the git pull → stop → start recovery. 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.

Verified on user's machine

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.


v0.2.16 — 2026-05-14

GUIDE-DAILY-USE TL;DR — Discord prompt cheat sheet alongside host commands

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.15 — 2026-05-14

Stitching cold-boot ↔ Discord into one end-to-end story

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

Cross-linking

  • 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.14 — 2026-05-14

GUIDE-DISCORD-BOT §12 — situation-based Discord workflow catalog

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.

Cross-linking

  • 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.


v0.2.13 — 2026-05-14

GUIDE-DAILY-USE.md — full cold-boot walkthrough

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 stop then 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.

Documentation map

  • 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).


v0.2.12 — 2026-05-14

GUIDE-DISCORD-BOT.md — major expansion (setup-only → setup + daily-use)

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.

Cross-linking

  • 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.md related-docs entry expands the description to point at the new §7–§11.

No code change.


v0.2.11 — 2026-05-14

Bug fix — TUI/Discord fetch failed after fresh setup (OLLAMA_DEFAULT_MODEL trap)

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 setup now post-prunes — after onboard returns rc=0, setup.sh queries the host Ollama /api/tags and removes any models.providers.ollama.models[].id that 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). Prints PRUNE_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.

Documentation

  • GUIDE-DAILY-USE.md — troubleshooting table gets a fetch failed / LLM request failed: network connection error row. New subsection "🔬 현재 어떤 모델을 쓰는지 — openclaw.json 점검" with: 2-step diagnostic (ollama list vs config models), and three fixes ranked by preference — (A) rerun ./openclaw setup --skip-confirm to 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).

v0.2.10 — 2026-05-14

New guide

  • 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 stop vs in-TUI Ctrl+D vs docker compose down vs down -v vs uninstall vs uninstall --purge) with what each preserves and the matching restart command. Bilingual TLDR + KO body.

Cross-linking

  • 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.md and docs/GUIDE-WEB-FETCH.md related-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.


v0.2.9 — 2026-05-14

New guide

  • 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.

Cross-linking

  • 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 setup now mentions Discord stage and points at the new doc.
  • docs/GUIDE-WEB-FETCH.md Related-docs table: adds the Discord guide so users navigating between integration guides find it.

No code change.


v0.2.8 — 2026-05-14

Bug fix — setup wizard Ollama not reachable trap

  • 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 with Ollama could not be reached at http://127.0.0.1:11434WizardCancelledError: Ollama not reachable even when the host Ollama is fine. OpenClaw upstream reads no env var or CLI flag for this URL (verified by grepping process.env.OLLAMA* and the onboard option surface in /app/dist); the value can only be entered through the prompt.
  • ./openclaw setup now pre-flights this — before launching the wizard, it spins a one-shot --no-deps container and curls http://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:
    ⚠  마법사 안에서 "Ollama base URL" 단계가 나오면 다음을 입력
         http://host.docker.internal:11434
       기본값으로 보이는 http://127.0.0.1:11434 는 컨테이너 자신을 가리켜서
       호스트 Ollama 에 닿지 못합니다.
    
    On failure (Ollama not running on the host, or network is in isolated mode), 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".

Documentation

  • README (KO + EN) wizard walkthrough table: added stage 8a (Ollama mode) and 8b (Ollama base URL ⚠️ trap) with the required host.docker.internal value. 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.

New commands

  • ./openclaw setup — first-time / re-run OpenClaw onboard wizard, safely inside Docker. Wraps docker compose run --rm openclaw-cli onboard with 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 chat or tui.
  • ./openclaw setup status — read-only inspector: shows whether ~/.openclaw/openclaw.json exists, last-modified time, and top-level config keys. Does not modify anything.

./openclaw chat upgrades

  • Interactive model picker — without -m, the script queries ollama list and prints a numbered menu of installed models with their sizes. Press Enter for the default (= .env's OLLAMA_MODELS first entry if installed), or pick a number.
    • Embedding models (*-embed-*, family embed*) are filtered out — they can't chat.
    • Exactly one installed model → auto-picked. Zero installed → friendly ollama pull recommendations + exit.
    • Non-interactive contexts (NONINTERACTIVE=1, piped stdin, --no-pick, or -m) skip the picker.
  • --no-pick flag — force the legacy "use .env default model" behavior.
  • Replaces the old "model X may not be installed, continue? [y/N]" warning with a real picker that shows what is installed.

Documentation

  • 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 setup discussion — 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 upstream docs.openclaw.ai/cli/onboard for the full 50+ provider surface.
  • GUIDE-FIRST-USE.md (KO + EN): Option B opens with ./openclaw setup instead of a raw docker compose run chain; Option C documents the picker. Inline stage list references the README walkthrough.
  • VERSION bumped 0.2.6 → 0.2.7.

v0.2.6 — 2026-05-14

Documentation correctness

  • docker compose exec openclaw-cli bashdocker compose run --rm openclaw-cli <subcommand> everywhere. The cli container's entrypoint is node dist/index.js, which prints help and exits when invoked with no args — so the container is in Exited (1) state and exec always fails. The correct pattern is run --rm per invocation. (README KO + EN, GUIDE-FIRST-USE.md, install.sh post-install banner.)
  • claudeopenclaw tui / openclaw onboard / openclaw agent. The actual CLI binary inside the container is openclaw (/usr/local/bin/openclaw/app/openclaw.mjs); claude does not exist on PATH. The previous instructions sent users into a dead end.
  • In-container workspace path: /workspace/home/node/.openclaw/workspace (matches OPENCLAW_WORKSPACE_DIR env in docker-compose.yml and the actual mount).

Web UI honesty

  • Isolated mode blocks web UI — Docker's internal: true network also disables host → container port publishing (no docker-proxy spawned). Empirically confirmed via docker inspect showing requested but unrealized port bindings. The network-mode table now reports isolated.WebUI as ✗ with a callout; both README and install.sh post-install banner now lead with ./openclaw network online --restart for 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-shot agent.

v0.2.5 — 2026-05-14

New features

  • openclaw chat — terminal REPL chat with the agent via host Ollama. Streams /api/chat token-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 reliability

  • install.sh: validate_state() — at install start, cascade-unmarks state keys whose underlying artifacts are gone:
    • OPENCLAW_DIR/.git missing → unmark repo_clone through sandbox (7 steps)
    • OPENCLAW_DIR/.env missing → unmark env_merge through sandbox (5 steps)
    • docker-compose.sandbox.yml missing + docker.sock ready → unmark sandbox
    • 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_sandbox deferred marker — when docker.sock is absent the step now sets SANDBOX_DEFERRED=1 and the marker is cleared after run_step, so the next install retries instead of staying stuck at sandbox=done.
  • validate_state always returns 0 — guards against silent set -e exit when no markers need clearing (the function's final [ ] && info short-circuited to exit code 1).

Bug fixes

  • compose.security.yml: drop duplicate security_opt: [no-new-privileges:true] on openclaw-gateway. Base docker-compose.yml already declared it, so Compose v2 concatenated the sequences and rejected with services.openclaw-gateway.security_opt items at 0 and 1 are equal. (The same fix was previously applied to openclaw-cli but the matching change to openclaw-gateway was missing.)

Documentation

  • 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 the network online ↔ isolated toggle.
  • README idempotency section: documents validate_state artifact 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.

v0.2.4 — 2026-04-25

  • openclaw install: removed bulk Ollama model auto-download (step_ollama_models deleted)
  • openclaw install: new step_ollama_check — detects and displays already-installed Ollama models before proceeding
  • step_compose_up / step_lockdown: pre-detect existing OpenClaw Docker images and containers, display them; use --pull missing to avoid re-downloading

v0.2.3 — 2026-04-25

  • 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)

v0.2.2 — 2026-04-25

Security fixes (audit)

  • BUGFIX: network.sh isolated/online compose overlays used app: → fixed to openclaw-gateway + openclaw-cli (network isolation was NOT working before this fix)
  • OPENCLAW_DIR default fixed from ~/openclaw~/DEV/openclaw in 8 scripts: start.sh, stop.sh, logs.sh, update.sh, backup.sh, restore.sh, uninstall.sh, detect.sh
  • sec_scan_compose(): sandbox overlay (docker-compose.sandbox.yml) now excluded from docker.sock false-positive check

v0.2.1 — 2026-04-25

  • BUGFIX: compose.security.yml + compose.network.yml service name fixed from appopenclaw-gateway/openclaw-cli (security overlays were NOT being applied before this fix)
  • OPENCLAW_WORKSPACE_DIR default changed to ~/DEV/openclawAgent (agent files visible in Finder)
  • Added OPENCLAW_CONFIG_DIR, OPENCLAW_WORKSPACE_DIR, OPENCLAW_SANDBOX to .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 ollama warning

v0.2.0 — 2026-04-25

  • 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=none via docker-setup.sh
  • Install banner now shows sandbox activation hint

v0.1.9 — 2025-07-xx

  • Default OPENCLAW_DIR changed from ~/openclaw to ~/DEV/openclaw (matches actual install location)
  • Updated all docs and .env.example to reflect new path

v0.1.8 — 2025-07-xx

  • 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

v0.1.7

  • Previous release