Memory for coding agents · comparison, September 2026 · claude-mem rechecked 16 October

The agents already write everything down. ravnori just reads it.

Claude Code, Codex and pi each append every prompt, answer, command and edit to a transcript on disk. ravnori indexes those files directly, so capture never waits on an LLM, a worker, or a queue, and one memory is shared by every agent you run.

32%of sessions claude-mem stored nothing for (157 of 493, 30 days to 27 Sep, this machine, the version installed then)
0duplicates after re-reading all 1.45 GB of transcripts from zero
23 msmedian prompt hook, including the meaning check; full 1.45 GB backfill in 6.4 s
66%of memories recalled for 90 held-out real prompts judged helpful by gpt-5.6-luna (52% by the stricter claude-haiku-4-5)
46 MBsingle Rust binary with its embedding model runtime; background service about 240 MB with the model loaded; no Node, Python, Docker or vector DB
North star · set 3 October 2026

The trusted, open record of what coding agents did, that other tools build on

Memory inside one agent is becoming a free built-in (Claude Code’s auto memory, Codex’s memories), and line-by-line AI attribution has a funded owner (git-ai, and Cursor’s open Agent Trace format). What nobody owns is the layer underneath: one complete, local, cross-agent record that loses nothing, cites its evidence and knows whether its code survived. A dozen tools each re-read the same transcripts with their own fragile parser. ravnori makes that layer the product, under the AGPL-3.0, and memory becomes the first app on it.

1 · The recordEvery agent session, captured without loss, deduplicated, redacted, deletable everywhere. A stable, documented schema and a local API anyone can build on.
2 · Apps on itMemory and recall (shipped), “ask anything about past agent work, with sources”, an Agent Trace export; standups, timesheets and cost reports by others.
3 · For teamsA self-hosted team server: shared, redacted records across a team, single sign-on, retention, audit export. The paid product, with a commercial licence beside the AGPL.

Rules: unique (only what the record makes possible), measured (every claim has a number, and recall changes pass the gate), easy (one command to install, nothing to configure), and fast (hooks under 300 ms, one binary).

  1. October: read the presentation trial; publish the schema and local API; ship “ask with sources”. Shipped 3 October (v0.2.0): AGPL licence, the record API v1, rvn ask, rvn trace.
  2. Months 1–3: list ravnori in Claude Code’s plugin marketplace and launch publicly with the measurements. Pass: at least one outside tool builds on the record.
  3. Months 3–6: a team server with 2–3 teams. Pass: at least one pays or signs a letter of intent. Fail either: stay a free tool with sponsors.
Why memory goes missing

Where the write path breaks

LLM on the write path most tools; claude-mem until October

hook workerqueue (RAM) LLM call database quota / timeout / crash = memory never saved lost on restart

On this machine, claude-mem stored nothing for 157 of 493 sessions (32%) in the 30 days before the switch, and left 883 sessions stuck as active. Its observer also ran 1,451 hidden Claude Code sessions to summarise the real ones.

claude-mem has since moved partly off this path. Since 7 September it has stored raw tool calls (input and output, except private prompts and its own memory tools) in a tool_uses table before any model call, which this page missed when it was written; since v13.30 (4 October) its hooks write each event to a spool on disk; and since v13.36 (12 October) a provider that says no pauses the observer instead of dropping the work. For hosts with hooks, capture still needs the hook to run, and the transcript watches its installers set up start at the end of existing files. Not re-measured on this machine.

Transcripts as the log ravnori

Claude Code Codex pi transcriptson disk SQLite+ cursor LLM one transaction: events + read position later,retried

A crash, a skipped hook or a model outage delays capture; it cannot lose it. ravnori re-read all 1.45 GB of this machine's transcripts from zero and stored 0 duplicates. It also recovered 30 of 30 Codex sessions claude-mem had missed.

Side by side

How the field compares

Thirteen tools checked on 28 September 2026 against their own READMEs, docs and the GitHub API. Cells marked partial carry a note. Where a fact could only be inferred, the note says so. Cursor's Memories feature is left out: it is missing from Cursor's current docs and appears to have been removed in 2.1.

