Mem0 vs Zep vs Letta vs a local ledger

Choosing agent memory in 2026, including the cases where the answer is not us.

The question that actually separates them

Every option below can store and retrieve memories. The differences that matter in practice are four: where your memory lives (their database, their platform, or your repo), what it costs to have installed (tokens of tool definitions before your first prompt), what happens to a number you corrected (does the agent keep quoting the old one from history?), and what happens when the agent writes the old number back anyway (is the correction merely shown, or enforced?).

Where memory livesShapeHonest fit
Mem0Hosted memory API + vector storeManaged service, the most adopted in its tier. Free, Starter $19, Pro $249, Enterprise custom (pricing page, 31 Aug 2026)You want a hosted memory database with a team behind it, and vendor storage passes your security review. Corrections are a free-tier feature there, not what the product is built around.
ZepHosted temporal knowledge graphGraph-native, with temporal edges. A superseded fact is invalidated instead of deleted. Free tier, then Flex from $125/mo, and the open-source Community Edition was discontinued in 2025 (Graphiti stays Apache-2.0)The closest to us in intent. You want relational and temporal structure, and hosted storage is fine.
LettaInside their agent runtimeAgent OS with memory built inYou are building agents on their runtime anyway. As a bolt-on to an existing MCP client, it is a big adoption.
Cognee / LangMem / GraphitiWherever you assemble itLibrariesYou want parts and are building your own memory system.
Cloudflare Agent MemoryYour CF account (KV/DO)Platform-native defaultYour whole agent stack is Cloudflare-native and platform defaults are fine.
claude-memYour machine, as a coding-agent pluginCaptures everything the agent does in a session and compresses it with an AI model (its own description). Apache-2.0, 102,011 GitHub stars (21 Oct 2026)You want a record of everything your agent did, with no effort. It captures and recalls; it does not block an edit that brings a corrected value back.
SupermemoryHosted memory API (can also run locally)MIT. Free, Pro $19, Scale $399 (pricing page, 21 Oct 2026)You want one memory layer across apps and tools. Like Mem0 it makes memory available; it does not enforce it.
beadsYour repo (an issue graph)Work items agents claim and close across sessions. MIT, 28,062 GitHub stars (21 Oct 2026)You want agents to track work between sessions. It remembers tasks, not corrections, so the two fit together.
TellOnce (TRACE)Your agent runtime, as a skillA research pipeline that compiles a user's corrections into checks an agent must pass (arXiv 2606.13174)The closest idea to ours, from the paper our guard cites. A research release rather than a product so far.
Ambient platform memoryInside one vendor's productDefault-on in GitHub Copilot, Claude Code auto-memory and Cursor, extracted from conversations. Copilot's expires after 28 daysYou want zero setup and are fine with memory you did not choose to record, that can expire, and that your other tools cannot read. Nothing there is enforced at edit time.
Hand-rolled CLAUDE.mdYour repoA file you curateFine at small scale, and our real competitor. There is no causality and no query, and corrections rely on your editing discipline.
memory-pulseYour repo (local JSONL ledger)A causal ledger with a guard that blocks an edit bringing a corrected value back; MCP tools, an agent board, optional hosted memoryYou want your agent to stop re-quoting withdrawn numbers, and to be blocked from writing them back, working from a file you own.

What we lead with

Corrections surface first, and are enforced. A correction recorded once outranks the history that contained the old number, at every brief size, in every session. Surfacing alone is not enough: a correction remembered in one session can be re-violated in the next (TRACE, arXiv 2606.13174, measured that with Mem0 memory, 57.5% of applicable preference checks were still violated). So the guard hook checks every edit before it lands and gives one of three verdicts: verified (the edit agrees with the ledger), blocked (it writes a withdrawn value back, and the verdict names the ledger line and date that retired it), or no evidence (the ledger has nothing to say, reported as exactly that and never as a pass). A comparison that names the replacement beside the old value goes through. This is the behavior you can test in five minutes, or right now in the browser.

You can show your memory was not altered. Hash-chained audit logs are common now. What we have not found elsewhere is keyless verification: give an auditor the receipt and the public verify endpoint and they can confirm it without your key and without anything from us. A substituted, deleted, reordered or truncated event fails by name.

The context cost is small. All four tool definitions come to ~900 tokens, or 3.3 KB, enforced by a test that fails the build past 4 KB. Independent measurements put a typical multi-server MCP setup at 50–67k tokens before the first prompt.

Nothing of yours is stored unless you ask. Your memory is a file in your repo and we keep no copy of it, so there is nothing on our side to leak and nothing to migrate if you leave. The exception is hosted memory, which you turn on per project on a paid plan to sync machines; turning it off erases our copy. The free tier needs no account at all.

