Adds "Copy as Markdown" and "Export as Markdown" to the ChatGPT chat options menu (the 3-dots button in the top-right of a chat).
Adds two items to ChatGPT's chat options menu (the three-dots button in the top-right of an open conversation):
.md file named after the chat title and today's date.Both options live inside the native menu, with matching styling, divider, and hover behavior — they look like part of ChatGPT.
The exported Markdown is the model's own emission, taken verbatim from ChatGPT's backend conversation API — not scraped from rendered HTML. That means code fences,
tables, nested lists, LaTeX math (\(...\) and \[...\]), and blockquotes all survive intact, exactly as the model produced them.
Each file starts with a small YAML frontmatter block:
────────────────────────────────────────────────────────────────────────────────
title: "..."
conversation_id: ...
created: ...
exported: ...
model: ...
url: https://chatgpt.com/c/...
Each turn is preceded by an H2 heading (## User / ## ChatGPT (model-slug)), and assistant turns include a "Sources" section underneath when web citations were used
in the answer.
When a chat has branches (from edited prompts or regenerated replies), the export follows the currently visible thread — i.e. what you see on screen — by walking the
conversation tree from current_node back to the root.
The script makes two requests, both to chatgpt.com, both using your already-active session:
GET /api/auth/session — to obtain the access token the ChatGPT UI itself uses.GET /backend-api/conversation/{id} — to fetch the conversation JSON.Nothing is sent anywhere else. There is no telemetry, no third-party server, no analytics. The whole script runs locally in your browser.
https://chatgpt.com/* (and the legacy chat.openai.com/*)@grants are required — ChatGPT's strict Content-Security-Policy blocks @grant none injections, so the
script declares GM_setClipboard, GM_download, and GM_info to opt into the sandboxed injection mode.*[image: …]* placeholders rather than downloaded./share/{id}) are not yet supported; only your own conversations under /c/{id}.