qmd-search
Skill410 starsChanged 5 months agoMITView on GitHub
This skill should be used to search the local Obsidian vault / markdown knowledge base by meaning, not just keywords, using the on-device qmd engine (BM25 + vector + LLM rerank). Trigger when the user asks to "search my vault/notes", "find notes about X", "what do my notes say about Y", "do I have anything on Z", "semantic search my knowledge base", or wants concept/cross-lingual retrieval over markdown. Fully local — nothing leaves the machine.
4 other projects use a version of this.
Adopted by
Most recently taken up by
- HurricaHjz/SecondSelftheir own version, first seen Oct 20, 2026
- HurricaHjz/second-yourselftheir own version, first seen Oct 1, 2026
- tkolleh/skillstheir own version, first seen Aug 17, 2026
- JAVICHILEON/claude---Skillsword for word, first seen Jul 1, 2026
Other versions4 projects use a version of this.
Word for word · 1
- JAVICHILEON/claude---Skills★ 0100% same
Edited · 0
None found.
Wrote their own version · 3
- HurricaHjz/SecondSelf★ 156same name
- HurricaHjz/second-yourself★ 105same name
- tkolleh/skills★ 1same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository120 other files it gives its agents.
- automation-advisor/CLAUDE.mdCLAUDE.md
- agency-docs-updaterSkill
- agency-meetup-publishSkill
- agency-socialsSkill
- agent-cliSkill
- agent-roundtableSkill
- app-mapSkill
- app-releaseSkill
- automation-advisorSkill
- background-agentsSkill
- balancedSkill
- brand-agencySkill
- browser-mateSkill
- browsing-historySkill
- chrome-historySkill
- cms-migration-checklistSkill
- coaching-session-summarizerSkill
- codexSkill
- cognitive-toolkitSkill
- context-builderSkill
- cull-release-checkSkill
- cull-release-prepareSkill
- cull-release-publishSkill
- cull-release-recoverSkill
- cull-releaseSkill
- cull-release-verifySkill
- cullSkill
- daydreamSkill
- decision-to-deliverySkill
- decision-toolkitSkill
- deep-researchSkill
- design-tokensSkill
- doctorgSkill
- ecosystemSkill
- elevenlabs-ttsSkill
- elimination-researchSkill
- fathomSkill
- feature-factorySkill
- firecrawl-apiSkill
- firecrawl-researchSkill
- font-featuresSkill
- github-gistSkill
- gmailSkill
- google-image-searchSkill
- gpt-image-2Skill
- granolaSkill
- gwsSkill
- health-dataSkill
- herdr-orchestratorSkill
- i18n-studioSkill
- init-tauri-appSkill
- init-xcode-appSkill
- insight-extractorSkill
- jtbdSkill
- lab-retroSkill
- learning-vaultSkill
- linearSkill
- llm-cliSkill
- local-modelsSkill
- meeting-prepSkill
- The first 60 shown.
The file
We split this skill into the rules it gives an agent
10 rules. 0 are common, 0 are distinctive, and 10 are very specific to this project.
0
Common
Most of the 3 edited versions we read keep these.
0
Distinctive
This author's own choices. Worth a look.
10
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 8
Search a local markdown knowledge base semantically with qmd.
- Very specific: line 31
Search semantically first (query / vsearch).
- Very specific: line 35
Run a literal pass before concluding absence: qmd-search.sh -m grep -n 20 "Зигги".
- Very specific: line 36
Use literal hits to disambiguate close names (e.g.
- Very specific: line 37
If everything fails, say "I didn't find it with these queries: …" and list the terms tried — not "it's not in the vault." Raise -n to ~20 …
- Very specific: line 42
Use the bundled wrapper; it suppresses qmd's stderr spinner, formats results as score path (parsing qmd's JSON, so commas in filenames are …
- Very specific: line 62
After getting hits, read the top files directly (they are normal vault paths) or fetch slices with qmd get "<path>:<line>" -l <N>.
- Very specific: line 80
If embedding never reaches 0 pending, check disk space (df -h) — a full disk fails writes silently.
- Very specific: line 87
If it's registered in the host (e.g.
- Very specific: line 94
Use the wrapper (scripts/qmd-search.sh) when you need what MCP doesn't cover: BM25-only (search), vector-only (vsearch), the …
“Common” is measured: kept by at least 6 in 10 of the 3 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
qmd Search
Search a local markdown knowledge base semantically with qmd. Five
modes — BM25 keywords, vector similarity, hybrid (expansion + rerank), literal native-script grep,
and a fused find — all running on-device. The key advantage over Obsidian's built-in search: it
matches meaning, finds notes that share no words with the query, and works across languages
(e.g. a Russian query retrieves English notes).
When to use which mode
- hybrid (
query) — default. A real question or fuzzy intent ("how do I stop overengineering"). Best quality; first run downloads reranker/expansion models (~one-time slow). - vector (
vsearch) — fast concept lookup ("notes about embodied computing"). - BM25 (
search) — an exact keyword, name, or filename. Instant, no model. - grep (
-m grep) — literal fixed-string ripgrep over the .md files. The audit path for proper nouns, transliterations, exact phrases, Russian stems/inflections, and absence checks. Bypasses the index; matches only the exact script/spelling you type.
Bilingual / proper-name rule (do not skip)
This vault is bilingual (English/Russian). The embedding model is decent for concepts but weak for proper nouns / specific entities, and BM25 only matches the script you type. So:
Never conclude "it's not in the vault" after one English semantic query. For names, people, pets, places, foreign terms, or bilingual topics:
- Search semantically first (
query/vsearch). - Generate likely native-script spellings/stems and try them, e.g.
Ziggy → Зигги/Зиги,dog/pet → собак, пёс, щенок, питомц, животн. Use stems (собакcatchesсобака/собаку/собаки), not just the nominative. - Run a literal pass before concluding absence:
qmd-search.sh -m grep -n 20 "Зигги". - Use literal hits to disambiguate close names (e.g.
Зиггиthe pet vs.ЗигмундFreud). - If everything fails, say "I didn't find it with these queries: …" and list the terms tried —
not "it's not in the vault." Raise
-nto ~20 for absence checks.
Primary usage — the wrapper
Use the bundled wrapper; it suppresses qmd's stderr spinner, formats results as score path
(parsing qmd's JSON, so commas in filenames are safe), and makes a best-effort refusal to run
during an active qmd embed (which would return empty results — override with --force):
~/.claude/skills/qmd-search/scripts/qmd-search.sh [-m query|search|vsearch|grep|find] [-n N] [-c COLLECTION] [--snippet] [--min-score X] [--json] [--full] <query...>Examples:
qmd-search.sh "what helps with anxiety" # hybrid (default)
qmd-search.sh -m vsearch -n 8 "behavioral health from photos"
qmd-search.sh -m search sensorium # BM25 keyword
qmd-search.sh -m grep -n 20 "Зигги" # literal native-spelling / absence check
qmd-search.sh -m find "Зигги собака" # fused: semantic + literal in one call
qmd-search.sh --snippet "agent orchestration" # rows + matching snippets
qmd-search.sh --min-score 0.5 "quarterly planning" # drop low-relevance hits
qmd-search.sh --json "agent orchestration" # structured output for further processingAfter getting hits, read the top files directly (they are normal vault paths) or fetch slices with
qmd get "<path>:<line>" -l <N>.
Setup / indexing (only if qmd status shows the vault is not indexed)
qmd collection add ~/Brains/brain --name brain # index the vault
qmd context add qmd://brain "short description of the vault"
qmd embed # build vectors; re-run until status shows 0 pending
qmd cleanup # compact the indexRefresh after large edits: qmd update && qmd embed. Check health any time with qmd status.
Operational rules (do not skip)
- One embed at a time, and never search while embedding — both cause empty/garbage results.
The wrapper guards searches; for manual
qmdcalls, checkqmd statusfirst. - If embedding never reaches 0 pending, check disk space (
df -h) — a full disk fails writes silently. Seereferences/cli-reference.md→ "Operational gotchas". - Vector scores are modest (~0.4–0.6); judge by ranking, not the absolute number.
MCP (native tools) vs. the CLI wrapper
qmd ships an MCP server (qmd mcp, stdio) exposing tools query, get, multi_get, status.
If it's registered in the host (e.g. .mcp.json), prefer the native query tool for hybrid
search — it returns structured results with no spinner/JSON-parsing/exit-code quirks. Register with:
{ "mcpServers": { "qmd": { "command": "qmd", "args": ["mcp"] } } }Use the wrapper (scripts/qmd-search.sh) when you need what MCP doesn't cover: BM25-only
(search), vector-only (vsearch), the literal/native-script grep pass, the fused find
mode, --snippet, or --min-score. The bilingual/proper-name rule above applies to both paths.
Quality / evals
evals/fixture.example.json + scripts/run-evals.sh run qmd bench to score search quality
(precision/recall/MRR per backend). Baseline and interpretation: evals/BASELINE.md. Re-run after
changing the wrapper, the index, or the embedding model; a drop vs. baseline is a regression.
Reference
Full command surface, query grammar (lex:/vec:/hyde:), output formats, models, and recovery
steps are in references/cli-reference.md.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

