9 min read

Where Claude Desktop Actually Stores Your Cowork Conversations

In a previous post, I documented the 27 fields in Claude Desktop’s Cowork session manifest files. That post ended with an explicit gap: “The session JSON contains metadata, configuration, and user decisions, but not the full conversation transcript. There are no message arrays, no assistant responses, no tool call logs.”

This post fills that gap. The transcripts exist, they’re on disk in plain JSONL, and the path to them can be derived from three fields in the manifest. There’s also an audit log with per-session cost data that I haven’t seen documented anywhere.

How I found this

Every community tool for extracting Claude conversations targets ~/.claude/projects/. That’s where Claude Code CLI and VS Code store their JSONL transcripts, and tools like claude-conversation-extractor, claude-code-transcripts, and claude-history all look there.

But Cowork doesn’t write to ~/.claude/projects/. If you only search that path, you’ll find your CLI and VS Code sessions but miss every Cowork conversation.

The base directory, local-agent-mode-sessions/, isn’t a secret. GitHub issue #24534 confirmed it, and several community posts reference it. What was missing was the path from that base directory down to the actual JSONL transcript files, and the mapping from manifest fields to file locations. I traced that by enumerating the directory trees of all 195 Cowork sessions on my machine and matching them against their manifest fields.

The result: a three-field mapping that resolves every manifest to its transcript with a 100% hit rate across all sessions that successfully started.

Where the transcripts actually live

On Windows, the full path to a Cowork conversation transcript is:

%AppData%\Claude\local-agent-mode-sessions\<org-id>\<user-id>\<sessionId>\.claude\projects\-sessions-<processName>\<cliSessionId>.jsonl

Breaking that down:

SegmentSourceExample
%AppData%\Claude\local-agent-mode-sessions\Fixed base pathC:\Users\Bryce\AppData\Roaming\Claude\local-agent-mode-sessions\
<org-id>\Organization UUIDe633e2fd-bc86-46af-91ae-069658732371\
<user-id>\User UUIDe9941c22-54c5-42dc-b970-4713ba9f6109\
<sessionId>\Manifest’s sessionId fieldlocal_7876b7f6-7ea3-4d3e-a128-38fe1e18266e\
.claude\projects\Standard Claude Code internal structure
-sessions-<processName>\VM working directory, encoded-sessions-charming-adoring-darwin\
<cliSessionId>.jsonlManifest’s cliSessionId field4368fcb8-373d-4ba7-9952-3beee2a56818.jsonl

On macOS, the base path is ~/Library/Application Support/Claude/local-agent-mode-sessions/. This is corroborated by multiple GitHub issues and community posts, though I’ve only verified the full internal transcript path on Windows.

