How to view Claude Code project memory
Browse the per-project memory at ~/.claude/projects/<project>/memory/ — MEMORY.md as a clickable index of layers, each linked file expandable inline, and "Open in…" for Finder, Cursor, VS Code, Zed, and more.
Claude Code's agents and skills can write per-project memory to a hidden directory inside ~/.claude/. claude-devtools renders that memory directly in the sidebar — read-only, so you can browse without worrying about edits, and one click away from your editor when you do want to change it.
What lives in memory/
For every project Claude Code has touched, there's a directory at:
~/.claude/projects/<encoded-project-id>/memory/The encoding is the same one used for session JSONL files: /Users/you/dev/crawler becomes -Users-you-dev-crawler. claude-devtools handles this for you on macOS, Linux, and Windows.
Inside, there's a MEMORY.md index plus one .md file per layer:
~/.claude/projects/-Users-you-dev-crawler/memory/
├── MEMORY.md
├── working-style.md
├── snapshot-is-full-fetch-outcome.md
└── architecture-llm-first.mdMEMORY.md is itself a markdown index — bullet points where each item links to a layer file and adds a one-line hook describing it:
# Memory index
- [Working style](working-style.md) — wants the "why" first, pushes back on architecture
- [Snapshot = full fetch outcome](snapshot-is-full-fetch-outcome.md) — prepare.py captures status/blocks/redirects/raw+rendered HTML/sitemap/XHR
- [Architecture: LLM-first](architecture-llm-first.md) — one structured-output LLM call per site within 30-min budgetHow claude-devtools renders it
When you select a project that has a memory/ directory, a single MEMORY row appears in the sidebar directly above SESSIONS — just the header, no inline expansion.
Click the row and claude-devtools opens a dedicated Memory pane as a new tab (same UX class as a session tab). The pane is a master/detail layout:
- Left: the layer list (everything in
MEMORY.md, plus any unlinked.mdfiles under an Unlinked group). - Right: the selected layer rendered as markdown — full size, with the same styling as the chat view, plus an in-pane search input and the Open in… launcher in the toolbar.
Because it's a real tab, you can split-view it next to a session, drag it between panes, and switch back to it from the tab bar. Projects with no memory/ directory get no MEMORY row at all.
"Open in…" — hand any layer to your editor
The Memory pane toolbar shows a pill-shaped Open in… trigger with the current filename. Clicking it drops down the icon-driven launcher modeled on the reference screenshot. Available options depend on which apps are installed:
| Target | Behaviour | Shortcut |
|---|---|---|
| Finder / Explorer / Files | Reveal the file (or the memory/ folder) | ⌘O / first item |
| Cursor, VS Code, Zed, Android Studio | Open the file in the IDE | 2–5 |
| Xcode | Open the file (macOS only) | 6 |
| Ghostty, iTerm, Terminal | Open a terminal in the parent directory | 7–9 |
| Copy path | Copy the absolute path to the clipboard | ⌘⇧C |
Detection runs once per session: unavailable apps don't appear in the menu, so a Linux user never sees Xcode and a Windows user never sees iTerm. Numeric 1–9 shortcuts fire while the menu is open.
Standalone / Docker mode
If you run claude-devtools as the headless HTTP server (Docker, remote box), the browser has no display to launch Cursor or Finder. In that mode the Open-in menu collapses to just Copy path, and the MEMORY.md index + layer contents still render normally.
Read-only by design
claude-devtools never writes to memory files. All editing happens via your editor — claude-devtools is a viewer. If you need to update a layer, click Open in Cursor (or your editor of choice) and edit there. The sidebar re-reads the file when you save.
Debugging Claude Code subagents and teams
Each subagent renders as its own execution tree with tool traces, tokens, duration, and cost. Nested agents render recursively. Teammate messages are color-coded by sender.
Setting up notification triggers
System notifications for .env access, tool errors, and high token usage. Plus custom regex triggers on any field with per-repo scoping — no Claude Code hooks required.