Mem0 vs Letta vs Zep vs Ujex Recall: Picking an Agent Memory Layer
Mem0: managed, vector-first, dev-friendly drop-in. Letta: full agent framework with three-tier memory built in. Zep: knowledge-graph memory, opinionated retrieval. Ujex Recall: markdown-first, your-bucket-is-the-source-of-truth, BM25 + Vertex AI vectors. Pick based on framework needs and self-host requirements.
Pick the wrong memory layer and you'll rip it out in three months. Vectorize's writeup covers Mem0 vs Letta in detail; Letta's own essay on agent memory is canonical reading. This post adds Zep and Ujex Recall to the matrix and gives the pick-by-use-case rule.
The four shapes
Mem0
A memory service. SDK in Python and JS. Vectors via your choice of store. Hosted or self-hosted. The shape: agent calls memory.add and memory.search as plain functions; Mem0 handles chunking, embeddings, retrieval. Opinions about deduplication and update vs append.
Letta (formerly MemGPT)
An agent runtime with memory baked in. Three tiers: Core (in-context, RAM), Recall (searchable conversation, disk cache), Archival (long-term, cold storage). Letta is the agent loop, not just the memory. Self-hostable; managed Letta Code product available.
Zep
A knowledge-graph memory. Extracts entities and relations from conversation. Retrieval is graph-walk + vector. Hosted; SDKs in major languages.
Ujex Recall
Markdown files in your Cloud Storage bucket are the source of truth. Firestore holds derived metadata + vector index (Vertex AI embeddings). BM25 search baseline; vector retrieval optional. The agent reads/writes name.md files with frontmatter. Apache-2.0 SDKs.
Decision matrix
| Mem0 | Letta | Zep | Ujex Recall | |
|---|---|---|---|---|
| Memory shape | Vector-first | Three-tier (Core/Recall/Archival) | Knowledge graph | Markdown files + BM25 + vectors |
| Need an agent framework? | No (your loop) | Yes (Letta is the framework) | No (your loop) | No (your loop) |
| Self-hostable | ✓ | ✓ Free, full feature | ✓ (paid) | ✓ Apache-2.0 |
| Managed offering | ✓ | ✓ Letta Code | ✓ | ✓ Free tier |
| Data ownership | Your store / theirs | Your DB / theirs | Theirs (managed) | Your bucket (always) |
| SDK languages | Python, JS | Python (primary) | Many | Python, Go, TypeScript |
| License (SDK) | Open | Apache-2.0 | Open client SDKs | Apache-2.0 |
| Frontmatter / human-readable | ✗ | Internal format | ✗ | ✓ (just .md) |
Pick Mem0 if
- You want a drop-in memory function in your existing agent loop
- Vector retrieval is the right shape for your data
- You don't need a framework (already have one or wrote your own)
Pick Letta if
- You want the framework + memory together
- You like the MemGPT three-tier model (Core/Recall/Archival)
- You're starting fresh and Letta's loop fits your problem
Pick Zep if
- Your data is naturally graph-shaped (relationships matter as much as content)
- You want managed retrieval with smart entity extraction
- Hosted-only is acceptable
Pick Ujex Recall if
- You want the agent's memory to live as
.mdfiles you can grep - You want the bucket to be the source of truth (not a vendor's database)
- You want memory + email + audit + ingress + budgets in one project
- You want Apache-2.0 SDKs
The migration question
All four have export paths to plain JSON. Migrating between them is "export, transform, re-ingest." Vector embeddings will need recomputation (different embedding models). Plan for an afternoon, not a week.
What about Hindsight, SuperMemory, MemClaw?
Vectorize's Letta-alternatives roundup covers Hindsight, Mem0, Zep, SuperMemory. Hindsight in particular is the closest philosophical sibling to Ujex Recall — pure memory service, no opinion about your loop. MemClaw is newer; haven't tested in depth.
FAQ
Can I use Mem0 inside LangGraph?
Yes. Mem0 is a tool/library; LangGraph is the orchestration. They compose.
Does Letta run on its own?
Yes — Letta is a full runtime. You don't bring a separate framework.
Is Ujex Recall multi-tenant?
Yes — at the Pod level. Multiple agents per pod each get their own bucket prefix; cross-pod isolation is enforced via Firestore security rules + IAM.
What about token cost?
All four bill embeddings against your model provider. Storage is separate. Letta's three-tier model can save context-window tokens by paging Recall in/out; the others don't have that opinion.