qmd - Local Search for Knowledge Bases Search indexed markdown collections using keyword, semantic, or hybrid search. When to Use - Searching project documentation or knowledge bases - Finding related files before making changes - Discovering context across many markdown files - Answering questions that span multiple documents Quick Start Search Modes | Mode | Command | Speed | Best For | |------|---------|-------|----------| | Keyword (BM25) | | Fast | Exact terms, known keywords | | Semantic | | Medium | Conceptual queries, synonyms | | Hybrid | | Slow | Complex questions needing both | | F…

--exclude '.*' \"$WATCH_DIR\" | while read -d \"\" event; do\n echo \"$(date '+%H:%M:%S') Change: $event\"\n qmd update >/dev/null 2>&1 && echo \"$(date '+%H:%M:%S') Index updated\"\ndone\n","content_type":"application/x-sh; charset=utf-8","language":"bash","size":863,"content_sha256":"3953a541a91fe2dd6289d96c7f3da47846192a675cee122b9cbbe3ef5ec3269c"}],"content_json":{"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"text":"qmd - Local Search for Knowledge Bases","type":"text"}]},{"type":"paragraph","content":[{"text":"Search indexed markdown collections using keyword, semantic, or hybrid search.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"When to Use","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Searching project documentation or knowledge bases","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Finding related files before making changes","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Discovering context across many markdown files","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Answering questions that span multiple documents","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Quick Start","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# Keyword search (fast, BM25)\nqmd search \"your query\" --json -n 10\n\n# Find related files\nqmd search \"topic\" --files -n 20\n\n# Semantic search (requires embeddings)\nqmd vsearch \"conceptual question\" -n 10\n\n# Hybrid search with reranking (best quality, slower)\nqmd query \"natural language question\" --json -n 10\n\n# Get full document content\nqmd get \"path/to/file.md\" --full","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Search Modes","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Mode","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Command","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Speed","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Best For","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Keyword (BM25)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"qmd search","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Fast","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Exact terms, known keywords","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Semantic","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"qmd vsearch","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Medium","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Conceptual queries, synonyms","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Hybrid","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"qmd query","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Slow","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Complex questions needing both","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"File list","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"qmd search --files","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Fast","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Finding all related files","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Workflows","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Before answering a question","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"qmd search \"relevant keywords\" --json -n 10","type":"text"}]},{"type":"paragraph","content":[{"text":"Review results, then read specific files for full context.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"After making changes (update cascade)","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"qmd search \"topic you changed\" --files -n 20","type":"text"}]},{"type":"paragraph","content":[{"text":"Review all related files and update any that reference the changed topic.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Writing content that needs project context","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"qmd search \"positioning voice tone\" --json -n 10\nqmd search \"topic for content\" --json -n 10","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Index Management","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# Update text index (fast, ~1 sec)\nqmd update\n\n# Update embeddings (slow, ~3-4 min)\nqmd embed\n\n# Check index health\nqmd status\n\n# List collections\nqmd collection list","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Setup & Troubleshooting","type":"text"}]},{"type":"paragraph","content":[{"text":"If qmd is not installed or broken, run the doctor script:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"bash ~/.claude/skills/qmd/scripts/doctor.sh","type":"text"}]},{"type":"paragraph","content":[{"text":"For full installation and automation setup, see ","type":"text"},{"text":"setup/README.md","type":"text","marks":[{"type":"link","attrs":{"href":"setup/README.md","title":null}}]},{"text":".","type":"text"}]},{"type":"paragraph","content":[{"text":"For the complete command reference, see ","type":"text"},{"text":"references/commands.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/commands.md","title":null}}]},{"text":".","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Tips","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Results below score 0.3 are noise - ignore them","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"qmd search","type":"text","marks":[{"type":"code_inline"}]},{"text":" (BM25) is good enough for day-to-day use","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Only use ","type":"text"},{"text":"vsearch","type":"text","marks":[{"type":"code_inline"}]},{"text":" when keywords don't match concepts","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"After changes, always run ","type":"text"},{"text":"--files","type":"text","marks":[{"type":"code_inline"}]},{"text":" query to catch ripple effects","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Combine with Read tool: qmd finds files, Read gets full content","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Self-Learning","type":"text"}]},{"type":"paragraph","content":[{"text":"Read ","type":"text"},{"text":"LEARNED.md","type":"text","marks":[{"type":"link","attrs":{"href":"LEARNED.md","title":null}}]},{"text":" before using this skill. It contains hard-won lessons about what works and what doesn't.","type":"text"}]},{"type":"paragraph","content":[{"text":"Update LEARNED.md when you discover:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"A query that returned bad results and what worked instead","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Search mode choice that was wrong (e.g. ","type":"text"},{"text":"search","type":"text","marks":[{"type":"code_inline"}]},{"text":" missed something ","type":"text"},{"text":"vsearch","type":"text","marks":[{"type":"code_inline"}]},{"text":" found)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Index issues (stale embeddings, missing files, broken binary)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Installation or automation gotchas","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"CLAUDE.md patterns that worked or failed for enforcing context-first behavior","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Consolidation (keep LEARNED.md under 50 lines):","type":"text","marks":[{"type":"strong"}]},{"text":" Before adding a new entry, check the file length. If it's over 50 lines:","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Merge duplicate/overlapping entries into single proven patterns","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Remove entries older than 3 months that haven't been reinforced","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Drop one-off observations that never recurred","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Move detailed historical context to ","type":"text"},{"text":"LEARNED-archive.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" if worth preserving","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Keep only entries that would change behavior - if it's obvious, cut it","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}}]},"metadata":{"date":"2026-06-05","name":"qmd","author":"@skillopedia","source":{"stars":9,"repo_name":"skills","origin_url":"https://github.com/changeflowhq/skills/blob/HEAD/skills/qmd/SKILL.md","repo_owner":"changeflowhq","body_sha256":"5362af11d1758e81570cc5e7187e19797dfce597be5c65b7cf13a4c76ce10053","cluster_key":"53616f8217edd849e3a6f2dcbbaad8baefaa8988f2d51afdb4fd32998d10f70f","clean_bundle":{"format":"clean-skill-bundle-v1","source":"changeflowhq/skills/skills/qmd/SKILL.md","attachments":[{"id":"55c09712-587d-5df7-b166-1e6f226eeb74","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/55c09712-587d-5df7-b166-1e6f226eeb74/attachment.md","path":"LEARNED.md","size":740,"sha256":"04870e31cf755427698ee12ae2bec594eed93b9723563a2b5596b4fd137718b8","contentType":"text/markdown; charset=utf-8"},{"id":"08d6b6ed-a49d-5504-91a7-b21ba7db5c7f","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/08d6b6ed-a49d-5504-91a7-b21ba7db5c7f/attachment.md","path":"references/commands.md","size":1917,"sha256":"761bd28fe2f1ed4c902219f5005a2cdeb2c87d6401b5ae79408842d440ce1f39","contentType":"text/markdown; charset=utf-8"},{"id":"715c4fc8-0619-5cdc-90f7-2c4af1da2a1a","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/715c4fc8-0619-5cdc-90f7-2c4af1da2a1a/attachment.sh","path":"scripts/doctor.sh","size":3938,"sha256":"3cd3e6b7159d002eef26bb62c4f2265781d9ce3ac74fdece3c160129344952ae","contentType":"application/x-sh; charset=utf-8"},{"id":"e50803c4-9f10-5347-afd5-81da93ac95d1","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/e50803c4-9f10-5347-afd5-81da93ac95d1/attachment.md","path":"setup/README.md","size":7336,"sha256":"29165675709f9f035d9ecf3739baebcc6910e7e917f3200f77f47f815942cbe2","contentType":"text/markdown; charset=utf-8"},{"id":"81a5b291-2ebe-50b7-abb9-684365f5c3a5","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/81a5b291-2ebe-50b7-abb9-684365f5c3a5/attachment.sh","path":"templates/hook.sh","size":780,"sha256":"f3fd7b699eb29cc92cc95e56c98e6679339e821af4624d90aea34208e70ac56f","contentType":"application/x-sh; charset=utf-8"},{"id":"f71deadf-80f6-52cc-a6f9-be2945861fbf","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/f71deadf-80f6-52cc-a6f9-be2945861fbf/attachment.plist","path":"templates/launchd.plist","size":1501,"sha256":"00fa950590148714fb631d7de1a99e34a02531223ad339b3b8a99242058136f3","contentType":"text/plain; charset=utf-8"},{"id":"627685a6-437d-5896-b2cf-ff29e4fd5468","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/627685a6-437d-5896-b2cf-ff29e4fd5468/attachment.sh","path":"templates/watch.sh","size":863,"sha256":"3953a541a91fe2dd6289d96c7f3da47846192a675cee122b9cbbe3ef5ec3269c","contentType":"application/x-sh; charset=utf-8"}],"bundle_sha256":"9ce35a6420e2d54ea58a24ff828d385f0f2232aa420a490c95e8ef3acdea8b78","attachment_count":7,"text_attachments":6,"attachment_storage":"skillopedia-attachments-v1","binary_attachments":1,"excluded_attachments":[]},"cluster_size":1,"skill_md_path":"skills/qmd/SKILL.md","import_metadata":{"date":"2026-06-05","author":"@skillopedia","version":"v1","category":"documents-office","category_label":"Documents"},"exact_dupes_collapsed_into_this":0},"version":"v1","category":"documents-office","import_tag":"clean-skills-v1","description":"Local semantic search engine for markdown knowledge bases using qmd (tobi/qmd).\nIndexes markdown files with BM25 keyword search, vector embeddings for semantic search,\nand hybrid reranked queries. Auto-indexes on file edits via Claude Code hooks and\nrefreshes embeddings overnight via launchd. Use when searching project docs,\nknowledge bases, meeting notes, or any indexed markdown collection.\n","allowed-tools":"Bash Read Write Edit"}},"renderedAt":1782980177967}

qmd - Local Search for Knowledge Bases Search indexed markdown collections using keyword, semantic, or hybrid search. When to Use - Searching project documentation or knowledge bases - Finding related files before making changes - Discovering context across many markdown files - Answering questions that span multiple documents Quick Start Search Modes | Mode | Command | Speed | Best For | |------|---------|-------|----------| | Keyword (BM25) | | Fast | Exact terms, known keywords | | Semantic | | Medium | Conceptual queries, synonyms | | Hybrid | | Slow | Complex questions needing both | | F…