Install
openclaw skills install @ianthereal/clawmemBootstrap, repair, and verify the ClawMem OpenClaw plugin. Use when ClawMem is not yet installed, not selected as the active memory plugin, missing per-agent provisioning, or needs setup troubleshooting. After activation, rely on the bundled clawmem plugin skill for everyday recall, saving, schema, collaboration, mental-model guidance, communication, and manual memory operations.
openclaw skills install @ianthereal/clawmemThis file is only for installing, activating, verifying, or repairing ClawMem.
Once the plugin is active, stop using this bootstrap document as the runtime memory playbook. The plugin now ships a bundled clawmem skill that handles:
gh and curl fallback flowsopenclaw plugins install @clawmem-ai/clawmem
openclaw plugins enable clawmem
openclaw config set plugins.slots.memory clawmem
openclaw config validate
openclaw gateway restart
If a gateway restart may interrupt the current reply stream, send the user a short notice before restarting.
First verify that ClawMem is selected as the active memory plugin:
openclaw status
python3 - <<'PY'
import json, os, subprocess
cfg_path = subprocess.check_output(["openclaw", "config", "file"], text=True).strip()
with open(os.path.expanduser(cfg_path)) as f:
root = json.load(f)
slots = (root.get("plugins") or {}).get("slots") or {}
print(f"plugins.slots.memory = {slots.get('memory', 'MISSING')}")
PY
Expected:
plugins.slots.memory = clawmemIf the active memory slot is not clawmem, fix that first and restart the gateway again.
ClawMem provisions credentials per agent identity and writes them back to:
openclaw.json -> plugins.entries.clawmem.config.agents.<agentId>
Check the current agent route:
AGENT_ID="${OPENCLAW_AGENT_ID:-main}"
python3 - "$AGENT_ID" <<'PY'
import json, os, subprocess, sys
agent_id = sys.argv[1]
cfg_path = subprocess.check_output(["openclaw", "config", "file"], text=True).strip()
with open(os.path.expanduser(cfg_path)) as f:
root = json.load(f)
cfg = (((root.get("plugins") or {}).get("entries") or {}).get("clawmem") or {}).get("config") or {}
route = (cfg.get("agents") or {}).get(agent_id) or {}
base_url = route.get("baseUrl") or cfg.get("baseUrl") or "MISSING"
default_repo = route.get("defaultRepo") or route.get("repo") or cfg.get("defaultRepo") or cfg.get("repo") or "MISSING"
token = "SET" if route.get("token") else "MISSING"
print(f"agentId: {agent_id}")
print(f"baseUrl: {base_url}")
print(f"defaultRepo: {default_repo}")
print(f"token: {token}")
PY
If defaultRepo or token is MISSING, the current agent has not been provisioned yet. Trigger one real turn with that agent so the plugin can finish provisioning, then rerun the check.
After provisioning, confirm the current route can read ClawMem without interactive gh auth login:
AGENT_ID="${OPENCLAW_AGENT_ID:-main}"
eval "$(
python3 - "$AGENT_ID" <<'PY'
import json, os, shlex, subprocess, sys
agent_id = sys.argv[1]
cfg_path = subprocess.check_output(["openclaw", "config", "file"], text=True).strip()
with open(os.path.expanduser(cfg_path)) as f:
root = json.load(f)
cfg = (((root.get("plugins") or {}).get("entries") or {}).get("clawmem") or {}).get("config") or {}
route = (cfg.get("agents") or {}).get(agent_id) or {}
base_url = (route.get("baseUrl") or cfg.get("baseUrl") or "https://git.clawmem.ai/api/v3").rstrip("/")
if not base_url.endswith("/api/v3"):
base_url = f"{base_url}/api/v3"
repo = route.get("defaultRepo") or route.get("repo") or cfg.get("defaultRepo") or cfg.get("repo") or ""
token = route.get("token") or ""
host = base_url.removesuffix("/api/v3").replace("https://", "").replace("http://", "")
for key, value in {
"CLAWMEM_BASE_URL": base_url,
"CLAWMEM_HOST": host,
"CLAWMEM_REPO": repo,
"CLAWMEM_TOKEN": token,
}.items():
print(f"export {key}={shlex.quote(value)}")
PY
)"
test -n "$CLAWMEM_REPO" || { echo "Current agent route has no repo yet"; exit 1; }
test -n "$CLAWMEM_TOKEN" || { echo "Current agent route has no token yet"; exit 1; }
GH_HOST="$CLAWMEM_HOST" GH_ENTERPRISE_TOKEN="$CLAWMEM_TOKEN" \
gh issue list --repo "$CLAWMEM_REPO" --limit 1 --json number,title
If gh is unavailable or not the official GitHub CLI, use curl instead:
curl -sf -H "Authorization: token $CLAWMEM_TOKEN" \
"$CLAWMEM_BASE_URL/repos/$CLAWMEM_REPO/issues?state=open&per_page=1&type=issues" | \
jq 'map({number,title})'
If either command returns JSON, even [], the route is usable.
After ClawMem is active:
clawmem skill becomes the runtime source of truthmemory_recall, memory_store, memory_update, memory_list, and memory_forgetDo not keep pasting large setup instructions into every session once the plugin is already active.
If your OpenClaw environment still relies on file-injected reminders, keep them short:
SOUL.md snippet## Memory System — ClawMem
I use ClawMem as my memory system.
When prior context may help, I search ClawMem before answering.
AGENTS.md snippetBefore ending every response, ask: "Did I learn anything durable this turn?"
If yes or unsure, save it to ClawMem now.
These compatibility snippets are optional. The bundled plugin skill is the primary runtime behavior source.
plugins.slots.memory is wrong, set it back to clawmem, validate config, and restart the gateway.defaultRepo or token is missing, trigger a real turn with the current agent and rerun provisioning checks.401 Unauthorized, reread the current route instead of assuming the previous repo or token still applies.clawmem skill rather than expanding this bootstrap document again.plugins.slots.memory = clawmemclawmem skill is available for runtime memory behavior