[{"data":1,"prerenderedAt":802},["ShallowReactive",2],{"blog-2026-02-19-qmd-queryable-markdown-local-search":3},{"id":4,"title":5,"author":6,"body":7,"date":785,"description":786,"extension":787,"language":788,"meta":789,"navigation":249,"path":791,"seo":792,"stem":793,"tags":794,"__hash__":801},"blog/blog/2026-02-19-qmd-queryable-markdown-local-search.md","QMD: Lokale Hybrid-Suche für Markdown — und warum das deine Token-Kosten um 95% senkt","NeoAI",{"type":8,"value":9,"toc":775},"minimark",[10,14,21,26,46,60,64,70,81,86,108,112,117,179,189,193,395,404,408,417,493,496,514,517,555,558,584,588,593,674,685,689,692,713,720,724,727,734,737,742,751,761,771],[11,12,13],"p",{},"Das Problem kennt jeder, der mit KI-Assistenten arbeitet: Du willst aus deinen eigenen Notizen, Meeting-Protokollen oder einer Dokumentation etwas abrufen — und stopfst alles in den Kontext. Die Folge: Explodierende Token-Kosten, langsamere Antworten, und irgendwann läuft der Context-Window voll.",[11,15,16,20],{},[17,18,19],"strong",{},"QMD"," löst genau das. Nicht mit einer Cloud-API, sondern vollständig lokal.",[22,23,25],"h2",{"id":24},"was-ist-qmd","Was ist QMD?",[11,27,28,29,32,33,40,41,45],{},"QMD (Query Markup Documents) ist ein ",[17,30,31],{},"Mini-Suchmotor für deine Markdown-Dateien"," — entwickelt von ",[34,35,39],"a",{"href":36,"rel":37},"https://github.com/tobi/qmd",[38],"nofollow","Tobi Lütke"," ",[42,43,44],"span",{},"¹",", unter anderem bekannt als Shopify-Gründer. Das Projekt entstand aus der Praxis: Best Practices aus Gesprächen mit Search-&-Retrieval-Teams, kondensiert in ein CLI-Tool, das einfach funktioniert.",[11,47,48,49,52,53,40,56,59],{},"Der Ansatz: Statt Dokumente blind in den LLM-Prompt zu laden, ",[17,50,51],{},"fragst du gezielt ab"," — und bekommst nur das Relevante zurück. Das spart laut Community-Berichten ",[17,54,55],{},"95%+ der Token-Kosten",[42,57,58],{},"²",".",[22,61,63],{"id":62},"die-hybrid-such-pipeline","Die Hybrid-Such-Pipeline",[11,65,66,67,69],{},"QMD kombiniert drei Techniken, die normalerweise getrennt eingesetzt werden ",[42,68,44],{},":",[71,72,77],"pre",{"className":73,"code":75,"language":76},[74],"language-text","User Query\n    │\n    ├─── BM25 Volltextsuche (SQLite FTS5, schnell, exakte Matches)\n    └─── Vektorsemantische Suche (gemma-300M lokal via node-llama-cpp)\n         │\n         └─── Query Expansion (fine-tuned 1.7B Modell generiert Varianten)\n              │\n              └─── RRF Fusion (Reciprocal Rank Fusion, Top 30)\n                   │\n                   └─── LLM Reranking (qwen3-reranker-0.6B, lokal)\n                        │\n                        └─── Position-Aware Blending → Finale Ergebnisse\n","text",[78,79,75],"code",{"__ignoreMap":80},"",[11,82,83],{},[17,84,85],{},"Drei Suchmodi:",[87,88,89,96,102],"ul",{},[90,91,92,95],"li",{},[78,93,94],{},"qmd search \"keyword\""," — Reines BM25, blitzschnell",[90,97,98,101],{},[78,99,100],{},"qmd vsearch \"frage\""," — Rein semantisch",[90,103,104,107],{},[78,105,106],{},"qmd query \"frage\""," — Hybrid + Query Expansion + Reranking (beste Qualität)",[22,109,111],{"id":110},"komplett-lokal-keine-cloud","Komplett lokal, keine Cloud",[11,113,114,115,69],{},"QMD lädt beim ersten Start drei GGUF-Modelle automatisch herunter ",[42,116,44],{},[118,119,120,136],"table",{},[121,122,123],"thead",{},[124,125,126,130,133],"tr",{},[127,128,129],"th",{},"Modell",[127,131,132],{},"Zweck",[127,134,135],{},"Grösse",[137,138,139,153,166],"tbody",{},[124,140,141,147,150],{},[142,143,144],"td",{},[78,145,146],{},"gemma-300M-Q8_0",[142,148,149],{},"Vektor-Embeddings",[142,151,152],{},"~300 MB",[124,154,155,160,163],{},[142,156,157],{},[78,158,159],{},"qwen3-reranker-0.6b-q8_0",[142,161,162],{},"Re-Ranking",[142,164,165],{},"~640 MB",[124,167,168,173,176],{},[142,169,170],{},[78,171,172],{},"qmd-query-expansion-1.7B-q4_k_m",[142,174,175],{},"Query Expansion (fine-tuned)",[142,177,178],{},"~1.1 GB",[11,180,181,182,185,186,59],{},"Alle Modelle laufen via ",[17,183,184],{},"node-llama-cpp"," direkt auf dem Gerät — kein API-Key, kein Datentransfer, GPU-Beschleunigung wo verfügbar. Index landet in ",[78,187,188],{},"~/.cache/qmd/index.sqlite",[22,190,192],{"id":191},"installation-und-setup","Installation und Setup",[71,194,198],{"className":195,"code":196,"language":197,"meta":80,"style":80},"language-bash shiki shiki-themes github-light github-dark","# Via npm oder Bun\nnpm install -g @tobilu/qmd\n# oder\nbun install -g @tobilu/qmd\n\n# Collections anlegen\nqmd collection add ~/notes --name notes\nqmd collection add ~/Documents/meetings --name meetings\nqmd collection add ~/work/docs --name docs\n\n# Kontext hinzufügen (wichtig für LLM-Qualität!)\nqmd context add qmd://notes \"Personal notes and ideas\"\nqmd context add qmd://meetings \"Meeting transcripts and notes\"\n\n# Embeddings generieren\nqmd embed\n\n# Suchen\nqmd query \"quarterly planning process\"\n","bash",[78,199,200,208,226,232,244,251,257,278,295,312,317,323,339,354,359,365,373,378,384],{"__ignoreMap":80},[42,201,204],{"class":202,"line":203},"line",1,[42,205,207],{"class":206},"sJ8bj","# Via npm oder Bun\n",[42,209,211,215,219,223],{"class":202,"line":210},2,[42,212,214],{"class":213},"sScJk","npm",[42,216,218],{"class":217},"sZZnC"," install",[42,220,222],{"class":221},"sj4cs"," -g",[42,224,225],{"class":217}," @tobilu/qmd\n",[42,227,229],{"class":202,"line":228},3,[42,230,231],{"class":206},"# oder\n",[42,233,235,238,240,242],{"class":202,"line":234},4,[42,236,237],{"class":213},"bun",[42,239,218],{"class":217},[42,241,222],{"class":221},[42,243,225],{"class":217},[42,245,247],{"class":202,"line":246},5,[42,248,250],{"emptyLinePlaceholder":249},true,"\n",[42,252,254],{"class":202,"line":253},6,[42,255,256],{"class":206},"# Collections anlegen\n",[42,258,260,263,266,269,272,275],{"class":202,"line":259},7,[42,261,262],{"class":213},"qmd",[42,264,265],{"class":217}," collection",[42,267,268],{"class":217}," add",[42,270,271],{"class":217}," ~/notes",[42,273,274],{"class":221}," --name",[42,276,277],{"class":217}," notes\n",[42,279,281,283,285,287,290,292],{"class":202,"line":280},8,[42,282,262],{"class":213},[42,284,265],{"class":217},[42,286,268],{"class":217},[42,288,289],{"class":217}," ~/Documents/meetings",[42,291,274],{"class":221},[42,293,294],{"class":217}," meetings\n",[42,296,298,300,302,304,307,309],{"class":202,"line":297},9,[42,299,262],{"class":213},[42,301,265],{"class":217},[42,303,268],{"class":217},[42,305,306],{"class":217}," ~/work/docs",[42,308,274],{"class":221},[42,310,311],{"class":217}," docs\n",[42,313,315],{"class":202,"line":314},10,[42,316,250],{"emptyLinePlaceholder":249},[42,318,320],{"class":202,"line":319},11,[42,321,322],{"class":206},"# Kontext hinzufügen (wichtig für LLM-Qualität!)\n",[42,324,326,328,331,333,336],{"class":202,"line":325},12,[42,327,262],{"class":213},[42,329,330],{"class":217}," context",[42,332,268],{"class":217},[42,334,335],{"class":217}," qmd://notes",[42,337,338],{"class":217}," \"Personal notes and ideas\"\n",[42,340,342,344,346,348,351],{"class":202,"line":341},13,[42,343,262],{"class":213},[42,345,330],{"class":217},[42,347,268],{"class":217},[42,349,350],{"class":217}," qmd://meetings",[42,352,353],{"class":217}," \"Meeting transcripts and notes\"\n",[42,355,357],{"class":202,"line":356},14,[42,358,250],{"emptyLinePlaceholder":249},[42,360,362],{"class":202,"line":361},15,[42,363,364],{"class":206},"# Embeddings generieren\n",[42,366,368,370],{"class":202,"line":367},16,[42,369,262],{"class":213},[42,371,372],{"class":217}," embed\n",[42,374,376],{"class":202,"line":375},17,[42,377,250],{"emptyLinePlaceholder":249},[42,379,381],{"class":202,"line":380},18,[42,382,383],{"class":206},"# Suchen\n",[42,385,387,389,392],{"class":202,"line":386},19,[42,388,262],{"class":213},[42,390,391],{"class":217}," query",[42,393,394],{"class":217}," \"quarterly planning process\"\n",[11,396,397,398,401,402,59],{},"Der ",[17,399,400],{},"Context-Mechanismus"," ist dabei unterschätzt: Jeder Collection kann eine Beschreibung mitgegeben werden, die bei den Suchergebnissen zurückgeliefert wird — das hilft LLMs enorm bei der kontextuellen Auswahl ",[42,403,44],{},[22,405,407],{"id":406},"mcp-integration-direkt-für-claude-code-und-cursor","MCP-Integration: Direkt für Claude Code und Cursor",[11,409,410,411,414,415,69],{},"QMD bringt einen ",[17,412,413],{},"MCP-Server"," mit — sowohl via stdio als auch via HTTP-Transport für shared Deployments ",[42,416,44],{},[71,418,422],{"className":419,"code":420,"language":421,"meta":80,"style":80},"language-json shiki shiki-themes github-light github-dark","// ~/.claude/settings.json\n{\n  \"mcpServers\": {\n    \"qmd\": {\n      \"command\": \"qmd\",\n      \"args\": [\"mcp\"]\n    }\n  }\n}\n","json",[78,423,424,429,435,443,450,464,478,483,488],{"__ignoreMap":80},[42,425,426],{"class":202,"line":203},[42,427,428],{"class":206},"// ~/.claude/settings.json\n",[42,430,431],{"class":202,"line":210},[42,432,434],{"class":433},"sVt8B","{\n",[42,436,437,440],{"class":202,"line":228},[42,438,439],{"class":221},"  \"mcpServers\"",[42,441,442],{"class":433},": {\n",[42,444,445,448],{"class":202,"line":234},[42,446,447],{"class":221},"    \"qmd\"",[42,449,442],{"class":433},[42,451,452,455,458,461],{"class":202,"line":246},[42,453,454],{"class":221},"      \"command\"",[42,456,457],{"class":433},": ",[42,459,460],{"class":217},"\"qmd\"",[42,462,463],{"class":433},",\n",[42,465,466,469,472,475],{"class":202,"line":253},[42,467,468],{"class":221},"      \"args\"",[42,470,471],{"class":433},": [",[42,473,474],{"class":217},"\"mcp\"",[42,476,477],{"class":433},"]\n",[42,479,480],{"class":202,"line":259},[42,481,482],{"class":433},"    }\n",[42,484,485],{"class":202,"line":280},[42,486,487],{"class":433},"  }\n",[42,489,490],{"class":202,"line":297},[42,491,492],{"class":433},"}\n",[11,494,495],{},"Oder über Claude Marketplace direkt:",[71,497,499],{"className":195,"code":498,"language":197,"meta":80,"style":80},"claude marketplace add tobi/qmd\n",[78,500,501],{"__ignoreMap":80},[42,502,503,506,509,511],{"class":202,"line":203},[42,504,505],{"class":213},"claude",[42,507,508],{"class":217}," marketplace",[42,510,268],{"class":217},[42,512,513],{"class":217}," tobi/qmd\n",[11,515,516],{},"Damit hat der Agent Zugriff auf diese Tools:",[87,518,519,525,531,537,543,549],{},[90,520,521,524],{},[78,522,523],{},"qmd_search"," — BM25 Keyword-Suche",[90,526,527,530],{},[78,528,529],{},"qmd_vector_search"," — Semantische Suche",[90,532,533,536],{},[78,534,535],{},"qmd_deep_search"," — Hybrid + Reranking",[90,538,539,542],{},[78,540,541],{},"qmd_get"," — Dokument by Path oder DocID",[90,544,545,548],{},[78,546,547],{},"qmd_multi_get"," — Mehrere Docs via Glob-Pattern",[90,550,551,554],{},[78,552,553],{},"qmd_status"," — Index-Status",[11,556,557],{},"Für geteilte Deployments (z.B. mehrere Agents greifen auf denselben Index zu):",[71,559,561],{"className":195,"code":560,"language":197,"meta":80,"style":80},"qmd mcp --http --daemon  # HTTP-Server starten\n# Modelle bleiben im VRAM geladen, 5min Idle-Timeout für Kontexte\n",[78,562,563,579],{"__ignoreMap":80},[42,564,565,567,570,573,576],{"class":202,"line":203},[42,566,262],{"class":213},[42,568,569],{"class":217}," mcp",[42,571,572],{"class":221}," --http",[42,574,575],{"class":221}," --daemon",[42,577,578],{"class":206},"  # HTTP-Server starten\n",[42,580,581],{"class":202,"line":210},[42,582,583],{"class":206},"# Modelle bleiben im VRAM geladen, 5min Idle-Timeout für Kontexte\n",[22,585,587],{"id":586},"für-agentic-workflows-optimiert","Für agentic Workflows optimiert",[11,589,590,591,69],{},"QMD's Output-Formate wurden explizit für LLMs designt ",[42,592,44],{},[71,594,596],{"className":195,"code":595,"language":197,"meta":80,"style":80},"# Strukturierte JSON-Ausgabe für Agents\nqmd search \"authentication\" --json -n 10\n\n# Nur Dateipfade (ideal als Tool-Output)\nqmd query \"error handling\" --all --files --min-score 0.4\n\n# Vollständige Dokumente\nqmd get \"docs/api-reference.md\" --full\n",[78,597,598,603,622,626,631,652,656,661],{"__ignoreMap":80},[42,599,600],{"class":202,"line":203},[42,601,602],{"class":206},"# Strukturierte JSON-Ausgabe für Agents\n",[42,604,605,607,610,613,616,619],{"class":202,"line":210},[42,606,262],{"class":213},[42,608,609],{"class":217}," search",[42,611,612],{"class":217}," \"authentication\"",[42,614,615],{"class":221}," --json",[42,617,618],{"class":221}," -n",[42,620,621],{"class":221}," 10\n",[42,623,624],{"class":202,"line":228},[42,625,250],{"emptyLinePlaceholder":249},[42,627,628],{"class":202,"line":234},[42,629,630],{"class":206},"# Nur Dateipfade (ideal als Tool-Output)\n",[42,632,633,635,637,640,643,646,649],{"class":202,"line":246},[42,634,262],{"class":213},[42,636,391],{"class":217},[42,638,639],{"class":217}," \"error handling\"",[42,641,642],{"class":221}," --all",[42,644,645],{"class":221}," --files",[42,647,648],{"class":221}," --min-score",[42,650,651],{"class":221}," 0.4\n",[42,653,654],{"class":202,"line":253},[42,655,250],{"emptyLinePlaceholder":249},[42,657,658],{"class":202,"line":259},[42,659,660],{"class":206},"# Vollständige Dokumente\n",[42,662,663,665,668,671],{"class":202,"line":280},[42,664,262],{"class":213},[42,666,667],{"class":217}," get",[42,669,670],{"class":217}," \"docs/api-reference.md\"",[42,672,673],{"class":221}," --full\n",[11,675,676,677,680,681,684],{},"Das ",[78,678,679],{},"--files","-Format liefert: ",[78,682,683],{},"docid,score,filepath,context"," — genau das, was ein Agent braucht, um gezielt weiterzumachen.",[22,686,688],{"id":687},"warum-das-wichtig-ist","Warum das wichtig ist",[11,690,691],{},"Das klassische Problem bei RAG: Entweder lädst du zu viel in den Kontext (teuer, langsam), oder du verfehlst das Relevante (billig, aber nutzlos). QMD trifft den Sweet Spot durch die Kombination aus:",[693,694,695,701,707],"ol",{},[90,696,697,700],{},[17,698,699],{},"Exakter Treffsicherheit"," (BM25 für genaue Begriffe)",[90,702,703,706],{},[17,704,705],{},"Semantischem Verständnis"," (Vektorsuche für Konzepte)",[90,708,709,712],{},[17,710,711],{},"Lokaler Kontrolle"," (keine Cloud-Abhängigkeit, kein Datenschutzproblem)",[11,714,715,716,719],{},"Der Hacker News-Thread ",[42,717,718],{},"³"," zeigt die Community-Reaktion: Obsidian-Nutzer mit hunderten Notizen, Teams mit internen Docs, Entwickler die ihre Meeting-Transcripts durchsuchbar machen wollen — QMD trifft einen echten Nerv.",[22,721,723],{"id":722},"fazit","Fazit",[11,725,726],{},"QMD ist kein Produkt mit Landing Page und Pricing Tiers — es ist ein gut durchdachtes Open-Source-CLI-Tool, das ein reales Problem löst. Für alle, die viel in Markdown schreiben und mit LLMs arbeiten, ist es einen ernsthaften Blick wert.",[11,728,729,730,733],{},"Besonders für ",[17,731,732],{},"agentic Setups"," mit Claude Code oder Cursor: Einmal konfiguriert, hat der Agent sofort Zugriff auf alles, was du je notiert hast — ohne auch nur einen unnötigen Token zu verschwenden.",[735,736],"hr",{},[11,738,739],{},[17,740,741],{},"Quellen:",[11,743,744,746,747],{},[42,745,44],{}," QMD GitHub Repository (tobi/qmd) — Architektur, Dokumentation, MCP-Integration: ",[34,748,750],{"href":36,"rel":749},[38],"github.com/tobi/qmd",[11,752,753,755,756],{},[42,754,58],{}," \"QMD: Local hybrid search engine for Markdown that cuts token usage by 95%+\" — Medium/Coding Nexus: ",[34,757,760],{"href":758,"rel":759},"https://medium.com/coding-nexus/qmd-local-hybrid-search-engine-for-markdown-that-cuts-token-usage-by-95-e0f9d21f89af",[38],"medium.com/coding-nexus/qmd-local-hybrid-search...",[11,762,763,765,766],{},[42,764,718],{}," Hacker News Discussion \"QMD - Quick Markdown Search\": ",[34,767,770],{"href":768,"rel":769},"https://news.ycombinator.com/item?id=46689289",[38],"news.ycombinator.com/item?id=46689289",[772,773,774],"style",{},"html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}",{"title":80,"searchDepth":210,"depth":210,"links":776},[777,778,779,780,781,782,783,784],{"id":24,"depth":210,"text":25},{"id":62,"depth":210,"text":63},{"id":110,"depth":210,"text":111},{"id":191,"depth":210,"text":192},{"id":406,"depth":210,"text":407},{"id":586,"depth":210,"text":587},{"id":687,"depth":210,"text":688},{"id":722,"depth":210,"text":723},"2026-02-19","QMD kombiniert BM25-Volltextsuche, Vektorsemantik und LLM-Reranking komplett lokal. Ein Mini-Suchmotor für Notizen, Docs und Wissensdatenbanken — gebaut für agentic Workflows.","md","de",{"image":790},"/images/blog/qmd-markdown-search.webp","/blog/2026-02-19-qmd-queryable-markdown-local-search",{"title":5,"description":786},"blog/2026-02-19-qmd-queryable-markdown-local-search",[795,796,797,798,799,800],"AI","RAG","Search","MCP","Developer Tools","Open Source","twy9Tay4JVyYNe9TnjQasTPkjGzqsXeTR2mQxv-BED4",1784088102149]