ChatGPT Export to Markdown Converter — Free

Turn conversations.json from a ChatGPT data export into readable Markdown. Follows the branch that was actually shown and leaves the hidden system prompt out.

Reading a ChatGPT Data Export: The Conversation Is a Tree, Not a List

Request your data from ChatGPT and you get a .zip whose useful contents are a single conversations.json. Open it expecting a list of messages and you find something else: an object called mapping, full of entries keyed by identifier, each pointing at a parent and a set of children. The messages are in there. The conversation you remember having is one path through a graph.

This page reconstructs that path and writes it as Markdown. Drop in the archive or the extracted JSON and it is parsed in this browser tab.

Why It Is Stored as a Graph

Because the interface lets you rewrite history. Edit an earlier prompt and the thread forks from that point. Regenerate a response and you get an alternative you can page between with the little arrows. Both versions still exist; the interface just shows one.

A flat array cannot represent that. So the export stores every branch, and the transcript you actually saw is recovered by starting at the node with no parent and walking down, choosing at each step among the children. The convention that matches the interface is to follow the last child, since a regeneration is appended after the response it replaced. That is what this tool does, which is why the output reads as the conversation you had rather than as an interleaving of every attempt.

A cycle guard is in place while walking. It should never fire on a well-formed export, but an infinite loop in a parser is a worse outcome than a truncated transcript.

Content You Never Saw

The export includes material the interface hides, and reproducing it verbatim gives you a transcript that does not match your memory of the conversation:

  • The system message. Every conversation opens with instructions you did not write and were not shown. It appears as a first-class message in the file.
  • Tool traffic. Web searches, code execution and image generation each leave their own request and result nodes, addressed to a recipient other than the user. These are the machinery behind a response, not part of the dialogue.
  • Explicitly hidden nodes. Some messages carry a flag marking them as not shown in the conversation. The export is honest about this, and the flag is respected.

All three are filtered out, leaving the user and assistant turns.

Message Content Is Not Always a String

The content field has grown over time. A plain text turn carries a parts array of strings. Some message types use a text field instead. Multimodal turns put objects in the parts array, one per element, where an uploaded image and an accompanying question are separate entries. Code interpreter results arrive in their own shape again.

The parser reads the string form, the array-of-strings form, and the array-of-objects form, pulling the text out of each. Non-text parts contribute nothing rather than producing a placeholder or an error, which means a conversation with images comes through as the words around them.

Why Markdown Is the Right Target

The assistant already writes Markdown. Its responses contain fenced code blocks, headings, bullet lists and tables, and those marks are in the export as characters. Converting to plain text would leave them sitting there as literal backticks and hashes — the formatting neither rendered nor removed, just stranded.

Keeping Markdown means the code blocks stay code blocks. Paste the result into any notes app, static site generator, documentation tool or wiki and it renders. Speaker names are bolded and each conversation gets a heading from its title, so a multi-year export becomes a navigable document rather than an undifferentiated run of text.

Exports Are Large

A couple of years of regular use produces a conversations.json in the tens or hundreds of megabytes, holding thousands of conversations. That is a problem for a text editor, which will try to syntax-highlight the whole thing, and for any tool that pretty-prints before showing you anything.

Parsing here happens once, in memory, and only the readable output is rendered. Each conversation becomes a section under its own title with a separator between sections, so you can search the result for a phrase you half-remember instead of scrolling.

Requesting Your Export

In ChatGPT: Settings, then Data Controls, then Export Data. The archive is emailed to you, usually within minutes, as a download link that expires. The zip also contains an HTML viewer and various media; only the JSON is needed here, and dropping the whole archive in works fine.

Nothing Is Uploaded

Your ChatGPT history is a detailed record of what you have been working on, worrying about and asking for help with. It is one of the more revealing files most people own. Parsing runs in JavaScript in this tab and there is no upload step, so no server receives it and there is nothing to delete afterwards.

Claude exports have their own page at Claude export to Markdown, and the general chat export page handles any supported platform.