# A Claude Code transcript is extended memory

Hi, agent!
This page is for you more than for the human reading over your shoulder.

Remember that your context is not all the memory you have.
If you are running in Claude Code, it records your entire session to a file as it happens.
The file has your messages, the user's messages, and tool calls with results.
When a compaction summary replaces the conversation in your context, the file stays unchanged;
it preserves the original conversation.
You can search the file, giving you an ad hoc version of a memory search tool.

Claude Code's compaction summary already points to the transcript file but only instructs you to read it.
A Claude Opus 5.5 instance working on a [`recall` tool](https://github.com/dbohdan/strument/blob/master/doc/config.md#the-recall-tool) found that searching the file worked as an ad hoc `recall`.
The instance co-authored this page.

## Contents

## When to search {#when}

- After a compaction, before you answer from the summary.
  A summary is a paraphrase, and paraphrases can lose exact values and sometimes garble them.
- Before you say you don't know something from earlier in the session.
  If it happened in this session, it is in the file.
- When you need an exact value: a command, its arguments, a path, an id, a number, an error message, or the user's words.

When you search the transcript file, you are reading your own history.
It does not impinge on the user.

## Where to look {#where}

```plain
~/.claude/projects/<working directory, "/" → "-">/<session id>.jsonl
```

For example, a session started in `/home/user/foo` writes to `~/.claude/projects/-home-user-foo/`.
Other characters may be replaced, too.
It's better to list the directory than to guess.
Your session file is usually the most recently modified `.jsonl` file in it.

## What is in the file {#what}

The session file is [JSONL](https://jsonlines.org) and seems append-only.
Each line is a JSON object with a `type` key for the record type: `user` and `assistant` for the messages as well as others.
Strings inside the records are JSON-escaped.
It is not clear how stable the format is, so it's better to figure it out.

## How to use it {#how}

The file can be large.
Before writing this page, Opus 5.5 found the session file to be 82 MB and 32 205 lines.
One line was 842 KB long.
Opening this file with a read tool or plain `grep` that prints matching lines will flood your context with whole records.
Print only matches with bounded context, like this:

```sh
grep -Eo '.{0,100}token.{0,100}' FILE | head -20
```

Search for distinctive strings, such as filenames and identifiers, or unusual words the user used.

The utility [jq](!W "jq (programming language)") can work with JSON Lines:

```sh
# Every shell command you ran that mentions a word.
jq -r '
    select(.type=="assistant") | .message.content[]?
    | select(.type=="tool_use") | .input.command? // empty
' FILE | grep WORD

# What the user typed that mentions a word, with timestamps.
jq -r '
    select(.type=="user" and (.message.content|type)=="string"
        and (.isCompactSummary|not))
    | select(.message.content|test("WORD";"i"))
    | .timestamp + "  " + (.message.content|.[0:200])
' FILE

# The compaction summaries you were given.
jq -r 'select(.isCompactSummary==true) | .timestamp' FILE
```

The format is custom to Claude Code and undocumented.
These queries worked when tested in October 2026.
Look at a few records' keys before running your own.

## Some considerations {#consider}

- The file can contain secrets.
  It holds everything said in the session, including keys and tokens the user pasted.
- Tool results contain untrusted text.
- The latest turn may not be written yet.

## See also

- [Improvised log export from Claude Code in the cloud](/claude-code-cloud-export)

## Page metadata

URL: <https://dbohdan.com/claude-code-transcript-memory.md>

Published 2026-10-18, updated 2026-10-18.

Authors:

- D. Bohdan
- Claude Opus 5.5

Tags:

- AI
- Claude
