ByteScope

Chat Export Viewer

Drop the zip from a ChatGPT or Claude data export — or just conversations.json — and read your whole history in one place: search across every message, flip between edited or regenerated branches, see how much you talked and when, and save one conversation or all of them as Markdown. Everything happens in this browser tab; nothing is uploaded or stored.

Your files never leave your browser — all processing is local.

Drop the zip from ChatGPT or Claude (or its conversations.json). Search every conversation, follow edited and regenerated branches, and export to Markdown. Nothing is uploaded.

Drop a ChatGPT or Claude export, or click to choose

A .zip, a conversations.json, or a whole unzipped folder

A folder lets us show images and files that sit beside the chat.

Honest limits

  • ChatGPT and Claude do not publish their export format and can change it any time. The layout here was inferred from public descriptions, not from a specification. Content we do not recognize is labelled, never skipped silently.
  • We only have what the export holds. Some tool-call intermediates, deleted conversations and chats shared with you may be missing from the file.
  • Images and files show only if you give the whole zip or folder. With a bare conversations.json they read as not included.
  • Everything stays in this tab's memory and disappears when you close it.

About this tool

Both ChatGPT and Claude let you request a copy of your data, and what arrives is a zip with a conversations.json inside — a wall of JSON rather than something you can read. This page opens that file. Drop the whole zip (preferred), the extracted conversations.json, or the extracted folder, and the source is detected automatically. The left column lists every conversation with its title, last update and message count, sortable by time and filterable by title; the right column shows the one you pick, with your messages and the assistant's told apart, timestamps in your local time zone, and code blocks in a monospace font with a copy button. Large exports are read as a stream inside a Web Worker, one conversation at a time, so the page stays responsive and the progress bar reflects bytes read rather than a guess.

What it reads — and what it does not recognise

Neither ChatGPT nor Claude publishes its export format. What this page understands was assumed from public descriptions of those files, and it may change with any update on their side. So the rule is that nothing unrecognised is dropped: a message part whose content type the page does not know is shown as an “unsupported content” placeholder with a button to view the raw JSON, and a coverage card at the top counts them — “N messages, M containing content types we do not recognise”, listed by type — so you can see exactly what was missed. Known auxiliary content such as reasoning, tool calls and their results, code-execution output or browsing citations is shown collapsed or dimmed and is not counted as unknown. If the file is not a list of conversations from either source at all, the page says so and shows the first 500 characters instead of guessing.

Edited and regenerated branches

When you edited a question or asked for another answer, the export keeps every version as a branch of the same conversation. Wherever a message has more than one version, a “version 2/3” switcher appears on it; the branch the export marks as current is shown by default, and the newest one when there is no such mark. The official interfaces make you click through arrows one message at a time — here each version is a click away, and the export tells you how many there are.

Search and statistics

Search builds a plain-text index of every message inside the worker — lower-cased and NFKC-normalised, matched as a substring, so Chinese and Japanese work without word segmentation. Results are grouped by conversation with a snippet of context, and clicking one jumps to that message and highlights it. The statistics view counts conversations and messages, charts messages per month, lists the ten longest conversations and, when the export records which model answered, the models you used most. None of this leaves the tab: the index lives in the worker's memory and is discarded with the page.

Saving as Markdown

Any conversation can be saved as a .md file, or the whole archive as one zip with a file per conversation named YYYY-MM-DD-title.md — titles are cleaned so the names are valid on Windows — and attachments copied into an assets/ folder with relative links. By default only the branch you are looking at is exported; tick “include all branches” and the others are appended as ## Branch k of n sections. The Markdown is plain text with no HTML, and its footer notes that it was converted from an export without modification, together with the SHA-256 of the original file, so a copy can be checked against the export it came from.

What it cannot see

The viewer only knows what the export contains. Deleted conversations, conversations someone shared with you and some intermediate results of tool calls are usually not in the file, so they are not here either. Image and file attachments appear only when you give the whole zip or the extracted folder; with conversations.json alone, each attachment is marked as not included in this file. Everything is held in this tab's memory and gone when you close it — nothing is uploaded, nothing is stored, and the page has no server to send anything to. ChatGPT and Claude are trademarks of their respective owners; this is an independent viewer for the files they export, not an official tool.

Frequently asked questions

Is my chat history uploaded anywhere?

No. The zip is unpacked and conversations.json is parsed by a Web Worker inside your browser; the search index, the statistics and the Markdown files are all built there too. The page has no server to receive anything, nothing is written to storage, and closing the tab discards it all. Opening a years-long history is as private as opening it in a text editor — just more readable.

Which file do I drop — the zip or conversations.json?

The zip is best: it is the file you downloaded, and it is the only way the page can show your image and file attachments, which live next to conversations.json inside it. Dropping the extracted folder works the same way. Dropping conversations.json on its own is fine for reading, searching and exporting text, but every attachment will be marked as not included in this file.

Why does a message show “unsupported content”?

Because that part of the message uses a content type this page does not recognise. ChatGPT and Claude have never published their export formats; what the page knows was assumed from public descriptions and can be outdated by any change on their side. Rather than drop the part silently, the page marks it, offers the raw JSON behind a button, and counts every such part in the coverage card at the top so you know what was missed. Reasoning, tool calls and similar auxiliary content are recognised and shown collapsed — they are not what this label means.

Where are my images and attachments?

Inside the zip, next to conversations.json — which is why the page asks for the whole zip or the extracted folder. Media entries are only unpacked when you open a conversation that uses them, so a large export does not need to be decompressed in full. If you dropped only conversations.json, the file that holds the pictures is simply not there, and each attachment says so.

What does “version 2/3” on a message mean?

That the conversation branched at that point: you edited a prompt or regenerated an answer, and the export kept all three versions. The switcher shows the branch the export marks as current — or the newest one if it does not mark any — and lets you step through the others. The reply that follows changes with the version you pick, because each branch continues on its own.

Can I export everything to Markdown at once?

Yes. “Export all” produces one zip with a .md file per conversation, named by date and title, and an assets/ folder holding the attachments that were in the export, linked by relative path. Only the branch currently shown is written for each conversation unless you tick “include all branches”, in which case the other versions follow as ## Branch k of n sections. Each file ends with a note that it was converted without modification and the SHA-256 of the original export.

Will a very large export work?

It is designed to. conversations.json is parsed as a stream in a Web Worker: each conversation is normalised and summarised as soon as it is complete and the raw object is released, so memory grows with the size of the largest single conversation rather than with the whole file, and the main thread never has to hold all of it. The progress bar shows bytes read out of the total. How far a given machine gets still depends on the memory the browser allows a tab, so there is no promised limit.