YesPartial or optionalNoUnknown
ToolCaptureSaved without an LLM callAgentsOne store across agentsRecovers from old transcriptsSearchRuntimeLicence · cost
ravnoriunreleased · this machineAutomaticindexes transcript files; hooks + 30 s watcherYesLLM distils later on its own thread and catches up on missed sessions; any OpenAI-compatible endpoint, or the user’s own Claude Code or Codex sign-in, with model fallbackClaude Code (all profiles), Codex, piYesplus per-prompt “meanwhile” updatesYesClaude Code, Codex, pi transcripts; claude-mem DB importHybridFTS5 BM25 + local MiniLM vectors in process; meaning gate on recallOne binaryRust, SQLite; nothing else to run; background service under systemd (Linux, WSL) or launchd (macOS)AGPL-3.0, commercial licence available · free
claude-mem101,063★ · v13.39, rechecked 16 OctAutomaticlifecycle hooks spooled to disk; transcript watch for hosts without hooks (DeepSeek Harness, Grok Bot) and, opt-in, Codex subagentsRaw calls onlyraw tool calls stored at capture (since 7 Sep); the memory itself waits on the model10+ hosts incl. Claude Code, Codex, Cursor, OpenCode, piYesinferredOpt-ina transcript watch you configure yourself reads existing files; the ones its installers set up start at the end; import requested in issue #3763, still openHybridFTS5 + Chroma vectorsHeavyNode 20+, Bun, Python/uv for ChromaApache-2.0 · Pro $30, Heavy $70, Max $100/mo
agentmemory28,937★Automatic12 hooks in Claude Code, 6 in CodexYesLLM compression optional9 incl. Claude Code, Codex, Cursor, Gemini CLI, piYesClaude Codeimport-jsonl for Claude Code transcriptsBM25 → hybridhybrid once embeddings are configuredNode + engineNode 20+ and the iii-engine binaryApache-2.0 · free
claude-mem-lite61★Automatic7 hooks plus /lesson, /bugYesLLM batched per episode, saved even if it failsClaude Code onlyNoYesClaude Code transcriptsFull-textFTS5 BM25 with query expansionNodeNode 22+, SQLiteMIT · free
Mem066,085★Hooks + toolsplugin hooks at session boundaries; MCP tools the agent callsOptionalfact extraction by default; infer=False skips itClaude Code, Codex, Cursor, Windsurf, OpenCodeYesper account, inferredNoinferredHybridsemantic + BM25 + entityServiceDocker self-host or cloud APIApache-2.0 · cloud tiers
Supermemory30,949★Automaticplugin captureNoprocessed server-side, inferredClaude Code, Cursor, Codex, OpenCode +2Yesper account, inferredUnknownVector + graphinferredCloud-firstself-host possibleMIT · credits
Hindsight37,059★API callsretain API and integrationsNoinferredClaude Code, Codex, Cursor, Copilot +YesinferredUnknownHybridsemantic + BM25 + graph + temporalHeavyDocker, Postgres, LLM keyMIT · paid cloud
Graphiti / Zep31,211★Tool callsagent calls MCP or app adds episodesNoentities extracted by an LLMAny MCP clientYesinferredNoinferredHybridsemantic + BM25 + graphHeavyPython, Neo4j/FalkorDB, OpenAI keyApache-2.0 · Zep Cloud paid
Basic Memory4,050★Agent writeswrite_note over MCPYesinferredClaude, Codex, Cursor, any MCP clientYesChat exportsClaude.ai / ChatGPT exports, not CLI transcriptsHybridfull-text + FastEmbedPythonvia uvAGPL-3.0 · cloud $15/mo
ByteRover4,966★ · ex-CipherCurate + reviewuser or agent curates, then approvesNoinferred22+ agentsYesUnknownUnknownNodebundled binary or Node 20+, LLM providerElastic 2.0 (not OSI) · Pro $15/mo
Letta Code3,434★Self-editingagent rewrites its own memory blocksNoinferredIts own harness onlyNoinferredUnknownUnknownmessage searchNode + serverLetta Cloud by defaultApache-2.0 · cloud plans
Claude Code built-inauto memoryModel decideswrites Markdown during the sessionYesno separate call, inferredClaude CodeNoNoinferredNonefirst 200 lines / 25 KB loadedBuilt inIncluded
Codex memoriesoff by defaultAutomaticbackground summaries once sessions go idleNoCodex app, CLI, IDENoYesbuilt from past sessionsNonesummary injected, ~5k tokensBuilt inIncluded
The case

Why ravnori, and where it is behind

Where ravnori leads

