Anansi is in private beta — the API is being hardened before general access.Join the waitlist →
// memory api · v0.3.0 · MIT licensed

Memory that knows what you knew — and when you knew it.

Give your AI a memory that remembers your users across every session — and lets you rewind to exactly what it knew at any moment in the past. Two endpoints, synthesized profiles that drop straight into a system prompt, open-source and docker compose up if you'd rather run it yourself. Under the hood: a bi-temporal knowledge graph.

time axes
valid + knowledge
license
MIT
embedding
768-dim
retrieval
BM25 + vector
POST /v1/ingest · GET /v1/contextREST · JSON · bearer auth
// POST /v1/ingest await memory.ingest({ userId: "user_abc", content: "Prefers TypeScript. Building a VAPI voice agent.", }); // → 202 Accepted { id, queued: true } // GET /v1/context const ctx = await memory.context({ userId: "user_abc" }); // → 200 OK // { // static: ["Senior TS engineer", "Uses BullMQ", ...], // dynamic: ["Building VAPI voice agent this week"], // relevant: [...] // }
time axes
2
valid-time + knowledge-time
license
MIT
self-hostable · docker compose
core endpoints
2
ingest + context
connectors
4
notion · gdocs · linear · transcripts
retention
pro
7d free · ∞ pro
embeddings
768-dim
nomic · ollama · bring your own

From conversation to system-prompt-ready memory.

Two endpoints on the outside. Three stages on the inside. One synthesized artifact your model can actually use.

In plain English

Think of Anansi as a notebook your AI keeps about each user. Every time someone talks to your app, the message gets handed to Anansi. Anansi quietly figures out what's worth remembering — who the user is, what they're working on, what they prefer — and writes it down. Next time the user shows up, your app asks for the notebook and pastes it into the prompt. The AI greets them like an old friend.

  1. Your app sends a message → Anansi stores it
  2. In the background Anansi summarizes what matters about the user
  3. Your app asks for the summary → Anansi returns a short profile
  4. Paste it into the system prompt → the AI remembers the user

Under the hood

Two HTTP surfaces, three internal stages, one versioned artifact (static_documents) per user.

  1. Ingest pathPOST /v1/ingest → sanitize (PII / secret redaction) → chunker (512 tok, 50 overlap, source-aware) → embed (768-dim) → pgvector + Postgres. Returns 202 immediately — embedding runs off the request path.
  2. Synthesis worker — BullMQ job, advisory-locked per user. An LLM pass reads accumulated chunks and writes static_facts (≤30) + dynamic_context (≤15) + bi-temporal entity graph.
  3. Retrieve pathGET /v1/context → Redis cache (60s TTL) → BM25 + vector search (parallel) → reciprocal rank fusion → JSON.
// architecture · ingest top, synthesis middle, retrieve bottom
INGESTSYNTHRETRIEVEYour AI appchat · voice · agentPOST/v1/ingestSanitizeredact PII · secretsChunk + embed512 tok · 768-dimPostgres+ pgvectorSynthesis workerBullMQ · advisory-lockLLM reads chunks→ writes static + dynamicstatic_documentsstatic[≤30] + dynamic[≤15]+ entity graph// invalidate on synthesisYour AI appsystem promptGET/v1/contextRedis cache60s TTLHybrid retrievalBM25 + vector · RRFPostgreschunks + profile

Two endpoints. No SDK required.

SDKs are convenience wrappers. The contract is REST, the auth is a bearer token, the response is JSON. Two calls do the job; the other two surfaces are there when you need them.

POST/v1/ingest

Store a conversation turn, document, note, or meeting transcript. Sanitization + chunking + embedding happen async — the request returns 202 before any of it runs.

GET/v1/context

Returns synthesized static + dynamic arrays plus optional relevant chunks. Drop both into a system prompt.

POST/v1/search

Raw hybrid search (vector + BM25 + RRF). For when you want the chunks, not the profile.

GET/v1/entities

Bi-temporal entity graph extracted during synthesis. People, projects, decisions — with valid-time and knowledge-time edges, queryable via asOf / asOfKnowledge. Pro+.

