Comparison with other memory tools¶
memd is one of several systems aimed at giving agents memory that survives
the context window. The closest neighbours are mem0, superlocalmemory,
Letta (formerly MemGPT), Zep, the newer research-grade systems
A-Mem, Cognee, and Memary, and raw vector databases used as memory
backends (Chroma, FAISS, Qdrant, others).
This page is design-first: how each system represents memory, retrieves it, runs as a process, persists state, and assigns trust. The cross-system retrieval numbers live in Benchmarking.
Headline benchmark¶
LoCoMo retrieval, same upstream locomo10.json, 10 conversations, 5,882
turns, 1,536 queries, MRR@10 over categories 1–4:
| System | MRR@10 | Hit@10 | Avg search | Seed |
|---|---|---|---|---|
memd v0.50.0 |
0.420 | 0.621 | 26.7 ms | 108 s |
superlocalmemory v3.4.46 (lexical) |
0.369 | 0.599 | 804.5 ms | 1.8 s |
mem0 v2.0.2 (LLM-extracted) |
0.354 | 0.591 | 40.9 ms | 13,424 s |
memd wins quality on every metric and is the fastest at search. Seed cost
trades off against retrieval quality. Full per-category numbers,
configuration, and reproducibility caveats: Benchmarking.
Design comparison¶
| System | Memory unit | Retrieval | Process model | Persistence | Trust model |
|---|---|---|---|---|---|
memd |
chunk-native + task.*/artifact.* records |
hybrid dense (HNSW) + sparse (BM25); optional rerankers | local CLI binary; warm worker + JSONL batch | SQLite (WAL) + segments + WAL + tantivy + HNSW | candidate · canonical · digest · verified; distinct-writer rule |
mem0 |
LLM-extracted memory units from raw turns | dense vector search over extracted memories | server + SDK; LLM-dependent at write time | vector store + metadata | implicit; trusts extractor and ranker |
superlocalmemory |
atomic-fact graph; Fisher–Rao retrieval | graph + embedding; lexical-only fallback under load | local Python service; embedding-worker subprocess | graph store | implicit; provenance via fact IDs |
Letta / MemGPT |
tiered context (core, archival, recall) managed by an LLM controller | dense vector search over archival; function-calling for promotion | server + SDK; LLM controller in the loop | Postgres or SQLite + vector backend | implicit; controller decides what to keep |
Zep |
session messages + extracted facts + temporal knowledge graph | dense + graph traversal | server (Go) + SDK; LLM extraction pipeline | Postgres + vector backend + graph | implicit; trusts pipeline-extracted facts |
A-Mem |
atomic notes with LLM-inferred links (Zettelkasten-style) | dense vector search; link traversal | library; LLM in the write path | vector store + link graph | implicit; trusts the linker |
Cognee |
entity-relation graph extracted by LLM | graph + vector hybrid | library or service; LLM at write | graph DB + vector backend | implicit; trusts extractor |
Memary |
knowledge-graph memory with recency/importance scoring | graph + dense | library; LLM at write | graph DB + vector backend | implicit |
| Raw vector DBs (Chroma, FAISS, Qdrant) | whatever the caller chunks and writes | dense vector search; sparse is BYO | server or in-process library | vector index + side metadata | none; caller's responsibility |
The columns above are deliberately narrow. They describe how each system shapes the work an agent has to do around the store, not whether one system is universally better.
What memd does differently¶
No LLM in the write path¶
mem0, Letta, Zep, A-Mem, Cognee, and Memary all run an LLM at
ingest time to extract or curate memory units, link entities, or annotate
facts. This has three consequences:
- Seed cost is large. On LoCoMo,
mem0seeded in 13,424 s againstmemd's 108 s, a 124× difference. The extra cost is the extractor running over every turn. - Write quality is coupled to extractor quality. Swapping the extractor
model — for cost, license, or capability reasons — invalidates the prior
memory, because the new model would have produced different units. The
mem0LoCoMo run uses a self-hostedgemma4-31bendpoint; published upstream numbers use a GPT-4-class model. - Extraction can drop information. A turn that an extractor finds unimportant is gone from memory; only re-ingesting raw turns can recover it.
memd writes chunks and structured records directly. If extraction is
useful, the agent does it inline and stores both the raw and the derived
records; nothing in the store assumes an LLM was involved.
Hybrid retrieval, not vector-only¶
Most of the systems above default to dense vector search. Dense is good at
paraphrase but bad at the lookup shapes agents actually generate often:
function names, file paths, error strings, ticket IDs, commit hashes,
parameter values. memd runs dense (HNSW) and sparse (BM25 over tantivy)
in parallel and fuses the results. The cross-system LoCoMo gap (+14% MRR@10
over the lexical-only superlocalmemory, +19% over the dense-only mem0)
is the headline data point.
Local CLI, not server¶
mem0, Letta, Zep, and the production vector DBs are server-shaped:
install a service, point clients at it, manage credentials. memd is a
single Rust binary plus an optional warm worker for the same process tree.
One trusted machine, one shared data directory per trust domain, multiple
agent processes. No network surface by default.
This buys two things. First, install friction is small enough that the same binary runs in agent shells, scripts, and CI without operational ceremony. Second, the data path stays on disk; there is no LLM API key, no embedding service round-trip, no service-level outage to debug.
The cost: multi-user deployments need an external trust boundary.
tenant_id is logical partitioning, not authorization. For shared
deployments, put a reverse proxy with real authentication in front, or
run separate data directories per trust domain.
Trust is a first-class object¶
Most systems return what they retrieve. The caller decides whether to
trust it. memd makes the contract explicit:
semantic_candidate— retrieved by similarity, no canonical artifact grounding.canonical_record— linked to a non-digest task or artifact record.compiled_digest_hint— linked to a digest artifact compiled from canonical records.verified_record— linked to an independent reviewer's verification withsupports_claim = truefrom a distinctagent_id.
The compiled wiki and digest libraries (project briefs, failure libraries, decision libraries, evidence libraries) are useful precisely because they cannot become ungrounded authority. They display their tier; downstream consumers can decide whether a hint is enough.
This is closest in spirit to the artifact discipline scientific-claim graphs use: a claim is meaningful only with context, evidence support is a separate object from the claim, and verification has to be represented explicitly.
When memd is the right tool¶
- One trusted machine, one or more agents, one shared memory.
- Task work that needs to survive sessions: goals, runs, failures, decisions, evidence, reviews.
- Retrieval that must mix identifier-shaped lookups (paths, error strings, ticket IDs) with semantic recall.
- A trust contract: digests must point back to canonical records, and verification must come from a separate writer.
When it is not¶
- Multi-user deployments with real authentication needs. Put auth at the
perimeter;
tenant_idis not an authorization boundary. - Workloads dominated by very-large-document retrieval where a server-class vector DB plus a tuned reranker is the right tool.
- Experiments whose point is a learned memory policy —
memddefines a substrate; the policy is a layer above it.
See also¶
- Architecture for the layer-by-layer breakdown and the static figure.
- Benchmarking for cross-system retrieval, internal task-memory, and the Bright-Pro biology adapter.
- Trust boundary for the candidate/canonical/digest/ verified rules.