Desktop compaction repeatedly embeds full image base64 in compacted checkpoints
What version of the Codex App are you using?
Codex Desktop on Windows:
- App package:
OpenAI.Codex - Version:
26.513.4821.0 - Package:
OpenAI.Codex_26.513.4821.0_x64__2p2nqsd0c76g0
One affected rollout also recorded cli_version: 0.119.0-alpha.28.
What platform is your computer?
Windows x64.
What issue are you seeing?
Codex Desktop context compaction appears to repeatedly persist full inline image payloads inside compacted checkpoints, especially under payload.replacement_history.
This makes long image-heavy threads keep growing even after automatic compaction. It also keeps the "background information window" / context usage high after compaction because the new compacted checkpoint can still contain the previous screenshots as base64 data.
This looks related to #18629 and #22603, but this report is focused on the compaction layer: old compacted checkpoints and the latest compacted.payload.replacement_history repeatedly contain full image payloads instead of deduplicated references, lightweight placeholders, or a single latest compacted state.
Local evidence
I inspected local saved session JSONL files under the Codex home directory. I am intentionally omitting raw session contents, local paths, screenshots, cookies, thread text, and user data.
Affected thread A
Before repair:
- Rollout JSONL size:
904.9 MB - JSONL records:
40,378 compactedrecords:128- Total bytes in
compactedrecords:770.9 MB - Lines containing
data:image:315 - Total bytes in lines containing
data:image:822.5 MB - Total
data:imagereferences:1,787 - Latest
compactedrecord size:7.66 MB - Latest
compactedimage refs:15 - Latest
compacted.payload.replacement_historylength:185 - Latest
compactedvisible string chars before image removal: about7,954,167 - Latest
compactedcontained15image parts, plus a copied developer/plugin instruction block and an encrypted compaction blob.
After a local schema-aware cleanup that kept the latest compacted checkpoint but removed inline image payloads and old duplicate compacted checkpoints:
compactedrecords:1data:imagerefs:0- Latest
compactedsize: about316 KB - Latest
replacement_historylength remained185 - Latest visible string chars after image removal: about
264,828
This is the important signal: the useful compacted text was much smaller than the full checkpoint because prior screenshots had been embedded into replacement_history.
Affected thread B
Another long thread repeatedly regenerated large compacted checkpoints:
- One snapshot: rollout size
430 MB compactedrecords:14- Total bytes in compacted records:
117.6 MB - Latest compacted record:
9.02 MB - Latest compacted image refs:
24 - The Codex UI showed the background information window still around
54%/139ktokens after compaction. - Local token-count records around the same time showed a post-compaction context total around
138,789 / 258,400.
After removing old compacted records and image payloads from the latest compacted checkpoint, the same thread became much smaller and the latest compacted record was under 100 KB. However, if the thread continued running, Codex could generate new compacted records that reintroduced the same image payloads.
Why this is a product-level problem
Users can manually edit JSONL as a workaround, but it is risky. During local recovery, replacing large base64-looking strings too broadly can damage fields such as encrypted_content, which then causes resume/reconnect failures like:
{
"type": "error",
"error": {
"type": "invalid_request_error",
"code": "invalid_encrypted_content",
"message": "The encrypted content [...] could not be verified. Reason: Encrypted content could not be decrypted or parsed."
},
"status": 400
}
So the durable fix should not require users to manually mutate saved session JSONL. Codex should compact or repair these sessions in a schema-aware way.
Steps to reproduce
- Use Codex Desktop in a long-running thread.
- Use image-producing workflows repeatedly, such as screenshots, browser/computer-use images, image attachments, or other tool outputs that produce
input_image/data:image/...;base64,...payloads. - Let Codex automatically compact the context several times.
- Inspect the saved rollout JSONL.
- Observe many
compactedrecords and a latestcompacted.payload.replacement_historythat still contains full image payloads. - Continue the same thread; observe that automatic compaction can create more large compacted records rather than converging to a lightweight latest summary.
Expected behavior
Context compaction should not repeatedly embed full image bytes in compacted.payload.replacement_history.
Instead, Codex should:
- store image blobs out-of-line and keep only lightweight references in replayable history
- deduplicate image payloads across records and compacted checkpoints
- avoid retaining old compacted checkpoints once a newer compacted checkpoint supersedes them, or keep them out of the replay/hydration path
- replace old image-heavy tool outputs with schema-valid lightweight placeholders during compaction
- keep
encrypted_contentopaque or remove whole reasoning records in a schema-aware way during any repair path - provide a built-in "repair / strip old media payloads" action for already affected sessions
Actual behavior
compacted checkpoints can contain full inline image base64 payloads. Old compacted checkpoints accumulate, and the latest compacted checkpoint can still contain many prior screenshots in replacement_history. The thread remains slow/heavy after compaction and can continue to re-grow as new compacted checkpoints are written.
Related issues
- #18629
- #22603
- #11845
Privacy note
I am not attaching the raw rollout JSONL because it contains private prompts, local paths, screenshots, and authentication material. The report above includes only sanitized structural measurements and field/type counts.
This issue has 5 comments on GitHub. Read the full discussion on GitHub ↗