Skip to main content

Overview

Memories and ingested documents live in one graph, connected by the entities they mention. Your saved belief “the ingest worker restarts via systemd” and the runbook you ingested both mention ingest worker, so they sit two hops apart, and recall follows the same edges.

Stored per chunk

Entity edges point at individual chunks, so the engine knows which section mentions what.

Shown per document

The graph API rolls those up into one weighted edge, so a 300-page PDF is one node, not 300.

What is in it

Only active memories and edges appear. Stale versions and reverted resolutions drop out.

Indexing

Indexing runs automatically a few seconds after you save a memory or add a file, debounced so a folder ingest becomes one run. Saves stay fast because the model work never blocks them.
Extraction is precision-first: it would rather miss an entity than invent one.

Extract

One model call per row against a closed vocabulary of 9 entity types, capped at the 5 most salient entities. The prompt lists names already in your graph so the model reuses them.

Validate

A deterministic pass drops out-of-vocabulary types, math expressions, sentence fragments, and names under two letters. Formula-heavy chunks skip the model entirely.

Resolve

Survivors resolve to a node by name key: casefolded, trimmed, leading @ dropped. Folded-away spellings resolve too, so Opus 4.8 lands on Claude Opus 4.8.
Entity types: person, organization, project, tool, technology, agent, place, event, and concept, which is explicitly a last resort. agent means a named AI model or assistant that does work, the actor rather than the company that made it.The same call extracts typed relationships against a closed predicate list: uses, depends_on, part_of, created_by, works_on, works_at, located_in, attended. Out-of-vocabulary predicates and anything under 0.7 confidence are kept as plain mention edges.A node’s identity is its name key alone. Type is an attribute, so an extractor that says technology today and project tomorrow cannot fork the node.
Extraction is not deterministic: the same input can extract differently on another run. --rebuild also needs a model, so running it offline still wipes, leaving everything unindexed until a key is configured. Belief edges are never touched by a rebuild.

The schema

The vocabularies live in a registry, not in code. Edit them in the viewer’s Schema tab, with memloom schema, or at GET /memory/schema. The description you write is the extraction rule, so write it like one: “a named drug or supplement” rather than “medications”. A proposal only surfaces after two independent extractions asked for it.

Managing entities

The Schema tab lists every entity with its usage counts and the tools to correct it. memloom can find the duplicates for you. See Entity resolution.

Traversal

Walks out from one entity instead of returning the whole graph. Stated relationships come back separately from entities that merely co-occur, because those are different kinds of evidence. In the viewer it is the traverse panel on the Graph tab; agents use related_entities.

In the viewer

Click a document diamond to expand it into chunks with their real chunk-level edges. Click a chunk to read it, with breadcrumbs back up. A document’s panel has an Open file button.
The daemon only opens files it previously ingested, looked up by document id and never by a path from the request, so that button cannot be pointed at arbitrary files.