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.
npx skills add https://github.com/glebis/claude-skills --skill 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).
query) — default. A real question or fuzzy intent ("how do I stop overengineering").Best quality; first run downloads reranker/expansion models (~one-time slow).
vsearch) — fast concept lookup ("notes about embodied computing").search) — an exact keyword, name, or filename. Instant, no model.-m grep) — literal fixed-string ripgrep over the .md files. The audit path forproper nouns, transliterations, exact phrases, Russian stems/inflections, and absence checks.
Bypasses the index; matches only the exact script/spelling you type.
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:
query / vsearch).Ziggy → Зигги/Зиги, dog/pet → собак, пёс, щенок, питомц, животн. Use stems (собак
catches собака/собаку/собаки), not just the nominative.
qmd-search.sh -m grep -n 20 "Зигги".Зигги the pet vs. Зигмунд Freud).not "it's not in the vault." Raise -n to ~20 for absence checks.
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 processing
After getting hits, read the top files directly (they are normal vault paths) or fetch slices with
qmd get "<path>:<line>" -l <N>.
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 index
Refresh after large edits: qmd update && qmd embed. Check health any time with qmd status.
The wrapper guards searches; for manual qmd calls, check qmd status first.
df -h) — a full disk fails writessilently. See references/cli-reference.md → "Operational gotchas".
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.
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.
Full command surface, query grammar (lex:/vec:/hyde:), output formats, models, and recovery
steps are in references/cli-reference.md.
Comprehensive document creation, editing, and analysis with support for tracked changes, comments, formatting preservation, and text extraction. When Claude needs to work with professional documents (.docx files) for: (1) Creating new documents, (2) Modifying or editing content, (3) Working with tracked changes, (4) Adding comments, or any other document tasks
Comprehensive PDF manipulation toolkit for extracting text and tables, creating new PDFs, merging/splitting documents, and handling forms. When Claude needs to fill in a PDF form or programmatically process, generate, or analyze PDF documents at scale.
Presentation creation, editing, and analysis. When Claude needs to work with presentations (.pptx files) for: (1) Creating new presentations, (2) Modifying or editing content, (3) Working with layouts, (4) Adding comments or speaker notes, or any other presentation tasks
Create beautiful visual art in .png and .pdf documents using design philosophy. You should use this skill when the user asks to create a poster, piece of art, design, or other static piece. Create original visual designs, never copying existing artists' work to avoid copyright violations.
Use this skill whenever the user wants to do anything with PDF files. This includes reading or extracting text/tables from PDFs, combining or merging multiple PDFs into one, splitting PDFs apart, rotating pages, adding watermarks, creating new PDFs, filling PDF forms, encrypting/decrypting PDFs, extracting images, and OCR on scanned PDFs to make them searchable. If the user mentions a .pdf file or asks to produce one, use this skill.
Use this skill whenever the user wants to create, read, edit, or manipulate Word documents (.docx files). Triggers include: any mention of 'Word doc', 'word document', '.docx', or requests to produce professional documents with formatting like tables of contents, headings, page numbers, or letterheads. Also use when extracting or reorganizing content from .docx files, inserting or replacing images in documents, performing find-and-replace in Word files, working with tracked changes or comments, or converting content into a polished Word document. If the user asks for a 'report', 'memo', 'letter', 'template', or similar deliverable as a Word or .docx file, use this skill. Do NOT use for PDFs, spreadsheets, Google Docs, or general coding tasks unrelated to document generation.
Use this skill any time a .pptx file is involved in any way — as input, output, or both. This includes: creating slide decks, pitch decks, or presentations; reading, parsing, or extracting text from any .pptx file (even if the extracted content will be used elsewhere, like in an email or summary); editing, modifying, or updating existing presentations; combining or splitting slide files; working with templates, layouts, speaker notes, or comments. Trigger whenever the user mentions \"deck,\" \"slides,\" \"presentation,\" or references a .pptx filename, regardless of what they plan to do with the content afterward. If a .pptx file needs to be opened, created, or touched, use this skill.
Create and edit Obsidian Flavored Markdown with wikilinks, embeds, callouts, properties, and other Obsidian-specific syntax. Use when working with .md files in Obsidian, or when the user mentions wikilinks, callouts, frontmatter, tags, embeds, or Obsidian notes.
Take glebis/qmd-search from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.