Capture cannot silently failEvery other tool depends on a hook or an API call running at the moment work happens (claude-mem now spools what its hooks catch to disk, but a hook that never runs still leaves nothing). ravnori reads the transcript the agent already wrote and commits the read position with the events, so a missed hook or crash only delays capture. rvn doctor reports lag and lost bytes instead of staying quiet.
Memories come with evidenceA summary cites the transcript events it came from, and ravnori drops any citation the model was not shown. get_observations prints the evidence and flags events that changed after the memory was written. claude-mem keeps the raw tool calls and points each batch of them at the first memory it produced, a link it documents as not one-to-one; no other tool we checked keeps the source behind a summary.
Problems reach you, not just the agentStuck capture, a stale backup, every model on cooldown or a stopped watcher are shown to you at session start by Claude Code and Codex. The failure that started this project, memory quietly not being saved, now has an alarm, and so does distillation falling behind: sessions about to age out undistilled raise a warning, and rvn doctor shows the backlog. An installed agent that is not connected, or whose Codex hooks are not trusted, is flagged too, with a Connect button in the viewer.
File memories know if their code survivedWhen an agent first opens a file, ravnori shows past memories about it and whether the lines each one’s session wrote are still there, partly, or gone, read back from the transcript that recorded the edit. Of 354 recent memory-file pairs that could be told, 268 still had their lines, where a whole-file check called nearly all of them changed.
One memory, live across agentsClaude Code, Codex and pi read and write the same store. On every prompt, a session is told what other sessions in the same project did since it last looked. agentmemory also shares one store across agents; no tool we checked documents per-prompt “meanwhile” updates.
Recall is measured on your own promptsravnori replays real prompts from your transcripts as they were typed, hides memories created later and the asking session’s own, and has two models from different families judge what recall shows. Tuning uses one half; the other half is read once. A second set holds prompts from the weeks ravnori distilled itself, and the release gate refuses a change that makes either worse. No tool we checked publishes recall measured on its user’s own work.
Nothing to babysitOne 46 MB binary with the embedding model runtime inside, and one background service (systemd on Linux and WSL, launchd on macOS). No Node, Bun, Python, Docker, vector database or cloud account. The closest light alternative, claude-mem-lite, supports Claude Code only.
Your models, no extra subscriptionSummaries go through any OpenAI-compatible endpoint (here CLIProxyAPI), or through the Claude Code or Codex a developer is already signed in to, with no key or proxy: rvn install picks one when nothing is set. An ordered model chain falls back when a model hits quota; tested live when gemini-3.5-flash-lite returned HTTP 503. Distillation runs after capture, so a failed or slow model never loses a session.
Moving from claude-mem loses nothingImport kept all 58,797 observations with their original ids and all 4,536 summaries, then backfill recovered sessions claude-mem never captured.

Where ravnori is behind

Vague questions still missA hand-written set of vague questions finds its memory in the top 5 only 60% of the time, and 3 of 10 prompts with no answer still recall something. The embedding model only reorders keyword candidates; it cannot find what shares no words with the question. Tuning search did not help: for most misses MiniLM ranks the target hundreds deep (a question about “how big a change may be” scores 0.20 against a memory titled with the check’s internal name and threshold), and a lower floor only floods prompts that have no answer.
Agents rarely open what they are shownSince scripted sessions were left out, agents opened the full text of 9% of session-start memories, 4% of prompt recall and 1% of file memories, and cited 3 in 939, while judges rated about 70% of shown memories helpful. Showing fewer memories was tested and lost helpful ones (below), so noise is not the explanation; whether agents use the one-line titles without opening them is not yet known.
Vector search is brute forceEvery meaning query scans all of a project’s vectors. Fine at 67,000 memories (slowest 5% of rankings 150 ms, hook recall 127 ms, against a 300 ms budget); the release gate fails a build that goes over, which is when an index gets built.
No knowledge graph or fact validityGraphiti and Hindsight track entities and when a fact stopped being true. ravnori stores observations with timestamps only.
Three agents, not nineagentmemory supports 9 agents and claude-mem 10+ hosts, pi among them since v13.34. ravnori covers Claude Code, Codex and pi, the three used here and by the team it is meant for. Of the rest, Gemini CLI fits best (a transcript per session and a BeforeAgent hook that adds context); Cursor’s prompt hook can block but not add text, and OpenCode keeps sessions in SQLite. Added when someone needs one.
Single machine, single userNo sync, no team sharing, no cloud option.
Brand new and unproven outside this machinePublic since 4 October (AGPL-3.0, github.com/daefery/ravnori), one user so far, no public benchmark. macOS support is written but has not yet run on a Mac; a teammate pilot comes next. Mem0 publishes a LongMemEval score of 94.4 for its managed platform.
Roadmap · reviewed by a three-model council

What shipped on 28 September

The seven essentials, ordered by value to a daily user divided by effort. Each passed two code-review rounds by GPT-6 Astra, Gemini Pro Agent and Claude Fable 5.1, which found and forced fixes for real bugs before release. 60 tests cover them.

Backups with a tested restore

Shipped · 1880133

The watch service takes a verified snapshot every night and keeps seven. Each snapshot is reopened and checked (integrity, schema, row counts, SHA-256) before it counts. rvn restore proves a snapshot on a scratch copy; --apply copies it into the live database through SQLite’s online-backup API.Council found a restore that could drop a concurrent write and one that could wait forever; both fixed and tested. Restore now gives up after 30 s with nothing changed.

Evidence links

Shipped · ac83d20

Summaries cite the transcript events behind each claim; citations outside what the model was shown are dropped. 94 links so far across 47 new memories. Imported claude-mem memories say plainly that no source was kept.Council found a citation that could slip in when a long turn was cut; the allowed list now comes from the text actually sent.

Working-tree snapshot

Shipped · 10d2ca6

At the end of each turn ravnori records branch, HEAD, unpushed commits and uncommitted files. The next session in any agent opens with a “Working tree” section, labelled with its age.Runs detached with one 3 s budget for all git calls, so a slow repository never delays the agent.

Prompt recall

Shipped · f3cf955