Note on directory names: Anthropic is actively renaming local-agent-mode-sessions to claude-code-sessions (GitHub issues #29373, #27463), with migration bugs reported on both platforms. Both directory names can coexist on the same machine. If you don’t find one, check the other.

The manifest-to-transcript mapping

Three fields from the session manifest (local_<sessionId>.json) give you the transcript path:

  1. sessionId: names the session data directory
  2. processName: encodes as the projects/ subdirectory name (the VM’s cwd is always /sessions/<processName>, which encodes to -sessions-<processName>)
  3. cliSessionId: names the JSONL transcript file

Validation results across 195 sessions:

  • 181 sessions have a cliSessionId and a matching JSONL at the predicted path, a 100% hit rate
  • 14 manifests lack cliSessionId entirely. These are failed or aborted sessions where the VM was created but the Claude Code process never started (0 seconds duration, empty projects/ directories)
  • 0 JSONL files at unexpected paths
  • 0 orphaned data directories without manifests
  • 0 orphaned manifests without data directories

Important: sessionId and cliSessionId are not the same thing. sessionId uses a local_ prefix and identifies the Cowork session. cliSessionId is a bare UUID that identifies the Claude Code CLI process running inside the VM. The transcript file is named after the CLI session, not the Cowork session.

What’s in the transcripts

The JSONL format shares the same core structure as Claude Code CLI transcripts. Each line is a JSON object with a type field.

Line types observed across 195 sessions:

TypeDescriptionCoworkCLI
assistantClaude’s responses (content, tool_use, tool_result blocks)YesYes
userUser messages and tool resultsYesYes
systemSystem messages, compaction metadataYesYes
queue-operationEnqueue/dequeue operationsYesYes
progressStreaming token progress updatesNoYes
file-history-snapshotFile edit undo snapshotsNoYes
pr-linkGitHub PR URLsNoYes

Field-level differences on shared types:

  • On assistant lines: Cowork adds error and isApiErrorMessage fields (not present in CLI)
  • On user lines: Cowork adds sourceToolUseID; CLI has todos instead

Tools that parse Claude Code CLI JSONL will mostly work on Cowork transcripts, but they’ll miss the Cowork-specific fields and won’t encounter progress, file-history-snapshot, or pr-link lines.

The audit log

Every Cowork session has an audit.jsonl file at the session data root (not inside .claude/):

%AppData%\Claude\local-agent-mode-sessions\<org-id>\<user-id>\<sessionId>\audit.jsonl

This is Cowork-only. 195 audit.jsonl files found in Cowork sessions, 0 found anywhere in ~/.claude/.

The audit log has a different schema from the conversation transcript:

Line TypeWhat it contains
system (subtype: init)Session initialization: cwd, tools, model, MCP servers, plugins, skills, slash commands, permission mode, Claude Code version, agents
assistantSimplified assistant messages with _audit_timestamp
userSimplified user messages with _audit_timestamp
tool_use_summaryAggregated summaries of tool use sequences
resultSession cost data: total_cost_usd, duration_ms, duration_api_ms, num_turns, usage, stop_reason, modelUsage
rate_limit_eventRate limit information

The result lines are the most interesting: they contain actual dollar costs per session. Sample data from real sessions:

SessionCostDurationTurns
ShopForge QA Review$11.6157 min174
Review customer persona research$8.6414 min88
Plan next project priorities$6.8516 min105
Compare image quality$6.3417 min108
Plan next steps forward$2.605 min53
Review storage usage$1.594 min45

Failed sessions (the 14 without cliSessionId) produce no result lines.

Subagent transcripts

Cowork frequently spawns subagents. Their transcripts live at:

...\-sessions-<processName>\<cliSessionId>\subagents\agent-<id>.jsonl

Quantified across 195 sessions:

  • 98 sessions (50.3%) spawn at least one subagent
  • Range: 1–35 subagents per session
  • Mean: 4.9, Median: 3
  • 11 sessions spawned 10+ subagents
  • Subagent JSONL uses the same schema as the main transcript (typically just a few lines per agent)
  • No per-subagent audit.jsonl; cost data is only at the session level

A gap in community tooling

The existing tools for extracting Claude conversations (claude-conversation-extractor, claude-code-transcripts, claude-history) correctly target ~/.claude/projects/ for CLI sessions. That’s where Claude Code CLI and VS Code write their transcripts, and those tools work well for that data.

The gap is that Cowork’s separate storage path isn’t covered. If you use both Claude Code CLI and Cowork through the Desktop app, these tools will find one half of your sessions and miss the other.

The source of the confusion: Claude Desktop has both a “Code” tab and a “Cowork” tab. The Code tab runs Claude Code against host directories and writes transcripts to ~/.claude/projects/<encoded-host-path>/. Cowork runs Claude Code inside an isolated VM and writes transcripts to %AppData%\Claude\local-agent-mode-sessions/. GitHub issue #29801, which reports both apps “reading the same .jsonl file from ~/.claude/projects/”, was testing Claude Code through the Desktop app’s Code tab, not Cowork.

Other things that don’t exist where you’d expect:

  • history.jsonl: frequently referenced as a global session index at ~/.claude/history.jsonl. Does not exist on Windows with Claude Code 2.1.64. Either deprecated or was never created by the Desktop app (vs. CLI).
  • sessions-index.json: exists but only for CLI projects, and only in 2 of 9 project directories on the tested machine. Not present in Cowork sessions. Appears to be generated on-demand (e.g., when /resume is used).

The complete storage map

LayerLocation (Windows)ContentsCoworkCLI
Session manifest%AppData%\Claude\local-agent-mode-sessions\...\local_<id>.jsonConfig, metadata, system prompt, PII (27+ fields)YesNo
Conversation transcript...\local_<id>\.claude\projects\-sessions-<name>\<cliId>.jsonlFull message history, tool calls, responsesYesNo
Subagent transcripts...\<cliId>\subagents\agent-<id>.jsonlPer-subagent conversationsYesNo
Audit log...\local_<id>\audit.jsonlTimeline with costs, durations, rate limitsYesNo
CLI transcript~\.claude\projects\<encoded-cwd>\<session>.jsonlFull message history (+ progress, snapshots)NoYes
CLI session index~\.claude\projects\<encoded-cwd>\sessions-index.jsonSession metadata (sparse, on-demand)NoPartial

What this means

Between this post and the session manifest schema, you now have a complete map of every file Cowork writes to disk: manifests, transcripts, subagent logs, and audit trails with per-session costs. Enough to build your own session browser, cost tracker, or conversation exporter.

This format is undocumented and can change at any time. This investigation was conducted on Windows with Claude Desktop v1.1.4498 running Claude Code 2.1.64 inside the Cowork VM, across 195 sessions spanning February 11 – March 10, 2026. The published JSON Schema covers the session manifest fields from the previous post.

If you’re building tools against this data, also see the posts on the scheduled task startup bug and the file upload permission fix, which both document Cowork behaviors that affect how sessions are created and what they contain.

I'm an independent engineer (ex-eBay) who designs and builds production AI systems. I work deep in the Claude Code and MCP ecosystem, document what I find, and take on contract work. Currently taking on projects. Get in touch .