Codex

Session archival, export, and retrieval.


Overview

The codex is the permanent archive for Claude Code session transcripts. Every time you interact with Claude, the conversation is recorded as a JSONL file under ~/.claude/projects/. Those files are ephemeral – Claude can overwrite or rotate them at any time. The codex captures them into a stable, searchable archive before they disappear.

Each archived session produces a directory containing:

  • manifest.json – metadata (timestamps, message count, agent count, project path, checksum)

  • session.jsonl – the raw transcript (omitted in --clean mode)

  • conversation.md – a clean markdown rendering of the conversation (generated in --clean mode, or via migrate --clean)

  • agents/ – sub-agent JSONL files (when sub-agents were used)

  • images/ – extracted base64 images (pulled out during migration or archive)

Archives are stored under $MX_CODEX_PATH (defaults to $MX_HOME/codex/), one directory per session, named with a timestamp and short session ID.

Archiving sessions

mx codex archive

Archive session transcripts to permanent storage. With no arguments, archives the most recent non-agent session. With --all, walks ~/.claude/projects/ and archives every session not already in the codex. Already-archived sessions are skipped (idempotent).

After archiving, the by-project index is rebuilt so subsequent reads can locate sessions by project name.

Flags

Flag Type Description
[PATH] positional Path to a specific session JSONL file. Conflicts with --all and --backfill.
--all flag Archive all unarchived sessions. Conflicts with --backfill.
--clean flag Save only conversation.md, manifest.json, and extracted images. Omits the raw JSONL and agent files. Produces a smaller, human-readable archive.
--include-agents flag Fold sub-agent transcripts into conversation.md. Requires --clean and requires subagents in --include (the default).
--include <LIST> string Comma-separated list of source artifacts to capture. Recognized tokens: subagents (default), mcp, tool-output, history, all, none. See below.
--backfill [VAULT_PATH] optional path Ingest legacy vault snapshots into the codex. See Backfill section. Conflicts with --all and [PATH].

Examples

mx codex archive
mx codex archive --all
mx codex archive --clean --include-agents
mx codex archive --all --clean --include subagents,mcp
mx codex archive /path/to/specific-session.jsonl

The –include flag

The --include flag controls which optional source artifacts are captured alongside the session transcript. Tokens are case-insensitive and comma-separated.

Token Default Description
subagents ON Copy sub-agent JSONL files into agents/.
mcp OFF Capture MCP server logs.
tool-output OFF Capture /tmp tool output snapshots.
history OFF Capture a slice of ~/.claude/history.jsonl.
all – Enable all of the above.
none – Disable all of the above.

Passing both all and none in the same value is rejected as a user error. Unknown tokens print a warning and are skipped. The hyphenated tool-output is the canonical spelling; tool_output (with underscore) is not recognized.

NOTE: The --include flag on archive governs which source files are captured into the archive. The separate --include flag on export governs which captured artifacts are rendered into the output. They share token names but serve different purposes.

Clean mode

When --clean is passed, the archive stores a rendered conversation.md instead of the raw session JSONL. The transcript is generated by:

  1. Extracting user and assistant messages from the JSONL

  2. Stripping <system-reminder> blocks from user messages

  3. Dropping tool-use blocks, tool results, and non-conversation message types

  4. Labeling speakers with configurable names (MX_USER_NAME env var, or git user.name, falling back to “User”; MX_ASSISTANT_NAME env var, falling back to “Orchestrator”)

With --include-agents, sub-agent transcripts are appended to conversation.md under ## Agent: <name> headings, separated by horizontal rules. Agent names are resolved from the parent session’s subagent_type field when available, falling back to the hex ID from the filename.

Backfill

The --backfill flag migrates historical session data from the legacy vault (~/.wonka/vault/archives/) into the codex.

mx codex archive --backfill

Walk every session-* snapshot under the vault path and feed each session JSONL through the standard archive pipeline. The vault path defaults to ~/.wonka/vault/archives/ when no value is given.

Backfill is idempotent: re-running against the same vault produces the same codex state. Sessions already present in the codex (matched by session ID derived from the JSONL filename) are skipped. Per-session failures are non-fatal – errors are accumulated and reported at the end so a single corrupt file does not abort the entire run.

The --clean and --include flags still apply during backfill, governing what each per-session archive captures.

Flags

Flag Type Description
--backfill [VAULT_PATH] optional path Path to the vault archives directory. Defaults to ~/.wonka/vault/archives/.

Examples

mx codex archive --backfill
mx codex archive --backfill /custom/vault/path
mx codex archive --backfill --clean --include-agents

The expected vault layout is:

<vault_path>/
  session-YYYYMMDD-HHMMSS-NNNNNN/
    projects/
      <project-slug>/
        <session-uuid>.jsonl
        <session-uuid>/
          subagents/
            agent-*.jsonl

TIP: When a vault exists at the default path, every mx codex command prints a reminder to run mx codex archive --backfill. The reminder is suppressed when you are already running backfill.

Exporting

mx codex export

Export archived sessions as Markdown or structured JSON. Content is read exclusively from the codex – live ~/.claude/projects/ data is never ingested directly. If unarchived sessions are detected, a warning is printed to stderr (unless --archive-first is passed).

