Where each coding agent stores its conversation history

twenty agents, twenty formats, 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
Antigravity~/.gemini/antigravity*/brain/*/.system_generated/logs/transcript.jsonlJSONL, one record per line
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
Codex CLI${CODEX_HOME:-~/.codex}/sessions/**/rollout-*.jsonlJSONL rollouts plus a history file
Copilot CLI${DEJA_COPILOT_ROOT:-~/.copilot/session-state}/*/events.jsonlJSONL, one record per line
Cursor~/Library/Application Support/Cursor/User/{globalStorage,workspaceStorage/*}/state.vscdbSQLite key-value store, or JSONL
DeepSeek Harness${DSH_HOME:-~/.dsh}/sessions/*/session-*/session.jsonl.zstdJSONL, one record per line
Gemini CLI${GEMINI_CLI_HOME:-~}/.gemini/tmp/*/chats/**/*.{json,jsonl}JSON or JSONL
Goose${GOOSE_PATH_ROOT}/data/sessions/sessions.dbJSONL, with a SQLite index
Grok Build${GROK_HOME:-~/.grok}/sessions/**/updates.jsonlJSONL events with JSON metadata
Hermes~/.hermes/profiles/*/state.dbSQLite database
Kimi Code${KIMI_CODE_HOME:-~/.kimi-code}/sessions/*/*/agents/main/wire.jsonlJSONL, one record per line
omp (Oh My Pi)~/.omp/profiles/*/agent/sessions/**/*.jsonlJSONL, one record per line
OpenClaw${OPENCLAW_STATE_DIR:-~/.openclaw}/agents/*/sessions/*.jsonlJSONL, one record per line
opencode~/.local/share/opencode/opencode.dbSQLite database
pi${DEJA_PI_ROOT:-~/.pi/agent/sessions}/**/*.jsonlJSONL, one record per line
Qwen Code${DEJA_QWEN_ROOT:-~/.qwen}/projects/*/chats/*.jsonlJSONL, one record per line
Roo Code/rooveterinaryinc.roo-cline/tasks/*/api_conversation_history.jsonJSON files
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'

Three are databases rather than files. opencode keeps opencode.db, Hermes a state.db per profile, 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. Cursor is the awkward one: older versions keep a key-value blob inside state.vscdb, newer builds write 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.

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