Kallimachos
☰

Give your coding agents the decisions you’ve already made.

From 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?”

Paddle

payment processor

See also

Stripe
Paddle MoR model evaluated but incompatible with B2B AR requirements for Net 30/60 invoicing
Polar
Paddle claimed to lead it on PPP support — but on a criterion since rejected
Lemon Squeezy
same fee structure (5% + 50¢)
Merchant of Record
Paddle operates as one
VAT Act §53-2 (KR)
applies only when a MoR intermediates the sale

Decided 2026-08-23

0.1s

Real output: kal_neighbors("Paddle") over the author’s 1,128-note vault.grep "Paddle" returns 14 files. To find Stripe and Polar in them you have to already know to look for Stripe and Polar.
Works withClaude CodeCodexclaude.aiObsidian

grep gives Claude 37 lines. It still has to go read the files.

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 vaultClaude asks Kallimachos
First response37 matching lines · ~4,000 tokens20 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 indexYes — the relations are already facts
What else was considered?You must already know the names to grep forStripe, 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.

Your vault becomes a galaxy

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.

Galaxy view of the author's vault: 7,974 entities drawn as points grouped by topic, one color per topic, with the topic list on the left: Personal Knowledge Management Systems, AI alignment and safety, Hybrid search systems, Agent termination patterns

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.

The same graph with the topic Hybrid search systems hovered: its purple cluster stays lit while the rest dims, and a card shows the topic summary and its top entities

topics

Grouped, not just drawn.

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.

1,116
documents indexed
25,476
entities extracted
35,318
relations linked
286MB
index + graph

Measured on the author's vault · 2026-09-14 · 1,128 notes (23MB) → 286MB of index and graph in 79 files.

Answers, not matches.

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 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.py

Claude Code sessions become memory

Session 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.py

Search built for Korean text

multilingual-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.py

benchmarks

Measured on public multi-hop data, with the conditions attached

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

You already wrote the answer. Kallimachos finds it.

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.

Extraction runs on your machine. Cloud answers when your machine is off.

graph · citations

Every answer names the note it came from

  • Entities and relations extracted from your own writing
  • Answers cite the exact note and session they came from
  • A timeline lists what was recorded about an entity, and when
  1. kal_entity("session cookie")
  2. description signed · HttpOnly · rotated weekly
  3. relations auth decision · Redis session table
  4. docs wiki/auth-decision.md
  5. sessions/2026-03-14-auth-review.md

cloud · every device

The server answers requests while your laptop is closed

  • An always-on remote MCP endpoint
  • The same graph and tools from claude.ai, Claude Code and Codex
  • Claude can search your graph while your laptop is closed
  1. 03:14 laptop sleeping
  2. 03:14 mcp listening
  3. 03:15 phone → query → answer + sources

architecture

Extraction runs on your machine. The server never calls an LLM.

  • Entity extraction runs locally on your own Claude subscription
  • Only what search needs goes to the cloud; your vault folder is not mirrored — unless you connect a GitHub repository (see Privacy)
  • The server calls no LLM, only storage and a small embedding model, so Cloud is a fixed monthly price, not billed per call
  1. Obsidian vault + Claude session logs
  2. │ extract (your machine · your subscription)
  3. ▼ graph 286MB
  4. │ push
  5. ▼ cloud storage
  6. │
  7. ▼ remote MCP

photos · videos

See the whiteboard behind the decision

  • Photos and videos in your notes are attached to the entities they show — and each link says why: you tagged it, it sits in the section that names it, or the name is written in the picture
  • Open an entity and see its pictures, or browse every photo and video by entity in the app
  • Ask Claude about an entity and it can look at the picture itself, not just the note around it
  1. kal_entity("session cookie")
  2. media auth-whiteboard.jpg tagged · 1.0
  3. login-flow.png in its section · 0.9
  4. error-screen.png name in the picture · 0.7
  5. kal_media("3f9a…")
  6. → image the whiteboard itself, for Claude to read

From notes to answers, in three layers

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.

raw

What you and your agents write, where it already lives

  • Obsidian notesyour vault
  • Claude Code sessions~/.claude/projects
  • Codex sessions~/.codex/sessions
  • Photos and videosembedded in your notes, or folders you choose

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

  • Documents1,116your notes and a summary of every conversation, as OKF Markdown pages you can open, edit and diff in gitpersonal/notes/ · personal/sessions/{claude,codex}/
  • Entities25,476the things your work is about, sorted by type
  • Relations35,318each with when it changed and the documents it came from
  • Aliases and homonymsconfirmed by a person, not guessed

Entities by type

  • artifact7,152
  • method4,216
  • concept3,844
  • failure3,562
  • tool2,032
  • decision1,737
  • metric1,267
  • event654
  • actor582
  • project430

ask

over MCP

output

Answers, with sources

  • kal_search · kal_entityfind, or go straight to a name
  • kal_neighbors · kal_timelinewhat connects, and what changed when
  • kal_doc · kal_statsread the source, see what is inside (kal_stats: cloud now, open source in the next release)
  • kal_mediathe photo or video linked to an entity, as an image (cloud now, open source in the next release)
  • Galaxy viewthe same graph, to look at
  • Cloudthe graph and note passages are uploaded to the server for remote MCP, never passages from notes marked no_llm

Asked by

  • Claude Code
  • Codex
  • claude.ai

Counts from the author’s own vault, measured 2026-09-14; types measured 2026-09-26.

what leaves your machine

What goes to the cloud is not metadata. It is the knowledge itself.

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.

  • If privacy is why you use Obsidian: a push never sends the passages of notes marked no_llm. If you connect a GitHub repository instead, the server keeps a copy of that whole repository to build from — no_llm notes included, though their text, paths and titles are left out of the search graph.
  • The desktop app can keep your agent sessions in the cloud as an archive. It starts only after you give it an upload token, masks known secrets by default, and encrypts everything on your device first — the server cannot read it.
  • The server never runs an LLM over your notes. Extraction happens on your machine, on your subscription — but it does send note text to Anthropic through your own claude CLI, so mark folders no_llm to keep them out of it.
  • Photos and videos are uploaded to the server only when you push them. Photo thumbnails and view copies have camera metadata removed (a GIF's view copy is kept as it is); originals are stored as they are — location included — unless you turn originals off. The capture date and file path of each are uploaded with it. The cloud copy is for viewing: keep your own originals.
  • The local product that builds your graph and decides what is uploaded is AGPL-3.0 and public, so you can read exactly what it sends. The hosted server’s source is not published.
Read more →

Common questions

What exactly is Kallimachos?

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.

What does Cloud add over Hobby?

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.

Do my notes go to the server?

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.

Does the server run an LLM over my notes?

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.

Can I see the photos and videos for an entity?

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.

Does Korean search actually work?

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.

Next time you think “I wrote this down somewhere”, ask Claude.

Start free — no card, graph memory included — or read the AGPL source on GitHub.