{
  "markdown": "<p align=\"center\">\n  <picture>\n    <source media=\"(prefers-color-scheme: dark)\" srcset=\"assets/logo-dark.svg\">\n    <img src=\"assets/logo.svg\" width=\"330\" alt=\"deja-vu\">\n  </picture>\n</p>\n\n<p align=\"center\"><b>Memory for coding agents, starting with the history you already have.</b></p>\n\n<p align=\"center\">Your agent is about to re-debug something you fixed in March. deja indexes the\nsessions Claude Code, Codex, Cursor and every other agent on this machine already wrote to\ndisk, and hands the right one back when it is needed.</p>\n\n<p align=\"center\"><img src=\"assets/demo.gif\" width=\"720\" alt=\"The same question put to the same agent twice: without memory it has no record of it, with deja it answers with the decision from eight months earlier\"></p>\n\n<p align=\"center\"><sub><em>Nobody searched anything — the agent called deja itself. Every line is quoted from two real sessions.</em></sub></p>\n\n<p align=\"center\"><b>Every memory tool starts empty and records forward. deja starts full.</b></p>\n\n<p align=\"center\">And nobody has to ask for it: recall arrives at session start, on every prompt,\nbefore a file is edited or a command runs, and after one fails. Keys and tokens are stripped as\nthe index is built, so what reaches the model is safe to send.</p>\n\n<p align=\"center\">\n<b>85.3% hit@1</b> on LongMemEval-S &middot; <b>69.6%</b> on LoCoMo &middot; <b>millisecond</b> lookups over 5&nbsp;GB of history<br>\n<sub>Both harnesses ship in this repo and run on the public datasets in minutes &middot;\n<a href=\"https://vshulcz.github.io/deja-vu/guide/benchmarks.html\">check the numbers yourself</a></sub>\n</p>\n\n<p align=\"center\">\n  <a href=\"https://github.com/vshulcz/deja-vu/actions/workflows/ci.yml\"><img src=\"https://github.com/vshulcz/deja-vu/actions/workflows/ci.yml/badge.svg\" alt=\"CI\"></a>\n  <a href=\"https://github.com/vshulcz/deja-vu/releases\"><img src=\"https://img.shields.io/github/v/release/vshulcz/deja-vu\" alt=\"Release\"></a>\n  <a href=\"https://mcptoplist.com/server/io.github.vshulcz%2Fdeja-vu\"><img src=\"https://mcptoplist.com/badge/io.github.vshulcz%2Fdeja-vu.svg\" alt=\"MCP Toplist\"></a>\n  <a href=\"LICENSE\"><img src=\"https://img.shields.io/badge/license-MIT-blue.svg\" alt=\"MIT License\"></a>\n</p>\n\n<p align=\"center\">English | <a href=\"README.zh.md\">中文</a></p>\n\n<p align=\"center\"><a href=\"https://vshulcz.github.io/deja-vu/\">Docs</a> &middot; <a href=\"https://vshulcz.github.io/deja-vu/guide/benchmarks.html\">Benchmarks</a> &middot; <a href=\"https://vshulcz.github.io/deja-vu/guide/compare.html\">How it compares</a></p>\n\n## Install\n\n```sh\ncurl -fsSL https://raw.githubusercontent.com/vshulcz/deja-vu/main/install.sh | sh\ndeja install --auto\n```\n\n<p align=\"center\"><img src=\"assets/banner.png\" width=\"700\" alt=\"What deja prints after the first index: the mark, the agents it found, and a query taken from your own history\"></p>\n\nTen seconds to install, about ten to index, and it is useful. The second command wires MCP\nrecall into every agent it finds, turns on session-start recall where the agent supports\nit, and builds the first index so the next session does not pay for it.\n\nStart a new agent session and ask it something you worked on months ago:\n\n> have we dealt with jwt refresh rotation before? check your memory\n\nIt does not have to be asked, either — with auto-recall the agent already knows what you\nsolved in that project when the session opens.\n\n<details>\n<summary>Other ways to install, and what to do if you want less than all of it</summary>\n\n`brew install deja-vu`, `go install github.com/vshulcz/deja-vu/cmd/deja@latest`,\nor `npx @vshulcz/deja-vu \"query\"` to try it without installing anything. Desktop apps that\ntake MCP servers as bundles can open the `.mcpb` from the\n[latest release](https://github.com/vshulcz/deja-vu/releases/latest); it carries the binary.\n\nClaude Code, Codex, Cursor, Qwen, OpenClaw and Copilot can take the same plugin bundle from\ntheir own marketplaces instead:\n\n```sh\nclaude plugin marketplace add vshulcz/deja-vu && claude plugin install deja-vu@deja-vu\n```\n\nOn Windows the install script exits with `unsupported OS` — it is a shell script. Use\nScoop instead, from the main bucket every Scoop install already has:\n\n```powershell\nscoop install deja-vu\n```\n\nOr take `deja-vu_<version>_windows_amd64.zip` from the\n[latest release](https://github.com/vshulcz/deja-vu/releases/latest) and put `deja.exe` on\nyour `PATH`, e.g. in `%USERPROFILE%\\.local\\bin`.\n\nThe binary alone is a complete install for searching: index, search, `show`, `ctx`, `blame`,\n`--json` and redaction need nothing else. `deja install` is what wires MCP into your agents\nand turns on session-start recall — worth having, and optional. On a binary-only setup\n`deja doctor` reports every MCP target as `not-wired`, which is that setup working as\nintended. `deja warmup` also leaves a skill at `~/.agents/skills/deja-search/SKILL.md`\nthat teaches an agent the CLI contract — `deja search --json`, `ctx`, `blame`, how to read\n`tier` and `total` — so it knows history is searchable without MCP. The copy in the repo is\n[`skills/deja-search/SKILL.md`](skills/deja-search/SKILL.md).\n\n`deja install --all` is `--auto` without the session-start recall: agents answer from memory\nwhen they decide to call it, rather than starting each session with it. The\n[agent setup guide](https://vshulcz.github.io/deja-vu/guide/agents.html) covers what each\nharness supports, aider's read-only context file, and the Windows `cmd /c deja mcp` wrapper.\n\n</details>\n\n<details>\n<summary>What gets written into each agent's own guidance file</summary>\n\nInstall also writes user-level guidance for the harnesses it detects: Claude Code, Codex, opencode, Gemini CLI, Antigravity, Qwen, Kimi Code, pi, Copilot, Cursor, Goose, OpenClaw, Hermes, Roo Code, omp, DeepSeek Harness and Zed each get it in their own guidance file (or under the configured `XDG_CONFIG_HOME`). Re-run rewrites deja's skill or marked block without changing surrounding user content. Use `deja install --all --no-guidance` to opt out; Grok Build gets the shared skill in `~/.agents/skills`, which is what it reads; the `~/.grok/GROK.md` written beside it is for the unrelated community CLI that shares that directory. Cursor has no user-level instructions file, so it gets a skill at `~/.cursor/skills/` instead, read only when something looks relevant rather than every session.\n\n</details>\n\n## What you get\n\n**Solve it in Codex. Claude remembers.** Twenty-two coding agents write every conversation\nto local files, and deja turns those files into one memory layer all of them read.\n\n| | |\n| --- | --- |\n| **Retroactive search** | `deja \"connection pool exhausted\"` over gigabytes, including everything from before you installed deja. Natural-language questions fall back to a relevance tier. Time is a hint, not a filter. |\n| **Cross-agent recall** | The MCP `recall` tool answers *\"we fixed this three weeks ago\"* in whichever agent asks, whoever solved it originally. |\n| **It survives compaction** | Measured over 43 compactions: the summary keeps 77% of the decisions and 0.2% of the commands you ran. deja hands back the other 99.8%. |\n| **Recall at the point of action** | Before an agent edits a file or runs a command, deja names that file's prior decision or that command's working invocation, from a `PreToolUse` hook. When a command fails, a `PostToolUse` hook answers with what followed that same error here before — the pair an agent never thinks to ask for. |\n| **It indexes the work, not just the talk** | The files each turn opened, the commands that ran with their exit status, and the exact spans an edit replaced. That is the part every summary throws away. |\n\n<details>\n<summary>Four more: rejected decisions, staleness, sync and handoff, redaction</summary>\n\n| | |\n| --- | --- |\n| **It knows what held** | `deja promote <id> --state rejected --note \"why\"` marks a decision you reverted. Every later hit for that session shows it was tried and rejected, with the reason. Nothing is deleted, and `--state accepted` takes the mark back. |\n| **It says when the ground moved** | A hit reports *4 files this session touched have changed since*, and says nothing when it cannot tell. It never claims anything is unchanged. |\n| **Sync and handoff** | `deja sync ssh laptop` moves memory between machines, append-only, no cloud in the middle. `deja handoff --to codex` packages the live context so you can continue in another agent. |\n| **Redaction** | Keys, tokens, JWTs and private key blocks are stripped at index time, so the cache is safe to keep. |\n\n</details>\n\n### Your own work, wrapped\n\n`deja stats --card` draws it in the terminal; give it a filename and it writes an\nSVG for a profile README. To post it anywhere else, [turn it into a\nPNG](https://vshulcz.github.io/deja-vu/card/) — that page converts it in your own\nbrowser.\n\n<p align=\"center\"><img src=\"docs/assets/stats-card-demo.svg\" width=\"760\" alt=\"deja stats card: a year of agent sessions as a heatmap, the agents they came from, and the longest one\"></p>\n\nThe full feature reference lives in the [docs](https://vshulcz.github.io/deja-vu/).\n\n## Privacy\n\nIndexing and search are local. The network is used only by `deja update`, `deja sync ssh`,\nand the version check in `deja doctor`.\n\nCredentials are redacted at index time: AWS keys, `api_key=` and `token=` assignments,\nbearer tokens and raw JWTs, PEM private key blocks, provider tokens, `scheme://user:pass@host`\nURLs, and high-entropy values for shapes no pattern knows. The value becomes\n`[redacted:<kind>]` and the surrounding text stays searchable. `deja share` and\n`deja sync export` re-apply redaction on the way out.\n\n`deja forget` removes sessions from a rebuilt index and writes tombstones, so a later\n`deja index` cannot restore them from the source history. `--unforget` lifts a tombstone.\nProject exclusions are one pattern per line in `~/.config/deja/exclude`.\n\nThe [security model](docs/SECURITY-MODEL.md) documents data flows, redaction limits, trust\nassumptions and release verification.\n\n## CLI\n\n```text\n$ deja \"jwt refresh token\"\n[claude] api        · Jul 8 · 8f31c0a9 — 2 matches\n  login started failing after refresh token rotation; jwt kid mismatch in tests\n  fixed by reloading jwks cache after rotateKey and adding a clock-skew test\n[codex]  web        · Jul 1 · b77d91e2 — 1 match\n  refresh token cookie needed SameSite=Lax in local callback flow\n```\n\n**Ask your history**\n\n| Command | What it does |\n| --- | --- |\n| `deja <query>` | Search every history. Multi-word is AND and quoted phrases require contiguous text; a query with no exact match then tries word forms and close spellings, which is where a substring reaches its word (`code` finds `opencode`). |\n| `deja` | With an index and a terminal: today's sessions, recalls served, a question you asked in more than one session, and a wall your agents keep hitting. |\n| `deja blame <path>` | Which sessions discussed a file, what was decided, and why. |\n| `deja files <topic>` | The other direction: which files the work on a subject actually touched. |\n| `deja how <tool>` | How this machine actually runs a thing, with the real flags, from what agents ran before. |\n| `deja fix <error>` | What this machine ran after that same error before, when the error did not come back. |\n| `deja friction` | Errors that hit three or more separate sessions, with the harnesses named. |\n\n<details>\n<summary>Using what it finds, and moving it between machines</summary>\n\n**Use what it finds**\n\n| Command | What it does |\n| --- | --- |\n| `deja ctx <query>` | Markdown digest of the best match, ready to pipe into a prompt. |\n| `deja resume <id>` | Reopen a found session in its native harness. |\n| `deja restore <path>` | Hand back a span an agent replaced, from the `old_string` its edit recorded. Never writes over the original. |\n| `deja promote <id>` | Distill a session into a curated note with provenance, tags and a lifecycle state. Notes outrank raw transcripts. |\n| `deja share <id>` | A sanitized session digest for a colleague, with secrets already scrubbed. |\n\n**Move it and check it**\n\n| Command | What it does |\n| --- | --- |\n| `deja sync export/import/ssh` | Move memory between machines. Watermarked, append-only, idempotent. |\n| `deja view` | Your whole memory as one local HTML file. No server, nothing leaves the machine. |\n| `deja stats` | Your agent work, wrapped. `--card` draws it in the terminal, `--card <file>.svg` writes one for a profile, `--html` a browsable timeline. |\n| `deja doctor [--deep]` | Self-diagnosis, and with `--deep`, proof of the index against the sources. |\n| `deja mcp` | The stdio MCP server, which is what `deja install` wires in. |\n\n</details>\n\nFull reference: [commands](https://vshulcz.github.io/deja-vu/guide/commands.html) and\n[JSON output](docs/json-output.md).\n\n### MCP tools\n\nThe server exposes one tool, `deja`, with a `mode`. `deja install` wires it in, so\nthis is only needed to configure an agent by hand. The six older tool names\n(`recall`, `recall_context`, `blame`, `fix`, `how`, `remember`) still answer for\nanything already wired to them.\n\n<details>\n<summary>Arguments and return shapes</summary>\n\n| Tool | Arguments | Returns |\n| --- | --- | --- |\n| `deja` | `mode`, plus `query`, `path`, `error`, `what`, `text`, `tags?`, `harness?`, `project?`, `since?`, `limit?`, `offset?`, `all?` | Depends on the mode, below. |\n\n| Mode | Arguments it reads | Returns |\n| --- | --- | --- |\n| `recall` | `query`, `harness?`, `limit?`, `offset?` | Dense matching snippets, capped at 4KB. |\n| `context` | `query`, `harness?` | Markdown digest of the best-matching session. |\n| `blame` | `path`, `harness?`, `project?`, `since?`, `limit?`, `all?` | Sessions that discussed a file. |\n| `fix` | `error`, `project?`, `limit?` | What this machine ran, or changed, after that same error before. |\n| `how` | `what`, `project?`, `limit?` | The real invocation, from what agents ran here. |\n| `remember` | `text`, `project?`, `tags?` | Stores a durable decision for later recall. |\n\n</details>\n\n## Supported harnesses\n\n<!-- matrix:start -->\naider &middot; Amp &middot; Antigravity &middot; Claude Code &middot; Cline &middot; Codex CLI &middot; Copilot CLI &middot; Cursor &middot; DeepSeek Harness &middot; Gemini CLI &middot; Goose &middot; Grok Build &middot; Hermes &middot; Kimi Code &middot; omp (Oh My Pi) &middot; OpenClaw &middot; opencode &middot; pi &middot; prime-agent (PrimeIntellect) &middot; Qwen Code &middot; Roo Code &middot; Zed.\n\n<details>\n<summary>What each one supports</summary>\n\n| Harness | MCP recall | Auto-recall | Skill | Command | Resume | Handoff | Needs |\n| --- | :-: | :-: | :-: | :-: | :-: | :-: | --- |\n| aider | ⚠ | ✅ | ✕ | ⚠ | ✕ | ✅ | deja aider |\n| Amp | — | — | — | — | ? | paste | — |\n| Antigravity | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | — |\n| Claude Code | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | — |\n| Cline | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | — |\n| Codex CLI | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | — |\n| Copilot CLI | ✅ | ✕ | ✅ | ✅ | ✅ | ✅ | — |\n| Cursor | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | sqlite3 (IDE chats) |\n| DeepSeek Harness | ✅ | ✅ | ✅ | ✅ | ✕ | paste | zstd |\n| Gemini CLI | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | — |\n| Goose | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | deja goose |\n| Grok Build | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | sqlite3 (grok-dev store) |\n| Hermes | ✅ | ✅ | ✅ | ✅ | ✅ | paste | sqlite3 |\n| Kimi Code | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | — |\n| omp (Oh My Pi) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | — |\n| OpenClaw | ✅ | ✅ | ✅ | ✅ | ✅ | paste | — |\n| opencode | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | sqlite3 |\n| pi | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | — |\n| prime-agent (PrimeIntellect) | — | — | — | — | — | paste | — |\n| Qwen Code | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | — |\n| Roo Code | ✅ | ⚠ | ✅ | ✅ | ✕ | paste | — |\n| Zed | ✅ | ✕ | ✅ | ✅ | ✕ | paste | sqlite3 + zstd |\n\n✅ works &middot; — possible, not built yet &middot; ✕ the harness has no such mechanism &middot; ⚠ blocked by an upstream bug &middot; ? not investigated\n\n</details>\n<!-- matrix:end -->\n\nCustom store locations go through `DEJA_*_ROOT` variables, and each agent's own relocation\nvariable is honored too. The\n[session format registry](https://vshulcz.github.io/deja-vu/registry/README.html) documents\nthe observed paths, record schemas and role mapping per harness, with synthetic fixtures\nkeeping those descriptions checked against the parsers.\n\n### Harnesses with a package of their own\n\n`deja install --auto` wires all six of these like every other harness, and\nthat stays the shortest path. They also have a package in their own ecosystem,\nfor people who install extensions there rather than from a CLI:\n\n| Harness | Package | Install |\n| --- | --- | --- |\n| opencode | npm `opencode-deja` | `opencode plugin opencode-deja` |\n| DeepSeek Harness | npm `dsh-deja` | `dsh plugin --profile web add dsh-deja` |\n| Zed | `deja-context-server` | Zed → Extensions → deja |\n| Kimi Code | plugin `deja` | `/plugins install https://github.com/vshulcz/deja-vu` |\n| Codex CLI | plugin `deja-vu` | `codex plugin marketplace add https://github.com/vshulcz/deja-vu` then `codex plugin add deja-vu@deja-vu` |\n| Grok Build | plugin `deja` | `grok plugin marketplace add xai-org/plugin-marketplace` then `grok plugin install deja` |\n\nEither path is enough on its own, and having both is not a problem: the\nopencode, dsh, Kimi, Grok and Codex packages read what `deja install` wrote and\ncontribute only what is missing, and in Zed both halves use one server id, so\nthere is nothing to have twice whichever order you install in.\n\nEach uses the deja you already have; the copy it bundles is only the fallback.\n\nThe same search is also a skill, for any agent that loads a `SKILL.md`:\n\n```sh\nnpx skills add https://github.com/vshulcz/deja-vu --skill deja-search   # skills CLI: Claude Code, Cursor, Goose, Copilot…\nopenclaw skills install @vshulcz/deja-search                            # ClawHub\nhermes skills install vshulcz/deja-vu/skills/deja-search                # Hermes\n```\n\nThe skill drives the `deja` binary from the install step above; it does not bundle one.\n\n## Semantic recall (optional)\n\nPoint `deja embed` at a local Ollama, LM Studio or OpenAI-compatible endpoint with\n`DEJA_EMBED_URL` and rephrased queries still hit. Without a reachable runtime, lexical\nsearch and MCP recall continue unchanged. OpenAI Platform works with its standard key:\n\n```sh\nexport OPENAI_API_KEY='sk-...'\nexport DEJA_EMBED_URL='https://api.openai.com/v1/embeddings'\nexport DEJA_EMBED_MODEL='text-embedding-3-small'\ndeja embed\n```\n\nWith no `DEJA_EMBED_URL` set, deja probes `localhost:11434` and `localhost:1234`,\nso a machine already running Ollama or LM Studio is picked up without being asked.\n`DEJA_EMBED_OFF=1`, or `DEJA_EMBED_URL=off`, turns that probe off — any other\nconfigured `DEJA_EMBED_URL` still wins.\n\nFor another authenticated OpenAI-compatible endpoint, set `DEJA_EMBED_KEY` explicitly:\n\n```sh\nexport DEJA_EMBED_URL='https://example.com/v1/embeddings'\nexport DEJA_EMBED_MODEL='embedding-model'\nexport DEJA_EMBED_KEY='...'\ndeja embed\n```\n\n`DEJA_EMBED_KEY` takes precedence. `OPENAI_API_KEY` is used automatically only for an\nHTTPS `api.openai.com` URL; it is never implicitly sent to local or third-party endpoints.\n\n<details>\n<summary>Where the vectors live and what they cost</summary>\n\nThe sidecar sits beside the index as `.vectors.bin`, not inside `index.db`. Float32 vectors\ncost roughly 4 MB per 1k messages for a 1,024 dimension model. A remote endpoint receives\nthe redacted indexed text, truncated to about 2k characters, but never raw source files.\nWith Ollama or LM Studio, embedding stays local and needs no key.\n\n</details>\n\n## Proof\n\n```sh\ndeja bench recall     # ranking regression floor, CI fails if recall drops\ndeja bench context    # 30 seeded task chains plus five negative controls\ndeja bench block      # does the answer survive into what deja hands over\n```\n\n`bench block` asks the question the other three cannot: with the right session in\nhand, does the block carry what that session settled. Eight sessions discuss each\nsubject and one of them settles it, in the middle of its own transcript rather\nthan at the end — so the baseline arm, the newest turns of the top hit, scores\nzero and an arm above zero had to choose.\n\n| Arm | Carries the answer | Median tokens |\n|---|---|---|\n| `deja-block` (session-start block) | 1.00 | 665 |\n| `deja-digest` (context digest) | 1.00 | 1656 |\n| `newest-turn` (baseline) | 0.00 | 289 |\n| `cold` | 0.00 | 0 |\n\n\nThe context experiment compares deja-recall against full-history, naive grep and cold\ncontext. With the default seed:\n\n| Arm | Median tokens | Median coverage | Negative-control tokens |\n| --- | ---: | ---: | ---: |\n| deja-recall | 286 | 1.00 | 0 |\n| full-history | 16,919 | 1.00 | 14,920 |\n| naive-grep | 57,489 | 1.00 | 0 |\n| cold | 0 | 0.00 | 0 |\n\nSame fact coverage as grepping the raw logs for about 200x fewer tokens, and about 60x\nfewer than replaying the matched sessions in full, while injecting nothing on the chains\nwhere no prior fact is relevant. The corpus generator and the relevance labels are\nordinary reviewed Go. Audit what \"relevant\" means before trusting any figure, ours\nincluded.\n\nMeasured on a real store of 1,551 sessions and 143k messages — 5.2 GB across nine\nharnesses:\n\n| Measurement | Result |\n| --- | --- |\n| Lookup, in process | **~0.4 ms** median (`deja bench recall`), ~25 ms on the LongMemEval-S haystacks |\n| `deja <query>`, end to end | ~0.2 s median on that store: process start, the freshness check over every store, ranking, printing |\n| Freshness check alone | ~30 ms when nothing changed |\n| Index size | 160 MB, ~3% of corpus |\n\nThe index is incremental. When a session file grows, only that file is re-read.\n\n## How it works\n\nLocal inverted index in `~/.cache/deja`: parse the JSONL and SQLite stores, redact\ncredentials, write `records.bin` plus token buckets, and track per-file state in\n`manifest.gob` so repeat runs only ingest what changed. The MCP server, stats, share and\nsync all read that one index. Details in [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md).\n\n## FAQ\n\n**Does anything leave my machine?** No, unless you ask it to. See the\n[data flows](docs/SECURITY-MODEL.md#data-flows).\n\n**What about secrets already in my logs?** They stay in the original harness files, which\nare your agent's data. Known shapes — AWS keys, `api_key=`/`token=` assignments, bearer\ntokens and bare JWTs, PEM blocks, provider tokens, high-entropy values — are stripped as\nthe index is built, so they do not reach digests, shares or sync exports. Pattern matching\nis not secret detection: a shape it does not know can pass through. See the\n[security model](docs/SECURITY-MODEL.md#redaction).\n\n**Will it slow my agent down?** A recall is a lexical lookup against a local index:\n~0.4 ms median, and nothing waits on a model. A hook adds the process start and a\nfreshness check over your stores on top of that — tens of milliseconds on a store of\na few gigabytes.\n\n**Do I have to change how I work?** No. The agent calls recall itself, and with\nauto-recall it already knows the project's prior decisions when the session opens.\n\n**How is this different from the other memory tools?**\n\n| | deja | Memory platforms<br>(Mem0, Letta, memU) | Session search<br>(cass) |\n| --- | :-: | :-: | :-: |\n| Knows work from before you installed it | yes | no | yes |\n| Capture step | none, the transcripts are the memory | the agent or your code writes facts | none |\n| Needs an LLM or embedding key | no | yes | optional |\n| Recalls without being asked | at session start and before a tool runs | no | no |\n\n[engram](https://github.com/Gentleman-Programming/engram) is the strongest of the\nrecord-forward tools and worth your time if that model fits you; it still starts empty and\nknows only what an agent chose to save. The\n[full comparison](https://vshulcz.github.io/deja-vu/guide/compare.html) covers eleven of them.\n\n**Where is Claude Code session history stored, and can I search it?** Under\n`~/.claude/projects`, one JSONL file per session; Codex keeps `~/.codex/sessions`, Cursor a\nSQLite `state.vscdb`. `deja search` reads them all in place, `deja last` lists the recent\nsessions of every agent, and `deja view` opens the whole history as one local page. Paths\nfor each agent: [where sessions are stored](https://vshulcz.github.io/deja-vu/guide/where-sessions-are-stored.html).\n\n**My Claude Code session history disappeared. Is it gone?** Claude Code deletes transcripts\nolder than 30 days (`cleanupPeriodDays` in `~/.claude/settings.json`), and `claude --resume` lists\nonly what is left. A session deja indexed before the cleanup stays searchable after the\nfile is gone. Details: [session files on disk](https://vshulcz.github.io/deja-vu/guide/session-files-on-disk.html).\n\n**What about Windows?** Builds exist and CI runs the suite there. macOS and Linux are the\nbattle-tested paths. Field reports welcome in [#9](https://github.com/vshulcz/deja-vu/issues/9).\n\n**How do I wipe everything?**\n\n```sh\ndeja uninstall --all\nrm -rf ~/.cache/deja\n```\n\n## Guides\n\nWritten for the situation rather than the feature:\n\n- [Does your agent remember previous conversations?](https://vshulcz.github.io/deja-vu/guide/does-my-agent-remember.html) — what each agent keeps between sessions, and what it drops\n- [Session files on disk](https://vshulcz.github.io/deja-vu/guide/session-files-on-disk.html) — how big `~/.claude/projects` gets, and what deleting it costs\n- [The agent lost the context you had](https://vshulcz.github.io/deja-vu/guide/lost-context.html) — after a crash, a clear, or a session that came back empty\n- [The context window is full](https://vshulcz.github.io/deja-vu/guide/context-window-full.html) — what compaction keeps, measured, and what to do instead\n- [Resuming yesterday's session](https://vshulcz.github.io/deja-vu/guide/resume-a-session.html) — find it across every agent, reopen it in the one that owns it\n- [The agent repeats a mistake you already fixed](https://vshulcz.github.io/deja-vu/guide/repeated-mistakes.html)\n- [Finding the session where you solved it](https://vshulcz.github.io/deja-vu/guide/find-a-session.html)\n- [Why agents forget between sessions](https://vshulcz.github.io/deja-vu/guide/forgetting.html) · [Where each agent keeps its history](https://vshulcz.github.io/deja-vu/guide/where-sessions-are-stored.html)\n- [What compaction drops](https://vshulcz.github.io/deja-vu/guide/after-compaction.html) · [Switching agents](https://vshulcz.github.io/deja-vu/guide/switching-agents.html) · [Auditing an agent](https://vshulcz.github.io/deja-vu/guide/auditing-agents.html) · [Exporting a conversation](https://vshulcz.github.io/deja-vu/guide/export-conversations.html) · [Across machines](https://vshulcz.github.io/deja-vu/guide/sync-across-machines.html) · [What memory costs](https://vshulcz.github.io/deja-vu/guide/token-cost.html)\n\nPer harness: [opencode](https://vshulcz.github.io/deja-vu/guide/memory-for-opencode.html) · [DeepSeek Harness](https://vshulcz.github.io/deja-vu/guide/memory-for-dsh.html) · [Kimi Code](https://vshulcz.github.io/deja-vu/guide/memory-for-kimi.html) · [Zed](https://vshulcz.github.io/deja-vu/guide/memory-for-zed.html) · [Grok Build](https://vshulcz.github.io/deja-vu/guide/memory-for-grok.html) · [Gemini CLI](https://vshulcz.github.io/deja-vu/guide/memory-for-gemini.html) · [Qwen Code](https://vshulcz.github.io/deja-vu/guide/memory-for-qwen.html) · [OpenClaw](https://vshulcz.github.io/deja-vu/guide/memory-for-openclaw.html) · [Goose](https://vshulcz.github.io/deja-vu/guide/memory-for-goose.html) · [Cline](https://vshulcz.github.io/deja-vu/guide/memory-for-cline.html) · [pi and omp](https://vshulcz.github.io/deja-vu/guide/memory-for-pi.html) · [Hermes](https://vshulcz.github.io/deja-vu/guide/memory-for-hermes.html)\n\n## Try it on your own history\n\n```sh\ncurl -fsSL https://raw.githubusercontent.com/vshulcz/deja-vu/main/install.sh | sh\ndeja install --auto\n```\n\nTen seconds to install, about ten to index. The next session your agent opens, it\nalready knows what you solved in that project — including everything from before\nyou installed this.\n\n## Contributing\n\n`make build test lint`, then [CONTRIBUTING.md](CONTRIBUTING.md). Adding a harness starts in\nthe [parser registry](docs/ARCHITECTURE.md#source-parsers). Priorities and non-goals are in\n[ROADMAP.md](ROADMAP.md). Good first issues are labeled.\n\n## License\n\nMIT © [Vladislav Shulcz](https://github.com/vshulcz)\n",
  "bytes": 28325,
  "sha": "5155ecba301fe945e19813d851346523e4d8b9756b896b906bac844876de98d4",
  "repo_slug": "vshulcz/deja-vu",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/plg_vshulcz_deja_vu_f5bc3216/readme"
}