DEV Community

Cover image for Export Perplexity threads to Markdown, with sources, plus Convolvger 0.7.0
Fahad Bilal Saleem
Fahad Bilal Saleem

Posted on

Export Perplexity threads to Markdown, with sources, plus Convolvger 0.7.0

If you want to export a Perplexity thread to Markdown or save a Perplexity conversation as a .md file, you are out of luck. Copy-paste keeps the answer text and drops every source the answer cited, which is the whole point of using Perplexity in the first place.

Convolvger 0.7.0 fixes that. It is my Python CLI that turns public AI chat share links into clean Markdown plus a full-fidelity JSON archive. No browser automation, no cookies, no API keys. This release adds Perplexity as the eighth provider, and gives five providers a proper Sources list in the Markdown.

How to export a Perplexity thread to Markdown

Perplexity share links look like https://www.perplexity.ai/search/ID. Three steps:

pip install convolvger
convolvger bookmarklet     # one-time: save the printed bookmarklet in your browser
convolvger export --capture
Enter fullscreen mode Exit fullscreen mode

Open the thread in your own browser and click the bookmarklet. No link is typed: it arrives with the conversation, from the page you clicked. The bookmarklet asks the provider for the same data the page itself loads, using your own browser session, and hands it to the waiting command. Perplexity answers automated programs with a Cloudflare challenge, so rather than impersonate a browser, Convolvger captures from yours. Nothing is impersonated and nothing leaves your machine. Verified in Chrome. If you already use the bookmarklet for Claude, run convolvger bookmarklet again and replace your bookmark.

Two honest limits: citations are read from the sources Perplexity itself marks as cited, and a thread longer than twenty turns arrives in pages. Only the first page is captured, and the archive says so when more pages exist. I would rather tell you what is missing than guess.

What the Markdown looks like now

This is the part I am most pleased with. Before 0.7.0, when an answer cited web search results, Convolvger stripped the citation markers and no source reached the Markdown. Now each answer that cites search results gets a numbered Sources list. Simplified example:

Before:

The trial showed a 40% reduction in symptoms.
Enter fullscreen mode Exit fullscreen mode

After:

The trial showed a 40% reduction in symptoms [1].

## Sources

1. [Phase 3 trial results, NEJM](https://example.com/paper)
Enter fullscreen mode Exit fullscreen mode

The text reads [1], [2] in the order the answer first cites them, and each number links the cited page by its title. This applies to Grok, DeepSeek, Kimi, Qwen, and Perplexity answers. Only cited results are listed, about a third of the results the measured shares carried. Every result, cited or not, stays in the JSON archive.

The rest of 0.7.0

Reasoning in the Markdown. The reasoning traces Kimi and Qwen show beside an answer now appear as labelled reasoning, separate from the answer, the same way ChatGPT's already did. One side effect: a Qwen share whose only unmodelled content was its reasoning now exits 0 and verifies as faithful.

Archive schema 4. A message now records its citations, and 0.7.0 reads schemas 2, 3, and 4. Because this mattered to me: 0.6.0 refuses a schema 4 archive with a message naming the version, instead of silently misreading it.

Faster on large payloads. A 4 MiB worst case went from 19-26 seconds to about 4, parsing in less memory. Snapshots passed with --from-file are held to the same 32 MiB limit as fetched ones.

A note on 0.6.1

I shipped 0.6.1 two days before this one and never wrote it up. It is a fixes-only release: hardening against malformed and hostile input. JSON nested more than 64 levels deep is refused wherever it is read, and a ChatGPT page that would unfold past 32 MiB is refused too. Before, a 1 kB page could produce a 742 MB archive using 1.47 GB of memory; now it is refused in about two seconds, with a clear error instead of a traceback, the same on Linux and Windows.

Why I built it this way

Every gap Convolvger hits during extraction is recorded as a structured finding instead of being dropped quietly, and convolvger verify checks an archive's integrity afterward. If something is missing from your export, you will know about it. An archive you cannot verify is not an archive.

Try it

pip install convolvger
Enter fullscreen mode Exit fullscreen mode

GitHub: https://github.com/fahadbilalsaleem/convolvger
PyPI: https://pypi.org/project/convolvger/

One honest note: share links rot. Providers change formats and delete old shares. If there is a conversation you care about, archive it now rather than later.

Which provider or export format should I add next? I read every comment.

Top comments (0)