<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Jack Aluo</title>
    <description>The latest articles on DEV Community by Jack Aluo (@jackaluo).</description>
    <link>https://dev.to/jackaluo</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4195798%2F4ef7253a-f97c-408d-bd21-2f9bb8568b3b.png</url>
      <title>DEV Community: Jack Aluo</title>
      <link>https://dev.to/jackaluo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jackaluo"/>
    <language>en</language>
    <item>
      <title>What I Learned Building a Chrome Extension to Export Chats from 6 AI Platforms</title>
      <dc:creator>Jack Aluo</dc:creator>
      <pubDate>Tue, 20 Oct 2026 09:36:56 +0000</pubDate>
      <link>https://dev.to/jackaluo/what-i-learned-building-a-chrome-extension-to-export-chats-from-6-ai-platforms-39cl</link>
      <guid>https://dev.to/jackaluo/what-i-learned-building-a-chrome-extension-to-export-chats-from-6-ai-platforms-39cl</guid>
      <description>&lt;p&gt;I've been building Chrome extensions that help people save and organize conversations from AI platforms.&lt;/p&gt;

&lt;p&gt;What started as a relatively straightforward idea — exporting AI chats into Notion, Markdown, or PDF — eventually turned into a much more complicated engineering challenge.&lt;/p&gt;

&lt;p&gt;Today, my project, AIExportHub, supports conversations from six AI platforms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ChatGPT&lt;/li&gt;
&lt;li&gt;Claude&lt;/li&gt;
&lt;li&gt;Gemini&lt;/li&gt;
&lt;li&gt;Perplexity&lt;/li&gt;
&lt;li&gt;Grok&lt;/li&gt;
&lt;li&gt;Genspark&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At first glance, exporting a conversation sounds simple. Read the messages, convert them into another format, and save the result.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwp9ar7th09j2gh1a8n6l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwp9ar7th09j2gh1a8n6l.png" alt="Bulk Export AI chats, keep memory" width="800" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But once you start supporting multiple platforms, long conversation histories, Projects, images, generated files, and different output formats, things become much more interesting.&lt;/p&gt;

&lt;p&gt;Here are some of the lessons I've learned while working on this project.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. There Is No Universal AI Conversation Format
&lt;/h2&gt;

&lt;p&gt;The first major challenge is that every AI platform structures its conversations differently.&lt;/p&gt;

&lt;p&gt;Even though ChatGPT, Claude, and Gemini all look like chat applications, the way they represent and expose conversation data can be quite different.&lt;/p&gt;

&lt;p&gt;A conversation isn't necessarily just an array of user and assistant messages.&lt;/p&gt;

&lt;p&gt;Depending on the platform, it might include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Text messages with different content structures&lt;/li&gt;
&lt;li&gt;Code blocks and syntax highlighting&lt;/li&gt;
&lt;li&gt;Mathematical expressions&lt;/li&gt;
&lt;li&gt;Images and file attachments&lt;/li&gt;
&lt;li&gt;Generated documents or other assets&lt;/li&gt;
&lt;li&gt;Citations and external references&lt;/li&gt;
&lt;li&gt;Project or collection metadata&lt;/li&gt;
&lt;li&gt;Timestamps and conversation identifiers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And these structures can change when platforms update their interfaces.&lt;/p&gt;

&lt;p&gt;This creates a fundamental problem: &lt;strong&gt;you can't assume the same extraction logic will work everywhere.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Separating platform differences from export formats
&lt;/h3&gt;

&lt;p&gt;One useful way to approach this problem is to think about two separate concerns.&lt;/p&gt;

&lt;p&gt;The first is collecting and interpreting conversations from each platform.&lt;/p&gt;

&lt;p&gt;The second is converting that content into the user's desired format.&lt;/p&gt;

&lt;p&gt;A conceptual export pipeline looks like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Discover conversations from the selected AI platform.&lt;/li&gt;
&lt;li&gt;Read the selected conversations and their available metadata.&lt;/li&gt;
&lt;li&gt;Identify messages, content blocks, and associated assets.&lt;/li&gt;
&lt;li&gt;Normalize the content into a consistent representation.&lt;/li&gt;
&lt;li&gt;Render the result as Markdown, PDF, or Notion pages.&lt;/li&gt;
&lt;li&gt;Verify the output and report any failures.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This separation matters because otherwise every new platform multiplies the number of special cases throughout the exporter.&lt;/p&gt;

