comparison
brainctl v2.4.3 vs Mem0, Letta, Zep, Cognee, MemPalace, OpenAI Memory — as of April 2026. Rows marked ? could not be confirmed from public docs; verify before relying on them. Retrieval numbers in the bottom rows: brainctl is measured, competitor numbers are cited from their own published material — the head-to-head sweep on identical fixtures is wired up at tests/bench/competitor_runs/ but not yet executed. This table will be updated as that sweep lands.
| feature | brainctl | mem0 | letta | zep | cognee | mempalace | openai |
|---|---|---|---|---|---|---|---|
| local-first (no required server) | ✓ | partial¹ | partial² | partial³ | ✓ | ✓ | — |
| MIT license | ✓ | — (Apache 2.0) | — (Apache 2.0) | — (proprietary) | — (Apache 2.0) | ? | — (closed) |
| no LLM calls required | ✓ | — | — | — | — | ✓ | — |
| FTS full-text search | ✓ | — | — | — | — | ? | — |
| vector / semantic search | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | — |
| hybrid retrieval (FTS + vector) | ✓ | — | — | — | — | ✓ (hybrid v5) | — |
| knowledge graph | ✓ | ✓ (Pro) | — | ✓ (Graphiti) | ✓ | ? | — |
| auto entity linking | ✓ | — | — | — | — | ? | — |
| belief revision (AGM) | ✓ | — | — | — | — | — | — |
| Ed25519-signed exports | ✓ | — | — | — | — | — | — |
| on-chain attestation (opt-in) | ✓ | — | — | — | — | — | — |
| managed non-custodial wallet | ✓ | — | — | — | — | — | — |
| MCP server included | ✓ (201 tools) | ✓ | ✓ | ✓ | ✓ | ? | — |
| first-party framework plugins | 16 | ? | ? | — | — | ? | — |
| session handoffs | ✓ | — | ✓ | — | — | ? | — |
| prospective memory (triggers) | ✓ | — | — | — | — | ? | — |
| multi-agent shared store | ✓ | ✓ | ✓ | — | — | ? | — |
| context profiles | ✓ | — | — | — | — | ? | — |
| confidence decay / half-life | ✓ | — | — | — | — | ? | — |
| write gate (dedup + surprise score) | ✓ | ✓ | — | — | — | ? | — |
| consolidation engine | ✓ | — | — | — | — | ? | — |
| affect / emotional state tracking | ✓ | — | — | — | — | ? | — |
| free at rest (no per-op billing)⁴ | ✓ | partial⁴ | partial⁴ | — | ✓ (local) | ✓ | — |
| embedding model flexibility | ✓ (any Ollama) | ✓ | ✓ | ? | ✓ | ? | — |
| LOCOMO session-level recall (head-to-head)⁵ | 0.922 | ? | ? | ? | ? | 0.603 | ? |
| LongMemEval Recall@5 (head-to-head, n=470)⁵ | 0.970 | ? | ? | ? | ? | 0.966 | ? |
| MemBench hit@5 (FirstAgent slice, partial)⁵ | 0.930 | ? | ? | ? | ? | 0.885 | ? |
¹ Mem0 self-hosted exists but knowledge graph (Neo4j) requires a separate server. Graph features are cloud-only on the Pro tier ($249/mo). Free open-source tier is vector-only.
² Letta supports self-hosting. Requires a running Letta server process — not a single file.
³ Zep Community Edition was deprecated April 2025. Local operation now requires Graphiti plus a separate graph database (Neo4j, FalkorDB, or Kuzu).
⁴ Mem0 and Letta open-source tiers have no per-op billing. Cloud tiers are metered.
⁵ Same-machine head-to-head, run 2026-04-18 on Intel Core Ultra 7 258V / 33.9 GB RAM / Windows 10. LOCOMO row is session-level recall on locomo10.json (1,986 QA, brainctl cmd_session vs mempalace raw_session). LongMemEval row is R@5 on longmemeval_s_cleaned.json (470 q, brainctl cmd_search vs mempalace raw_session). MemBench row is hit@5 on the FirstAgent slice (200 q, partial). Repro: python benchmarks/compare_memory_engines.py --label full_compare. Honesty caveat: the vector-on/off flag for the cmd_search run was not persisted in the artifact bundle — we will not overclaim cmd_search as a clean vector-vs-FTS statement without rerunning that variant with the flag captured. Full table + provenance on /benchmarks.
what brainctl trades
local-first and MIT-licensed is the positioning. these are the costs that follow.
brainctl is local-first by design. No hosted API, no managed tier, no SaaS dashboard. Multi-machine sync requires managing brain.db replication yourself.
Brain.search baseline still shows weak single-hop/multi-hop hit@1 (0.167 / 0.174). In the latest sweep, hybrid improves top-heavy metrics materially (Hit@1 0.6983, Hit@5 0.9132, MRR 0.7920) and raises multi-hop Hit@5 to 0.6739, with a small single-hop Hit@5 giveback vs session (-1.63%) and near-tied Hit@10.
brain.db is a single WAL-mode SQLite file. Multi-agent works when agents share a filesystem. Across machines, sync the file manually. Zep and Letta's server-based architectures handle distributed access natively.
Managed wallet (brainctl wallet new) removes setup friction. Offline signature verification needs no network. But --pin-onchain depends on Solana. If you want the on-chain attestation, you're in that ecosystem.
No web dashboard, no graph explorer. Obsidian export gives a navigable vault layer, but it's one-way. Cognee ships a local graph UI; Letta has a cloud console; Mem0 has a platform dashboard.
Entities and edges grow from memory writes and explicit calls. No ontology layer, no required relationship schema. Cognee's ECL pipeline is more structured. Zep's Graphiti has temporal validity windows.
Same-machine head-to-head against MemPalace landed:
- LoCoMo session-level recall (n=1,986): brainctl 0.922 vs mempalace 0.603 — substantial win.
- LongMemEval R@5 (n=470): brainctl 0.970 vs mempalace 0.966 — narrow edge, statistical tie.
- MemBench hit@5 (FirstAgent slice, n=200): brainctl 0.930 vs mempalace 0.885 — clear edge, partial sweep.
- ConvoMem: blocked — evidence payload fetch failed.
Honesty note: the cmd_search run did not persist a separate vector-on/off flag in the artifact bundle, so the cmd_search numbers above should not be cited as a clean vector-vs-FTS statement without rerunning that exact variant. Full provenance, hardware, repro command, and per-metric breakdown on the benchmarks page.