Memory with receipts.

A memory plugin for AI chats that outgrow their context window. It finds the few messages that matter, answers with receipts, and says “not in memory” instead of making things up.

Built for the Reactive AI Memory Retrieval Challenge START Warsaw × Poland Tech Week 2026

How Librarian answers a question

In August a user has tried three Korean restaurants. By late September it’s four. In October they ask. The answer is one sentence in months of chat, next to dozens that look almost right.

  1. It's a fact, a recommendation, a count, an update or a date. Each gets its own search.

  2. Keyword and meaning search over every turn, reranked on our own machine. Reactor only sees the passages we pick.

  3. About three dated passages. Dates and day gaps are computed in code.

  4. It reads 0.2% of the archive and cites the sessions it used.

  5. If the evidence is weak, the answer is “not in memory”.

Who it's for

Any assistant that talks to the same person for months: agents, companions, support desks and teams.

Proactive personal agents

Agents that work for you around the clock: booking, buying, planning. Before they act, they need your preferences and commitments, with proof.

Book dinner for Friday.

The agent checks your diet, your Friday plans and who's coming. Every fact comes with the conversation it was said in. Anything not in memory becomes a question for you.

Try the pre-flight check

Before booking dinner for Friday

  1. Your dietFound, with the chat it came from
  2. Friday plansFound, with the chat it came from
  3. Who's comingNot in memory: the agent asks you
Checks run on Librarian's recall. Nothing is booked on a guess.

Companions and coaching personas

Companion apps, coaches, branded characters, game NPCs. The longer the relationship, the worse they remember.

  1. What's my cat called?The fact, with the session it came from.
  2. That book you recommended?Its own past advice.
  3. I moved in July.The latest value wins. Both get cited.
  4. How long since my surgery?Dates computed in code.
  5. Remember our trip to Rome?“I don't think you told me about Rome.” No invented memories.

Memory audit “What's my cat called?”

  1. Sombra
  2. Fig
  3. Sombra
  4. “Fig or Sombra?”
When a fact changes, Librarian shows every version with its date, so the persona can ask instead of guessing.

These are the five question types of the Reactive AI challenge. We score 87.1 on them.

Customer support

Agents and bots answering the same customer across months of tickets.

What did we promise this customer in March?

The promise, the date and the ticket it was made in.

Team memory

A team's chat history, searched by everyone who joins later.

What did we decide about pricing?

The decision and when it was made, or “never decided”.

What goes wrong in long chats

Facts change

Three Korean restaurants in August, four in September. The latest wins, and both get cited.

Answers hide in one line

“A kitchen gadget” turns out to be an Instant Pot, mentioned once in passing.

Some answers don't exist

Two dogs appear in the history: a friend's puppy and a hospital therapy dog. Neither is theirs. Librarian says so.

Ask-back: a second search when the first one misses

When the first evidence pack misses, the model gets a private link to the user's archive and runs its own follow-up searches, then answers from what it found, with citations. Any agent with tool access can do this through the MCP server. In our live test, Reactor did not open the link yet.

11 of 16 facts our first pass missed, recovered by follow-up searches in offline tests

Results

Every retrieval change is scored against known answers in minutes, without calling Reactor. That's how one slow, shared model got five rounds of improvements in one night.

87.1
offline score, up from 42.9 for keyword search
146/146
test questions answered by Reactor
0.2%
of each archive read per question
13
times it said “not in memory” instead of guessing

Use it as a plugin (MCP)

Any agent that can call a tool can use Librarian: the same search, timeline and evidence packs the demo uses.

claude mcp add --transport http librarian \
  https://librarian67.pages.dev/mcp
recall
Evidence for a question, or not in memory
search
Free-text search over one archive
timeline
Every dated mention of a topic
ask_reactor
Reactor answers with citations
get_answer
Poll a Reactor answer
list_users
The 15 demo archives

Open demo: 15 real test archives from the challenge.

Tech stack

Python for retrieval, Reactor for answers, Cloudflare for hosting.

Retrieval Python 3.12

  • Question router and 5 type-specific lenses
  • BM25 (bm25s, Snowball stemmer)
  • Dense embeddings: BAAI/bge-small-en-v1.5 (384-d) via sentence-transformers
  • Reciprocal rank fusion (k = 60)
  • Cross-encoder reranker: ms-marco-MiniLM-L-6-v2
  • PyTorch on CPU
  • Dates, day gaps and counts computed in code

Answering

  • Reactor (Reactive AI) over its WebSocket API
  • Evidence passages labelled [E1]…
  • Citations mapped to session ids
  • “Not in memory” when evidence is missing
  • No other hosted LLM anywhere in the pipeline

Ask-back and plugin

  • Private per-question memory links Reactor can open
  • MCP server (JSON-RPC over Streamable HTTP) with 6 tools

Hosting

  • Cloudflare Pages: static site, plus Functions for the API proxy and the MCP server
  • Cloudflare Containers (4 vCPU) running the Python backend behind a Worker
  • KV and a service binding; a cron keeps it warm

Frontend

  • Plain HTML, CSS and JavaScript, no framework
  • Our own WebGL shader for the hero
  • Canvas halftone archive
  • Self-hosted fonts

Evaluation

  • Offline scorer: pack answerability, citation F1, cost
  • 526 dev questions and a 200-session test-scale split
  • Five rounds of improvements overnight

Try the demo

Pick a real question from the test set and watch it search.

Open the demo