Local semantic search for Obsidian.
QMD bridges Obsidian with a local QMD daemon to deliver fast, privacy-first semantic search across your vault. All processing happens on your machine—no data leaves your device. Search by meaning instead of keywords, discover related notes automatically, and keep your notes indexed in real time.
This repo keeps plugin implementation local; shared family assets are limited to contracts, docs, and harness/tooling skeletons.
PATH or configure a custom path in settingsmain.js, manifest.json, and styles.css from the latest release.obsidian/plugins/qmd/ in your vaultcd <your-vault>/.obsidian/plugins
git clone https://github.com/GoBeromsu/obsidian-qmd.git qmd
cd qmd
pnpm install
pnpm build
Reload Obsidian and enable the plugin under Settings > Community plugins.
qmd daemon is installed and available on your systemQMD offers four complementary search modes:
| Mode | Best For | Example |
|---|---|---|
| Keyword (BM25) | Exact terms, technical keywords | obsidian plugin development |
| Semantic (Vector) | Meaning, concepts, paraphrases | how do I extend Obsidian |
| Hybrid | Balanced mix of both | embedding models |
| Advanced | Structured queries | lex:plugin vec:semantic hyde:advanced |
Open Settings > QMD to customize behavior.
| Setting | Default | Description |
|---|---|---|
| QMD executable path | auto |
Path to the qmd binary, or auto to auto-detect |
| Collection override | (empty) | Force a specific QMD collection name (advanced) |
| Default search mode | hybrid |
Initial mode when opening the search modal |
| Preview result limit | 8 |
Maximum search results shown |
| Related result limit | 8 |
Maximum related notes shown in the sidebar |
| Auto-sync enabled | true |
Automatically index notes when they change |
| Auto-sync debounce | 7000ms |
Wait time after last change before auto-sync |
| Show mode selector | true |
Display the search mode toggle |
| Persist last mode | true |
Remember the last-used search mode between sessions |
| Show sync status bar | true |
Display QMD status in the status bar |
If you find QMD useful, consider supporting the developer:
pnpm install
pnpm dev # vault selection + esbuild watch + hot reload
pnpm build # TypeScript check + production build
pnpm test # Unit tests (Vitest)
pnpm lint # ESLint
pnpm run ci # build + lint + test
| Category | Technology |
|---|---|
| Platform | Obsidian Plugin API |
| Language | TypeScript 5 |
| Bundler | esbuild |
| Search Engine | QMD CLI (BM25 + vector search + hybrid) |
| Testing | Vitest |
| Linting | ESLint + Husky + lint-staged |
obsidian-qmd/
├── src/
│ ├── main.ts # Plugin entry point
│ ├── domain/ # Auto-sync orchestration, settings, path resolution
│ ├── ui/ # Search modal, related view, settings, notices, process adapter
│ ├── types/ # TypeScript type definitions
│ └── utils/ # Pure parsing and query helpers
├── scripts/ # Build and release scripts
├── boiler.config.mjs # Repo-specific harness/release configuration
└── manifest.json # Obsidian plugin manifest
git checkout -b feature/your-feature)pnpm run ci to verify changesMIT