Each prompt adds up to five memories that match it, never repeated in a session. A memory needs two of the prompt’s words and the prompt at least one rare word; personal-detail memories are never injected automatically. (An earlier version of this page said the rare word had to be in the title; that check never existed, and adding it did not help.)Measured with the recall test: hit@5 87%, hit@1 55%, MRR 0.68, p95 about 110 ms.

Forget, exclude, remember

Shipped · 4b4cf9a

rvn forget removes memories, events, sessions or projects and leaves a marker that ingest, import and summarisation all respect. rvn remember pins facts every agent sees; rvn pins lists them.Council found three ways forgotten data could return (re-import, in-flight summaries, prompts); all closed and tested.

Health alerts

Shipped · 5a985a4

One set of checks feeds rvn doctor, the viewer and session start, where Claude Code and Codex show alerts to the user.Expensive checks moved into the watch service; session start stays around 30 ms with no false alarms.

Export and recall evaluation

Shipped · a28e8df

rvn export writes everything as JSONL with a meta header. rvn eval builds known-item questions from real memories and reports hit rates and latency; the set stays private on the machine.Used immediately: it picked the ranking weights and rejected a change that looked good but was not.

Then, the same day: recall you can trust

Six more steps, each reviewed by the council (GPT-6 Astra, GPT-6 Sol on operations, Claude Fable 5.1) across rounds 12 to 25. Every number here comes from a test set, and the last two steps were chosen on data the tuning never saw.

Local semantic recall

Shipped · 75bfe77

Memories get vectors from a local model the watch service keeps loaded; hooks ask it over localhost and fall back to keywords within 300 ms. Vectors are tied to the exact text and model files they came from, so an edited memory or a new model never meets a stale vector.Council rounds 12–15 closed a stale-vector race, a revision mix-up and a port the hooks could not find.

Hybrid search for agents and the viewer

Shipped · fa757a2

MCP search used to need every word, so a plain question found nothing (0% on the test questions). It now takes all-word matches, then any-word matches, fused with the nearest memories by meaning; the viewer shows one ranked list with a words / meaning badge on each card.Through MCP search: top 5 went from 0% to 85% of test questions. Pages are stable and one limit spans memories and transcript events.

Meaning gate on recall

Shipped · c426f90

Keyword hits that share words but not meaning are dropped before they reach the agent. Search applies a softer version to any-word matches only.Prompts with no answer that still recalled something: 9 of 10 down to 1.

Recall judged on real prompts

Shipped · 2a9b7a8

rvn eval --build-real samples real prompts, split by session into a tuning half and a test half. Each is replayed as of when it was typed; --judge has the distillation models mark what recall showed, with a second judge and its agreement on request.First labels from file overlap were dropped after reading results: they missed most relevant memories. Judges agree on 425 of 541 memories (kappa 0.57).

No more echo of the live conversation

Shipped · 996921d

Recall leaves out memories distilled from the session that is asking; the agent already has that conversation in context.Found by the judged eval: 43% of judged memories were the session’s own, and they took 55% of the “helpful” marks.

A better embedding model, picked on data

Shipped · edf44c9

Seven local models screened on the tuning half; all-MiniLM-L6-v2 separated helpful from unhelpful candidates best (AUC 0.731 against 0.657; bge-small at 0.711 is within noise). Each model gets its own thresholds.Held-out, run once: helpful memories shown 149 → 179 (luna) and 100 → 141 (haiku), unhelpful 95 → 93 and 144 → 131. Trade: one test set lost two first places.

Also shipped, and one tried and dropped

Backup and move from the viewer

Shipped · 4bd5bdf

Take a verified backup in the viewer, download it, and on a new machine upload it, see it next to what that machine holds, then replace. The backup carries the settings (never keys); they are off unless ticked, and any change to where prompts go is flagged.Council rounds 26–29 found a trigger a crafted backup could smuggle in, a write that could be lost mid-restore and a missing upload deadline; all fixed and tested, including a full two-machine move.

A release gate for recall

Shipped · 2b570b5

rvn eval --gate runs the installed ravnori and the candidate build (or candidate settings) on their own copies of one snapshot, graded by the same judge, and refuses the change if recall got worse: 17 checks across known, vague and judged real prompts, MCP search, personal details listed unasked, and hook latency timed in real processes.Checked: an identical build passes 17 of 17; switching the relevance gate off fails 5; a build without ONNX fails 4; a slow settings file fails on latency (631 ms). Council rounds 31–33.

Memories about a file, and whether it changed since

Shipped · a509161

When Claude Code first reads or edits a file in a session, ravnori adds up to three past memories about that file, each with how the file changed since in git (commits, uncommitted edits, lines added and removed). Any agent can ask with recall_file(path); get_observations flags memories whose files changed. About 40–170 ms, once per file.Measured first on 172 real edits: 44% had memories about the file; 74–79% judged helpful with the file named, 51% with it hidden, so about as useful as prompt recall and almost never the same memories (4 of 198). Council rounds 34–37 fixed cross-package and node_modules matches, pattern-like file names, stalled git and binary files.

Reranking the top ten: tried, not adopted

Measured · 28 Sep

