ARCANADA
All Posts
Blog July 28, 2026

Long ChatGPT Conversations: Images and Sensible File Names

A ChatGPT conversation saved into a folder with a Markdown file and images
Version 1.1.6 puts the conversation and its images into one folder named after the chat.

Six weeks ago I wrote about why I built Conversation to Markdown: I talk to ChatGPT while training, then hand the whole conversation to Codex so it can turn the discussion into tasks. The extension scrolled through the chat, collected messages by role, and copied the result to the clipboard.

On my own conversations it worked. On genuinely long ones it did not. Version 1.1.6 closes the three things that kept it from being useful in earnest.

The scroll that never arrived

The symptom was odd: short conversations exported fine, long ones failed with "Conversation scroll did not settle before timeout".

The cause was the waiting criterion. The function waited for the page to "settle", counting frames with no changes as stable — and resetting that counter whenever the document height grew. But growing is exactly what a virtualized page does continuously: it loads content, the height increases, the counter resets. Stability never arrived, and the longer the conversation, the more certain the timeout.

The right criterion is not "nothing changed" but "scrolling stopped moving". Now only the position matters; a growing document height no longer prevents the target from being recognised as reached. And if the position still is not reached in time, the page jumps straight to the target instead of throwing — so collection never starts from the middle of the conversation.

Images that downloaded broken

The extension can save a conversation into the downloads folder together with its images, rewriting the links to local paths. Except what landed there were not images but files with a .json extension and a "site was unavailable" note.

The code passed the remote URL straight to Chrome's downloader. For ChatGPT images that does not work: they live on a separate host, the links are temporary and signed, and a request issued from the downloader's context arrives without the required parameters.

An interim attempt to fix this through canvas — take the already-rendered element, draw it onto a canvas, read the pixels back — failed even more clearly. A cross-origin image without CORS headers taints the canvas, and reading the pixels throws. An elegant idea with a zero result.

The working approach is duller. The content script fetches the image itself — it has the host permission declared — turns it into a data URL, and hands that to the downloader. A data URL always downloads, because it never touches the network. Along the way it turned out that image links cannot have their query parameters stripped the way ordinary links are stripped for privacy: the server only serves the file when the signature and timestamp are present. Links inside the text still get trimmed; image links do not.

The conversation title instead of conversation.md

The third item is not a bug but something that was missing. The file was always called conversation.md, so after a third export the downloads folder held conversation (2).md and conversation (3).md with no hint of what was inside.

Now the extension reads the conversation title — the one ChatGPT shows in the sidebar — and uses it twice: as the heading at the top of the document and as the file name. Images sit alongside it and inherit the same name with a sequence number:

Downloads/chatgpt-export/Arcana-agent/
├── Arcana-agent.md
├── Arcana-agent-image_001.png
└── Arcana-agent-image_002.jpg

Naming the images is not cosmetic. While they were called image_001.png, exporting two different conversations produced identical names and Chrome appended (1), (2) — leaving no way to tell which conversation an image came from.

Non-Latin titles survive intact: the slug only strips what would break the filesystem. If a conversation has not been titled yet, the old behaviour stands — conversation.md at the root of the export folder.

The limitations worth stating plainly

Image links expire. They have to be downloaded while the conversation is open; the ones left as links in the Markdown will eventually stop resolving.

Chrome does not overwrite files: exporting the same conversation again creates a suffixed copy rather than updating the existing file.

And above all, the extension depends on ChatGPT's markup. When the page structure changes, an update is needed. That is the price of working against someone else's interface, and it is worth keeping in mind.

Installation

The extension ships as an unpacked build, not through the Chrome Web Store: download the repository, open chrome://extensions, enable developer mode, and point it at the folder containing the manifest.

Everything runs locally in the browser — no telemetry, no server, no storage. The code is open source under the MIT License.