Knowledge vault and personal plugin
Plain markdown, Claude Code plugin, no embeddings, no MCP, no daemon.
inbox/, distilled into curated folders, read directly by Claude through Read, Grep, Glob.
What it is
A curated personal knowledge base (strategy, decisions, patterns, playbooks, project hubs, people notes, voice) that Claude Code reads directly from the filesystem through Read, Grep, and Glob. About 216 markdown files at last count, fitting inside Claude's context window with room to spare. The companion plugin ships three skills that interact with it: search-vault, distil-vault, lint-vault, plus a handful of voice and meeting helpers.
How it's structured
A folder taxonomy (strategy, patterns, playbooks, decisions, projects, people, voice, references, daily) with a frontmatter schema enforced on every note: title, created, tags, links. The links field is the load-bearing one, because every new note has to declare its inbound and outbound edges. That forces the writer to locate the new content in the existing graph rather than letting it pile up un-linked.
The three skills do work the human can't reliably do at write time. search-vault is a Glob plus Grep plus Read pipeline (no index, no embedding, just patterns over filenames and frontmatter). distil-vault takes raw inbox material and produces a curated note plus updates to 5 to 15 cross-referenced neighbours, so synthesis happens once, by the LLM, when the note is written. lint-vault runs whole-vault consistency checks (missing backlinks, orphan files, frontmatter drift) on demand.
The framing that turned out to matter most: synthesis happens at write time, not at query time. When a new note lands, the LLM has it and the affected neighbours in context simultaneously, and can refresh the cross-references then. By the time I'm querying, the vault is already coherent. That's the load-bearing thing; without it, files accumulate un-linked and the "Claude reads the whole vault" affordance erodes.
The history
The April version of the vault was a full hybrid retrieval stack: FastMCP server, SQLite FTS5, LanceDB vector store, Ollama embedding pipeline, file watcher, hybrid scorer. About 600 lines of plumbing. After two months of running it I deleted the whole stack and replaced it with what's above. The full argument for why (a calibration exercise that came back nearly flat, indexing bugs that wouldn't stay fixed, and a Karpathy note that snapped the framing into focus) is in the post on deleting the embedding pipeline.
Links
- Repository: private (vault contains personal notes)
- Why I deleted the embedding pipeline
- Claude Code, the runtime the plugin ships into