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

AgentWhere the sessions liveFormat
aider~/.aider.chat.history.mdone Markdown log
Amp~/.local/share/amp/threads/*.jsonone JSON file per thread
Antigravity~/.gemini/antigravity*/brain/*/.system_generated/logs/transcript.jsonlJSONL, one record per line
Cherry Studio<app data>/CherryStudio/Data/Agents/.claude/projects/*/*.jsonlJSONL, in Claude Code's own shape
Claude Code${CLAUDE_CONFIG_DIR:-~/.claude}/projects/**/*.jsonlJSONL, one record per line
Cline${CLINE_SESSION_DATA_DIR:-${CLINE_DATA_DIR:-${CLINE_DIR:-~/.cline}/data}/sessions}/*/*.messages.jsonJSON files
CodeBuddy Code${CODEBUDDY_CONFIG_DIR:-~/.codebuddy}/projects/*/*.jsonl; WorkBuddy writes ~/.workbuddy/projects/*/*.jsonlJSONL, one record per line
CodeWhale${CODEWHALE_HOME:-~/.codewhale}/sessions/<id>.jsonJSON, one file per session
Codex CLI${CODEX_HOME:-~/.codex}/sessions/**/rollout-*.jsonlJSONL rollouts plus a history file
Command Code~/.commandcode/projects/*/*.jsonlJSONL, one record per line
Continue${CONTINUE_GLOBAL_DIR:-~/.continue}/sessions/*.jsonJSON files, rewritten whole
Copilot CLI${DEJA_COPILOT_ROOT:-${COPILOT_HOME:-~/.copilot}/session-state}/*/events.jsonlJSONL, one record per line
Crush<project>/.crush/crush.dbSQLite database, one per project
Cursor~/Library/Application Support/Cursor/User/{globalStorage,workspaceStorage/*}/state.vscdb; the CLI writes ~/.cursor/projects/**/agent-transcripts/**/*.jsonlSQLite key-value store, or JSONL
DeepSeek Harness${DSH_HOME:-~/.dsh}/sessions/*/session-*/session.v4.jsonl.zstdzstd-compressed JSONL
Devin CLI${XDG_DATA_HOME:-~/.local/share}/devin/cli/sessions.dbSQLite database
gajae-code${GJC_CODING_AGENT_DIR:-~/.gjc/agent}/sessions/*/*.jsonlJSONL, one record per line
Gemini CLI${GEMINI_CLI_HOME:-~}/.gemini/tmp/*/chats/**/*.{json,jsonl}JSON or JSONL
Goose${GOOSE_PATH_ROOT}/data/sessions/sessions.dbSQLite database; older builds JSONL
Grok Build${GROK_HOME:-~/.grok}/sessions/**/updates.jsonlJSONL events with JSON metadata
Hermes~/.hermes/state.db and ~/.hermes/profiles/*/state.dbSQLite database
JetBrains AI Assistant<JetBrains config>/<Product><version>/workspace/*.xml; agent chats also …/aia-task-history/*.eventsXML, plus base64 JSON event logs
Junie${JUNIE_HOME:-~/.junie}/sessions/*/events.jsonlJSONL, one record per line
Kilo Code<vscode-globalStorage>/kilocode.kilo-code/tasks/*/api_conversation_history.jsonJSON files, plus the CLI's own SQLite store
Kimchi Coding~/.config/kimchi/harness/sessions/--<encoded-cwd>--/*.jsonlJSONL, one record per line
Kimi Code${KIMI_CODE_HOME:-~/.kimi-code}/sessions/*/*/agents/main/wire.jsonlJSONL, one record per line
Kiro~/.kiro/sessions/cli/*.jsonl and ~/.kiro/sessions/*/sess_*/messages.jsonlJSONL, one record per line
Muse Code${XDG_DATA_HOME:-~/.local/share}/muse/sessions/YYYY/MM/DD/*/session.jsonlJSONL, one record per line
omp (Oh My Pi)~/.omp/agent/sessions/**/*.jsonl and ~/.omp/profiles/*/agent/sessions/**/*.jsonlJSONL, one record per line
OpenClaw${OPENCLAW_STATE_DIR:-~/.openclaw}/agents/*/agent/openclaw-agent.sqlite and …/agents/*/sessions/*.jsonlSQLite database, or JSONL in older builds
opencode~/.local/share/opencode/opencode.dbSQLite database
pi${DEJA_PI_ROOT:-~/.pi/agent/sessions}/**/*.jsonlJSONL, one record per line
prime-agent (PrimeIntellect)${DEJA_PRIME_ROOT:-~/.prime/agent/sessions}/**/*.jsonlJSONL, one record per line
Qwen Code${DEJA_QWEN_ROOT:-~/.qwen}/projects/*/chats/*.jsonlJSONL, one record per line
Reasonix${REASONIX_STATE_HOME:-~/.reasonix}/projects/<workspace-slug>/sessions-v4/<id>/events.frames and ${REASONIX_STATE_HOME:-~/.reasonix}/sessions/<id>.jsonlzstd-framed event log (1.x), or JSONL
Roo Code<vscode-globalStorage>/rooveterinaryinc.roo-cline/tasks/*/api_conversation_history.jsonJSON files
Senpi${SENPI_CODING_AGENT_DIR:-~/.senpi/agent}/sessions/*/*.jsonlJSONL, one record per line
TRAE CLI${TRAE_HOME:-~/.trae}/cli/sessions/**/rollout-*.jsonlJSONL rollouts plus a history file
VS Code Copilot Chat<vscode-User>/workspaceStorage/*/chatSessions/*.{json,jsonl}JSON or JSONL
ZCode~/.zcode/projects/*/*.jsonlJSONL, plus the CLI's own SQLite store
Zed~/Library/Application Support/Zed/threads/threads.dbSQLite 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.