Markdown

ChatGPT/Claude Export to Markdown

Drop ChatGPT's conversations.json or a Claude export and get one clean Markdown file per conversation, code blocks intact, nothing uploaded.

Runs 100% in your browserUpdated Jul 6, 2026
Live · runs on your deviceNothing leaves your browser

Drop your conversations.json here

or choose the file from your computer.

Works with ChatGPT's conversations.json or a Claude chat export. Nothing is uploaded, parsing runs entirely in your browser.

Overview

Drop ChatGPT's conversations.json or a Claude chat export into this tool. It converts every conversation into its own Markdown file with a YAML header (title, date, source), You and Assistant sections, and every code block preserved exactly as written. Branching conversations resolve to the single active thread automatically, since the parser follows the export's current_node back to the root rather than every regenerated reply. Nothing is uploaded.

How it works

  1. 1Request your export: in ChatGPT, go to Settings, Data controls, Export, then confirm; in Claude, go to Settings, Privacy, Export data. Both send a download link by email.
  2. 2Download and unzip the file OpenAI or Anthropic emails you, and find conversations.json (ChatGPT) or the export file (Claude) inside.
  3. 3Drop that file onto this page, or click Choose .json file to select it from your computer.
  4. 4Check the conversations you want. Select all toggles every one, and the Include headings checkbox controls whether each message gets a You / Assistant heading.
  5. 5Download the selected conversations as individual .md files (bundled into a .zip once you pick more than three) or as one combined .md.

Worked example

Two conversations sharing a title, plus one with no title

A conversations.json holding two conversations both titled "Research Notes" and a third with no title at all produces three files: research-notes.md, research-notes-2.md (the duplicate gets a -2 suffix), and untitled-conversation.md. The first file opens with a YAML header reading title: "Research Notes", date: 2025-07-02, source: chatgpt-export-to-markdown, then a ## You section with the question and a ## Assistant section that keeps the assistant's fenced ```python code block exactly as written, backticks and indentation untouched.

Methodology & privacy

ChatGPT's conversations.json stores every conversation as a tree: a mapping object of node id to {parent, children, message}, plus a current_node id pointing at the leaf the UI currently shows. The parser walks current_node's parent pointers back to the root and reverses the result, which resolves branches and regenerated replies for free: a sibling branch is never an ancestor of current_node, so it is simply never visited. Each node's message is kept only when it has real content: empty parts are dropped, a message explicitly flagged hidden from the conversation is dropped, and an unmarked default system prompt is dropped as noise while a system message the user actually wrote (flagged is_user_system_message) is kept. A multi-part message joins its string parts with a blank line; any non-string part (an image or other attachment reference) becomes a placeholder note rather than silently disappearing. Claude's export shape (a chat_messages array of {sender, text}) is normalized into the same Conversation model by a second parser, so downstream rendering never needs to know which platform a conversation came from. Rendering wraps each conversation in a YAML front-matter block (title, date computed from the export's timestamp, and a source label) and, per message, an optional ## You / ## Assistant / ## System / ## Tool heading; message text is emitted verbatim, so fenced code blocks and any other Markdown a model wrote survive unchanged. Filenames are a lowercase, hyphenated slug of the title (falling back to untitled-conversation when nothing alphanumeric survives), de-duplicated with a -2, -3, ... suffix in input order.

This tool reads your conversations.json or Claude export entirely in your browser. The file you drop, the conversations it parses, and every Markdown file it produces are never uploaded, logged, or sent to a server.

FAQ

How do I convert a ChatGPT export to Markdown?

+

Export your data from ChatGPT (Settings, Data controls, Export), unzip the file OpenAI emails you, and drop conversations.json onto this page. It converts entirely in your browser and lets you download each conversation as its own Markdown file.

How do I get conversations.json into Markdown for Obsidian?

+

Drop conversations.json onto this page, select the conversations you want, and download them as individual .md files or a .zip. Each file opens with a YAML front-matter header, so Obsidian reads the title and date straight into its Properties pane.

How do I convert a Claude export to Markdown?

+

Export your data from Claude (Settings, Privacy, Export data), then drop the file it emails you onto this page. The tool recognizes Claude's chat_messages export shape automatically, no separate mode to pick.

Does this tool keep code blocks from my ChatGPT export?

+

Yes. Message text is written to the Markdown file exactly as the export stored it, so fenced code blocks, tables, and any other Markdown a model wrote survive unchanged, they are never re-escaped or reformatted.

Why does my ChatGPT export have branches or regenerated replies?

+

ChatGPT stores every conversation as a tree, and regenerating a reply adds a sibling branch rather than replacing the old one. This tool follows the export's current_node back to the root, so only the single active thread you actually saw is exported, not every abandoned regeneration.

Is my chat history uploaded anywhere when I use this?

+

No. JSON.parse, the conversation parsing, and every download run with JavaScript already loaded in your browser. Nothing you drop onto this page is sent to a server.

What happens if my export file is too large?

+

Files over 20 MB show an honest too-large notice instead of a silent failure or a frozen tab. Most personal exports are well under that, but a very long history may need to be split first.

This tool fixes one moment. recal handles the whole day.

recal is a private brain for your Mac. It watches how you work, on device, and starts doing your busywork itself. You approve every action.

Get early access