most stores hand back text that looks like your question. iglegais keeps why things happened and what is still true, in a single local file you run on your own machine.

embed the text, store the vector, hand back the nearest match. that tells you what a memory looks like. it stays quiet on why the thing happened, and on whether it still holds. three separate questions, and a nearest-neighbor search fumbles every one.
the quiet failure is worse. ask it something it has no answer for and it still returns the closest row, at cosine 0.2, reported as fact. the retrieval layer was never given permission to say i do not know.

every memory is a node: an embedding for meaning, a timestamp, and the subject it is about. the edges between nodes carry a type. caused by, contradicts, follows. the edges do the reasoning that similarity cannot.
so it walks a chain of causes down to a root, and it tells a live fact from a stale one, because it kept the edge that says one replaced the other. four hundred lines of sqlite hold the whole thing.


walks the caused-by chain from a symptom to the true root, even when the root reads nothing like the question.
subject slots retire stale beliefs with a foreign key, and as-of queries rebuild what you believed at any past moment.
a background pass merges duplicates and writes the higher fact a cluster of small memories implies, so the store gets cleaner as it grows.
no cluster, no vector database, nothing to boot. an mcp server and a python library sit over a single sqlite file. memories are rows, edges are rows, vector search is a dot product. everything below is the whole system.
built for builders
on the two questions that decide whether an agent feels sharp or broken, a flat vector store scores a flat zero. the graph scores everything. the benchmark ships in the repo.
no database to run, no server, nothing to boot. it installs as one package and keeps everything in a single file under your home directory.