#cant get extra path for qmd memory to work
104 messages · Page 1 of 1 (latest)
Let me check the current docs + code path for QMD, then I’ll give you the shortest fix path.
Yep. First, can you paste the exact output of:
openclaw --version
“April 11” narrows it down, but the exact build matters here.
For QMD extra paths, the valid config shapes are either:
{
agents: {
defaults: {
memorySearch: {
extraPaths: ["/absolute/path/to/docs"]
}
}
},
memory: { backend: "qmd" }
}
or:
{
memory: {
backend: "qmd",
qmd: {
paths: [{ name: "docs", path: "/absolute/path/to/docs", pattern: "**/*.md" }]
}
}
}
A few gotchas that bite people a lot:
memory.qmd.extraPathsis not a real key.- Relative paths resolve from the agent workspace, not your shell cwd. Use an absolute path first.
- If you set
memory.qmd.paths[].name, do not add the agent suffix yourself, usedocs, notdocs-main. - If the target dir is a symlink, try the real path first.
- After changing config, force a reindex:
openclaw memory index --agent main --force
Best next debug command:
openclaw memory status --agent main --deep --index --verbose
If you paste these 3 things, I can usually spot it fast:
openclaw --version- your
memory+agents.defaults.memorySearchconfig snippet openclaw memory status --agent main --deep --index --verbose
Docs:
can you give ne the commands to paste for you to get all the infor you need
Yep, paste this whole bundle. If you need to redact private paths, that’s fine, just keep whether they’re absolute or relative.
echo '=== openclaw version ==='
openclaw --version
echo
echo '=== gateway status ==='
openclaw gateway status
echo
echo '=== memory config ==='
openclaw config get memory
echo
echo '=== default memorySearch config ==='
openclaw config get agents.defaults.memorySearch
echo
echo '=== agents list ==='
openclaw config get agents.list
echo
echo '=== qmd binary ==='
which qmd || command -v qmd
qmd --version
echo
echo '=== memory status ==='
openclaw memory status --deep --index --verbose
If your agent is not main, also run this and paste it too:
openclaw memory status --agent <your-agent-id> --deep --index --verbose
That should give me basically everything I need.
lets go one by one. since its too much to paste in one message
Yep, that’s easier.
First one:
openclaw --version
Paste the output, then I’ll give you the next one.
totaluser@Total-Hardware:~$ openclaw --version
OpenClaw 2026.4.11 (769908e)
Nice, thanks.
Next one:
openclaw config get memory
Paste that, then I’ll do the next step.
totaluser@Total-Hardware:~$ openclaw config get memory
🦞 OpenClaw 2026.4.11 (769908e)
Automation with claws: minimal fuss, maximal pinch.
{
"backend": "qmd",
"qmd": {
"paths": [
{
"path": "/home/totaluser/.openclaw/yr-knowledge",
"name": "yr-knowledge",
"pattern": "**/*.md"
}
],
"sessions": {
"enabled": true
},
"scope": {
"default": "deny",
"rules": [
{
"action": "allow",
"match": {
"chatType": "direct"
}
},
{
"action": "allow",
"match": {
"chatType": "channel"
}
}
]
}
}
}
That config shape looks fine, good sign.
Next one:
openclaw config get agents.list
I want to see the agent id + workspace before we hit memory status.
totaluser@Total-Hardware:~$ openclaw config get agents.list
🦞 OpenClaw 2026.4.11 (769908e)
Automation with claws: minimal fuss, maximal pinch.
[
{
"id": "main",
"heartbeat": {},
"subagents": {
"allowAgents": [
"forge",
"scout",
"vital",
"sentinel",
"alfred"
]
}
},
{
"id": "forge",
"name": "Forge",
"workspace": "/home/totaluser/.openclaw/forge",
"agentDir": "/home/totaluser/.openclaw/agents/forge/agent",
"heartbeat": {}
},
{
"id": "scout",
"name": "Scout",
"workspace": "/home/totaluser/.openclaw/scout",
"agentDir": "/home/totaluser/.openclaw/agents/scout/agent",
"heartbeat": {}
},
{
"id": "vital",
"name": "vital",
"workspace": "/home/totaluser/.openclaw/vital",
"agentDir": "/home/totaluser/.openclaw/agents/vital/agent",
"heartbeat": {}
},
{
"id": "sentinel",
"name": "sentinel",
"workspace": "/home/totaluser/.openclaw/sentinel",
"agentDir": "/home/totaluser/.openclaw/agents/sentinel/agent",
"heartbeat": {}
},
{
"id": "alfred",
"name": "Alfred",
"workspace": "/home/totaluser/.openclaw/alfred",
"agentDir": "/home/totaluser/.openclaw/agents/alfred/agent",
"heartbeat": {
"every": "15m",
"target": "telegram",
"accountId": "forge"
}
},
{
"id": "rush",
"name": "rush",
"workspace": "/home/totaluser/.openclaw/rush",
"agentDir": "/home/totaluser/.openclaw/agents/rush/agent",
"memorySearch": {
"qmd": {
"extraCollections": []
}
}
},
{
"id": "cipher",
"name": "Cipher",
"workspace": "/home/totaluser/.openclaw/cipher",
"agentDir": "/home/totaluser/.openclaw/agents/cipher/agent"
}
]
totaluser@Total-Hardware:~$
so i have been troubleshooting with rush which is one of the agents that i need to have this set up on, but main also needsto get set up on it too so whichever one we trouble shoot, i dont mind
Perfect. Since memory.qmd.paths is global, it should apply to both main and rush, so let’s debug rush first.
Next one:
openclaw memory status --agent rush --deep --index --verbose
Paste that output. That should show whether OpenClaw is actually seeing the extra path/collection or skipping it.
totaluser@Total-Hardware:~$ openclaw memory status --agent rush --deep --index --verbose
17:49:49-07:00 [plugins] plugins.allow is empty; discovered non-bundled plugins may auto-load: lossless-claw (/home/totaluser/.openclaw/extensions/lossless-claw/dist/index.js). Set plugins.allow to explicit trusted ids.
🦞 OpenClaw 2026.4.11 (769908e)
Shell yeah—I'm here to pinch the toil and leave you the glory.
17:49:53-07:00 [memory] qmd collection add skipped for memory-alt-rush: qmd collection add /home/totaluser/.openclaw/rush --name memory-alt-rush --glob memory.md failed (code 1): A collection already exists for this path and pattern:
Name: memory-root-rush (qmd://memory-root-rush/)
Pattern: **/*.md
Use 'qmd update' to re-index it, or remove it first with 'qmd collection remove memory-root-rush'
│
17:49:53-07:00 [bedrock-mantle-discovery] Mantle IAM token generation unavailable
â—‡
Memory index complete.
Memory Search (rush)
Provider: qmd (requested: qmd)
Model: qmd
Sources: memory, sessions
Indexed: 157/8 files · 157 chunks
Dirty: no
Store: ~/.openclaw/agents/rush/qmd/xdg-cache/qmd/index.sqlite
Workspace: ~/.openclaw/rush
Dreaming: off
Embeddings: ready
By source:
memory · 151/5 files · 151 chunks
sessions · 6/3 files · 6 chunks
Vector: ready
Batch: disabled (failures 0/0)
Recall store: 4 entries · 0 promoted · 4 concept-tagged · 0 spaced · scripts=3 latin, 1 other
Recall path: ~/.openclaw/rush/memory/.dreams/short-term-recall.json
Recall updated: 2026-04-12T21:50:48.770Z
QMD audit: ~/.openclaw/agents/rush/qmd/xdg-cache/qmd/index.sqlite · 7335936 bytes · 5 collections
This is useful. QMD itself is alive and indexing, so we’re past the “QMD is broken entirely” stage.
Next, let’s verify the extra path actually has Markdown files that match **/*.md:
echo '=== all files ==='
find /home/totaluser/.openclaw/yr-knowledge -type f | sed -n '1,20p'
echo
echo '=== markdown count ==='
find /home/totaluser/.openclaw/yr-knowledge -type f -name '*.md' | wc -l
Paste that output, then I’ll narrow it down further.
totaluser@Total-Hardware:~$ echo '=== all files ==='
find /home/totaluser/.openclaw/yr-knowledge -type f | sed -n '1,20p'
echo
echo '=== markdown count ==='
find /home/totaluser/.openclaw/yr-knowledge -type f -name '*.md' | wc -l
=== all files ===
/home/totaluser/.openclaw/yr-knowledge/index.md
/home/totaluser/.openclaw/yr-knowledge/2026/glossary.md
/home/totaluser/.openclaw/yr-knowledge/2026/decisions.md
/home/totaluser/.openclaw/yr-knowledge/2026/overview.md
/home/totaluser/.openclaw/yr-knowledge/2026/facts.md
/home/totaluser/.openclaw/yr-knowledge/2026/stakeholders.md
/home/totaluser/.openclaw/yr-knowledge/2026/timeline.md
/home/totaluser/.openclaw/yr-knowledge/contacts/satellite-location-pastors.md
/home/totaluser/.openclaw/yr-knowledge/contacts/education-az-conference.md
/home/totaluser/.openclaw/yr-knowledge/contacts/thunderbird-adventist-academy.md
/home/totaluser/.openclaw/yr-knowledge/contacts/conference-administration.md
/home/totaluser/.openclaw/yr-knowledge/contacts/additional-phoenix-churches.md
/home/totaluser/.openclaw/yr-knowledge/contacts/phoenix-central-valley-spanish.md
/home/totaluser/.openclaw/yr-knowledge/contacts/glendale-sda-church.md
/home/totaluser/.openclaw/yr-knowledge/contacts/youth-ministries-az-conference.md
/home/totaluser/.openclaw/yr-knowledge/contacts/phoenix-camelback-sda.md
/home/totaluser/.openclaw/yr-knowledge/contacts/glenview-adventist-academy.md
/home/totaluser/.openclaw/yr-knowledge/contacts/phoenix-paradise-valley-sda.md
/home/totaluser/.openclaw/yr-knowledge/contacts/thunderbird-christian-elementary.md
/home/totaluser/.openclaw/yr-knowledge/past/master-schedule-2025.md
=== markdown count ===
38
totaluser@Total-Hardware:~$
Nice, that rules out the obvious file-pattern problem. QMD should be able to index that tree.
Next, let’s test whether rush can actually retrieve from it. Try this:
openclaw memory search --agent rush --query "Thunderbird Adventist Academy" --max-results 5 --json
Paste the output. If that comes back empty, we’re very close to the real bug.
18:09:34-07:00 [plugins] plugins.allow is empty; discovered non-bundled plugins may auto-load: lossless-claw (/home/totaluser/.openclaw/extensions/lossless-claw/dist/index.js). Set plugins.allow to explicit trusted ids.
18:09:38-07:00 [memory] qmd collection add skipped for memory-alt-rush: qmd collection add /home/totaluser/.openclaw/rush --name memory-alt-rush --glob memory.md failed (code 1): A collection already exists for this path and pattern:
Name: memory-root-rush (qmd://memory-root-rush/)
Pattern: **/*.md
Use 'qmd update' to re-index it, or remove it first with 'qmd collection remove memory-root-rush'
18:09:45-07:00 [memory] qmd search failed because a managed collection is missing; repairing collections and retrying once
18:09:47-07:00 [memory] qmd collection add skipped for memory-alt-rush: qmd collection add /home/totaluser/.openclaw/rush --name memory-alt-rush --glob memory.md failed (code 1): A collection already exists for this path and pattern:
Name: memory-root-rush (qmd://memory-root-rush/)
Pattern: **/*.md
Use 'qmd update' to re-index it, or remove it first with 'qmd collection remove memory-root-rush'
18:09:48-07:00 [memory] qmd search failed: Error: qmd search Thunderbird Adventist Academy --json -n 5 -c memory-alt-rush failed (code 1): Collection not found: memory-alt-rush
there is another half to this i will send it right after
Yep, send the second half.
But I already see the likely bug: OpenClaw is trying to search memory-alt-rush, but QMD only has memory-root-rush. So this looks like stale/legacy collection state, not “your extra path config is wrong”.
18:09:48-07:00 [memory] qmd memory failed; switching to builtin index: qmd search Thunderbird Adventist Academy --json -n 5 -c memory-alt-rush failed (code 1): Collection not found: memory-alt-rush
{
"results": [
{
"id": "5bfc4f6c9550b2335309f58ae146cb26967875ec7d4e9a05c9fc8db549588f9b",
"path": "memory/2026-03-16.md",
"startLine": 1,
"endLine": 33,
"score": 0.6630591909393899,
"textScore": 0.6630591909393899,
"snippet": "March 16, 2026 - Recruiting Churches Research\n\nTask\nResearched pastors and phone numbers for AZ Conference recruiting churches (English and Spanish).\n\n Churches Identified\n\nEnglish Churches\n1. Tempe SDA - Pastor: Michael A Soto, Phone: xxx-xxx-xxxxn2. Glendale SDA - Pastor: Gary Venden, Associates: Myles Reiner, Zack Surovec, Eddie Turner, Phones:(website), \n3. Phoenix Paradise Valley - Pastor: Paul Blake, Assoc: Hugh Barton, Phones: \n4. Chandler SDA - Pastor: Edward Anderson Jr, Phone: \n5. Chandler Fil-Am - P",
"source": "memory"
}
]
}
18:09:48-07:00 [memory] chunks written for memory/2026-03-16.md without vector embeddings — chunks_vec not updated (sqlite-vec unavailable). Vector recall degraded for this file.
totaluser@Total-Hardware:~$
i have deleted phone numbers but they were there.
it seems like its pulling info from teh memory folder
Yep, exactly. It’s falling back to the builtin index because one of rush’s managed QMD collections is stale/mismatched.
Next one, let’s inspect the actual QMD collections for rush:
XDG_CONFIG_HOME=/home/totaluser/.openclaw/agents/rush/qmd/xdg-config \
XDG_CACHE_HOME=/home/totaluser/.openclaw/agents/rush/qmd/xdg-cache \
QMD_CONFIG_DIR=/home/totaluser/.openclaw/agents/rush/qmd/xdg-config/qmd \
qmd collection list --json
Paste that output. After that I should be able to give you the cleanup command directly.
totaluser@Total-Hardware:~$ XDG_CONFIG_HOME=/home/totaluser/.openclaw/agents/rush/qmd/xdg-config
XDG_CACHE_HOME=/home/totaluser/.openclaw/agents/rush/qmd/xdg-cache
QMD_CONFIG_DIR=/home/totaluser/.openclaw/agents/rush/qmd/xdg-config/qmd
qmd collection list --json
Collections (4):
memory-dir-rush (qmd://memory-dir-rush/)
Pattern: **/*.md
Files: 5
Updated: 7h ago
yr-knowledge (qmd://yr-knowledge/)
Pattern: **/*.md
Files: 38
Updated: 4h ago
sessions-rush (qmd://sessions-rush/)
Pattern: **/*.md
Files: 7
Updated: 1m ago
memory-root-rush (qmd://memory-root-rush/)
Pattern: **/*.md
Files: 108
Updated: 6h ago
totaluser@Total-Hardware:~$
Aha, there it is.
yr-knowledge is indexed, 38 files. The real problem is that memory-root-rush is wrong, it has **/*.md on the workspace root, so OpenClaw can’t create the expected memory-alt-rush collection and then QMD search blows up and falls back to builtin.
Next step, remove just that broken collection for rush. This does not delete your markdown files, only the bad QMD collection entry:
XDG_CONFIG_HOME=/home/totaluser/.openclaw/agents/rush/qmd/xdg-config \
XDG_CACHE_HOME=/home/totaluser/.openclaw/agents/rush/qmd/xdg-cache \
QMD_CONFIG_DIR=/home/totaluser/.openclaw/agents/rush/qmd/xdg-config/qmd \
qmd collection remove memory-root-rush
Paste the output, then I’ll give you the reindex command.
totaluser@Total-Hardware:~$ XDG_CONFIG_HOME=/home/totaluser/.openclaw/agents/rush/qmd/xdg-config
XDG_CACHE_HOME=/home/totaluser/.openclaw/agents/rush/qmd/xdg-cache
QMD_CONFIG_DIR=/home/totaluser/.openclaw/agents/rush/qmd/xdg-config/qmd
qmd collection remove memory-root-rush
âś“ Removed collection 'memory-root-rush'
Deleted 458 documents
Cleaned up 103 orphaned content hashes
totaluser@Total-Hardware:~$
Nice. That’s the broken piece gone.
Next one, rebuild rush’s managed QMD collections cleanly:
openclaw memory index --agent rush --force --verbose
Paste that output, then we’ll do one search check.
totaluser@Total-Hardware:~$ openclaw memory index --agent rush --force --verbose
19:36:41-07:00 [plugins] plugins.allow is empty; discovered non-bundled plugins may auto-load: lossless-claw (/home/totaluser/.openclaw/extensions/lossless-claw/dist/index.js). Set plugins.allow to explicit trusted ids.
🦞 OpenClaw 2026.4.11 (769908e)
I don't have opinions about tabs vs spaces. I have opinions about everything else.
19:36:45-07:00 [memory] qmd collection add skipped for memory-alt-rush: qmd collection add /home/totaluser/.openclaw/rush --name memory-alt-rush --glob memory.md failed (code 1): A collection already exists for this path and pattern:
Name: memory-root-rush (qmd://memory-root-rush/)
Pattern: **/*.md
Use 'qmd update' to re-index it, or remove it first with 'qmd collection remove memory-root-rush'
Memory Index (rush)
Provider: qmd (requested: qmd)
Model: qmd
Sources: memory (MEMORY.md + ~/.openclaw/rush/memory/.md), sessions (~/.openclaw/agents/rush/sessions/.jsonl)
19:36:46-07:00 [bedrock-mantle-discovery] Mantle IAM token generation unavailable
QMD index: ~/.openclaw/agents/rush/qmd/xdg-cache/qmd/index.sqlite (7733248 bytes)
Memory index updated (rush).
totaluser@Total-Hardware:~$
?
Sorry, just this command next:
qmd --version
Paste the output. I’m checking whether the QMD CLI itself is the mismatch here.
totaluser@Total-Hardware:~$ qmd --version
Usage:
qmd collection add [path] --name <name> --mask <pattern> - Create/index collection
qmd collection list - List all collections with details
qmd collection remove <name> - Remove a collection by name
qmd collection rename <old> <new> - Rename a collection
qmd ls [collection[/path]] - List collections or files in a collection
qmd context add [path] "text" - Add context for path (defaults to current dir)
qmd context list - List all contexts
qmd context rm <path> - Remove context
this is the first half
qmd get <file>[:line] [-l N] [--from N] - Get document (optionally from line, max N lines)
qmd multi-get <pattern> [-l N] [--max-bytes N] - Get multiple docs by glob or comma-separated list
qmd status - Show index status and collections
qmd update [--pull] - Re-index all collections (--pull: git pull first)
qmd embed [-f] - Create vector embeddings (800 tokens/chunk, 15% overlap)
qmd cleanup - Remove cache and orphaned data, vacuum DB
qmd search <query> - Full-text search (BM25)
qmd vsearch <query> - Vector similarity search
qmd query <query> - Combined search with query expansion + reranking
qmd mcp - Start MCP server (stdio transport)
qmd mcp --http [--port N] - Start MCP server (HTTP transport, default port 8181)
qmd mcp --http --daemon - Start MCP server as background daemon
qmd mcp stop - Stop background MCP daemon
Global options:
--index <name> - Use custom index name (default: index)
Search options:
-n <num> - Number of results (default: 5, or 20 for --files)
--all - Return all matches (use with --min-score to filter)
--min-score <num> - Minimum similarity score
--full - Output full document instead of snippet
--line-numbers - Add line numbers to output
--files - Output docid,score,filepath,context (default: 20 results)
--json - JSON output with snippets (default: 20 results)
--csv - CSV output with snippets
--md - Markdown output
--xml - XML output
-c, --collection <name> - Filter results to a specific collection
sorry there is one more section
Multi-get options:
-l <num> - Maximum lines per file
--max-bytes <num> - Skip files larger than N bytes (default: 10240)
--json/--csv/--md/--xml/--files - Output format (same as search)
Models (auto-downloaded from HuggingFace):
Embedding: embeddinggemma-300M-Q8_0
Reranking: qwen3-reranker-0.6b-q8_0
Generation: Qwen3-0.6B-Q8_0
Index: /home/totaluser/.cache/qmd/index.sqlite
totaluser@Total-Hardware:~$
ok thats the entire ouput
Yep, that basically confirms it. Your qmd is old enough that it’s printing usage instead of a real version, and that matches the collection weirdness we’re seeing.
Next step, update QMD:
pnpm add -g @tobilu/qmd@latest
Paste the output, then we’ll re-check qmd --version and rebuild rush cleanly.
That’s enough, no need for the last section 👍
Please run this next:
pnpm add -g @tobilu/qmd@latest
Then paste the output. After that we’ll re-check qmd --version and rebuild rush cleanly.
Yep, perfect, that confirms it.
Your current qmd is definitely on the older CLI behavior. Let’s actually update it now:
pnpm add -g @tobilu/qmd@latest
Paste the output from that command. Then I’ll have you run qmd --version right after.
totaluser@Total-Hardware:~$ pnpm add -g @tobilu/qmd@latest
 ERR_PNPM_NO_GLOBAL_BIN_DIR  Unable to find the global bin directory
Run "pnpm setup" to create it automatically, or set the global-bin-dir setting, or the PNPM_HOME env variable. The global bin directory should be in the PATH.
totaluser@Total-Hardware:~$
Yep, that’s just pnpm not being set up globally on this machine yet.
Next one:
pnpm setup
Paste the output. If it asks you to restart the shell, I’ll give you the exact next command after that.
totaluser@Total-Hardware:~$ pnpm setup
Appended new lines to /home/totaluser/.bashrc
Next configuration changes were made:
export PNPM_HOME="/home/totaluser/.local/share/pnpm"
case ":$PATH:" in
":$PNPM_HOME:") ;;
*) export PATH="$PNPM_HOME:$PATH" ;;
esac
To start using pnpm, run:
source /home/totaluser/.bashrc
totaluser@Total-Hardware:~$
Perfect.
Next one:
source /home/totaluser/.bashrc && pnpm add -g @tobilu/qmd@latest
Paste the output, then we’ll verify the new qmd version.
totaluser@Total-Hardware:~$ source /home/totaluser/.bashrc && pnpm add -g @tobilu/qmd@latest
â•──────────────────────────────────────────╮
│ │
│ Update available! 10.30.2 → 10.33.0. │
│ Changelog: https://pnpm.io/v/10.33.0 │
│ To update, run: pnpm self-update │
│ │
╰──────────────────────────────────────────╯
Downloading @node-llama-cpp/linux-x64@3.18.1: 7.73 MB/7.73 MB, done
Downloading @node-llama-cpp/linux-x64-vulkan@3.18.1: 24.69 MB/24.69 MB, done
 WARN  1 deprecated subdependencies found: prebuild-install@7.1.3
Packages: +258
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Downloading node-llama-cpp@3.18.1: 28.99 MB/28.99 MB, done
Downloading @node-llama-cpp/linux-x64-cuda@3.18.1: 125.19 MB/125.19 MB, done
Downloading @node-llama-cpp/linux-x64-cuda-ext@3.18.1: 194.62 MB/194.62 MB, done
Progress: resolved 276, reused 0, downloaded 258, added 258, done
/home/totaluser/.local/share/pnpm/global/5:
- @tobilu/qmd 2.1.0
╠Warning ─────────────────────────────────────────────────────────────────────╮
│ │
│ Ignored build scripts: better-sqlite3@12.8.0, node-llama-cpp@3.18.1, │
│ tree-sitter-go@0.23.4, tree-sitter-javascript@0.23.1, │
│ tree-sitter-python@0.23.4, tree-sitter-rust@0.24.0, │
│ tree-sitter-typescript@0.23.2. │
│ Run "pnpm approve-builds -g" to pick which dependencies should be │
│ allowed to run scripts. │
│ │
╰──────────────────────────────────────────────────────────────────────────────╯
Done in 20.2s using pnpm v10.30.2
totaluser@Total-Hardware:~$
Nice, you’ve got QMD 2.1.0 installed now.
Next one, let’s make sure your shell is actually using the new binary:
source /home/totaluser/.bashrc && which qmd && qmd --version
Paste that output. After that we’ll reset rush cleanly against the new QMD.
totaluser@Total-Hardware:~$ source /home/totaluser/.bashrc && which qmd && qmd --version
/home/totaluser/.bun/bin/qmd
Usage:
qmd collection add [path] --name <name> --mask <pattern> - Create/index collection
qmd collection list - List all collections with details
qmd collection remove <name> - Remove a collection by name
qmd collection rename <old> <new> - Rename a collection
qmd ls [collection[/path]] - List collections or files in a collection
qmd context add [path] "text" - Add context for path (defaults to current dir)
qmd context list - List all contexts
qmd context rm <path> - Remove context
qmd get <file>[:line] [-l N] [--from N] - Get document (optionally from line, max N lines)
qmd multi-get <pattern> [-l N] [--max-bytes N] - Get multiple docs by glob or comma-separated list
qmd status - Show index status and collections
qmd update [--pull] - Re-index all collections (--pull: git pull first)
qmd embed [-f] - Create vector embeddings (800 tokens/chunk, 15% overlap)
qmd cleanup - Remove cache and orphaned data, vacuum DB
qmd search <query> - Full-text search (BM25)
qmd vsearch <query> - Vector similarity search
qmd query <query> - Combined search with query expansion + reranking
qmd mcp - Start MCP server (stdio transport)
qmd mcp --http [--port N] - Start MCP server (HTTP transport, default port 8181)
qmd mcp --http --daemon - Start MCP server as background daemon
qmd mcp stop - Stop background MCP daemon
Global options:
--index <name> - Use custom index name (default: index)
in two halves this is the first half
Search options:
-n <num> - Number of results (default: 5, or 20 for --files)
--all - Return all matches (use with --min-score to filter)
--min-score <num> - Minimum similarity score
--full - Output full document instead of snippet
--line-numbers - Add line numbers to output
--files - Output docid,score,filepath,context (default: 20 results)
--json - JSON output with snippets (default: 20 results)
--csv - CSV output with snippets
--md - Markdown output
--xml - XML output
-c, --collection <name> - Filter results to a specific collection
Multi-get options:
-l <num> - Maximum lines per file
--max-bytes <num> - Skip files larger than N bytes (default: 10240)
--json/--csv/--md/--xml/--files - Output format (same as search)
Models (auto-downloaded from HuggingFace):
Embedding: embeddinggemma-300M-Q8_0
Reranking: qwen3-reranker-0.6b-q8_0
Generation: Qwen3-0.6B-Q8_0
Index: /home/totaluser/.cache/qmd/index.sqlite
totaluser@Total-Hardware:~$
second half
That’s the bug. Your shell is still picking the old Bun qmd here:
/home/totaluser/.bun/bin/qmd
So the new install is not what OpenClaw is using yet.
No need for the second half. Next one:
/home/totaluser/.local/share/pnpm/qmd --version
Paste that output. If that works, we’ll point OpenClaw directly at that binary so it stops using the old Bun one.
All good, ignore that old second half.
Please run this exact command now:
/home/totaluser/.local/share/pnpm/qmd --version
That checks the new QMD binary directly, instead of the old Bun one. Paste that output.
totaluser@Total-Hardware:~$ /home/totaluser/.local/share/pnpm/qmd --version
qmd 2.1.0
totaluser@Total-Hardware:~$
Perfect. That’s the good binary.
Next, point OpenClaw at it explicitly so it stops using the old Bun one:
openclaw config set memory.qmd.command /home/totaluser/.local/share/pnpm/qmd
Paste the output, then we’ll reindex rush again using the correct QMD.
totaluser@Total-Hardware:~$ openclaw config set memory.qmd.command /home/totaluser/.local/share/pnpm/qmd
🦞 OpenClaw 2026.4.11 (769908e)
I'm basically a Swiss Army knife, but with more opinions and fewer sharp edges.
Config overwrite: /home/totaluser/.openclaw/openclaw.json (sha256 90aee0e8f48560b2e81f4acf52ccbd9af6d32b8c9ffafc81d2704e833cb238fc -> 18116df3598db9ad33c518e17b7bd95f04dfbc6e47580634e48bbbbcec041bc5, backup=/home/totaluser/.openclaw/openclaw.json.bak)
Updated memory.qmd.command. Restart the gateway to apply.
totaluser@Total-Hardware:~$
Nice. Now let’s make the gateway pick up that new QMD path.
Next one:
openclaw gateway restart
Paste the output, then we’ll reindex rush one more time.
can i also make it so that my system uses the new qmd when i type in like "qmd" into the cli?
Yep. Right now ~/.bun/bin is winning in PATH, so your shell keeps hitting the old one.
We can fix that too, but I’d finish the OpenClaw side first so we don’t mix two changes at once.
Next one:
openclaw gateway restart
Paste that output, then I’ll give you:
- the reindex check, and
- the clean shell fix so plain
qmduses the new binary too.
ok it restarted cleanly
Nice. Next one, reindex rush again with the new QMD binary wired in:
openclaw memory index --agent rush --force --verbose
Paste that output. If that looks clean, we’ll do one search check right after.
There are multiple parts. Here is one part wait until i tell you "im done sending them"
totaluser@Total-Hardware:~$ openclaw memory index --agent rush --force --verbose
19:49:34-07:00 [plugins] plugins.allow is empty; discovered non-bundled plugins may auto-load: lossless-claw (/home/totaluser/.openclaw/extensions/lossless-claw/dist/index.js). Set plugins.allow to explicit trusted ids.
🦞 OpenClaw 2026.4.11 (769908e)
Your task has been queued; your dignity has been deprecated.
19:49:38-07:00 [memory] qmd collection add skipped for memory-root-rush: qmd collection add /home/totaluser/.openclaw/rush --name memory-root-rush --glob MEMORY.md failed (code 1): Collection 'memory-root-rush' already exists.
Use a different name with --name <n>
19:49:39-07:00 [bedrock-mantle-discovery] Mantle IAM token generation unavailable
19:49:43-07:00 [memory] qmd collection add skipped for memory-alt-rush: qmd collection add /home/totaluser/.openclaw/rush --name memory-alt-rush --glob memory.md failed (code 1): A collection already exists for this path and pattern:
Name: memory-root-rush (qmd://memory-root-rush/)
Pattern: **/*.md
Use 'qmd update' to re-index it, or remove it first with 'qmd collection remove memory-root-rush'
19:49:46-07:00 [memory] qmd collection add skipped for memory-dir-rush: qmd collection add /home/totaluser/.openclaw/rush/memory --name memory-dir-rush --glob **/*.md failed (code 1): Collection 'memory-dir-rush' already exists.
Use a different name with --name <n>
19:49:47-07:00 [memory] qmd collection add skipped for yr-knowledge: qmd collection add /home/totaluser/.openclaw/yr-knowledge --name yr-knowledge --glob **/*.md failed (code 1): Collection 'yr-knowledge' already exists.
Use a different name with --name <n>
19:49:47-07:00 [memory] qmd collection add skipped for sessions-rush: qmd collection add /home/totaluser/.openclaw/agents/rush/qmd/sessions --name sessions-rush --glob **/*.md failed (code 1): Collection 'sessions-rush' already exists.
Got it, I’ll wait. Send the rest, and I won’t diagnose until you say “im done sending them”.
Use a different name with --name <n>
Memory Index (rush)
Provider: qmd (requested: qmd)
Model: qmd
Sources: memory (MEMORY.md + ~/.openclaw/rush/memory/.md), sessions (~/.openclaw/agents/rush/sessions/.jsonl)
19:49:48-07:00 [memory] qmd boot update failed: Error: qmd update failed (code 1): /home/totaluser/.local/share/pnpm/global/5/.pnpm/bindings@1.5.0/node_modules/bindings/bindings.js:126
err = new Error(
^
Error: Could not locate the bindings file. Tried:
→ /home/totaluser/.local/share/pnpm/global/5/.pnpm/better-sqlite3@12.8.0/node_modules/better-sqlite3/build/better_sqlite3.node
→ /home/totaluser/.local/share/pnpm/global/5/.pnpm/better-sqlite3@12.8.0/node_modules/better-sqlite3/build/Debug/better_sqlite3.node
→ /home/totaluser/.local/share/pnpm/global/5/.pnpm/better-sqlite3@12.8.0/node_modules/better-sqlite3/build/Release/better_sqlite3.node
→ /home/totaluser/.local/share/pnpm/global/5/.pnpm/better-sqlite3@12.8.0/node_modules/better-sqlite3/out/Debug/better_sqlite3.node
→ /home/totaluser/.local/share/pnpm/global/5/.pnpm/better-sqlite3@12.8.0/node_modules/better-sqlite3/Debug/better_sqlite3.node
→ /home/totaluser/.local/share/pnpm/global/5/.pnpm/better-sqlite3@12.8.0/node_modules/better-sqlite3/out/Release/better_sqlite3.node
→ /home/totaluser/.local/share/pnpm/global/5/.pnpm/better-sqlite3@12.8.0/node_modules/better-sqlite3/Release/better_sqlite3.node
→ /home/totaluser/.local/share/pnpm/global/5/.pnpm/better-sqlite3@12.8.0/node_modules/better-sqlite3/build/default/better_sqlite3.node
→ /home/totaluser/.local/share/pnpm/global/5/.pnpm/better-sqlite3@12.8.0/node_modules/better-sqlite3/compiled/25.6.1/linux/x64/better_sqlite3.node
→ /home/totaluser/.local/share/pnpm/global/5/.pnpm/better-sqlite3@12.8.0/node_modules/better-sqlite3/addon-build/release/install-root/better_sqlite3.node
→ /home/totaluser/.local/share/pnpm/global/5/.pnpm/better-sqlite3@12.8.0/node_modules/better-sqlite3/addon-build/debug/install-root/better_sqlite3.node
→ /home/totaluser/.local/share/pnpm/global/5/.pnpm/better-sqlite3@12.8.0/node_modules/better-sqlite3/addon-build/default/install-root/better_sqlite3.node
→ /home/totaluser/.local/share/pnpm/global/5/.pnpm/better-sqlite3@12.8.0/node_modules/better-sqlite3/lib/binding/node-v141-linux-x64/better_sqlite3.node
at bindings (/home/totaluser/.local/share/pnpm/global/5/.pnpm/bindings@1.5.0/node_modules/bindings/bindings.js:126:9)
at new Database (/home/totaluser/.local/share/pnpm/global/5/.pnpm/better-sqlite3@12.8.0/node_modules/better-sqlite3/lib/database.js:48:64)
at openDatabase (file:///home/totaluser/.local/share/pnpm/global/5/.pnpm/@tobilu+qmd@2.1.0_typescript@5.9.3/node_modules/@tobilu/qmd/dist/db.js:58:12)
at createStore (file:///home/totaluser/.local/share/pnpm/global/5/.pnpm/@tobilu+qmd@2.1.0_typescript@5.9.3/node_modules/@tobilu/qmd/dist/store.js:1175:16)
at getStore (file:///home/totaluser/.local/share/pnpm/global/5/.pnpm/@tobilu+qmd@2.1.0_typescript@5.9.3/node_modules/@tobilu/qmd/dist/cli/qmd.js:25:17)
at getDb (file:///home/totaluser/.local/share/pnpm/global/5/.pnpm/@tobilu+qmd@2.1.0_typescript@5.9.3/node_modules/@tobilu/qmd/dist/cli/qmd.js:45:12)
at updateCollections (file:///home/totaluser/.local/share/pnpm/global/5/.pnpm/@tobilu+qmd@2.1.0_typescript@5.9.3/node_modules/@tobilu/qmd/dist/cli/qmd.js:414:16)
at file:///home/totaluser/.local/share/pnpm/global/5/.pnpm/@tobilu+qmd@2.1.0_typescript@5.9.3/node_modules/@tobilu/qmd/dist/cli/qmd.js:2665:19 {
tries: [
'/home/totaluser/.local/share/pnpm/global/5/.pnpm/better-sqlite3@12.8.0/node_modules/better-sqlite3/build/better_sqlite3.node',
'/home/totaluser/.local/share/pnpm/global/5/.pnpm/better-sqlite3@12.8.0/node_modules/better-sqlite3/build/Debug/better_sqlite3.node',
'/home/totaluser/.local/share/pnpm/global/5/.pnpm/better-sqlite3@12.8.0/node_modules/better-sqlite3/build/Release/better_sqlite3.node',
'/home/totaluser/.local/share/pnpm/global/5/.pnpm/better-sqlite3@12.8.0/node_modules/better-sqlite3/out/Debug/better_sqlite3.node',
'/home/totaluser/.local/share/pnpm/global/5/.pnpm/better-sqlite3@12.8.0/node_modules/better-sqlite3/Debug/better_sqlite3.node',
'/home/totaluser/.local/share/pnpm/global/5/.pnpm/better-sqlite3@12.8.0/node_modules/better-sqlite3/out/Release/better_sqlite3.node',
'/home/totaluser/.local/share/pnpm/global/5/.pnpm/better-sqlite3@12.8.0/node_modules/better-sqlite3/Release/better_sqlite3.node',
'/home/totaluser/.local/share/pnpm/global/5/.pnpm/better-sqlite3@12.8.0/node_modules/better-sqlite3/build/default/better_sqlite3.node',
'/home/totaluser/.local/share/pnpm/global/5/.pnpm/better-sqlite3@12.8.0/node_modules/better-sqlite3/compiled/25.6.1/linux/x64/better_sqlite3.node',
'/home/totaluser/.local/share/pnpm/global/5/.pnpm/better-sqlite3@12.8.0/node_modules/better-sqlite3/addon-build/release/install-root/better_sqlite3.node',
'/home/totaluser/.local/share/pnpm/global/5/.pnpm/better-sqlite3@12.8.0/node_modules/better-sqlite3/addon-build/debug/install-root/better_sqlite3.node',
'/home/totaluser/.local/share/pnpm/global/5/.pnpm/better-sqlite3@12.8.0/node_modules/better-sqlite3/addon-build/default/install-root/better_sqlite3.node',
'/home/totaluser/.local/share/pnpm/global/5/.pnpm/better-sqlite3@12.8.0/node_modules/better-sqlite3/lib/binding/node-v141-linux-x64/better_sqlite3.node'
]
}
Node.js v25.6.1
Memory index failed (rush): qmd update failed (code 1): /home/totaluser/.local/share/pnpm/global/5/.pnpm/bindings@1.5.0/node_modules/bindings/bindings.js:126
err = new Error(
^
Error: Could not locate the bindings file. Tried:
Got it, still waiting. Send the rest, and I’ll hold off until you say “im done sending them”.
→ /home/totaluser/.local/share/pnpm/global/5/.pnpm/better-sqlite3@12.8.0/node_modules/better-sqlite3/build/better_sqlite3.node
→ /home/totaluser/.local/share/pnpm/global/5/.pnpm/better-sqlite3@12.8.0/node_modules/better-sqlite3/build/Debug/better_sqlite3.node
→ /home/totaluser/.local/share/pnpm/global/5/.pnpm/better-sqlite3@12.8.0/node_modules/better-sqlite3/build/Release/better_sqlite3.node
→ /home/totaluser/.local/share/pnpm/global/5/.pnpm/better-sqlite3@12.8.0/node_modules/better-sqlite3/out/Debug/better_sqlite3.node
→ /home/totaluser/.local/share/pnpm/global/5/.pnpm/better-sqlite3@12.8.0/node_modules/better-sqlite3/Debug/better_sqlite3.node
→ /home/totaluser/.local/share/pnpm/global/5/.pnpm/better-sqlite3@12.8.0/node_modules/better-sqlite3/out/Release/better_sqlite3.node
→ /home/totaluser/.local/share/pnpm/global/5/.pnpm/better-sqlite3@12.8.0/node_modules/better-sqlite3/Release/better_sqlite3.node
→ /home/totaluser/.local/share/pnpm/global/5/.pnpm/better-sqlite3@12.8.0/node_modules/better-sqlite3/build/default/better_sqlite3.node
→ /home/totaluser/.local/share/pnpm/global/5/.pnpm/better-sqlite3@12.8.0/node_modules/better-sqlite3/compiled/25.6.1/linux/x64/better_sqlite3.node
→ /home/totaluser/.local/share/pnpm/global/5/.pnpm/better-sqlite3@12.8.0/node_modules/better-sqlite3/addon-build/release/install-root/better_sqlite3.node
→ /home/totaluser/.local/share/pnpm/global/5/.pnpm/better-sqlite3@12.8.0/node_modules/better-sqlite3/addon-build/debug/install-root/better_sqlite3.node
→ /home/totaluser/.local/share/pnpm/global/5/.pnpm/better-sqlite3@12.8.0/node_modules/better-sqlite3/addon-build/default/install-root/better_sqlite3.node
→ /home/totaluser/.local/share/pnpm/global/5/.pnpm/better-sqlite3@12.8.0/node_modules/better-sqlite3/lib/binding/node-v141-linux-x64/better_sqlite3.node
at bindings (/home/totaluser/.local/share/pnpm/global/5/.pnpm/bindings@1.5.0/node_modules/bindings/bindings.js:126:9)
Still with you, send the rest. I’m waiting for “im done sending them” before I diagnose.
Still waiting, send any remaining part and then say “im done sending them”. After that I’ll summarize the fix cleanly.
at new Database (/home/totaluser/.local/share/pnpm/global/5/.pnpm/better-sqlite3@12.8.0/node_modules/better-sqlite3/lib/database.js:48:64)
at openDatabase (file:///home/totaluser/.local/share/pnpm/global/5/.pnpm/@tobilu+qmd@2.1.0_typescript@5.9.3/node_modules/@tobilu/qmd/dist/db.js:58:12)
at createStore (file:///home/totaluser/.local/share/pnpm/global/5/.pnpm/@tobilu+qmd@2.1.0_typescript@5.9.3/node_modules/@tobilu/qmd/dist/store.js:1175:16)
at getStore (file:///home/totaluser/.local/share/pnpm/global/5/.pnpm/@tobilu+qmd@2.1.0_typescript@5.9.3/node_modules/@tobilu/qmd/dist/cli/qmd.js:25:17)
at getDb (file:///home/totaluser/.local/share/pnpm/global/5/.pnpm/@tobilu+qmd@2.1.0_typescript@5.9.3/node_modules/@tobilu/qmd/dist/cli/qmd.js:45:12)
at updateCollections (file:///home/totaluser/.local/share/pnpm/global/5/.pnpm/@tobilu+qmd@2.1.0_typescript@5.9.3/node_modules/@tobilu/qmd/dist/cli/qmd.js:414:16)
at file:///home/totaluser/.local/share/pnpm/global/5/.pnpm/@tobilu+qmd@2.1.0_typescript@5.9.3/node_modules/@tobilu/qmd/dist/cli/qmd.js:2665:19 {
tries: [
'/home/totaluser/.local/share/pnpm/global/5/.pnpm/better-sqlite3@12.8.0/node_modules/better-sqlite3/build/better_sqlite3.node',
'/home/totaluser/.local/share/pnpm/global/5/.pnpm/better-sqlite3@12.8.0/node_modules/better-sqlite3/build/Debug/better_sqlite3.node',
'/home/totaluser/.local/share/pnpm/global/5/.pnpm/better-sqlite3@12.8.0/node_modules/better-sqlite3/build/Release/better_sqlite3.node',
'/home/totaluser/.local/share/pnpm/global/5/.pnpm/better-sqlite3@12.8.0/node_modules/better-sqlite3/out/Debug/better_sqlite3.node',
'/home/totaluser/.local/share/pnpm/global/5/.pnpm/better-sqlite3@12.8.0/node_modules/better-sqlite3/Debug/better_sqlite3.node',
'/home/totaluser/.local/share/pnpm/global/5/.pnpm/better-sqlite3@12.8.0/node_modules/better-sqlite3/out/Release/better_sqlite3.node',
Still waiting for the last bit. When you’re done, send “im done sending them” and I’ll wrap it up cleanly.
Still waiting for the final chunk. When you’re done, send “im done sending them” and I’ll give you the fix.
'/home/totaluser/.local/share/pnpm/global/5/.pnpm/better-sqlite3@12.8.0/node_modules/better-sqlite3/Release/better_sqlite3.node',
'/home/totaluser/.local/share/pnpm/global/5/.pnpm/better-sqlite3@12.8.0/node_modules/better-sqlite3/build/default/better_sqlite3.node',
'/home/totaluser/.local/share/pnpm/global/5/.pnpm/better-sqlite3@12.8.0/node_modules/better-sqlite3/compiled/25.6.1/linux/x64/better_sqlite3.node',
'/home/totaluser/.local/share/pnpm/global/5/.pnpm/better-sqlite3@12.8.0/node_modules/better-sqlite3/addon-build/release/install-root/better_sqlite3.node',
'/home/totaluser/.local/share/pnpm/global/5/.pnpm/better-sqlite3@12.8.0/node_modules/better-sqlite3/addon-build/debug/install-root/better_sqlite3.node',
'/home/totaluser/.local/share/pnpm/global/5/.pnpm/better-sqlite3@12.8.0/node_modules/better-sqlite3/addon-build/default/install-root/better_sqlite3.node',
'/home/totaluser/.local/share/pnpm/global/5/.pnpm/better-sqlite3@12.8.0/node_modules/better-sqlite3/lib/binding/node-v141-linux-x64/better_sqlite3.node'
]
}
Node.js v25.6.1
totaluser@Total-Hardware:~$
im done sending them
Nice, we found it.
You actually had two separate problems:
- OpenClaw was using the old Bun qmd.
- The new pnpm qmd is installed, but pnpm blocked its native build scripts, so
better-sqlite3is missing.
So the current blocker is the second one.
Next step:
pnpm approve-builds -g
When it opens, approve at least:
better-sqlite3node-llama-cpp
If it also shows the tree-sitter-* ones, approving those is fine too.
Paste what happens after that, and then I’ll give you the rebuild command.
ok i approved all build
Perfect.
Next one:
pnpm rebuild -g
Paste the output. If that finishes cleanly, we’ll do one quick QMD sanity check and then reset rush cleanly.
totaluser@Total-Hardware:~$ pnpm rebuild -g
 ERROR  Unknown option: 'global'
For help, run: pnpm help rebuild
totaluser@Total-Hardware:~$
Ah, pnpm is being annoying with flag order.
Use this exact one instead:
pnpm --global rebuild
Paste the output.
totaluser@Total-Hardware:~$ pnpm --global rebuild
 ERROR  Unknown option: 'global'
For help, run: pnpm help rebuild
totaluser@Total-Hardware:~$
Yep, let’s sidestep pnpm’s global flag weirdness.
Run this exact command:
cd /home/totaluser/.local/share/pnpm/global/5 && pnpm rebuild better-sqlite3 node-llama-cpp
Paste the output.
totaluser@Total-Hardware:~$ cd /home/totaluser/.local/share/pnpm/global/5 && pnpm rebuild better-sqlite3 node-llama-cpp
totaluser@Total-Hardware:~/.local/share/pnpm/global/5$
Nice, no error there, good sign.
Quick sanity check on the new QMD binary itself:
/home/totaluser/.local/share/pnpm/qmd status
Paste the output. If that works, we’ll do the final cleanup/reset for rush.
totaluser@Total-Hardware:~/.local/share/pnpm/global/5$ /home/totaluser/.local/share/pnpm/qmd status
QMD Status
Index: /home/totaluser/.cache/qmd/index.sqlite
Size: 36.1 MB
Documents
Total: 1604 files indexed
Vectors: 3298 embedded
Updated: 3h ago
AST Chunking
Status: active
Languages: typescript, tsx, javascript, python, go, rust
Collections
total-shared (qmd://total-shared/)
Pattern: **/.md
Files: 875 (updated 3h ago)
research (qmd://research/)
Pattern: **/.md
Files: 296 (updated 13h ago)
memory (qmd://memory/)
Pattern: .md
Files: 44 (updated 3h ago)
vital-research (qmd://vital-research/)
Pattern: **/.md
Files: 389 (updated 17d ago)
Examples
List files in a collection
qmd ls total-shared
Get a document
qmd get qmd://total-shared/path/to/file.md
Search within a collection
qmd search "query" -c total-shared
Models
Embedding: https://huggingface.co/ggml-org/embeddinggemma-300M-GGUF
Reranking: https://huggingface.co/ggml-org/Qwen3-Reranker-0.6B-Q8_0-GGUF
Generation: https://huggingface.co/tobil/qmd-query-expansion-1.7B-gguf
Device
GPU: vulkan (offloading: yes)
Devices: NVIDIA RTX A4000
VRAM: 14.9 GB free / 15.2 GB total
CPU: 4 math cores
Tips
Add context to collections for better search results: total-shared, research, memory +1 more
qmd context add qmd://<name>/ "What this collection contains"
qmd context add qmd://<name>/meeting-notes "Weekly team meeting notes"
Add update commands to keep collections fresh: total-shared, research, memory +1 more
qmd collection update-cmd <name> 'git stash && git pull --rebase --ff-only && git stash pop'
totaluser@Total-Hardware:~/.local/share/pnpm/global/5$
Beautiful. The new QMD binary is healthy now.
What’s left is the stale rush QMD state that the old Bun binary created. We’re going to back that up and let OpenClaw rebuild it cleanly.
Next one:
openclaw gateway stop
Paste the output, then I’ll give you the backup/reset command.
ok i stopped it
Nice.
Next one, back up the broken rush QMD state directory so the gateway can recreate it fresh:
mv /home/totaluser/.openclaw/agents/rush/qmd /home/totaluser/.openclaw/agents/rush/qmd.bak.$(date +%s)
Paste the output, then we’ll start the gateway again.
ok i did that one
Perfect.
Next one:
openclaw gateway start
Paste the output, then we’ll rebuild rush from scratch.
ok its restarted
Nice. Now the real test.
Next one:
openclaw memory index --agent rush --force --verbose
Paste the output. If this comes back clean, we’re almost done.
totaluser@Total-Hardware:~$ openclaw memory index --agent rush --force --verbose
20:02:59-07:00 [plugins] plugins.allow is empty; discovered non-bundled plugins may auto-load: lossless-claw (/home/totaluser/.openclaw/extensions/lossless-claw/dist/index.js). Set plugins.allow to explicit trusted ids.
🦞 OpenClaw 2026.4.11 (769908e)
Self-hosted, self-updating, self-aware (just kidding... unless?).
20:03:01-07:00 [memory] symlinked qmd models: /home/totaluser/.cache/qmd/models → /home/totaluser/.openclaw/agents/rush/qmd/xdg-cache/qmd/models
20:03:03-07:00 [memory] qmd collection add skipped for memory-alt-rush: qmd collection add /home/totaluser/.openclaw/rush --name memory-alt-rush --glob memory.md failed (code 1): A collection already exists for this path and pattern:
Name: memory-root-rush (qmd://memory-root-rush/)
Pattern: **/*.md
Use 'qmd update' to re-index it, or remove it first with 'qmd collection remove memory-root-rush'
20:03:03-07:00 [bedrock-mantle-discovery] Mantle IAM token generation unavailable
Memory Index (rush)
Provider: qmd (requested: qmd)
Model: qmd
Sources: memory (MEMORY.md + ~/.openclaw/rush/memory/.md), sessions (~/.openclaw/agents/rush/sessions/.jsonl)
QMD index: ~/.openclaw/agents/rush/qmd/xdg-cache/qmd/index.sqlite (6135808 bytes)
Memory index updated (rush).
totaluser@Total-Hardware:~$
Okay, we found the real boundary.
Even with:
- the new QMD 2.1.0
- the correct
memory.qmd.command - a fresh
rushQMD state
OpenClaw 2026.4.11 is still recreating the bad memory-root-rush collection shape. So at this point it looks like a version-specific OpenClaw/QMD compatibility bug, not your yr-knowledge path.
Two paths from here:
- Clean fix: update OpenClaw past
2026.4.11 - Fast workaround now, recommended: disable default QMD memory collections on this version, then add only the paths you actually want
I’d do the workaround now.
Next one:
openclaw config set memory.qmd.includeDefaultMemory false
Paste the output, then I’ll give you the per-agent path command for rush.
im not gonna disable default memory
Fair, I wouldn’t disable default memory either.
At this point I think the honest answer is: this is a 2026.4.11 bug/compat issue, not you misconfiguring yr-knowledge.
So the clean path now is to update OpenClaw.
If you want to preview first:
openclaw update --dry-run
If you just want to do it:
openclaw update
I’d recommend the real update. After that, rerun:
openclaw memory index --agent rush --force --verbose
If the latest version still recreates that bad memory-root-rush shape, then it’s GitHub-issue-worthy: https://github.com/openclaw/openclaw/issues
do i need to manually initiate qmd on the folder before i use it with openclaw?
No, you should not need to manually initialize QMD for OpenClaw.
OpenClaw is supposed to:
- create the QMD collections
- manage the per-agent QMD home
- run
qmd update/qmd embed - search those collections for you
So for your setup, manual QMD init is not the expected fix, and it would not solve the memory-root-rush / memory-alt-rush mismatch we hit.
Your extra path config shape was basically fine. The thing that broke was the OpenClaw 2026.4.11 + QMD behavior around default memory collections.
Docs:
If you want, I can help you do the least painful update path next.
ok i updated openclaw to the latest
Nice. First let’s confirm what you landed on:
openclaw --version
Paste that, then we’ll retry the rush index.
totaluser@Total-Hardware:~$ openclaw --version
OpenClaw 2026.4.11 (769908e)
it didnt actually update anythng cause i was already on it
Yep, that means stable/latest is still 2026.4.11 for your install path, so openclaw update had nothing newer to give you.
If you want to try a newer build for this fix, the next sensible check is the dev channel preview:
openclaw update --channel dev --dry-run
Paste that output.
If you do not want dev builds, then we’re basically down to:
- the config workaround, or
- filing a bug: https://github.com/openclaw/openclaw/issues