Open-source memory with a bi-temporal graph.

Memory is a crowded space. Here's what Anansi does that's genuinely distinct — each one backed by code in the repo, not a slide.

01 · Bi-temporal graph

Entity edges track two time axes — valid-time (when it was true) and knowledge-time (when we learned it). Query the graph asOf a date, or as we knew it. Ask what was true when.

02 · MIT & self-hostable

Open-source under MIT. docker compose up brings up Postgres + Redis; the API ships its own Dockerfile. Run the hosted service or host it yourself — your users' memory, your infra.

03 · Synthesized profiles

An LLM pass distills accumulated chunks into static facts and dynamic context. Drop both arrays into a system prompt — no chunks to dedupe, rank, or trim yourself.

04 · Bring your own embeddings

Swap the embedding provider (Nomic or local Ollama), or skip it entirely — pass a pre-computed embedding on ingest and we store your vectors. Model-agnostic on the LLM side too.

GET /v1/entities · the "as we knew it" querybi-temporal · Pro+
// In June you learn: Alex actually left Acme back in April. // A single-axis graph quietly rewrites history. Anansi keeps both axes. // "What was true on May 1 — as we KNEW it on May 1?" await memory.listEntities({ userId: "user_abc", asOf: "2026-05-01", // valid-time instant asOfKnowledge: "2026-05-01", // knowledge-time instant }); // → Alex —works_at→ Acme (current: true) — you hadn't learned they'd left // "What was true on May 1 — as we know it TODAY?" await memory.listEntities({ userId: "user_abc", asOf: "2026-05-01" }); // → no works_at edge — the April departure, recorded in June, now applies

Three places Anansi genuinely wins.

Not "memory for everyone" — memory for teams whose problem shape matches what this engine actually does.

Compliance & audit

"What did we know on March 3rd?" is an audit question, and most memory stores can't answer it — they overwrite. Anansi's knowledge-time axis reconstructs the graph as you knew it at any instant, self-hosting keeps memory on your infrastructure, and DELETE /v1/user gives you a GDPR hard-delete that cascades through chunks, profile, and graph.

Slack-first teams

Install the Slack app and the workspace becomes shared memory: messages ingest automatically, /ask answers from a two-layer profile (curated static facts + current context), and /memory forget-me lets anyone opt out. No pipeline to build — the bot runs on the same engine as the API.

OSS-first engineers

MIT license, no open-core asterisks. docker compose up starts Postgres + Redis, and with local Ollama serving both embeddings and synthesis, the whole stack runs on your laptop with zero external API calls. Read the retrieval code before you trust it with your users' memory.

Where Anansi sits.

An honest read of the memory landscape. Mem0, Supermemory, and Zep are strong tools with graph memory, temporal reasoning, and dashboards of their own — these are the axes where Anansi is genuinely differentiated.

capabilityanansisupermemorymem0
Knowledge-time queries — the graph "as we knew it" (asOfKnowledge)
MIT license, full stack self-hostable via docker composehostedOSS core
Graph / temporal memory
Synthesized profile (system-prompt ready)
Hybrid retrieval (BM25 + vector)
First-party Slack app with /ask team memory

// based on each product's public docs as of July 2026. Spotted an error? Open an issue — we'll fix the table.

Pay for what you ingest. No per-seat tax.

Usage-metered. Cancel any time via /portal. Free tier is real — 1,000 ingest calls per month, no card.

free
$0/mo
  • 1,000 ingest calls
  • 500 context calls
  • 10 memory users
  • 7-day retention
  • vector retrieval
Join waitlist →
scale
$99/mo
  • 250,000 ingest calls
  • 100,000 context calls
  • everything in pro
  • priority support
  • SLA on request
Contact us

Anansi didn't weave a new web for every story. Your agent shouldn't build a new mind for every session.

Stop letting your agent forget.

Two function calls. Any LLM. Free tier, no card. Five minutes from signed-up to remembering users in production.

Join the Anansi beta.

We're hardening the API before opening general access. Drop your email and we'll reach out when you're in — no spam, one email when beta opens.

// no spam · one email when access opens · unsubscribe anytime