&lt;p&gt;If the source parsing and output generation are tightly coupled, a small change to one platform can affect several export workflows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson learned:&lt;/strong&gt; Treat platform-specific parsing as a separate engineering problem from document generation.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Exporting Text Is Easy Compared to Exporting Attachments
&lt;/h2&gt;

&lt;p&gt;Text is only part of a modern AI conversation.&lt;/p&gt;

&lt;p&gt;People upload PDFs, screenshots, spreadsheets, and source files. AI platforms also generate images, documents, code assets, and other downloadable files.&lt;/p&gt;

&lt;p&gt;When a user exports a conversation, they often expect those attachments to be preserved alongside the text.&lt;/p&gt;

&lt;p&gt;This is where things become complicated.&lt;/p&gt;

&lt;h3&gt;
  
  
  A file URL isn't always a downloadable file
&lt;/h3&gt;

&lt;p&gt;Some assets are accessible only within the user's authenticated session.&lt;/p&gt;

&lt;p&gt;Others use temporary or protected download URLs.&lt;/p&gt;

&lt;p&gt;A link that works inside an open ChatGPT conversation may not behave the same way when accessed from an unrelated browser extension context.&lt;/p&gt;

&lt;p&gt;For example, AIExportHub handles supported protected ChatGPT-generated files through the connected, signed-in ChatGPT tab.&lt;/p&gt;

&lt;p&gt;The important principle is that &lt;strong&gt;the original source session may be necessary to retrieve an asset successfully.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Simply extracting a URL and attempting to download it later isn't always reliable.&lt;/p&gt;

&lt;h3&gt;
  
  
  Attachments may also expire
&lt;/h3&gt;

&lt;p&gt;Even with the correct session, an exporter can't necessarily recover a file that the source platform no longer provides.&lt;/p&gt;

&lt;p&gt;This is an important limitation.&lt;/p&gt;

&lt;p&gt;A backup tool can preserve content that is accessible at export time, but it cannot guarantee recovery of deleted or expired source assets.&lt;/p&gt;

&lt;p&gt;For that reason, I think backup tools should distinguish between:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A conversation exported successfully&lt;/li&gt;
&lt;li&gt;A conversation exported with missing attachments&lt;/li&gt;
&lt;li&gt;A conversation that couldn't be exported&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Reporting these cases accurately is better than displaying a generic success message.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Markdown Needs More Than Plain Text
&lt;/h2&gt;

&lt;p&gt;Markdown is one of my favorite export formats because it's portable.&lt;/p&gt;

&lt;p&gt;You can open it in Obsidian, VS Code, or almost any text editor.&lt;/p&gt;

&lt;p&gt;But generating useful Markdown from AI conversations involves more than joining messages together.&lt;/p&gt;

&lt;p&gt;Consider a conversation containing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multiple levels of headings&lt;/li&gt;
&lt;li&gt;Nested lists&lt;/li&gt;
&lt;li&gt;JavaScript or Python code blocks&lt;/li&gt;
&lt;li&gt;Mathematical expressions&lt;/li&gt;
&lt;li&gt;Tables&lt;/li&gt;
&lt;li&gt;Citations&lt;/li&gt;
&lt;li&gt;Embedded images&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you simply extract the visible text, much of the original structure can disappear.&lt;/p&gt;

&lt;p&gt;A code example might lose its formatting. A mathematical expression might become difficult to read. An image could turn into a broken link.&lt;/p&gt;

&lt;p&gt;The goal isn't just to preserve the words.&lt;/p&gt;

&lt;p&gt;It's to preserve enough structure that the conversation remains useful outside the original website.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdkaojh5vq7srj14lc7yi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdkaojh5vq7srj14lc7yi.png" alt="AI Exporter to Markdown as Second Brand" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The attachment path problem
&lt;/h3&gt;

&lt;p&gt;Suppose you export a conversation as Markdown and download its images separately.&lt;/p&gt;

&lt;p&gt;If the Markdown file still references temporary URLs from the original AI platform, those references may stop working later.&lt;/p&gt;

&lt;p&gt;For local archives, a better approach is to store supported assets alongside the Markdown document and use local relative paths.&lt;/p&gt;

&lt;p&gt;For example, a Markdown note and its attachments might be organized like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;conversation.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;assets/diagram.png&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;assets/reference.pdf&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The note can then reference the local image instead of relying entirely on the original hosted URL.&lt;/p&gt;

