{"slug": "what-i-learned-building-a-chrome-extension-to-export-chats-from-6-ai-platforms", "title": "What I Learned Building a Chrome Extension to Export Chats from 6 AI Platforms", "summary": "A developer built AIExportHub, a Chrome extension that exports conversations from six AI platforms into formats including Notion, Markdown, and PDF. The developer reports that each platform structures conversation data differently and that attachments often require the original authenticated session to retrieve, arguing that parsing and document generation should be handled as separate engineering concerns.", "body_md": "I've been building Chrome extensions that help people save and organize conversations from AI platforms.\n\nWhat started as a relatively straightforward idea — exporting AI chats into Notion, Markdown, or PDF — eventually turned into a much more complicated engineering challenge.\n\nToday, my project, AIExportHub, supports conversations from six AI platforms:\n\nAt first glance, exporting a conversation sounds simple. Read the messages, convert them into another format, and save the result.\n\nBut once you start supporting multiple platforms, long conversation histories, Projects, images, generated files, and different output formats, things become much more interesting.\n\nHere are some of the lessons I've learned while working on this project.\n\nThe first major challenge is that every AI platform structures its conversations differently.\n\nEven though ChatGPT, Claude, and Gemini all look like chat applications, the way they represent and expose conversation data can be quite different.\n\nA conversation isn't necessarily just an array of user and assistant messages.\n\nDepending on the platform, it might include:\n\nAnd these structures can change when platforms update their interfaces.\n\nThis creates a fundamental problem: **you can't assume the same extraction logic will work everywhere.**\n\nOne useful way to approach this problem is to think about two separate concerns.\n\nThe first is collecting and interpreting conversations from each platform.\n\nThe second is converting that content into the user's desired format.\n\nA conceptual export pipeline looks like this:\n\nThis separation matters because otherwise every new platform multiplies the number of special cases throughout the exporter.\n\nIf the source parsing and output generation are tightly coupled, a small change to one platform can affect several export workflows.\n\n**Lesson learned:** Treat platform-specific parsing as a separate engineering problem from document generation.\n\nText is only part of a modern AI conversation.\n\nPeople upload PDFs, screenshots, spreadsheets, and source files. AI platforms also generate images, documents, code assets, and other downloadable files.\n\nWhen a user exports a conversation, they often expect those attachments to be preserved alongside the text.\n\nThis is where things become complicated.\n\nSome assets are accessible only within the user's authenticated session.\n\nOthers use temporary or protected download URLs.\n\nA link that works inside an open ChatGPT conversation may not behave the same way when accessed from an unrelated browser extension context.\n\nFor example, AIExportHub handles supported protected ChatGPT-generated files through the connected, signed-in ChatGPT tab.\n\nThe important principle is that **the original source session may be necessary to retrieve an asset successfully.**\n\nSimply extracting a URL and attempting to download it later isn't always reliable.\n\nEven with the correct session, an exporter can't necessarily recover a file that the source platform no longer provides.\n\nThis is an important limitation.\n\nA backup tool can preserve content that is accessible at export time, but it cannot guarantee recovery of deleted or expired source assets.\n\nFor that reason, I think backup tools should distinguish between:\n\nReporting these cases accurately is better than displaying a generic success message.\n\nMarkdown is one of my favorite export formats because it's portable.\n\nYou can open it in Obsidian, VS Code, or almost any text editor.\n\nBut generating useful Markdown from AI conversations involves more than joining messages together.\n\nConsider a conversation containing:\n\nIf you simply extract the visible text, much of the original structure can disappear.\n\nA code example might lose its formatting. A mathematical expression might become difficult to read. An image could turn into a broken link.\n\nThe goal isn't just to preserve the words.\n\nIt's to preserve enough structure that the conversation remains useful outside the original website.\n\nSuppose you export a conversation as Markdown and download its images separately.\n\nIf the Markdown file still references temporary URLs from the original AI platform, those references may stop working later.\n\nFor local archives, a better approach is to store supported assets alongside the Markdown document and use local relative paths.\n\nFor example, a Markdown note and its attachments might be organized like this:\n\n`conversation.md`` assets/diagram.png``assets/reference.pdf`\nThe note can then reference the local image instead of relying entirely on the original hosted URL.\n\nAIExportHub supports local asset folders and link rewriting for available images and attachments.\n\nThis is especially useful for Obsidian users who want to maintain a portable knowledge vault.\n\n**Lesson learned:** A Markdown export should be treated as a portable document with its dependencies, not just a text file.\n\nExporting one conversation and exporting hundreds of conversations are very different challenges.\n\nAn individual export is usually a relatively short operation.\n\nA bulk export can involve many conversations, different content types, numerous attachments, and repeated requests to the source platform.\n\nSeveral things can go wrong during a long-running job:\n\nOne failed conversation shouldn't necessarily invalidate an entire batch.\n\nImagine exporting 500 conversations.\n\nIf the process fails on conversation 430, restarting everything from the beginning would be frustrating.\n\nA more reliable workflow needs to account for individual items rather than treating the entire operation as one all-or-nothing task.\n\nThat means keeping track of concepts such as:\n\nAIExportHub includes batch progress, configurable delays, cancellation, retry options, and the ability to skip previously exported items in supported workflows.\n\nThese features may not look as exciting as a new export format, but they become essential when processing large histories.\n\nOne temptation when building a bulk exporter is to make everything run as quickly as possible.\n\nBut a high request rate can cause more failures rather than faster completion.\n\nFor long-running exports, controlled pacing and graceful recovery are often more important than maximum throughput.\n\nIf the source platform starts rejecting requests, continuing to send more requests immediately may only make the situation worse.\n\nA reliable exporter needs to recognize such limits and avoid turning a temporary restriction into hundreds of repeated failures.\n\n**Lesson learned:** Reliability, resumability, and accurate progress reporting are core features of a bulk export tool.\n\nAI platforms are no longer limited to independent conversations.\n\nWe now have features such as ChatGPT Projects, Claude Projects, Gemini Gems, Genspark Hubs, and other ways of grouping related work.\n\nThese features create another challenge.\n\nA conversation can belong to a larger collection with its own context and organization.\n\nIf you export only the messages without preserving any collection information, you may lose an important part of how the knowledge was organized.\n\nFor example, imagine a Claude Project containing multiple discussions about the same application.\n\nSaving all those conversations into one flat folder without any Project context makes it harder to understand their relationship later.\n\nA useful export should preserve available collection metadata and provide a sensible folder or database structure.\n\nHowever, there's an important distinction:\n\n**Exporting conversations from a Project is not necessarily the same as backing up the entire Project.**\n\nProject instructions, settings, independently uploaded files, and other platform-specific information may require separate handling.\n\nI think being explicit about these limitations is essential, especially when users rely on backups for important work.\n\nAnother lesson is that the destination format changes what a good export looks like.\n\nThe same conversation might be used in several different ways.\n\nMarkdown works well for users who want files they can keep, edit, search, and organize locally.\n\nIt's particularly useful for Obsidian workflows, source-code notes, and long-term archives.\n\nThe main challenges are preserving structure, managing attachments, and keeping links functional.\n\nNotion is useful when conversations need to become part of a structured workspace.\n\nA conversation can include information such as its title, source platform, URL, timestamps, and related collection.\n\nInstead of storing everything as unrelated documents, users can organize conversations in databases and project pages.\n\nBut exporting to Notion introduces another set of considerations.\n\nThe user needs to authorize the destination workspace, and the integration needs permission to access the selected pages or databases.\n\nMedia uploads and long conversations also require different handling from a simple Markdown download.\n\nPDF is useful when the goal is to preserve a readable document.\n\nHowever, a PDF isn't automatically a complete backup of every associated file.\n\nFor example, images may be embedded in the document while other supported attachments need to be downloaded separately.\n\nFormatting also matters. Long conversations, tables, code blocks, and mathematical expressions can make PDF rendering surprisingly difficult.\n\n**Lesson learned:** Different export formats require different preservation strategies. One output format cannot perfectly serve every use case.\n\nAI conversations can contain sensitive information.\n\nPeople use AI assistants for work, research, code reviews, personal notes, and internal documents.\n\nWhen building an exporter, it's important to consider where that information goes during processing.\n\nFor AIExportHub, Markdown and PDF exports are generated in the browser without requiring an intermediate cloud workspace.\n\nFor Notion exports, users authorize their own Notion workspace and choose the destination.\n\nThere are still interactions with the original AI platforms, of course, because the browser needs to retrieve the conversations and available assets.\n\nSo local-first doesn't mean the browser never communicates with an online service.\n\nIt means avoiding unnecessary intermediate services for local file generation.\n\nI think this is a useful design principle for browser-based productivity tools.\n\nUsers should understand which services access their data and why.\n\nOne particularly frustrating part of maintaining browser extensions is that the websites they interact with can change without warning.\n\nA conversation identifier might be exposed differently.\n\nAn interface element might be moved.\n\nA content structure might be updated.\n\nAn attachment retrieval flow might start behaving differently.\n\nFrom the user's perspective, the extension simply stops working.\n\nFrom the developer's perspective, the problem may originate in a platform you don't control.\n\nThis is why real user feedback has been so valuable.\n\nA report such as \"the export failed\" is a starting point, but it's much easier to investigate when you can identify:\n\nIn some cases, a failure happens only with a particular conversation structure or attachment type.\n\nReproducing those cases is often the hardest part of debugging.\n\nThis has reinforced one principle for me:\n\n**An exporter that depends on changing third-party platforms is never really finished.**\n\nMaintenance and compatibility testing are ongoing parts of the product.\n\nThese challenges are what led me to keep expanding [AIExportHub](https://chatgpt2notion.com/products/aiexporthub-hero/).\n\nIt's a Chrome extension for exporting conversations from ChatGPT, Claude, Gemini, Perplexity, Grok, and Genspark.\n\nDepending on the source platform, it supports:\n\nIt's free to try, with some advanced features requiring a paid plan.\n\nI'm still working on improving compatibility, long-running exports, and how different types of content are preserved.\n\nThe biggest takeaway from this project is that exporting AI conversations isn't simply about saving text.\n\nIt's about dealing with changing platforms, preserving structured content, maintaining access to available files, and making the final result useful outside the original application.\n\nWorking on an AI conversation exporter has taught me quite a bit about browser extensions and the challenges of building tools on top of third-party web applications.\n\nIf I had to summarize the most important lessons, they would be:\n\nThere's still plenty to improve, especially as AI conversations become more complex and platforms introduce new features.\n\nBut I believe the underlying problem is worth solving.\n\nAI conversations are becoming an important part of how we work and learn. We should have practical ways to preserve and reuse that knowledge beyond a single chat interface.\n\n**I'm curious about other developers' experiences:**\n\nHave you built a Chrome extension that depends on a third-party website's changing interface?\n\nHow do you handle breaking changes, authenticated downloads, or large background operations?\n\nI'd love to learn how others approach these problems.\n\nThanks for reading!\n\n— Jack\n\n*Indie developer building AIExportHub.*", "url": "https://wpnews.pro/news/what-i-learned-building-a-chrome-extension-to-export-chats-from-6-ai-platforms", "canonical_source": "https://dev.to/jackaluo/what-i-learned-building-a-chrome-extension-to-export-chats-from-6-ai-platforms-39cl", "published_at": "2026-10-20 09:36:56+00:00", "updated_at": "2026-10-20 09:48:26.442866+00:00", "lang": "en", "topics": ["ai-tools", "ai-products", "developer-tools"], "entities": ["AIExportHub", "Chrome", "ChatGPT", "Claude", "Gemini", "Notion"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/what-i-learned-building-a-chrome-extension-to-export-chats-from-6-ai-platforms", "markdown": "https://wpnews.pro/news/what-i-learned-building-a-chrome-extension-to-export-chats-from-6-ai-platforms.md", "text": "https://wpnews.pro/news/what-i-learned-building-a-chrome-extension-to-export-chats-from-6-ai-platforms.txt", "jsonld": "https://wpnews.pro/news/what-i-learned-building-a-chrome-extension-to-export-chats-from-6-ai-platforms.jsonld"}}