ai-memory
The memory your agent does not have
Your coding agent already takes notes. They live on one machine, belong to that one agent, and are gone the moment you switch tools. ai-memory is what sits on the other side of that wall: one shared memory that more than twenty harnesses — Claude Code, Codex, Cursor, Gemini CLI, OpenCode and others — read from and write to.
Quit Claude Code mid-task, open Codex in the same directory, and the next agent picks up a real handoff: where you stopped, what you already tried and why it failed, what is still open. It is a typed protocol, claimed exactly once — not a note you hope the next model reads.
What makes it different
It follows you across agents
Twenty-plus harnesses feed one memory. The handoff is owned, typed and claimed once, so two agents cannot both pick up the same baton.
It follows you across machines
The memory lives in a server you run — the same laptop, a homelab box, wherever. The project you left on the desktop is the project you resume on the laptop.
Your memory is plain markdown
The source of truth is a git-backed wiki of ordinary .md files. Grep it, open it in Obsidian, edit it by hand. The database is a derived index that can be rebuilt from the files.
It records the work, not a ceremony
Lifecycle hooks capture what actually happened — prompts, tool calls, session boundaries — sanitised at a typed privacy boundary before anything is stored. There is no "remember this" to say.
The default path costs no tokens
Capture, search and handoffs all work with no API key at all. The LLM passes — consolidation, auto-improve — are the opt-in part, not the price of entry.
It works for a team
Point everyone at one server and what one person's sessions learn, everyone's agents can retrieve. Multi-user auth, per-person attribution and an audit log are built in, not a paid tier.
ai-memory-web — see what your agents remember
ai-memory stores; ai-memory-web shows. It is a read-only Laravel panel over the same SQLite index, on the same host, answering two questions: what did the agents remember, and how was it collected.
It never writes, and that is enforced at the engine rather than promised in a comment: the connection is pinned with PRAGMA query_only = 1, the raw handle is private, and a test attempts a real write and asserts that it throws. ai-memory stays the only writer of its own index.
Nine screens over one database
A dashboard with live totals and a history that outlives an ai-memory reset, the projects and workspaces the memory is spread across, the consolidated wiki pages and their versions, the sessions and the facts each one learned, the handoffs between agents, and full-text search through ai-memory's own FTS5 index.
These captures are of the Portuguese AI-MEMORY integration in this site's own admin, which is where the standalone app was extracted from. ai-memory-web itself is in English and carries its own navigation.
The two repositories
What changed
The most recent releases, taken from the project's own changelog.
-
v2.2.0 current
- Retrieval explains itself: a page that surfaced through the link graph now says which typed edge it arrived by — causes, fixes or contradicts — so "why did this come back" has an answer.
- Questions about a moment in the past get a second path. Asking as of a date now searches the page versions that were alive then, not only the entity timeline, so "which database were we on during the outage" finds pages that name no entity at all.
- Two opt-in ranking signals, both off by default so an unconfigured store ranks exactly as before. Measured on a 138-query set over a two-year production wiki, the pair moves hit@1 from 0.61 to 0.75.
-
v2.1.0
- Provider fallback chains: a transient failure — 429, 5xx, a timeout — moves to the next provider you listed, carrying the same request and schema. A deterministic error still stops immediately, as it did with one provider.
- An interrupted bootstrap can be resumed from durable per-chunk progress instead of paying for every LLM call a second time.
- OpenCode 2.0 beta becomes a first-party client, and a finished Codex session now gets the same automatic summary and cross-agent handoff Claude Code already had.
-
v2.0.3
- Source installs build with the committed lockfile, so two people installing the same tag get the same dependencies instead of whatever resolved that day.
- Status reports the free space on the data directory. An operator whose safety archive left 77 MB free had the store fail to extend its write-ahead log eight minutes later, silently, for hours.
-
v2.0.2
- Relative links inside the wiki stop returning 404 in the web view, and a directory path lists the pages under it instead of failing.
- A page whose stored title was blank reads back with the title from its own heading, instead of disappearing behind a bogus "multiple pages share title" warning.
-
v2.0.0
- A launchd agent for macOS, so the server keeps running after the terminal that started it closes. Until now closing it stopped hook delivery with nothing to say so.
- Local embeddings with no API key and no external server: an in-process model, fetched once, whose vectors coexist with any provider's.
- Status tells more of the truth — migration state, stored embeddings by provider and model, typed-edge counts, and a queue gauge that surfaces a writer that has wedged.