&lt;p&gt;AIExportHub supports local asset folders and link rewriting for available images and attachments.&lt;/p&gt;

&lt;p&gt;This is especially useful for Obsidian users who want to maintain a portable knowledge vault.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson learned:&lt;/strong&gt; A Markdown export should be treated as a portable document with its dependencies, not just a text file.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Bulk Exporting Is a Reliability Problem
&lt;/h2&gt;

&lt;p&gt;Exporting one conversation and exporting hundreds of conversations are very different challenges.&lt;/p&gt;

&lt;p&gt;An individual export is usually a relatively short operation.&lt;/p&gt;

&lt;p&gt;A bulk export can involve many conversations, different content types, numerous attachments, and repeated requests to the source platform.&lt;/p&gt;

&lt;p&gt;Several things can go wrong during a long-running job:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A conversation may fail to load.&lt;/li&gt;
&lt;li&gt;A network request may time out.&lt;/li&gt;
&lt;li&gt;An attachment may be unavailable.&lt;/li&gt;
&lt;li&gt;The source platform may temporarily rate-limit requests.&lt;/li&gt;
&lt;li&gt;The user may cancel the operation.&lt;/li&gt;
&lt;li&gt;The browser tab or session may become unavailable.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One failed conversation shouldn't necessarily invalidate an entire batch.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2f1oree26ahsnnbfckho.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2f1oree26ahsnnbfckho.png" alt="Bulk Export ai chats" width="799" height="415"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk0qeylysa3m59y6ix3w4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk0qeylysa3m59y6ix3w4.png" alt="Bulk Export ai chats" width="800" height="506"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Progress and error recovery matter
&lt;/h3&gt;

&lt;p&gt;Imagine exporting 500 conversations.&lt;/p&gt;

&lt;p&gt;If the process fails on conversation 430, restarting everything from the beginning would be frustrating.&lt;/p&gt;

&lt;p&gt;A more reliable workflow needs to account for individual items rather than treating the entire operation as one all-or-nothing task.&lt;/p&gt;

&lt;p&gt;That means keeping track of concepts such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pending conversations&lt;/li&gt;
&lt;li&gt;Successfully exported conversations&lt;/li&gt;
&lt;li&gt;Skipped conversations&lt;/li&gt;
&lt;li&gt;Failed conversations&lt;/li&gt;
&lt;li&gt;Retry attempts&lt;/li&gt;
&lt;li&gt;Attachment download results&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AIExportHub includes batch progress, configurable delays, cancellation, retry options, and the ability to skip previously exported items in supported workflows.&lt;/p&gt;

&lt;p&gt;These features may not look as exciting as a new export format, but they become essential when processing large histories.&lt;/p&gt;

&lt;h3&gt;
  
  
  Rate limits require patience
&lt;/h3&gt;

&lt;p&gt;One temptation when building a bulk exporter is to make everything run as quickly as possible.&lt;/p&gt;

&lt;p&gt;But a high request rate can cause more failures rather than faster completion.&lt;/p&gt;

&lt;p&gt;For long-running exports, controlled pacing and graceful recovery are often more important than maximum throughput.&lt;/p&gt;

&lt;p&gt;If the source platform starts rejecting requests, continuing to send more requests immediately may only make the situation worse.&lt;/p&gt;

&lt;p&gt;A reliable exporter needs to recognize such limits and avoid turning a temporary restriction into hundreds of repeated failures.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson learned:&lt;/strong&gt; Reliability, resumability, and accurate progress reporting are core features of a bulk export tool.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Projects and Collections Make the Data Model More Complex
&lt;/h2&gt;

&lt;p&gt;AI platforms are no longer limited to independent conversations.&lt;/p&gt;

&lt;p&gt;We now have features such as ChatGPT Projects, Claude Projects, Gemini Gems, Genspark Hubs, and other ways of grouping related work.&lt;/p&gt;

&lt;p&gt;These features create another challenge.&lt;/p&gt;

&lt;p&gt;A conversation can belong to a larger collection with its own context and organization.&lt;/p&gt;

&lt;p&gt;If you export only the messages without preserving any collection information, you may lose an important part of how the knowledge was organized.&lt;/p&gt;

&lt;p&gt;For example, imagine a Claude Project containing multiple discussions about the same application.&lt;/p&gt;

