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/.
| Location | Contents |
|---|---|
/Applications/Claude.app, ~/Applications/Claude.app | Application 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/QuotaManager | SQLite 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.json | Claude Code sessions launched from the desktop app |
Claude/claude_desktop_config.json, Claude-3p/claude_desktop_config.json | MCP server definitions and desktop preferences |
Claude/config.json, config.json.journal | App state: first launch, versions, last quit, account UUID |
Claude/Claude Extensions/, Claude Extensions Settings/, extensions-*.json | Installed extensions, settings, registry, blocklist |
Claude/mcp-user-tool-toggles.json | Tools the user disabled |
Claude/Local State | Chromium state, including uninstall_metrics.installation_date2 |
Claude/Local Storage/leveldb/, Claude/Session Storage/ | Web storage keys (drafts, flags) |
Claude/Cookies, Claude/Partitions/*/Cookies | Chromium cookie databases |
Claude/sentry/ | Crash-reporter scope and breadcrumb queue |
Claude/bridge-state.json and other small state files | Remote 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.db | NSURLCache index |
~/Library/Preferences/com.anthropic.claudefordesktop.plist | Application 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.
| Source | What it shows |
|---|---|
Contents/Info.plist (CFBundleShortVersionString, CFBundleVersion) | Currently installed version |
config.json | First 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.journal | Earlier state that the app has since rewritten |
Local State | uninstall_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.plist | Preference key names and settings |
main.log | Startup, update, and sign-in events with local-time stamps (see Logs) |
sentry/scope_v3.json | App 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.
| Period | Artifacts 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 2025 | Desktop Extensions (.dxt, later .mcpb): Claude Extensions*, installations registry, blocklist |
| Late 2025 | Claude Code inside the desktop app: claude-code-sessions/, git-worktrees.json |
| Early 2026 | Cowork: 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
| Artifact | Source | Format | Forensic Value |
|---|---|---|---|
| Conversations | IndexedDB, HTTP cache | LevelDB + V8, Chromium Simple Cache | High |
| Cowork Sessions | local-agent-mode-sessions/ | JSON, JSONL, files | High |
| Cowork Audit Log | local_<uuid>/audit.jsonl | JSONL with HMAC chain | High |
| MCP and Extensions | Config and extension files | JSON | High |
| Logs | ~/Library/Logs/Claude/ | Text (electron-log) | High |
| State and Storage | State files, Sentry, web storage, cookies | JSON, LevelDB, SQLite | Medium |
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
| Tool | Support |
|---|---|
| macfor | All artifacts above, via the ai.claudedesktop plugin (Pro) |
ccl_chromium_reader | Chromium IndexedDB, LevelDB, and cache parsing, useful for cross-checking |
jq, sqlite3 | Manual 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.