AI Chat Archive — Markdown export format

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.

Document skeleton

# {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.

Turn headings

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 (…):

Human-turn attachment references

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:

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 body

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_useartifact Fenced code block with the artifact's language, preceded by **Artifact: {title}**.
tool_useshow_widget Either an inline SVG (for SVG widgets) or an HTML block stored in the companion _widgets/ folder, referenced by filename.
tool_usepresent_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).

Artifact example

## 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/htmlhtml, image/svg+xmlsvg). 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).

Versioned artifacts

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.

Free vs paid output

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.

What's not in the Markdown

Stability guarantees

If you're parsing these files programmatically and want to be alerted to format changes, subscribe to the changelog or watch this repository.

Related