&lt;p&gt;Saving all those conversations into one flat folder without any Project context makes it harder to understand their relationship later.&lt;/p&gt;

&lt;p&gt;A useful export should preserve available collection metadata and provide a sensible folder or database structure.&lt;/p&gt;

&lt;p&gt;However, there's an important distinction:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exporting conversations from a Project is not necessarily the same as backing up the entire Project.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Project instructions, settings, independently uploaded files, and other platform-specific information may require separate handling.&lt;/p&gt;

&lt;p&gt;I think being explicit about these limitations is essential, especially when users rely on backups for important work.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Notion, Markdown, and PDF Solve Different Problems
&lt;/h2&gt;

&lt;p&gt;Another lesson is that the destination format changes what a good export looks like.&lt;/p&gt;

&lt;p&gt;The same conversation might be used in several different ways.&lt;/p&gt;

&lt;h3&gt;
  
  
  Markdown: portability and local knowledge management
&lt;/h3&gt;

&lt;p&gt;Markdown works well for users who want files they can keep, edit, search, and organize locally.&lt;/p&gt;

&lt;p&gt;It's particularly useful for Obsidian workflows, source-code notes, and long-term archives.&lt;/p&gt;

&lt;p&gt;The main challenges are preserving structure, managing attachments, and keeping links functional.&lt;/p&gt;

&lt;h3&gt;
  
  
  Notion: structured knowledge organization
&lt;/h3&gt;

&lt;p&gt;Notion is useful when conversations need to become part of a structured workspace.&lt;/p&gt;

&lt;p&gt;A conversation can include information such as its title, source platform, URL, timestamps, and related collection.&lt;/p&gt;

&lt;p&gt;Instead of storing everything as unrelated documents, users can organize conversations in databases and project pages.&lt;/p&gt;

&lt;p&gt;But exporting to Notion introduces another set of considerations.&lt;/p&gt;

&lt;p&gt;The user needs to authorize the destination workspace, and the integration needs permission to access the selected pages or databases.&lt;/p&gt;

&lt;p&gt;Media uploads and long conversations also require different handling from a simple Markdown download.&lt;/p&gt;

&lt;h3&gt;
  
  
  PDF: readable and shareable documents
&lt;/h3&gt;

&lt;p&gt;PDF is useful when the goal is to preserve a readable document.&lt;/p&gt;

&lt;p&gt;However, a PDF isn't automatically a complete backup of every associated file.&lt;/p&gt;

&lt;p&gt;For example, images may be embedded in the document while other supported attachments need to be downloaded separately.&lt;/p&gt;

&lt;p&gt;Formatting also matters. Long conversations, tables, code blocks, and mathematical expressions can make PDF rendering surprisingly difficult.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson learned:&lt;/strong&gt; Different export formats require different preservation strategies. One output format cannot perfectly serve every use case.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Local-First Processing Is Worth Thinking About
&lt;/h2&gt;

&lt;p&gt;AI conversations can contain sensitive information.&lt;/p&gt;

&lt;p&gt;People use AI assistants for work, research, code reviews, personal notes, and internal documents.&lt;/p&gt;

&lt;p&gt;When building an exporter, it's important to consider where that information goes during processing.&lt;/p&gt;

&lt;p&gt;For AIExportHub, Markdown and PDF exports are generated in the browser without requiring an intermediate cloud workspace.&lt;/p&gt;

&lt;p&gt;For Notion exports, users authorize their own Notion workspace and choose the destination.&lt;/p&gt;

&lt;p&gt;There are still interactions with the original AI platforms, of course, because the browser needs to retrieve the conversations and available assets.&lt;/p&gt;

&lt;p&gt;So local-first doesn't mean the browser never communicates with an online service.&lt;/p&gt;

&lt;p&gt;It means avoiding unnecessary intermediate services for local file generation.&lt;/p&gt;

&lt;p&gt;I think this is a useful design principle for browser-based productivity tools.&lt;/p&gt;

&lt;p&gt;Users should understand which services access their data and why.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. The Most Difficult Bugs Often Come from Changes Outside Your Code
&lt;/h2&gt;

&lt;p&gt;One particularly frustrating part of maintaining browser extensions is that the websites they interact with can change without warning.&lt;/p&gt;

&lt;p&gt;A conversation identifier might be exposed differently.&lt;/p&gt;

&lt;p&gt;An interface element might be moved.&lt;/p&gt;