Three cross-encoders scored each prompt’s ten keyword candidates on the judged real-prompt set. None beat the MiniLM gate by more than noise (AUC 0.702–0.745 against 0.713) and each took 0.9–3.4 s per prompt against a 300 ms budget.Only reordering the keyword top ten was tested; a wider candidate pool and reranking MCP search, where seconds are acceptable, remain open. rvn eval --rerank re-runs the comparison.

29 September: nothing falls behind unnoticed

Six changes, reviewed by the council (GPT-6 Astra, GPT-6 Sol, Claude Fable 5.1) in rounds 41 to 44, and one idea measured and dropped.

No session ages out of distillation unnoticed

Shipped · 3d10e3e

The watcher distilled only the 5 newest sessions of the last 2 days; the rest never became memories (862 in 30 days) while doctor said OK. It now distils on its own thread, then backfills the last 7 days oldest first under a daily request budget, and warns when sessions will age out. rvn distill --since-days 30 --max-calls 200 catches up older ones by hand.Council rounds 41–42. First catch-up batch: 200 calls, 539 memories, no errors.

The gate sees the memories ravnori writes

Shipped · 71dcafa

claude-mem stopped importing, so every new memory is distilled by ravnori, yet only 4 of the 70 judged real prompts could see one. rvn eval --build-recent samples prompts from the last 30 days in projects that already held ravnori memories (at most 6 per session, half per project); the gate now judges them too, with the same limits. On its first run ravnori memories reached the top five for 16 of 57 prompts, and 34 of the 38 shown were judged helpful against 74 of 121 imported ones.57 prompts per half from 30 sessions; a baseline built before the set skips its checks.

Whether a memory's own edits are still there

Shipped · bd2e998

A memory about a file said whether the file changed since, which in an active repository is nearly always: “3 of 3 predate changes” on every touch. It now says whether the lines its session left are still there, partly (how many) or gone, reading each edit back from the transcript record it came from. Of 354 recent memory-file pairs that could be told, 268 still had their lines, 77 partly, 9 not. Only memories whose edits changed count toward the warning.Council round 43: exact tool call and record identity, edits applied in order within a chunk, whole-line matches, bounded reads. File hook p95 78 ms against 75 before.

Sessions another agent scripted stay out of memory

Shipped · cf6c04a

24 of 2,482 sessions were driven by another agent’s brief (a review council, test runs) yet made 17% of a week’s distilled memories, and 9% of the memories shown to real sessions came from them. Prompts matching scripted_sessions patterns now mark a session: it is not distilled or offered memories, and its memories stay out of recall and the session-start context. Explicit search still finds them, labelled. Nothing is deleted.Council round 44: the last-summary line, timeline neighbours, an atomic rescan when patterns change, and search kept as a pull.

A killed gate run cleans up after itself

Shipped · 85af3f7

Each gate run copies the database and removes the copy when it ends. A run that was killed left a 423 MB copy behind; the next run now removes copies older than six hours.

Titles that name the thing: tried, not adopted

Measured · eff0824

A title rule that puts the component, file or decision first was compared on 30 chunks the live prompt had distilled, with a question per chunk written from its digest by another model. Rewriting only the titles, contents unchanged: top 5 fell from 22 to 18 of 30 and titles-only choices to open from 19 to 16. It helped where the old title named nothing (a phase number followed by “planning completed”) and hurt where a path or id replaced the words people ask in (a title about merge conflicts on a shared file became that file’s path).rvn eval --titles 30, then --retitle for titles alone. Re-distilling the chunks instead changed contents too and could not separate the two.

29–30 September: safer data, a lighter viewer, setup in any order

Seven changes, each reviewed before it shipped, and two viewer redesigns tried and put back.

More secrets redacted, also in what was already stored

Shipped · ee4a5ba

