# Chat Export Viewer

> Open a ChatGPT or Claude export (zip or conversations.json) in your browser: search every message, switch edited branches, see stats, save Markdown. No upload.

- URL: https://bytescope.dev/en/chat-export-viewer/
- Locale: en · Also: [ja](https://bytescope.dev/ja/chat-export-viewer.md) · [zh-Hant](https://bytescope.dev/zh-Hant/chat-export-viewer.md)
- Runs: Your files never leave your browser — all processing is local.
- Requires: Any modern browser (Chrome, Edge, Firefox, Safari), desktop and mobile.
- Updated: 2026-09-08

## What it does

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.

## Limits

Does not upload or store your chats, does not restore them into the app, and does not read formats other than ChatGPT and Claude data exports (conversations.json).

## FAQ

### 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.

## Related tools

- [WhatsApp Chat Viewer](https://bytescope.dev/en/whatsapp-chat-viewer.md) — Read an exported WhatsApp chat as a conversation →
- [MSG Viewer](https://bytescope.dev/en/msg-viewer.md) — Open an Outlook .msg file without Outlook →
- [EML Viewer](https://bytescope.dev/en/eml-viewer.md) — Open an .eml file and read it safely →
- [CSV Explorer](https://bytescope.dev/en/csv-explorer.md) — Explore a large CSV file in the browser →
