How ChatGPT Extractor Works: Lessons from Building a Share-Link Converter

A share link goes in, clean text comes out. What's underneath — and the things that broke on the way.

November 1, 2026 • 6 min read • ← Back to Blog

ChatGPT Extractor looks simple from the outside: you paste a share link and get your conversation back as text. Underneath, it's a small server, a browser-side formatter, and a lot of edge cases. I built it on my own, and most of what I know about it came from things that broke. This post walks through how it works and what I learned, in case you're curious or building something similar.

The core problem: the conversation isn't in the page you download

When you open a share link, the page you see is put together by the platform's own code after it loads. If a program simply downloads the address, it doesn't get a readable conversation. That's why the extractor loads the page in an automated browser, waits for the conversation to finish rendering, and then reads the messages out of it, keeping their order and formatting.

The same idea applies to every platform, but each one builds its page differently. ChatGPT, Claude, Gemini, Grok, Meta AI, and Perplexity each have their own link format and their own page structure, so each has its own extractor. Adding a platform means looking at the real links people share and the real structure of the page, not guessing.

That sounds obvious, and I still got it wrong once. My own contact page listed the wrong link format for Meta AI until I checked the written list against what the code actually accepts. Documentation written from memory drifts, so I now treat the code as the source of truth.

The pipeline in four steps

  1. Check the link. The tool confirms the link matches one of the supported formats before doing any work.
  2. Render the page. An automated browser opens the share page and waits for the conversation to appear.
  3. Extract the messages. The tool reads each message in order, labeled by who said it, and sends the result to your browser.
  4. Build the file in your browser. The page turns the extracted conversation into the format you choose: text, Markdown, JSON, HTML, or PDF.

The server's job ends at step 3. Everything about file formats happens on your side, which keeps the server focused on one task.

Five formats from one conversation

Each format answers a different need:

  • Markdown passes the original code blocks through as they are, so it renders properly in GitHub, Obsidian, and VS Code.
  • Plain text keeps all the words but drops the styling.
  • HTML gives you a viewable copy with the structure intact.
  • JSON keeps messages as structured data for scripts.
  • PDF is for sharing or archiving a readable document.

It took a while to get these claims right. At one point my own documentation said plain text indented code blocks, which it doesn't. I only caught it by reading the formatting code and comparing it against real output.

Lesson 1: A PDF made of screenshots is a bad PDF

The first version of the PDF export took a picture of each page and put the pictures into a PDF. It worked, in the sense that you got a file. But a 96-page conversation came out at about 19 MB, you couldn't select or search any of the text, and some words broke in the middle of a line.

That's the opposite of what a tool for getting text out should do. I rebuilt the export to write real text into the PDF. The same kind of conversation now comes out at under half a megabyte, the text is selectable and searchable, lines wrap at word boundaries, and code appears in a monospaced font.

There are limits. PDF's built-in fonts can't draw Arabic, Chinese, Japanese, Korean, and similar scripts, or emoji. Emoji are left out of the PDF. Conversations in those scripts still use the older page-image method so that nothing is lost. A proper fix is to embed a Unicode font, and it's on my list.

Lesson 2: Test the whole path, not just the part you changed

When I rebuilt the PDF, I tested the new text builder directly and it passed. But the tool doesn't call the builder directly. It first decides which method to use, and that decision had a bug: the check for non-Latin scripts accidentally matched emoji. Any emoji-heavy conversation, and ChatGPT replies often are, silently took the old image route.

The builder was fine. The decision in front of it wasn't. I only found the problem by exporting a real, emoji-filled conversation end to end. The lesson is simple: test with real data through the same path a user takes.

Lesson 3: Very long conversations are their own problem

Short conversations hide a lot of sins. Real ones are long, full of code, and sometimes enormous. One share page I tested was around 34 MB, and it crashed the extractor. Handling very long threads and very large pages reliably took a dedicated round of hardening in October 2026, and it's the kind of work you don't notice when it works.

What the tool can't do

  • It needs a public share link. It loads the same page anyone with the link could open. If a chat isn't shared, it can't read it.
  • It depends on each platform's page. When a platform redesigns its share page, an extractor can break until I update it. If a link that should work fails, send me the details.
  • The PDF has the font limits above.

Why not an extension?

I looked for existing solutions before building this one, and nearly everything was a browser extension. I don't like installing an extension for something I use now and then, and I figured many other people feel the same. A website you can use from any browser, with nothing to install, fits the job better. The homepage also has a bookmarklet, a small in-browser alternative that works in a different way, for people who want one.

What's next

The next big item is Unicode font support so Arabic and CJK conversations get real, selectable PDFs too. Release notes appear on the changelog as things ship. If there's something you'd like the tool to do, tell me on the contact page. Requests that come in more than once move up the list.

Frequently asked questions

Why does the tool need a public link? It reads the same page anyone with the link could open, and it never asks for a login or password. A chat that isn't shared can't be read.

Why did extraction fail on a link that looks fine? Usually the link isn't public, it's the wrong type of URL, or the platform changed its page. The contact page lists the checks to run first.

Does it work for platforms other than ChatGPT? Yes. The same flow works for Claude, Gemini, Grok, Meta AI, and Perplexity.

Paste a share link and see the pipeline for yourself.

Extract Your Conversations Free

Also read: How to Move a Long AI Conversation to Another Assistant • Why ChatGPT's Built-In Export Is All-or-Nothing

More guides are on the blog, and release notes are on the changelog.