A scan of everything stored found no leaks of the formats ravnori already redacted, but 58 passwords in URLs (postgres://user:pass@host) in 45 imported memories and 13 events. Redaction now covers passwords in URLs and Stripe, Google, Hugging Face, npm, Slack-webhook and Telegram tokens. When the rules grow, the watcher re-redacts stored text once, in resumable batches.On this machine: 15 events and 61 memories rewritten in 12 s; a rescan finds none left. Transcripts on disk and older backups are left as they are.

A viewer light enough for low-end devices, with nothing lost

Shipped · 3a25e90

Two time indexes, gzip and ETags, no web font, and a stylesheet cut to the rules the viewer can reach. Live updates pause in a hidden tab and catch up, oldest first, when it is shown.First load 583 KB → 50 KB, a reload 137 KB → 2 KB, a feed page on the server 370 ms → 3 ms, layout while scrolling at 4× slower CPU 710 → 233 ms. 27 feature checks pass on both builds: the rule was no capability lost.

Agents connect in any install order

Shipped · 60153b7

rvn install writes each agent’s part whether the agent is installed yet or not. rvn install, rvn doctor and the viewer say which installed agents are not getting memory (missing hooks, tools pointing at a missing binary, Codex hooks not yet trusted); the viewer’s Connect button fixes it or shows the steps to trust Codex’s hooks.Re-running install leaves a working setup untouched; Codex’s config.toml is edited structurally and an invalid one is refused. Three Codex review rounds; six end-to-end tests in a scratch home.

Backups: daily switch and delete one

Shipped · debc256, 2119a20

“Back up automatically every day” can be turned off in the viewer or with rvn backup --auto off; the watcher follows it without a restart, and doctor stops alerting on an old backup while it is off. Each backup can be deleted on its own, after a confirmation.Both actions sit behind the viewer’s origin and X-Ravnori guard; delete accepts only a backup’s own name, never a path.

Restore strips a backup’s own schema first

Shipped · cfedf86

A crafted backup’s triggers, views and indexes are dropped over a plain connection before ravnori opens it, so none can run on ravnori’s migration writes. The filter now skips only real sqlite_* objects (a LIKE pattern had spared a trigger named sqliteevil).Found by review while building the timeline preview. The regression test plants such triggers and fails with the old order.

A flaky distill lock

Fixed · d77b231

A lock released a moment ago could look held, because a subprocess forked by another thread keeps the lock file open until exec. Acquire now retries for 200 ms before reporting another distill.4 failures in 12 full test runs before, none in 15 after.

Two viewer redesigns: tried, put back

Put back

A three-pane viewer (filters, list, the memory in full with whether its code survived and how often agents opened it) and a live timeline at /next were both built, reviewed and run, then reverted at the user’s call: the original feed stays. The three-pane viewer is kept on branch viewer-redesign; the timeline was deleted at the user’s call, its security fix already on main.The lightweight pass above replaced them: same feed, much less weight.

1–2 October: the backlog closed, a presentation trial, ready for a team

One catch-up, two recall changes judged on real prompts before any code shipped, a missing alert, a live trial of how memories are shown, and what a teammate needs: distillation on their own sign-in and the service on macOS.

Every older session that matters is distilled

Done · 1–2 Oct

Sessions from 7 to 30 days ago that predated backfill were caught up by hand, project by project: 478 undistilled became 0 apart from five small or idle projects the user chose to leave as they are (103 sessions; their transcripts and events stay searchable). A first bounded run (up to 200 calls) took it to 336; then 215 sessions, project by project, took 200 calls and wrote 677 memories (478 observations, 199 summaries), all embedded. rvn doctor now reports fully caught up.A per-session dry run first: 63 of the 215 had nothing left to distill and cost nothing. Most of what remained were worker sessions with no prompt from the user, distilled at the user’s choice. A fresh install never builds this gap: the watcher backfills the 7 days before it first ran, then keeps up.

Fewer memories late in a session: tried, not adopted

Measured · 2 Oct

The idea: after prompt 10, show 3 memories instead of 5, require a closer meaning match, and drop or demote memories older than 7 days, since agents opened fewer of them. On the judged real prompts (70 older, 57 from the weeks ravnori distilled itself), late-session memories were judged more helpful than early ones (78–90% against 37–73%), and none of 36 variants removed more unhelpful memories than helpful ones; the best dropped 18 helpful for 2 unhelpful.Simulated on each prompt’s judged top five from rvn eval --judge --dump, before writing code. A sample of 18 sessions had suggested the opposite.

Older file memories only when their edits survive: tried, not adopted

Measured · 2 Oct

Built as a setting: when an agent opens a file, skip memories older than 7 days unless their own edited lines are still there. On the judged file edits it showed 61 helpful and 18 unhelpful memories against 68 and 22 without it, and helped 28 edits against 30: seven helpful memories lost to drop four unhelpful ones. Reverted.The same build run twice on the same edits, once with each setting, judged by the same models.

Say when no memories are being made

Shipped · 40511e1

Without a distillation key, ravnori captures and searches everything but writes no memories, and nothing said so. Now that is an alert in rvn doctor, the viewer and session start, and the last line of rvn install.Tested end to end in a scratch home: said with no settings, silent with a key, and the test fails with the alert removed.

Fewer memories per prompt: no gain, stopped

Ran 2–16 October · 34520fb

Agents use what they open, but memories shown and not opened leave no more trace in what the agent does next than memories never shown (9.0% against 9.1% at the same match strength, 528 shown over 139 prompts). Recall picks well; the presentation does not land. Since 2 October half of sessions, split by a hash of the session id, are shown at most 2 memories per prompt and the rest 5, in the same days.Result after 14 days (scripted sessions left out, opened = fetched in full within 30 minutes): shown 2, 71 sessions and 531 prompts, opened 28 of 977 memories (2.9%) and something on 3.6% of prompts; shown 5, 85 sessions and 355 prompts, opened 49 of 1,279 (3.8%) and something on 6.8% of prompts. Differences, resampling whole sessions: −1.0 points per memory (95% CI −4.6 to +2.0) and −3.2 points per prompt (−9.1 to +1.1). Showing fewer did not make agents open more, so every session is back to 5. In the same days agents fetched the full memory after 88 of 120 of their own searches (73%): what they ask for, they read.

Distil with the Claude Code or Codex you are signed in to

Shipped · f32759a

A teammate without an endpoint or key now gets memories from their own plan: rvn install sets distillation to claude -p (sonnet), else codex exec (gpt-5.6-luna, low effort), at most 100 background requests a day, and never changes a setup that already works. Each run is isolated: an empty directory, no saved session, tools, MCP servers, hooks or user settings, thinking off. Without hooks off, Codex would run ravnori’s own hooks and every request would become a session to distil.Chosen on 30 real chunks from 19 sessions, judged blind against luna by gpt-5.6-terra and claude-haiku-4-5. Sonnet matched luna (16–13 and 13–15; 4% of specific details not in the transcript against 3%) at about $0.04 a chunk; codex with luna came close (17–13, 3%). Haiku lost 30–0 with one judge and made up more details, so it is not the default; the first suggestion had been haiku, from a single test. Thinking on cost three times more for no better memories.

The watch service on macOS

Shipped · 0c654b8

One module decides the service manager: a systemd user unit on Linux and WSL, a launchd agent with KeepAlive on macOS. Install, uninstall, the health alerts and the viewer’s restart button all ask it, so each names the right command on its system.136 tests on Linux; on macOS type-checked only (cargo check and clippy for aarch64-apple-darwin). The first real run is the next step.

3 October: the record opens up (v0.2.0)

The first steps toward the north star: a licence that keeps ravnori open, an interface other tools can build on, and two apps on it.

AGPL-3.0, with a commercial licence beside it

Shipped · 4594c04

Anyone may use, change and share ravnori; whoever distributes a changed ravnori, or runs one as a service, shares the change. Contributors license their work under the AGPL and to the authors, so a commercial licence stays possible. Every release now carries the licence and the texts of all 500-odd linked components’ licences, generated from what the build actually links.

The record API v1

Shipped · 2e16b57

A stable, read-only HTTP interface to sessions, events, memories (with the events they cite and whether their code survived) and search, so a tool reads one complete record instead of parsing transcripts. Lists page by id, so a tool can also sync. Fields are only ever added within v1. Every request carries a token from an owner-only file; a web page cannot send it, so a browser cannot read the record.On the live record (2,757 sessions, 110,630 events, 67,888 memories) lists answer in 10 ms and search in 40 ms. Tested over HTTP, including that a wrong token and a foreign Host are refused.

rvn ask: questions about past work, with sources

Shipped · fa8a9f4

The best-matching memories are shown at once; the distillation model answers from them only and cites them by id. A citation of a memory it was not shown is dropped. Each memory carries what the developer typed in that session, so a “why” is answered from what was actually asked.Asked why the viewer redesign was reverted, the first version gave a plausible reason taken from a later next-step note; with the typed prompts and a rule against inferring motives it answers that the user asked for it, citing the right memory, in about 7 s.

rvn trace: Agent Trace for commits already made

Shipped · a0e3b43

Cursor’s open Agent Trace format, built after the fact from transcripts ravnori already holds: which lines each commit added were written by an agent, by session and model. Tools that record attribution from now on cannot do this for past commits. Exact line matches only, so the share is a floor; edits in other worktrees of the same repository count.Last 40 commits, under a second each: ravnori 37% of added lines; a team repository worked through git worktrees and a merge train 14% (0% before counting worktrees and using author dates, since the merge train rebases commits hours after the edits); another 6%, where 32 of the 40 commits are other people’s.

Next

In order of expected gain for the effort, each measured before it ships.

Search that returns the memories it findsThe trial found no gain from showing fewer memories, while agents fetch the full text after 73% of their own searches. One call that returns the index and the top few memories in full would save that round trip; measured by tool calls per search before it ships. One line on why each shown memory matters (what it decided, whether its code is still there) stays untested.
Public: done 4 October.The repository is public with a clean history, v0.3.0 installs in one line or as a Claude Code plugin from daefery/ravnori, and this page is on GitHub Pages. Next: the official plugin directory, and the first outside builders.
A first run on a Mac, then one teammateInstall on macOS, then a Claude Code teammate on Linux or WSL. Checks what no machine here can: the launchd service, sonnet on another account, the cost against a plan’s limits, and setup by someone who did not build ravnori.
First outside builderThe record API, rvn ask and rvn trace shipped. Next: offer the API to the authors of two or three transcript tools (standups, time sheets, cost reports) and list ravnori in Claude Code’s plugin marketplace. Shell-written files in rvn trace (heredocs, scripts) are the known gap.
Prebuilt releases: shippedv0.1.0: one command installs ravnori on Linux, WSL or macOS, no Rust needed; six targets built and tested on GitHub. Next: list ravnori in Claude Code’s plugin marketplace.
More agents, then syncOnly when someone uses one: Gemini CLI first (about a day), Cursor only if its prompt hook gains a way to add context. Then encrypted replication between machines.
Retention, deferredPruning old raw events would weaken evidence links and the edit check, which read events and transcripts. The database is 436 MB, well within what SQLite handles.
Verdict

Memory you can git blame

ravnori is the best fit for this setup: three agents on one machine, models through CLIProxyAPI, and no tolerance for silently lost sessions. Search is hybrid and measured on real prompts, including the weeks ravnori distilled itself, but Mem0, Hindsight and Graphiti still model entities and time, and agentmemory covers more agents.

The position is now built rather than planned. Capture that cannot lose data, distillation that cannot fall behind unnoticed, memories that cite the transcript events behind them and say whether the code they changed is still there, live updates across agents, and alerts that reach you. Every competitor summarises first and keeps no source; they cannot offer evidence or check an edit without storing full transcripts.

Next: toward the north star above: the record as a platform (schema, local API, ask with sources), a first run on a Mac and one teammate. Agents do not use the memories they are shown unless they open them, and showing fewer did not change that (trial, 2–16 October); what they search for, they read.

Method and sources

Facts marked inferred in the matrix could not be confirmed from a primary source. Prices for Mem0, Letta and Zep come from third-party listings. Roadmap order reflects council round 8 (GPT-6 Astra, Gemini Pro Agent, Claude Fable 5.1) and, for recall, rounds 12–25 (GPT-6 Astra, GPT-6 Sol, Claude Fable 5.1), and rounds 41–43 for distillation and file memories, adjudicated by Claude Opus 5.5.

  1. ravnori measurements: this machine, 27–28 Sep 2026: rvn doctor, hook log, backfill timings, test suite (94 tests), systemd service RSS
  2. Recall evaluation: rvn eval on private test sets in ~/.ravnori/eval (38 model-written questions, 30 hand-written, 70 + 90 real prompts, and 57 + 57 prompts from the weeks ravnori distilled itself), judged by gpt-5.6-luna and claude-haiku-4-5; 28–29 Sep 2026
  3. 29 September measurements: distillation catch-up (200 calls, 539 memories, 0 errors), title experiment (30 chunks, rvn eval --titles and --retitle), edit check over 460 recent memory-file pairs, file hook timed over 60 touches on a copy of the database, rvn uptake over 7 days
  4. 29–30 September measurements: stored-secret scan and re-redaction pass, viewer before/after on the live database (transfer, server time, layout at 4× CPU slowdown, 27 feature checks), distill-lock test runs, rvn doctor and rvn uptake on 1 Oct 2026
  5. 1–2 October measurements: per-session distillation dry runs and runs, late-session rule simulated on judged real-dev and recent-dev candidates (rvn eval --judge --dump), file age limit run on files-dev with and without the setting, unopened-memory use against a never-shown control at matched cosine (139 prompts, 21 sessions, 26 Sep–2 Oct), rvn uptake and rvn doctor on 2 Oct 2026; distillation providers on 30 chunks from 19 sessions (luna by endpoint, haiku and sonnet by claude -p, luna by codex exec), judged blind by gpt-5.6-terra and claude-haiku-4-5, with specific details checked against each transcript
  6. claude-mem loss figures: claude-mem.db on this machine before removal, 30-day window ending 27 Sep 2026
  7. GitHub API (stars, licences, last push): accessed 28 Sep 2026 for thedotmack/claude-mem, rohitg00/agentmemory, sdsrss/claude-mem-lite, mem0ai/mem0, supermemoryai/supermemory, vectorize-io/hindsight, getzep/graphiti, basicmachines-co/basic-memory, campfirein/byterover-cli, letta-ai/letta-code
  8. claude-mem v13.39.0 source (commit b8fc2ef, 15 Oct 2026), read 16 Oct 2026: src/services/sqlite/tool-uses.ts, src/services/worker/http/shared.ts, src/shared/hook-spool.ts, src/services/worker/agents/ResponseProcessor.ts, src/services/transcripts/watcher.ts and cli.ts, src/services/integrations (DeepSeekHarnessInstaller.ts, GrokBotInstaller.ts), RECEIPT-JOIN.md, README.md, CHANGELOG.md (13.30.0, 13.34.0, 13.36.0); GitHub API for stars and issue #3763 the same day
  9. https://docs.claude-mem.ai/
  10. https://cmem.ai/pricing
  11. https://github.com/thedotmack/claude-mem/issues/3763
  12. https://code.claude.com/docs/en/memory
  13. https://learn.chatgpt.com/docs/customization/memories
  14. https://mem0.ai/blog/how-memory-works-in-codex-cli
  15. https://mem0.ai/blog/claude-code-memory
  16. https://supermemory.ai/docs/integrations/claude-code
  17. https://supermemory.ai/changelog/coding-plugins-now-free/
  18. https://www.byterover.dev/pricing
  19. https://docs.letta.com/guides/cloud/plans/
  20. https://www.getzep.com/pricing/
  21. https://cursor.com/docs/context/memories
  22. https://forum.cursor.com/t/custom-modes-and-memories-gone-in-2-1/143744