Every response names its sources
Every response names the documents behind it — path, title and date — so when something looks wrong you can point at exactly where it came from.
src/kal_mcp.pyFrom your Obsidian notes and past sessions — with the source on every answer.
Kallimachos builds one knowledge graph from your Obsidian notes and your past Claude Code and Codex sessions. Claude Code, Codex and claude.ai ask it over MCP, and every answer names the note or session it came from. Free to start — graph memory is on the free Hobby plan.
14 days of Cloud, then free Hobby. Nothing to cancel.

Kallimachos
“Claude, why did we pick Paddle?”
payment processor
See also
Decided 2026-08-23
0.1s
Ask Claude why you picked Paddle. Grepping the vault returns 37 matching lines — and then Claude has to work out which of the 14 files actually holds the answer and read them — around 2,000 tokens for a typical one, though one of them is a 390 KB generated session index. Calling kal_neighbors("Paddle") instead returns the relations already extracted about Paddle, and they contain the answer.
| Claude greps the vault | Claude asks Kallimachos | |
|---|---|---|
| First response | 37 matching lines · ~4,000 tokens | 20 of 22 relations · ~3,500 tokens |
| Is that the answer? | No — it still has to pick and read them: ~2,000 tokens for a typical one, and one of the 14 is a 390 KB generated index | Yes — the relations are already facts |
| What else was considered? | You must already know the names to grep for | Stripe, Polar, Lemon Squeezy — returned with the answer |
Measured on the author’s 1,128-note vault, 2026-09-15. The call returns 20 of 22 relations across 11 documents, and no single document contributes more than 5 of them — so no single file holds the whole answer.
Why it ends there
Extraction has already read every note and written down what it found — Paddle → Stripe, “Paddle MoR model evaluated but incompatible with B2B AR requirements for Net 30/60 invoicing”. Claude is not searching and ranking files; it is looking facts up. That is why, in this example, one call was enough: it returns the relations recorded for Paddle — up to twenty, with the total count — rather than a ranked list of files to open.
The galaxy view draws each entity as a point and each relation as a line, colored by topic. An Obsidian plugin draws the same graph inside your vault.

The author's real vault, drawn by the product — captured 2026-09-01 at 7,974 entities in 20 topics; it has grown since. Each topic is found by community detection and named from its top entities.

topics
Louvain community detection splits the graph into topics, and a model names each one from its three most connected entities. Hover over a topic and only that topic’s points stay highlighted, with its summary beside it.
Hover on "Hybrid search systems": 501 entities, summarized as BM25 keyword search combined with vector embeddings.
Measured on the author's vault · 2026-09-14 · 1,128 notes (23MB) → 286MB of index and graph in 79 files.
Obsidian search matches strings. Kallimachos extracts entities (people, tools, decisions) and the relations between them from your notes and conversations, and Claude searches those.
Built the LightRAG way — entity and relationship extraction using LightRAG’s own schema, 2,400-character chunks, and description merging. LightRAG ↗
Every response names the documents behind it — path, title and date — so when something looks wrong you can point at exactly where it came from.
src/kal_mcp.pySession logs are summarized into documents and extracted into the same graph as your notes, so a decision made in a past session shows up when Claude searches the graph.
src/distill_sessions.pymultilingual-e5-small embeddings layered with a 2·3-gram full-text index, so Korean words still match with particles attached. Measured on a 97-document mixed Korean/English vault (2026-08).
src/kal_search.pybenchmarks
A 7-point gain from the graph in one-shot search. Against grep, a Sonnet agent tied or did slightly better, and a Haiku agent showed no significant difference (in grep’s direction). An own-vault run showed no advantage. All of it, with the limits.
See the benchmarks →the point
Decisions, postmortems, benchmarks, that one config flag: they live across hundreds of notes and chat logs. Instead of re-explaining context to Claude every session, connect the graph once and ask.
graph · citations
cloud · every device
architecture
photos · videos
Raw is what you and your agents already write. Kallimachos compiles it into an openwiki — plain Markdown pages in an open format — and builds a graph from those pages. Output is what your agents get back over MCP: answers, each with the documents it came from.
What you and your agents write, where it already lives
Before anything is read
Sessions on your exclude list are skipped, known secret formats in sessions are masked, and notes marked no_llm are never sent to an LLM.
compile
collect → summarize → extract → merge
An openwiki bundle on your machine: Markdown pages, and the graph built from them
Entities by type
ask
over MCP
Answers, with sources
Asked by
Counts from the author’s own vault, measured 2026-09-14; types measured 2026-09-26.
what leaves your machine
Entity names, relations, the chunk text used for search. The server must read them to search them, so the search index cannot be end-to-end encrypted. Better to say it now than have you find out later.
An open-source pipeline plus an Obsidian MCP server. It indexes your vault and Claude Code session logs into a LightRAG-style knowledge graph, and serves it to Claude over MCP with sources on every answer.
Hobby is free and already includes graph memory. Cloud lifts the limits: unlimited remote MCP tool calls instead of 2,000 a month, up to 1 GB of graph instead of 100 MB, photos and videos linked to entities, the encrypted session archive, and graphs built from your GitHub repositories. On both plans Claude can search your graph while your laptop is closed; on Cloud there is no monthly call limit. It is $15 a month, or $10 a month billed yearly.
Yes — entity names, relations and the chunk text used for search. The server has to read them to search them, so the search index cannot be end-to-end encrypted. If you connect a GitHub repository, the server also keeps a copy of that repository. Extraction still sends note text to Anthropic through your own claude CLI; mark folders no_llm to keep them out of it.
No. Entity extraction runs on your machine on your own Claude subscription. The server stores the result and runs a small embedding model (multilingual-e5-small) to search it — an encoder, not a generative model: it turns text into numbers for search and writes no text.
Yes. Pictures and videos embedded in your notes, or in folders you choose, are linked to entities on your machine — by your own tags, by the section they sit in, or by a name read from the picture — and every link shows its reason. In the app you browse them by entity; over MCP, Claude gets the picture itself with kal_media. Linking runs locally; the server never looks at the image.
Yes. multilingual-e5-small embeddings layered with a 2·3-gram full-text index, measured on a 97-document mixed Korean/English vault (2026-08). Korean is where a lot of setups get worse, so it is the case we measure.
Still have a question? Email the maintainer — billing and privacy questions go here, not to GitHub issues.
Start free — no card, graph memory included — or read the AGPL source on GitHub.