
Qmd
- 12 installs
- 610 repo stars
- Updated June 26, 2026
- alsk1992/cloddsbot
qmd is a Claude skill (CLI-backed) that runs local hybrid search over indexed Markdown notes and docs on your machine.
About
qmd is a local search engine for Markdown notes, docs, and knowledge bases. Developers index a collection once, then run qmd search for fast BM25 keyword matches, or qmd vsearch and qmd query for semantic and hybrid results. It runs locally with GGUF models and a SQLite index on macOS or Linux. It is used to retrieve notes and related content from indexed Markdown files on disk.
- Local hybrid search over Markdown notes and docs, indexed once
- Fast BM25 keyword search by default, with optional semantic vsearch
- Runs local GGUF models with SQLite-backed index, macOS and Linux
Qmd by the numbers
- 12 all-time installs (skills.sh)
- Ranked #1,115 of 1,879 Documentation skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
qmd capabilities & compatibility
Free and local; first run auto-downloads local GGUF models
- Capabilities
- notes search · semantic search · document retrieval
- Use cases
- research · web search
- Platforms
- macOS · Linux
- Pricing
- Free
What qmd says it does
Local hybrid search for markdown notes and docs. Use when searching notes, finding related content, or retrieving documents from indexed collections.
Prefer `qmd search` (BM25). It's typically instant and should be the default.
npx skills add https://github.com/alsk1992/cloddsbot --skill qmdAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 12 |
|---|---|
| repo stars | ★ 610 |
| Last updated | June 26, 2026 |
| Repository | alsk1992/cloddsbot ↗ |
What it does
Search local Markdown notes and docs and retrieve related documents from indexed collections.
Who is it for?
Searching and retrieving your local Markdown notes, docs, and knowledge bases.
Skip if: Code search across repositories, which the docs say to use dedicated code tools for.
When should I use this skill?
A user asks to search their notes, find related notes, or retrieve a Markdown doc from a collection.
What you get
- searchable local index of a Markdown collection
By the numbers
- 3 search modes (search, vsearch, query)
- few hundred tokens per chunk
Files
qmd - Quick Markdown Search
Local search engine for Markdown notes, docs, and knowledge bases. Index once, search fast.
When to use (trigger phrases)
- "search my notes / docs / knowledge base"
- "find related notes"
- "retrieve a markdown document from my collection"
- "search local markdown files"
Default behavior (important)
- Prefer
qmd search(BM25). It's typically instant and should be the default. - Use
qmd vsearchonly when keyword search fails and you need semantic similarity (can be very slow on a cold start). - Avoid
qmd queryunless the user explicitly wants the highest quality hybrid results and can tolerate long runtimes/timeouts.
Prerequisites
- Bun >= 1.0.0
- macOS:
brew install sqlite(SQLite extensions) - Ensure PATH includes:
$HOME/.bun/bin
Install Bun (macOS): brew install oven-sh/bun/bun
Install
bun install -g https://github.com/tobi/qmd
Setup
qmd collection add /path/to/notes --name notes --mask "**/*.md"
qmd context add qmd://notes "Description of this collection" # optional
qmd embed # one-time to enable vector + hybrid searchWhat it indexes
- Intended for Markdown collections (commonly
**/*.md). - In our testing, "messy" Markdown is fine: chunking is content-based (roughly a few hundred tokens per chunk), not strict heading/structure based.
- Not a replacement for code search; use code search tools for repositories/source trees.
Search modes
qmd search(default): fast keyword match (BM25)qmd vsearch(last resort): semantic similarity (vector). Often slow due to local LLM work before the vector lookup.qmd query(generally skip): hybrid search + LLM reranking. Often slower thanvsearchand may timeout.
Performance notes
qmd searchis typically instant.qmd vsearchcan be ~1 minute on some machines because query expansion may load a local model (e.g., Qwen3-1.7B) into memory per run; the vector lookup itself is usually fast.qmd queryadds LLM reranking on top ofvsearch, so it can be even slower and less reliable for interactive use.- If you need repeated semantic searches, consider keeping the process/model warm (e.g., a long-lived qmd/MCP server mode if available in your setup) rather than invoking a cold-start LLM each time.
Common commands
qmd search "query" # default
qmd vsearch "query"
qmd query "query"
qmd search "query" -c notes # Search specific collection
qmd search "query" -n 10 # More results
qmd search "query" --json # JSON output
qmd search "query" --all --files --min-score 0.3Useful options
-n <num>: number of results-c, --collection <name>: restrict to a collection--all --min-score <num>: return all matches above a threshold--json/--files: agent-friendly output formats--full: return full document content
Retrieve
qmd get "path/to/file.md" # Full document
qmd get "#docid" # By ID from search results
qmd multi-get "journals/2025-05*.md"
qmd multi-get "doc1.md, doc2.md, #abc123" --jsonMaintenance
qmd status # Index health
qmd update # Re-index changed files
qmd embed # Update embeddingsKeeping the index fresh
Automate indexing so results stay current as you add/edit notes.
- For keyword search (
qmd search),qmd updateis usually enough (fast). - If you rely on semantic/hybrid search (
vsearch/query), you may also wantqmd embed, but it can be slow.
Example schedules (cron):
# Hourly incremental updates (keeps BM25 fresh):
0 * * * * export PATH="$HOME/.bun/bin:$PATH" && qmd update
# Optional: nightly embedding refresh (can be slow):
0 5 * * * export PATH="$HOME/.bun/bin:$PATH" && qmd embedIf your Clawdbot/agent environment supports a built-in scheduler, you can run the same commands there instead of system cron.
Models and cache
- Uses local GGUF models; first run auto-downloads them.
- Default cache:
~/.cache/qmd/models/(override withXDG_CACHE_HOME).
Relationship to Clawdbot memory search
qmdsearches your local files (notes/docs) that you explicitly index into collections.- Clawdbot's
memory_searchsearches agent memory (saved facts/context from prior interactions). - Use both:
memory_searchfor "what did we decide/learn before?",qmdfor "what's in my notes/docs on disk?".
/**
* QMD CLI Skill - Quick Markdown Search
*
* Commands:
* /qmd search <query> - BM25 keyword search (fast, default)
* /qmd vsearch <query> - Vector semantic search (slower)
* /qmd query <query> - Hybrid search (best quality, slowest)
* /qmd index <path> - Index a directory
* /qmd collections - List indexed collections
*/
import { execSync } from 'child_process';
function sanitizeShellArg(input: string): string {
// Whitelist: only allow alphanumeric, spaces, hyphens, underscores, dots, slashes, and common punctuation
return input.replace(/[^a-zA-Z0-9 \-_./,:!?@#%+=\[\]~]/g, '');
}
function checkQmd(): string | null {
try {
execSync('which qmd', { stdio: 'pipe' });
return null;
} catch {
return `**qmd is not installed**
Install with:
\`\`\`bash
bun install -g https://github.com/tobi/qmd
\`\`\`
Or via cargo:
\`\`\`bash
cargo install qmd
\`\`\`
qmd provides fast BM25 keyword and vector semantic search over markdown files.`;
}
}
async function execute(args: string): Promise<string> {
const parts = args.trim().split(/\s+/);
const cmd = parts[0]?.toLowerCase() || 'help';
const installError = checkQmd();
if (installError) return installError;
try {
switch (cmd) {
case 'search':
case 's': {
const query = parts.slice(1).join(' ');
if (!query) return 'Usage: /qmd search <query>';
const result = execSync(`qmd search "${sanitizeShellArg(query)}"`, {
encoding: 'utf-8',
timeout: 10000,
});
return result || 'No results found.';
}
case 'vsearch':
case 'vs': {
const query = parts.slice(1).join(' ');
if (!query) return 'Usage: /qmd vsearch <query>';
const result = execSync(`qmd vsearch "${sanitizeShellArg(query)}"`, {
encoding: 'utf-8',
timeout: 30000,
});
return result || 'No results found.';
}
case 'query':
case 'q': {
const query = parts.slice(1).join(' ');
if (!query) return 'Usage: /qmd query <query>';
const result = execSync(`qmd query "${sanitizeShellArg(query)}"`, {
encoding: 'utf-8',
timeout: 60000,
});
return result || 'No results found.';
}
case 'index': {
const path = parts[1];
if (!path) return 'Usage: /qmd index <directory-path>';
const result = execSync(`qmd index "${sanitizeShellArg(path)}"`, {
encoding: 'utf-8',
timeout: 120000,
});
return result || 'Indexing complete.';
}
case 'collections':
case 'list': {
const result = execSync('qmd collections', {
encoding: 'utf-8',
timeout: 5000,
});
return result || 'No collections indexed.';
}
default:
return `**QMD - Quick Markdown Search**
/qmd search <query> - BM25 keyword search (fast)
/qmd vsearch <query> - Vector semantic search
/qmd query <query> - Hybrid search (best quality)
/qmd index <path> - Index a directory
/qmd collections - List indexed collections
Prefer 'search' for speed. Use 'vsearch' when keywords fail.`;
}
} catch (error) {
return `Error: ${error instanceof Error ? error.message : String(error)}`;
}
}
export default {
name: 'qmd',
description: 'Quick Markdown search - BM25 keyword and vector semantic search',
commands: ['/qmd'],
handle: execute,
};
Related skills
FAQ
Which search mode should I use first?
The docs recommend qmd search (BM25) as the default since it is typically instant; use vsearch only when keyword search fails.
Which operating systems does it support?
The metadata lists macOS (darwin) and Linux.