With no selector flags, exports the most recent archived session. Selectors are mutually exclusive: at most one of --session, --project, or --date may be passed.

Flags

Flag Type Description
--session <UUID> string Select by session UUID (full or unique prefix).
--project <QUERY> string Filter by project: absolute path, cwd-encoded slug, or basename. Ambiguous basenames list collisions and exit non-zero.
--date <RANGE> string Date selector. Accepts YYYY-MM-DD, YYYY-MM-DD..YYYY-MM-DD, or YYYY-MM.
--format <FMT> string Output format: markdown (default), json, or both. both requires --output.
--include <LIST> string Comma-separated content to render. Default: subagents. Tokens: subagents, tools, system-reminders, mcp, tool-output, history, all, none.
--archive-first flag Run mx codex archive --all before exporting. Suppresses the unarchived-data warning.
-o, --output <PATH> path Output file. Default: stdout. Required when --format both.

Examples

mx codex export
mx codex export --session abc123
mx codex export --project mx --format json
mx codex export --date 2026-04 -o april.md
mx codex export --date 2026-04-01..2026-04-15 --format both -o sessions
mx codex export --archive-first --include all -o full.md

Format: both

When --format both is used with --output, two sidecar files are written:

  • If the path ends in .json: JSON goes to the path, markdown goes to <path>.md

  • If the path ends in .md: markdown goes to the path, JSON goes to <path>.json

  • Otherwise: both extensions are appended (<path>.json and <path>.md)

Using --format both without --output is rejected – there is no clean way to multiplex two formats on stdout.

Export –include tokens

The export --include set is distinct from the archive --include set. It controls which content is rendered, not which is captured. Two additional tokens are available for export only:

Token Description
tools Render tool_use blocks (assistant tool invocations).
system-reminders Render <system-reminder> blocks.

The remaining tokens (subagents, mcp, tool-output, history, all, none) behave identically to the archive side.

Browsing

List

mx codex list

List archived sessions. By default, shows only the latest version of each session (filtering out incremental re-archives). Output is a table with columns: archive ID, archived timestamp, message count, agent count, and size.

Flags

Flag Type Description
--all flag Show all archives including incremental saves.
--json flag Output as JSON array.

Examples

mx codex list
mx codex list --all
mx codex list --json

Read

mx codex read <ID>

Read an archived session by its short archive ID (from mx codex list). The ID is matched as a substring against archive directory names.

By default, outputs the raw transcript. With --clean, outputs the rendered conversation.md (errors if no clean transcript exists – use mx codex migrate --clean to generate one). With --human, pretty-prints JSONL as labeled User/Assistant blocks.

Flags

Flag Type Description
<ID> positional Archive ID (short UUID from list).
--human flag Pretty-print JSONL in human-readable format. Conflicts with --clean.
--agents flag Include agent transcripts in the output.
--grep <PATTERN> string Filter output to lines matching the pattern.
--json flag Output the manifest as JSON.
--clean flag Read the clean markdown transcript (conversation.md). Conflicts with --human.

Examples

mx codex read abc12345
mx codex read abc12345 --clean
mx codex read abc12345 --clean --agents
mx codex read abc12345 --human
mx codex read abc12345 --grep "migration"
mx codex read abc12345 --json

mx codex search <PATTERN>

Search all archived sessions for a text pattern. Scans both conversation.md (preferred) and session.jsonl (fallback) in each archive. Reports matching archive IDs and the lines that contain the pattern. Archives with no transcript file are skipped with a count reported to stderr.

Flags

Flag Type Description
<PATTERN> positional Text pattern to search for.
--json flag Output matches as JSON.

Examples

mx codex search "retry logic"
mx codex search migration --json

Migration

mx codex migrate

Upgrade archive formats. Archives below the current schema version are migrated forward.

Without --clean, the primary migration is image extraction: v1 archives have base64 images embedded in the JSONL. Migration extracts them to images/ files and rewrites the JSONL with references. Older archives also receive a metadata-only version bump to the current schema (v5). Original files are backed up as *.bak.

With --clean, generates conversation.md for archives that have session.jsonl but no clean transcript. This is useful for retroactively adding human-readable transcripts to archives created before clean mode existed.

Flags

Flag Type Description
--dry-run flag Show what would be migrated without making changes.
--detailed flag Show detailed progress for each archive.
--clean flag Generate conversation.md for archives missing a clean transcript.
--include-agents flag Include sub-agent transcripts in generated clean transcripts. Requires --clean.

Examples

mx codex migrate --dry-run
mx codex migrate --detailed
mx codex migrate --clean
mx codex migrate --clean --include-agents --detailed

Deprecated alias

DEPRECATED: mx codex save was renamed to mx codex archive in PR #284 (issue #273). The save subcommand still works and accepts all the same flags, but it prints a deprecation notice to stderr on every invocation:

note: `mx codex save` is deprecated; use `mx codex archive` instead.

The save alias is hidden from --help output. It will be removed in a future release. Update scripts and muscle memory to use mx codex archive.