Put your ChatGPT archive where your notes already live.

Obsidian is where a lot of people keep the things they intend to still have in ten years. ChatGPT is where a growing amount of the thinking now happens. Between the two sits a ZIP file that no notes app will open.

Drop that ZIP in below. It is read in this browser tab and comes back as one Markdown note per conversation — frontmatter Obsidian can query, an index note to start from, attachments on relative paths, and every message either rendered or written down by name with the reason it was not.

What lands in your vault


The download is a folder, not a single file, and its shape is fixed — so you can point a script at it later if you ever want to.

PathWhat it is
index.mdEvery conversation, grouped by year and month, each one a link.
conversations/One note per conversation. Filenames are safe on Windows, macOS and Linux.
assets/Images and files that were actually present in the export.
manifest.csvOne row per conversation: id, title, dates, message count, output path.
skipped.csvOne row per thing not fully rendered, and why.

The frontmatter, in full


Every note opens with the same YAML block. It is there so that Dataview queries and the search bar have something real to work with, not to look thorough:

  • title — the conversation title, quoted, so a colon inside it cannot break the block.
  • source — chatgpt.
  • created and updated — the source timestamps, ISO 8601. Left out entirely when the export carries none, rather than backfilled with the date you happened to run the conversion.
  • model — when the export names one.
  • messages — the count, including any sitting off the main path.
  • conversation_id — the original id, so a note can always be traced back to the export it came from.
  • branch_count and messages_off_path — how many alternate branches exist, and how many messages are on them.
  • tags: [ai-chat, chatgpt] — so the whole archive is one query away.

What happens to prompts you edited


This is the part most converters get wrong, and the failure is invisible when they do.

ChatGPT does not store a conversation as a list of messages. It stores a tree. Every time you edited a prompt and regenerated, the abandoned branch stayed in the file, and a single current_node pointer marks the end of whichever path you were last looking at. A converter that walks the JSON in key order will cheerfully interleave three discarded drafts into one conversation and hand it back to you looking completely normal.

Here the current path is resolved first and everything off it is counted. branch_count and messages_off_path in the frontmatter tell you it exists at all. You can include the alternate branches in the note under an Alternate branches heading, or leave them out — and if you leave them out, each omitted message still gets a row in skipped.csv saying so. What does not happen is a silent flatten.

What happens to images and files


Assets present in the ZIP are written into assets/ under a name derived from their contents, and linked relatively, so the vault survives being moved or renamed.

Assets that are referenced but absent — routine in real exports — are not linked at all. A link to a file that is not there looks identical to a link that works, right up until you click it. The missing asset gets a note in place and a row in skipped.csv. Nothing is fetched from a remote URL to paper over the gap.

Getting it into the vault


Copy conversations/ and assets/ into a vault you already use, or open the whole folder as a new vault on its own. Links and attachment paths are relative, so both work, and nothing needs a plugin to render — it is ordinary Markdown with ordinary YAML.

If you keep the archive as its own vault, index.md is the note to open first.

The count has to add up


At the end of a conversion you get three numbers: messages found in the export, messages rendered, and messages skipped. Rendered plus skipped equals found — or the tool says so, in those words, instead of showing you a success screen.

That is the whole point of the thing. A converter that quietly drops what it cannot parse produces an archive that looks complete and is not, and you will not find out for years.

Next

Related


Questions

5 answered


Does this upload my chats?
No. Parsing and packaging run in a Web Worker on your own machine. A browser test fails the release if any conversation data crosses the network.
Do I need the Obsidian plugin or a browser extension?
Neither. The output is plain Markdown with YAML frontmatter and renders in any vault as it is.
What does it cost?
Inspection is free and uncapped, and your 10 most recent conversations convert free. The one-time unlock covers the rest, with no account and no subscription.
Will re-running it overwrite notes I have edited?
No. A note that has been hand-edited since it was generated is left alone and the new content arrives as a separate conflict file beside it.
How large an export can it handle?
A 500 MB conversations.json holding 10,000 conversations has been converted in a browser tab in under twenty seconds. Your machine, not a server, is doing the work.