Sources
Where each coding agent stores its sessions, and how the CLI reads them.
A source is one coding agent. The CLI only reads sources you approve during selltraces onboard. See what it found with:
selltraces sourcesThis lists each detected source with session counts and sizes. It reads file metadata only, not content.
Locations
| Source | ID | macOS and Linux | Windows |
|---|---|---|---|
| Claude Code | claude_code | ~/.claude/projects/**/*.jsonl | %USERPROFILE%\.claude\projects |
| Codex CLI | codex | ~/.codex/sessions/**/*.jsonl | %USERPROFILE%\.codex\sessions |
| Gemini CLI | gemini_cli | ~/.gemini/tmp/**/chats/*.json | %USERPROFILE%\.gemini\tmp |
| OpenCode | opencode | ~/.local/share/opencode/storage/** or opencode.db | %USERPROFILE%\.local\share\opencode |
| Cursor | cursor | state.vscdb in Cursor's User/globalStorage and User/workspaceStorage | %APPDATA%\Cursor\User |
Cursor's folder is ~/Library/Application Support/Cursor/User on macOS and ~/.config/Cursor/User on Linux.
Notes per source
- Claude Code keeps one JSONL file per session, grouped by project folder.
- Codex keeps rollout files by date. Duplicate event lines are ignored so each turn counts once.
- Gemini CLI stores saved chats per project hash. Newer JSONL chats are supported too.
- OpenCode moved from JSON files to a SQLite database. Both layouts are read.
- Cursor support is best effort. Cursor stores chats in an internal SQLite database whose layout changes between releases. If a Cursor update breaks parsing, the CLI skips those sessions and says so, rather than guessing.
What is normalized
Every source is converted to the same JSONL format before redaction: one header line, then messages, tool calls and tool results in order. Model names and timestamps are kept so buyers can see which models did the work.
Turning a source off
selltraces onboardUnselect the source. Already uploaded traces stay where they are. To remove those, see excluding traces.