Where each coding agent stores its conversation history
forty-one agents, one table
Every coding agent writes what you said and what it did to a file on your machine. The formats differ, the locations differ, and none of them is documented in one place — so here is that place, generated from the same registry deja's parsers are written against.
Where each one writes
| Agent | Where the sessions live | Format |
|---|---|---|
| aider | ~/.aider.chat.history.md | one Markdown log |
| Amp | ~/.local/share/amp/threads/*.json | one JSON file per thread |
| Antigravity | ~/.gemini/antigravity*/brain/*/.system_generated/logs/transcript.jsonl | JSONL, one record per line |
| Cherry Studio | <app data>/CherryStudio/Data/Agents/.claude/projects/*/*.jsonl | JSONL, in Claude Code's own shape |
| Claude Code | ${CLAUDE_CONFIG_DIR:-~/.claude}/projects/**/*.jsonl | JSONL, one record per line |
| Cline | ${CLINE_SESSION_DATA_DIR:-${CLINE_DATA_DIR:-${CLINE_DIR:-~/.cline}/data}/sessions}/*/*.messages.json | JSON files |
| CodeBuddy Code | ${CODEBUDDY_CONFIG_DIR:-~/.codebuddy}/projects/*/*.jsonl; WorkBuddy writes ~/.workbuddy/projects/*/*.jsonl | JSONL, one record per line |
| CodeWhale | ${CODEWHALE_HOME:-~/.codewhale}/sessions/<id>.json | JSON, one file per session |
| Codex CLI | ${CODEX_HOME:-~/.codex}/sessions/**/rollout-*.jsonl | JSONL rollouts plus a history file |
| Command Code | ~/.commandcode/projects/*/*.jsonl | JSONL, one record per line |
| Continue | ${CONTINUE_GLOBAL_DIR:-~/.continue}/sessions/*.json | JSON files, rewritten whole |
| Copilot CLI | ${DEJA_COPILOT_ROOT:-${COPILOT_HOME:-~/.copilot}/session-state}/*/events.jsonl | JSONL, one record per line |
| Crush | <project>/.crush/crush.db | SQLite database, one per project |
| Cursor | ~/Library/Application Support/Cursor/User/{globalStorage,workspaceStorage/*}/state.vscdb; the CLI writes ~/.cursor/projects/**/agent-transcripts/**/*.jsonl | SQLite key-value store, or JSONL |
| DeepSeek Harness | ${DSH_HOME:-~/.dsh}/sessions/*/session-*/session.v4.jsonl.zstd | zstd-compressed JSONL |
| Devin CLI | ${XDG_DATA_HOME:-~/.local/share}/devin/cli/sessions.db | SQLite database |
| gajae-code | ${GJC_CODING_AGENT_DIR:-~/.gjc/agent}/sessions/*/*.jsonl | JSONL, one record per line |
| Gemini CLI | ${GEMINI_CLI_HOME:-~}/.gemini/tmp/*/chats/**/*.{json,jsonl} | JSON or JSONL |
| Goose | ${GOOSE_PATH_ROOT}/data/sessions/sessions.db | SQLite database; older builds JSONL |
| Grok Build | ${GROK_HOME:-~/.grok}/sessions/**/updates.jsonl | JSONL events with JSON metadata |
| Hermes | ~/.hermes/state.db and ~/.hermes/profiles/*/state.db | SQLite database |
| JetBrains AI Assistant | <JetBrains config>/<Product><version>/workspace/*.xml; agent chats also …/aia-task-history/*.events | XML, plus base64 JSON event logs |
| Junie | ${JUNIE_HOME:-~/.junie}/sessions/*/events.jsonl | JSONL, one record per line |
| Kilo Code | <vscode-globalStorage>/kilocode.kilo-code/tasks/*/api_conversation_history.json | JSON files, plus the CLI's own SQLite store |
| Kimchi Coding | ~/.config/kimchi/harness/sessions/--<encoded-cwd>--/*.jsonl | JSONL, one record per line |
| Kimi Code | ${KIMI_CODE_HOME:-~/.kimi-code}/sessions/*/*/agents/main/wire.jsonl | JSONL, one record per line |
| Kiro | ~/.kiro/sessions/cli/*.jsonl and ~/.kiro/sessions/*/sess_*/messages.jsonl | JSONL, one record per line |
| Muse Code | ${XDG_DATA_HOME:-~/.local/share}/muse/sessions/YYYY/MM/DD/*/session.jsonl | JSONL, one record per line |
| omp (Oh My Pi) | ~/.omp/agent/sessions/**/*.jsonl and ~/.omp/profiles/*/agent/sessions/**/*.jsonl | JSONL, one record per line |
| OpenClaw | ${OPENCLAW_STATE_DIR:-~/.openclaw}/agents/*/agent/openclaw-agent.sqlite and …/agents/*/sessions/*.jsonl | SQLite database, or JSONL in older builds |
| opencode | ~/.local/share/opencode/opencode.db | SQLite database |
| pi | ${DEJA_PI_ROOT:-~/.pi/agent/sessions}/**/*.jsonl | JSONL, one record per line |
| prime-agent (PrimeIntellect) | ${DEJA_PRIME_ROOT:-~/.prime/agent/sessions}/**/*.jsonl | JSONL, one record per line |
| Qwen Code | ${DEJA_QWEN_ROOT:-~/.qwen}/projects/*/chats/*.jsonl | JSONL, one record per line |
| Reasonix | ${REASONIX_STATE_HOME:-~/.reasonix}/projects/<workspace-slug>/sessions-v4/<id>/events.frames and ${REASONIX_STATE_HOME:-~/.reasonix}/sessions/<id>.jsonl | zstd-framed event log (1.x), or JSONL |
| Roo Code | <vscode-globalStorage>/rooveterinaryinc.roo-cline/tasks/*/api_conversation_history.json | JSON files |
| Senpi | ${SENPI_CODING_AGENT_DIR:-~/.senpi/agent}/sessions/*/*.jsonl | JSONL, one record per line |
| TRAE CLI | ${TRAE_HOME:-~/.trae}/cli/sessions/**/rollout-*.jsonl | JSONL rollouts plus a history file |
| VS Code Copilot Chat | <vscode-User>/workspaceStorage/*/chatSessions/*.{json,jsonl} | JSON or JSONL |
| ZCode | ~/.zcode/projects/*/*.jsonl | JSONL, plus the CLI's own SQLite store |
| Zed | ~/Library/Application Support/Zed/threads/threads.db | SQLite database |
Each row links to that harness's page in the session format registry, which documents the record schema, how roles map, the override variables, and what deja could not verify. Every entry carries the date it was last checked against a real store.
Reading them yourself
Most are JSONL — one JSON object per line, appended as the session runs:
ls -t ~/.claude/projects/*/*.jsonl | head -1 | xargs tail -5 | jq -r '.message.content'
Some are databases rather than files. opencode keeps opencode.db, Hermes a state.db plus one per profile, Goose a sessions.db, Crush a crush.db per project, Devin CLI a sessions.db, and Zed one SQLite store for every thread with each body compressed as a zstd frame — so sqlite3 alone will show you rows of binary, and you need zstd to read a thread. Reasonix 1.x and DeepSeek Harness also need zstd. Cursor is the awkward one: the IDE keeps its chats as key-value rows inside state.vscdb, while Cursor CLI writes JSONL transcripts per project.
Two practical notes. Paths move: Claude Code honours CLAUDE_CONFIG_DIR, Codex CODEX_HOME, Kimi KIMI_CODE_HOME, Goose and opencode follow XDG_DATA_HOME. And these files hold whatever your session held, including any secret that was pasted or printed — treat them like the logs they are.
What to do with them
Reading one file answers "what did I do in that session". The useful question is usually the other one — "which session was it" — and that needs an index across all of them. That is what deja builds: one local index over every store above, searchable from the command line and readable by the agents themselves over MCP. deja with no arguments opens it as a full-screen search, results as you type.
curl -fsSL https://raw.githubusercontent.com/vshulcz/deja-vu/main/install.sh | sh deja "connection pool exhausted"
No capture step and nothing to switch on first: the files are already there, including the months before you installed anything. Indexing and search stay local, and credentials are stripped as the index is built.
The full registry · Why agents forget in the first place · Getting started
Found this useful? Star deja-vu on GitHub.