
Opening the Viewer
Click the brain icon in the main header to open the full-panel Memories overlay. PressEsc to close it.
The button appears only when the active agent supports per-project memory. Today that’s Claude Code only. Other agents (Codex, OpenCode, Factory Droid, etc.) don’t expose this surface - the button will be hidden for them.
What You’re Looking At
Claude Code stores memory per project as a directory of small markdown files. The viewer mirrors that one-to-one:- Toolbar - the filter box, the unlinked count, the Graph button, and the Preview / Edit switch on the right.
- Left pane - list of every
.mdfile in the project’s memory directory, each row annotated with an estimated token count so you can see at a glance which entries are paying for themselves.MEMORY.mdis always pinned to the top; everything else is alphabetical. - Right pane - the selected file, rendered or editable depending on the switch. A live token estimate sits next to the filename in the editor header and updates as you type.
- Stats footer - file count, total bytes on disk, an estimated token cost (~4 bytes/token), and the first-created and last-edited timestamps.
Reading and Editing
The right pane opens in Preview: the memory rendered as markdown, with headings, tables, task lists, and links the way you would read any other document in Maestro. That is the default because reading is the usual reason to open this panel. Switch to Edit for the source, in the same syntax-coloured editor the File Preview uses - line numbers, soft wrap, and markdown highlighting. PressCmd+E (Ctrl+E on Windows/Linux) to flip between them from anywhere in the viewer; it is the same key that toggles edit and preview on a file, so there is one chord to remember. The caret lands in the editor as soon as it appears, and returns to the file list when you switch back.
Your edits survive the flip either way - switching to Preview shows what you have typed, not the last saved version, so it doubles as a way to check your formatting before pressing Save.
Finding a Memory
The filter box at the left of the toolbar narrows the list as you type. It matches both the filename and the text inside every memory, so you can find an entry you only half-remember the contents of - typeworktree and you get every file that mentions worktrees, whatever it happens to be called.
Hits are highlighted as you type: in the file list the matching part of each filename is marked, and every occurrence in the open memory is marked too, in both Preview and Edit.
The counter beside the box reads matches/total. Hovering a result row shows the line that matched. If the file you were reading is not among the matches, the viewer moves you to the top hit - unless you have unsaved edits, in which case it leaves you where you are.
Press / or Cmd+F (Ctrl+F on Windows/Linux) to jump straight to the box from anywhere in the viewer. / steps aside while you are typing, so a slash inside a memory stays a slash; Cmd+F works even from the editor.
Esc walks back out one step at a time. From the filter box it returns you to the list with your query intact, which is the point: filter down, Esc, then arrow through the hits. Press it again to clear the filter, and once more to close the viewer. (If your filter matched nothing there is no row to return to, so that first Esc clears instead.) The x in the box clears it at any time.
Graphing Your Memories
The Graph button in the toolbar - orCmd+G (Ctrl+G on Windows/Linux) -
opens the Document Graph over the memory directory, showing how the entries link
to each other. It is titled Memory Graph when opened this way, so it is
obvious which set of files you are looking at. MEMORY.md sits in the middle,
since it is the index every other entry hangs off.
Memories that link to nothing appear in the Unlinked band at the bottom -
the same set the toolbar’s chip narrows to, seen as a picture instead of a
list. The viewer closes when the graph opens; both are full-window views.
Two of the graph’s layouts are worth reaching for
here, both on L. Lobes groups the memories by which other memories they
link to, so you can see which subjects have grown into clusters and which
entries stand alone. Timeline lays them out by when each was last written,
oldest on the left, which is the quickest way to spot advice that has gone
stale.
Esc brings you back here. A graph opened this way skips the usual “close
the Memory Graph?” prompt, because there is nothing to lose: you land back in
the viewer, and Cmd+G puts you straight back in the graph. (You can turn that
prompt off everywhere in Settings → Display → Document Graph.)
Unlinked Memories
Claude readsMEMORY.md to decide which entries to load. A memory the index
does not list, and no other memory links to, is therefore never recalled -
it costs disk and reads as remembered while being, in practice, forgotten.
When any exist, an N unlinked button appears in the toolbar, beside the
filter box. Click it, or press Cmd+U (Ctrl+U), to narrow the list to exactly
those entries; the same key restores the full list. The row tooltip says
unlinked - nothing points at this. It composes with the filter box rather than
replacing it, so “unlinked memories mentioning worktrees” is one question you
can ask.
A memory counts as linked when another entry points at it by [[wiki link]] or
by a [markdown](link.md), matching either its filename or its frontmatter
name: slug - both spellings are in active use. Hyphens and underscores are
treated as the same character, because [[my-note]] and [[my_note]] are one
character apart, the difference is invisible in rendered markdown, and treating
them as different targets is exactly how a correct-looking index ends up
pointing nowhere.
MEMORY.md is never listed as unlinked - it is the index, so nothing is
expected to point at it.
Keyboard
The viewer opens with the file list already focused, so the keys below work immediately - no click needed. (If you go straight for the filter box, the caret stays there.)
This is the fast path for an audit pass: filter down to what you suspect is stale, then arrow through the results and press
Backspace on the ones that should go.
How Memory is Organized
Each Claude Code project has two flavors of memory file:MEMORY.md (the index)
MEMORY.md is a one-line-per-entry pointer file. Each entry is short (under ~150 chars) and links to the actual memory:
MEMORY.md on every turn to decide which entries are relevant, then loads only those entries into context. Keep it tight - long index files defeat the purpose.
Entry files (the actual memories)
Each entry is its own markdown file with YAML frontmatter classifying it:type field is one of:
The viewer doesn’t enforce these types; they’re a convention Claude uses when reading and writing memory.
Editing Memory
Click any file in the left pane to load it into the editor. Edits are local until you press Save - switching files (or closing the viewer) with unsaved changes prompts a discard confirmation. The list shows a modified marker next to the selected file when there are unsaved changes, and the stats bar refreshes after every save so file size and timestamps stay accurate.Creating a New Memory
Click + New Memory in the header. The first file you create in an empty project is suggested asMEMORY.md (the index); subsequent files default to new-memory.md, new-memory-2.md, and so on.
The .md extension is added automatically if you omit it. Filenames must be unique within the project.
New files are pre-populated with starter content:
MEMORY.md- a starter index template with one example pointer line.- Any other file - a starter entry with empty
name,description, andtype: userfrontmatter ready to fill in.
Deleting a Memory
With an entry selected, click Delete (bottom right) or pressBackspace/Delete with a list row focused. Either way you get a confirmation dialog before the file is removed.
After a delete the selection moves down to the next memory rather than back to the index, so a cleanup pass keeps moving in one direction: filter, arrow, Backspace, confirm, repeat.
MEMORY.md is the index and cannot be deleted from the viewer - if you really need to wipe it, use Open in Finder and delete it manually. Removing it from disk effectively resets Claude’s memory for the project, since the index is what tells it which entries exist.
Storage Location
Memory lives outside your project directory, under your Claude Code config:- macOS:
~/.claude/projects/<encoded-path>/memory/ - Linux:
~/.claude/projects/<encoded-path>/memory/ - Windows:
%USERPROFILE%\.claude\projects\<encoded-path>\memory\
<encoded-path> is your project’s absolute path with every non-alphanumeric character replaced by -. For example, /Users/you/Projects/Maestro becomes -Users-you-Projects-Maestro.
Because storage is keyed off the project path, opening the same project from a different absolute path (e.g., a git worktree under a different directory) yields a separate memory store. This is by design - worktrees are independent workspaces.
How Claude Uses Memory
Claude Code is instructed to:- Read
MEMORY.mdwhenever it might be relevant - to decide which entries to load. - Save new memories when it learns something durable about you, your preferences, or the project - without being asked.
- Update or remove stale entries when it discovers they’re wrong or out of date.
- Skip anything already derivable from the code, git history, or
CLAUDE.md- memory is for things that can’t be re-derived.
Related
- Context Management - how Maestro shapes what reaches the agent each turn
- Prompt Customization - editing the system prompts that govern memory behavior