Haki is the memory layer for AI agents where every fact carries a date, a source and a status — so your agent uses what's true today, and can prove it.
No credit card • running in 2 minutesYour agent recalls a preference stated three months ago. It changed since. The agent applies it anyway, confidently, and nobody notices.
That's how today's memory layers fail: they know how to add, not how to correct. Contradictory facts pile up, semantic search picks one at random — and when someone asks "why did the agent say that?", nobody can answer.
Haki is built around the opposite question: what is true right now, and how do we prove it?
One command stores a preference, captures the change of mind that replaces it, opens a brand-new conversation — and checks that the agent serves the current value, keeps the old one marked superseded, and ties the whole thing to a trace.
This is the test we're asking you to run before you take our word for it.
> haki verify ✔ capture "invoices in French" ✔ capture "actually, in English" same thread ✔ consolidate 1 supersession ✔ context NEW thread 0.04 s recalled invoice_language = "en" hidden invoice_language = "fr" superseded trace 7c99a8de… OK — remembered across conversations.
Capture, consolidation, context, trace, forget. Five explicit steps — and with every answer, proof of what was used.
Every fact is dated and versioned. A change of mind supersedes the old one — never deleted, never served as current.
Unresolvable contradiction: both versions are withheld.
Every context ships with its sources, its dates and a trace: what was kept, dropped or blocked — and why.
“Why did the agent say that?” answered in a minute.
Coded agent, Cursor, n8n, or a one-line base_url swap. You keep your stack.
Embeddings computed locally: no network call on the critical path. Measured, reproducible — scripts/benchmark_context.py.
Two details that change everything in practice — and a full explanation of every context decision.
When a fact mentions another person, Haki widens the search to their facts too — two hops max, no extra LLM call.
A fact captured in French answers a question asked in English. Local multilingual embeddings, tested FR / EN / ES in real conditions.
No network call for the embedding — so no data leak to a third party.
Every fact kept or dropped has a reason, not a black box
The context budget is limited. What doesn't fit is never silent: every fact carries an explicit status in the trace.
Based on recent public research (sites, docs, accessible source code) — not on figures we can't source. Where we couldn't verify something, we say so.
| Haki | Supermemory | Zep | Mem0 | |
|---|---|---|---|---|
| Strict bitemporality (no silent deletion) | ✓ | ✓ | ✓ | ~ |
| Full self-hosting, one command | ✓ | ~ | ✗ | ✓ |
| Coded reason per fact (kept / excluded / blocked) | ✓ | ✗ | ✗ | ✗ |
| Database-enforced isolation (RLS) | ✓ | ~ | ~ | ? |
| Forget propagated to derived data, with a receipt | ✓ | ~ | ~ | ? |
| Automatic OpenAI-compatible memory injection | ✓ | ✓ | ✗ | ✗ |
| Ecosystem, integrations, community | ~ | ✓ | ✓ | ✓ |
| Published benchmark results | ⏳ | ✓ | ✓ | ✓ |
✓ confirmed · ✗ confirmed absent · ~ partial / different mechanism · ? not publicly verified · ⏳ coming
Every sourced symbol links to its public source (hover or click). Research done 10 Aug 2026 — spot an error? Tell us, we'll correct it and flag it.
four explicit steps — observable, replayable, not a black box.
Every conversation turn is captured with its source, without blocking your agent.
An async job extracts facts, dates them, versions them and detects contradictions.
On every request, Haki assembles the relevant context packet — p95 measured at 249 ms across 10,000 facts.
Every answer returns a trace: what was kept, dropped, blocked — and why.
Steps 01–04 build the memory. Here's the payoff: your agent draws on it at request time, with no network call on the critical path.
Most memory layers describe a behaviour in their docs. We describe ours with the name of the test that proves it, against a real PostgreSQL database — never mocks.
A guarantee that isn't tested isn't a guarantee. Found one that doesn't hold? Open an issue — we'll publish it.
The field's evaluation ground truth is broken — an independent audit found 6.4% of answer-key errors in LoCoMo, the most cited benchmark in the space. Rather than a number you can't verify, we'd rather publish what we can prove today.
see the guarantees contract →Current is told from stale; a contradiction is flagged, never guessed.
p95 measured across 10,000 active facts, locally — reproducible via scripts/benchmark_context.py.
Organisation → project → subject: nothing crosses over. Scopes come from your backend, never from the model. And forgetting really propagates, with a timestamped receipt.
A key is bound to one project. Requesting another returns 403 forbidden_scope — without ever revealing that it exists.
Isolation is enforced by the database itself: even if the code forgot a filter, a query cannot cross project boundaries.
POST /v1/forget erases derived facts, embeddings, events and traces, and writes a timestamped receipt.
docker compose up -d. The full server, Apache 2.0, no amputated edition. Zep deprecated its self-hosted Community Edition in April 2025.
SDK, MCP server, n8n template or gateway: plug Haki into your stack in minutes.
Memory is coming to your stack…Join the betaThe same product at every tier — no feature is locked behind a paywall. Only the monthly credit volume changes.
Try Haki in the cloud, no commitment.
Or self-host for free, no credit limit — source below. GitHub →
For a first agent in production.
For several agents or a team.
For serious, growing volume.
Multiple boundaries, dedicated deployment, compliance review.
Private beta • self-hosted free and open source • no commitment
No — Haki already ships its own vector index (pgvector, hnsw) and full-text index. A single docker compose up is enough.
The old fact becomes “superseded”: it stays in history but is never served as current again. On a real contradiction, Haki withholds both versions and flags it rather than guessing.
No. Embeddings are computed locally, with no network call on the critical path: p95 measured at 249 ms across 10,000 facts (public, reproducible benchmark script). LLM extraction is asynchronous.
No. Three lines around your call with the SDK, or a single base_url swap with the OpenAI-compatible gateway. Cursor and n8n have their own integrations.
Every context returns a trace_id. Inspecting it shows each memory kept, dropped or blocked, with its reason code and source.
POST /v1/forget propagates deletion to derived facts, embeddings, events and traces, and writes a timestamped receipt in forget_receipts.
Because precision degrades with length: when the right answer moves from position 1 to position 10 in a 20-document context, accuracy drops by about 30% — measured across GPT-4.1, Claude Opus 4 and Gemini 2.5. Serving 1,500 relevant tokens instead of 115,000 attacks this problem directly. And a full context can't supersede, trace, or forget.
We don't publish any yet. The field's evaluation ground truth is broken: a public April 2026 audit found 6.4% of LoCoMo's answer key is wrong — the real ceiling is 93.6% — and the standard judge accepts up to 63% of deliberately wrong answers. We'll publish our numbers with a frozen configuration, dataset checksums, three runs, and the categories where we lose. Not before.
Your agent keeps going. The gateway switches to X-Haki-Memory: degraded and forwards the request. We never block your critical path — and we never fail silently: a degradation is always visible in the response.