Try it in thirty seconds
The demo archive is large on purpose, because that is when a reader stops being a nicety. Four things worth opening:
- Search across every message — dozens of hits with the matching sentence under each one. The full text index is fetched only once you start typing.
- Open a long thread — nearly fifty messages, with a question index down the right side.
- See rendered maths — LaTeX drawn by KaTeX bundled locally, not fetched from a CDN.
- Read the missing-files report — what the export referenced, what it actually shipped, and which conversations lost the most.
Your export arrived as conversations-000.json
If your history is large, OpenAI no longer ships a single conversations.json.
It arrives split into conversations-000.json, conversations-001.json and so on,
sometimes inside a nested ZIP. Viewers that look for one exact filename quietly show you a
fraction of your history, or nothing at all.
This tool finds every shard through export_manifest.json, falls back to matching the
filename pattern, and opens the inner archive that a Privacy Portal export wraps them in. Each file
is streamed, so a 300 MB single-line JSON never lands in memory whole.
What the ZIP does not tell you
chat.htmldumps every conversation onto one page with no search.- Attachments are named
file_0a1b2c3d.datwith no extension, so nothing opens them. Extensions get restored from file signatures. - Exports routinely reference images they do not contain. You get a report of what is missing and which conversations lost the most.
- Conversations are trees, not lists. The thread is rebuilt from
current_nodeback through parent links, so edits and regenerations do not scramble the order.
Run it
Python 3.8 or newer, no dependencies.
git clone https://github.com/Gusarovv/chatgpt-export-viewer.git
cd chatgpt-export-viewer
python3 build_site.py ~/Downloads/your-export.zip
The site lands next to the export. Open index.html and read your archive the way you
read a website. Copy the folder to a USB stick and it still works.