AI Assistants

Claude Desktop

Overview

Claude Desktop is Anthropic's desktop application for Claude, packaged as an Electron app (bundle identifier com.anthropic.claudefordesktop). Like other Electron apps it keeps a Chromium profile under ~/Library/Application Support/Claude/, so its web-style storage (IndexedDB, Local Storage, HTTP cache, cookies) uses the Chromium formats, and it adds its own JSON state files, logs, and agent-session directories alongside.

Three features make it forensically significant:

  • Cached conversations. Claude conversations can be recovered from the IndexedDB conversation store and from cached API responses in the Chromium HTTP cache. Superseded and deleted values may survive in LevelDB.
  • Cowork agent sessions. The app can run local agent sessions that execute tools on the user's machine. Each session keeps metadata, the agent's transcripts, input and output files, and an audit log whose entries are chained with an HMAC.
  • Connectors and extensions. The app launches MCP servers defined in a JSON config file and supports installable extensions. Both run code on the host and are a persistence and execution vector.

What is documented here

This section was written from research on a Claude Desktop 2.42304.0 install on macOS 26, plus the app's own code for the audit log framing. Where a behaviour was observed on that one build it is described as observed. Version boundaries in the timeline below are approximate, and parsers should key on file presence rather than version.

File Locations

Paths are relative to the user's home directory. Claude/ below means ~/Library/Application Support/Claude/.

LocationContents
/Applications/Claude.app, ~/Applications/Claude.appApplication bundle (Contents/Info.plist carries the version)
Claude/IndexedDB/https_claude.ai_0.indexeddb.leveldb/ and .blob/Conversation store (legacy location)
Claude/WebStorage/<bucket>/IndexedDB/indexeddb.leveldb/ and .blob/Conversation store (storage-bucket location)
Claude/WebStorage/QuotaManagerSQLite map from bucket to origin
Claude/Cache/Cache_Data/, Claude/Partitions/*/Cache/Cache_Data/Chromium HTTP cache (cached API responses)
Claude/local-agent-mode-sessions/<account>/<org>/Cowork sessions, audit logs, transcripts, spaces
Claude/claude-code-sessions/<account>/<org>/, Claude/git-worktrees.jsonClaude Code sessions launched from the desktop app
Claude/claude_desktop_config.json, Claude-3p/claude_desktop_config.jsonMCP server definitions and desktop preferences
Claude/config.json, config.json.journalApp state: first launch, versions, last quit, account UUID
Claude/Claude Extensions/, Claude Extensions Settings/, extensions-*.jsonInstalled extensions, settings, registry, blocklist
Claude/mcp-user-tool-toggles.jsonTools the user disabled
Claude/Local StateChromium state, including uninstall_metrics.installation_date2
Claude/Local Storage/leveldb/, Claude/Session Storage/Web storage keys (drafts, flags)
Claude/Cookies, Claude/Partitions/*/CookiesChromium cookie databases
Claude/sentry/Crash-reporter scope and breadcrumb queue
Claude/bridge-state.json and other small state filesRemote control, device registry, token usage, window state
Claude/vm_bundles/claudevm.bundle/Cowork Linux VM images (very large)
~/Library/Logs/Claude/Application, MCP, renderer, VM, and SSH logs
~/Library/Caches/com.anthropic.claudefordesktop.ShipIt/Auto-updater state and logs
~/Library/Caches/com.anthropic.claudefordesktop/Cache.dbNSURLCache index
~/Library/Preferences/com.anthropic.claudefordesktop.plistApplication preferences

Claude-3p/ is a second configuration root that holds its own claude_desktop_config.json. Check both when you look for MCP servers.

Claude Code is separate

The Claude Code command-line tool keeps its own data under ~/.claude/ and ~/.claude.json. That data is outside the Claude Desktop profile. Desktop only holds the link to it (session records in claude-code-sessions/ and git-worktrees.json). Collect ~/.claude/ separately when Claude Code is in scope.

Install and Version Timeline

The app does not keep a single install log, but several artifacts combine into a timeline.

SourceWhat it shows
Contents/Info.plist (CFBundleShortVersionString, CFBundleVersion)Currently installed version
config.jsonFirst launch time, the version at first launch, last seen updater version, staged update, running instance (pid, version, boot epoch), last quit time and version, last known account UUID
config.json.journalEarlier state that the app has since rewritten
Local Stateuninstall_metrics.installation_date2 (install date)
ShipItState.plist and ShipIt_stderr.log*Update checks and installs by the Squirrel/ShipIt updater, with staged and installed versions
com.anthropic.claudefordesktop.plistPreference key names and settings
main.logStartup, update, and sign-in events with local-time stamps (see Logs)
sentry/scope_v3.jsonApp start time, boot time, app and OS version, timezone

Versions seen on the research build use the form 2.NNNNN.0. Earlier builds used a 0.x scheme.

Feature history (approximate)

Dates are approximate and come from observation of how artifacts differ across builds, not from vendor release notes.

PeriodArtifacts introduced or changed
Late 2024 (0.7-0.9)Base profile; claude_desktop_config.json with mcpServers; MCP logs that include full JSON-RPC payloads
Mid 2025Desktop Extensions (.dxt, later .mcpb): Claude Extensions*, installations registry, blocklist
Late 2025Claude Code inside the desktop app: claude-code-sessions/, git-worktrees.json
Early 2026Cowork: local-agent-mode-sessions/, vm_bundles/, the HMAC audit chain, scheduled tasks, remote control
Current (2.4xxxx)MCP logs record metadata only; conversation-store schema 2.2; storage buckets under WebStorage/

Uninstall

Removing the app bundle does not remove the profile. ~/Library/Application Support/Claude/ and ~/Library/Logs/Claude/ typically persist, so a missing /Applications/Claude.app does not mean there is no data. A collector should not require the bundle to be present.

Artifact Summary

ArtifactSourceFormatForensic Value
ConversationsIndexedDB, HTTP cacheLevelDB + V8, Chromium Simple CacheHigh
Cowork Sessionslocal-agent-mode-sessions/JSON, JSONL, filesHigh
Cowork Audit Loglocal_<uuid>/audit.jsonlJSONL with HMAC chainHigh
MCP and ExtensionsConfig and extension filesJSONHigh
Logs~/Library/Logs/Claude/Text (electron-log)High
State and StorageState files, Sentry, web storage, cookiesJSON, LevelDB, SQLiteMedium

Encryption and Secrets

Claude Desktop uses Electron's safeStorage for values it wants protected at rest. On macOS that means a v10 prefix followed by AES-128-CBC ciphertext. The AES key is derived from a secret in the user's login Keychain, in an item named Claude Safe Storage. Values protected this way include:

  • Cookie values
  • The audit log key (.audit-key, see Cowork Audit Log)
  • Some tokens and allowlist caches in config.json

macfor records that these values exist but does not decrypt them and never reads the Keychain. Everything else described in this section, including conversation text, is stored without that protection and is readable from a disk image.

Tool Support

ToolSupport
macforAll artifacts above, via the ai.claudedesktop plugin (Pro)
ccl_chromium_readerChromium IndexedDB, LevelDB, and cache parsing, useful for cross-checking
jq, sqlite3Manual inspection of JSON state and the cookie and QuotaManager databases

General-purpose forensic suites do not currently interpret the Claude-specific layouts, so expect to work from the raw files.

References