This document specifies the Markdown representation AI Chat Archive produces when exporting a Claude.ai conversation. If you are writing an importer (Obsidian plugin, search indexer, static-site ingest), this page is the canonical reference.
All examples below are taken from real output. The format is stable across releases; any
breaking change will be flagged in the changelog and a new
version string will appear in llms.txt.
# {Conversation title}
> Created: {locale-formatted timestamp} | Updated: {locale-formatted timestamp}
---
## Human ({timestamp}):
{attachment references, if any}
{message body}
---
## Claude ({timestamp}):
{message body, with artifacts / widgets / tool calls rendered inline}
---
{…alternating Human / Claude blocks…}
Every exported file starts with a single # H1 containing the conversation title, an
optional blockquote with creation / update timestamps, and a horizontal rule before the
first message.
Untitled Conversation.## Human (…) / ## Claude (…) heading —
switches uniformly.Each turn begins with an H2. Two senders are supported:
## Human (2026-04-23 14:07):
## Claude (2026-04-23 14:07):
If the source message has no timestamp, the parenthetical is dropped:
## Human:
## Claude:
Turns are separated by a blank line and a horizontal rule:
(previous turn body)
---
## Claude (…):
When a human turn has uploaded attachments or files, AI Chat Archive writes them as blockquote lines before the message body, so an importer can pick them up without parsing the message itself:
## Human (2026-04-23 14:07):
> 📎 Attachment: design-brief.pdf (234.5 KB)
> 📎 Attachment: screenshot.png (88.1 KB)
> 📎 File: brand-guide.pdf
Can you review these and suggest what's missing?
Two distinct prefixes exist:
> 📎 Attachment: {name} ({size}) — files uploaded directly into the message
(attachments array). Size is omitted when not available.> 📎 File: {name} — files attached via the Projects file picker (files array).The actual binary is not embedded in the Markdown file. See ZIP bundle structure for how attachments travel alongside the transcript in bulk export mode.
Message content is a sequence of typed blocks. The extension flattens them into Markdown using the following rules:
| Source block | Rendered as |
|---|---|
text |
Plain Markdown, passed through unchanged (Claude already returns valid Markdown). |
thinking |
Fenced block labelled > 💭 Claude's thinking, omitted by default; included only when the user enables includeThinking. |
tool_use — artifact |
Fenced code block with the artifact's language, preceded by **Artifact: {title}**. |
tool_use — show_widget |
Either an inline SVG (for SVG widgets) or an HTML block stored in the companion _widgets/ folder, referenced by filename. |
tool_use — present_files |
A bullet list of filenames; the files themselves are bundled into the ZIP. |
Any other tool_use |
Dropped from Markdown output (tool calls are implementation noise; enable "Include tool calls" in settings to keep them). |
## Claude (2026-04-23 14:08):
Here's the component:
**Artifact: Login form (React)**
```jsx
export function LoginForm() {
return <form>…</form>;
}
```
And a quick explanation…
Artifacts always carry a language tag inferred from Claude's artifact_type field
(e.g. application/vnd.ant.code → the code's own language, text/html → html,
image/svg+xml → svg). When multiple versions of the same artifact exist in the
conversation, only the final version is rendered in-line; earlier versions are listed
in an appendix (see Versioned artifacts below).
If Claude rewrote an artifact across multiple turns, the Markdown file ends with an appendix:
---
## Artifact history
### Login form — earlier versions
- [v1](#artifact-login-form-v1) — Initial draft
- [v2](#artifact-login-form-v2) — Added email validation
Each entry links to an in-file anchor where the full earlier version is preserved as a fenced code block. This preserves round-trip fidelity without cluttering the main conversation flow.
The free tier appends a single-line attribution footer to each exported file:
---
Exported with [AI Chat Archive](https://aichatarchive.app) · Runs entirely in your browser
A paid license removes this line. The rest of the format is identical across tiers.
# {title}, ## Human (…):, ## Claude (…): will not
change without a major version bump.> 📎 Attachment: and > 📎 File: — safe to
regex for.tool_use variants may gain
dedicated renderers, but existing ones are frozen.If you're parsing these files programmatically and want to be alerted to format changes, subscribe to the changelog or watch this repository.