When not to pick us. You need cross-repo organizational memory shared by many teams, which hosted graphs do better today. You need multi-seat admin and SSO, which we do not have. You want memories extracted automatically from every conversation, where we record only what you tell us to remember.

Industry benchmarks, with the method attached

LongMemEval and LoCoMo are the two benchmarks the field quotes. A score on either is only comparable when the reader model, the judge model, the retrieval unit and the question set are named. The official LongMemEval judge is gpt-4o-2024-08-06 with per-type prompts, LoCoMo's official metric is token F1 with no judge, and vendors disagree even on LoCoMo's category labels. So every row below carries its method, and a row without one is not here.

BenchmarkSystemScoreReader / judgeSource
LongMemEval-Smemory-pulse, retrieval onlyR@5 0.970 · R@10 0.985
session recall_any@k
none / nonemeasured 2026-09-01
n=470 (30 abstention excluded), BM25 program run in our execute sandbox, 10 s for all 500
LongMemEval-Smemory-pulse, QA with a local 8B reader64.2%
QA accuracy, all 500 questions (task-averaged 68.5%)
qwen3:8b, local / qwen3:8b, official per-type promptsmeasured 2026-09-01
n=500, no sample. The reader gets ~2k tokens (top-20 hit turns plus the following turn, grouped by session date). By type: single-session user .914 · single-session assistant .964 · knowledge-update .833 · temporal reasoning .511 · multi-session .421 · preference .467, abstention .733 (n=30). The judge is a local model, not gpt-4o-2024-08-06: exact against our own arms, approximate against vendor rows
LongMemEval-Smemory-pulse, fixed-size signature index, retrieval onlyR@5 0.955 · R@10 0.985
session recall_any@k
none / nonemeasured 2026-09-01
n=470, one fixed 8 KB signature per session whatever its length, term weights read from the signatures themselves, no inverted index, no embeddings
LoCoMomemory-pulse, QA with a local 8B readerJ 70.1 · F1 0.400
LLM-judge (J) and official token F1, cats 1–4
qwen3:8b, local / qwen3:8b, Mem0 'be generous' promptmeasured 2026-09-01
n=1,540, every question, top-10 turns to the reader. By official id: 4 single-hop J .790 / F1 .512 · 2 temporal .670 / .363 · 1 multi-hop .553 / .191 · 3 open-domain .458 / .153. 99 of the 1,540 answer keys are known-bad (issue #27), so 93.6% is the ceiling for anyone. The judge is a local model, not gpt-4o-mini
LoCoMomemory-pulse, retrieval onlyturn R@5 0.574 · session R@5 0.894
recall@k over evidence dialog ids
none / nonemeasured 2026-09-01
n=1,536, categories 1–4 by official id, BM25 over every turn
LongMemEval-SPaper full-context baseline60.6%
QA accuracy
gpt-4o / gpt-4o-2024-08-06Oct 2024
LongMemEval-SZep71.2%
QA accuracy
gpt-4o-2024-11-20 / LLM judge (model not named)Jan 2025
LongMemEval-SSupermemory (third-party rerun)81.6%
QA accuracy
gpt-4o / gpt-4o, paper prompts2026
LongMemEval-SMem094.4%
QA accuracy
gpt-4o / gpt-4oApr 2026
LongMemEval-Sagentmemory (rohitg00)R@5 0.952
session recall_any@5 (retrieval only)
none / none2026
LoCoMoFull-context baseline (Mem0 paper)J 72.9
LLM-judge (J), cats 1–4
gpt-4o-mini / gpt-4o-miniApr 2025
LoCoMoMem0J 66.9
LLM-judge (J), cats 1–4
gpt-4o-mini / gpt-4o-miniApr 2025
LoCoMoZepJ 75.1 ± 0.2
LLM-judge (J), cats 1–4
gpt-4o-mini / gpt-4o-miniMay 2025
LoCoMoLetta (filesystem)74.0%
accuracy, cats 1–4
gpt-4o-mini agents / gpt-4.1Aug 2025
LoCoMoMem0 platform v392.5%
accuracy, cats 1–4
gpt-5 / gpt-52026

Our retrieval rows have no model in the loop: the memory system's job is to hand the reader the right evidence, and that is measured directly against each question's labelled evidence. Our QA rows are the complete runs, every question, on a local 8B reader and judge (qwen3:8b on an M1 Pro, $0) with the official prompts. Because the judge is not the official gpt-4o, read them exactly against our own arms and only approximately against vendor rows. On both benchmarks the shape is the same: single-hop questions are strong and multi-hop and temporal questions are the weakest, which is where the work goes next. Vendor rows are as each vendor published them, read 1 September 2026. The readers and judges differ from row to row.

The five-minute test

Installation (claude mcp add memory-pulse -- npx -y memory-pulse), one correction recorded with remember (kind=correction), a new session, and a question about the old number. The same sequence against your current setup makes the comparison.

← memory-pulse