&lt;p&gt;A content structure might be updated.&lt;/p&gt;

&lt;p&gt;An attachment retrieval flow might start behaving differently.&lt;/p&gt;

&lt;p&gt;From the user's perspective, the extension simply stops working.&lt;/p&gt;

&lt;p&gt;From the developer's perspective, the problem may originate in a platform you don't control.&lt;/p&gt;

&lt;p&gt;This is why real user feedback has been so valuable.&lt;/p&gt;

&lt;p&gt;A report such as "the export failed" is a starting point, but it's much easier to investigate when you can identify:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which AI platform was being used&lt;/li&gt;
&lt;li&gt;Whether the problem affects one conversation or an entire history&lt;/li&gt;
&lt;li&gt;Which export format was selected&lt;/li&gt;
&lt;li&gt;Whether the conversation contains images or attachments&lt;/li&gt;
&lt;li&gt;What error message appeared&lt;/li&gt;
&lt;li&gt;Whether the issue happens consistently&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In some cases, a failure happens only with a particular conversation structure or attachment type.&lt;/p&gt;

&lt;p&gt;Reproducing those cases is often the hardest part of debugging.&lt;/p&gt;

&lt;p&gt;This has reinforced one principle for me:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;An exporter that depends on changing third-party platforms is never really finished.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Maintenance and compatibility testing are ongoing parts of the product.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I've Built So Far
&lt;/h2&gt;

&lt;p&gt;These challenges are what led me to keep expanding &lt;a href="https://chatgpt2notion.com/products/aiexporthub-hero/" rel="noopener noreferrer"&gt;AIExportHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It's a Chrome extension for exporting conversations from ChatGPT, Claude, Gemini, Perplexity, Grok, and Genspark.&lt;/p&gt;

&lt;p&gt;Depending on the source platform, it supports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Individual conversation exports&lt;/li&gt;
&lt;li&gt;Bulk conversation history backups&lt;/li&gt;
&lt;li&gt;Selective conversation exports&lt;/li&gt;
&lt;li&gt;Supported Projects, Gems, Hubs, and other collections&lt;/li&gt;
&lt;li&gt;Markdown and Obsidian-compatible files&lt;/li&gt;
&lt;li&gt;Notion pages and databases&lt;/li&gt;
&lt;li&gt;PDF documents&lt;/li&gt;
&lt;li&gt;Supported images, attachments, generated files, and citations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's free to try, with some advanced features requiring a paid plan.&lt;/p&gt;

&lt;p&gt;I'm still working on improving compatibility, long-running exports, and how different types of content are preserved.&lt;/p&gt;

&lt;p&gt;The biggest takeaway from this project is that exporting AI conversations isn't simply about saving text.&lt;/p&gt;

&lt;p&gt;It's about dealing with changing platforms, preserving structured content, maintaining access to available files, and making the final result useful outside the original application.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Working 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.&lt;/p&gt;

&lt;p&gt;If I had to summarize the most important lessons, they would be:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Don't assume similar-looking websites have similar data structures.&lt;/li&gt;
&lt;li&gt;Separate source-specific parsing from output generation.&lt;/li&gt;
&lt;li&gt;Treat images, generated files, and attachments as first-class content.&lt;/li&gt;
&lt;li&gt;Design bulk operations around partial failures and recovery.&lt;/li&gt;
&lt;li&gt;Preserve available metadata and collection context.&lt;/li&gt;
&lt;li&gt;Be transparent about export limitations.&lt;/li&gt;
&lt;li&gt;Expect third-party platforms to change, and design for ongoing maintenance.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;There's still plenty to improve, especially as AI conversations become more complex and platforms introduce new features.&lt;/p&gt;

&lt;p&gt;But I believe the underlying problem is worth solving.&lt;/p&gt;

&lt;p&gt;AI 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.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;I'm curious about other developers' experiences:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Have you built a Chrome extension that depends on a third-party website's changing interface?&lt;/p&gt;

&lt;p&gt;How do you handle breaking changes, authenticated downloads, or large background operations?&lt;/p&gt;

&lt;p&gt;I'd love to learn how others approach these problems.&lt;/p&gt;

&lt;p&gt;Thanks for reading!&lt;/p&gt;

&lt;p&gt;— Jack&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Indie developer building AIExportHub.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>productivity</category>
      <category>softwaredevelopment</category>
      <category>tools</category>
    </item>
  </channel>
</rss>
