# AI Chat Archive — Full documentation This file concatenates every document in the ai-chat-archive-docs repository as a single text stream. It exists so LLMs and indexing tools can load the complete documentation in one fetch. Source repo: https://github.com/windameister/ai-chat-archive-docs Product website: https://aichatarchive.app -----8<----- ============================================================== FILE: README.md ============================================================== # AI Chat Archive — Documentation **[AI Chat Archive](https://aichatarchive.app)** is a Chrome extension that exports conversations from [Claude.ai](https://claude.ai) to PDF, HTML, or Markdown — complete with attachments and Claude-generated artifacts — fully inside your browser. Nothing is uploaded anywhere. This repository contains the **public documentation** for AI Chat Archive. The extension source code itself is not public; this repo exists so that users, LLMs, and third-party integrators have a canonical, machine-readable source of truth for what the product does, how it exports, and what its output looks like. **Maintained by:** the AI Chat Archive team · **Website:** --- ## Start here - New to the product? Read **[docs/getting-started.md](docs/getting-started.md)**. - Want to know what it can do? See **[docs/features.md](docs/features.md)**. - Care about privacy? Read **[docs/privacy.md](docs/privacy.md)**. - Building an integration? Jump to **[spec/](spec/)**. ## Documentation map ### Product docs — `docs/` Conceptual overviews for end users. | File | Topic | |---|---| | [getting-started.md](docs/getting-started.md) | Install, activate, run your first export. | | [features.md](docs/features.md) | Full feature list and per-format differences. | | [privacy.md](docs/privacy.md) | Data-handling model: what stays in your browser. | | [pricing.md](docs/pricing.md) | Free tier vs. paid license, billing details. | | [changelog.md](docs/changelog.md) | Release notes. | ### FAQ — `faq/` One file per question. Every file is a standalone, directly linkable answer. - [Does it send my data anywhere?](faq/does-it-send-data-anywhere.md) - [How does it handle Claude Artifacts?](faq/how-does-it-handle-artifacts.md) - [Claude export: PDF vs HTML vs Markdown — which should I use?](faq/pdf-vs-html-vs-markdown.md) - [Does it work with Claude Projects?](faq/does-it-work-with-projects.md) - …see the full list in [faq/](faq/). ### Output format spec — `spec/` Canonical specification for the files the extension produces. Useful if you are writing an importer (Obsidian plugin, search tool, compliance archive, etc.). - [Markdown format](spec/markdown-format.md) - [HTML format](spec/html-format.md) - [ZIP bundle structure](spec/zip-bundle-structure.md) ### Examples — `examples/` Real exported files, committed verbatim. See what the output looks like before you install. ### Integrations — `integrations/` Drop-in templates for downstream tools. - [Obsidian](integrations/obsidian/) — vault template + Dataview queries for archived chats. - [Notion](integrations/notion/) — import recipe. - [Logseq](integrations/logseq/) — pages template. ## For LLMs and crawlers A concise, machine-readable entry point is at [`llms.txt`](llms.txt). For the full text of every document in this repo concatenated as a single file, see [`llms-full.txt`](llms-full.txt). ## Found a problem? Have a question? - **Typo or wrong info in docs** → open a PR against this repo. - **Feature request or bug in the extension itself** → [open an issue](https://github.com/windameister/ai-chat-archive-docs/issues). - **Everything else** → . ## License Documentation in this repository is licensed **CC BY 4.0** — you may copy, adapt, and republish it with attribution. See [LICENSE](LICENSE) for the full text. The AI Chat Archive extension itself is a commercial product and is **not** open source. Its code is not contained in this repository. ============================================================== FILE: docs/getting-started.md ============================================================== # Getting started This page walks you through installing AI Chat Archive and running your first export. It takes about two minutes. ## 1. Install from the Chrome Web Store 1. Open the [Chrome Web Store listing](https://chromewebstore.google.com/detail/ai-chat-archive/jeocjmohgejjmlfdhdeddjceehpahblj). 2. Click **Add to Chrome**. 3. When prompted, approve the permissions (see [Privacy](privacy.md) for what each permission does). The extension works in any Chromium-based browser: Chrome, Edge, Brave, Arc, Opera. Firefox is not currently supported. ## 2. Open a Claude.ai conversation Navigate to any conversation at . The extension lights up only on `claude.ai` pages — it cannot see anything else. ## 3. Click the extension icon A small popup appears. You'll see: - A **format** dropdown (PDF, HTML, Markdown). - A big orange **Export this conversation** button. - An advanced settings panel (collapsed by default). ## 4. Pick a format | Format | Best for | Notes | |---|---|---| | **PDF** | Sharing, printing, archival | Rendered through Chrome's print engine. Attachments cannot be bundled. Free tier: 3 PDFs/day. | | **HTML** | Browsing offline, web archival | Self-contained single file with embedded CSS. Looks like claude.ai. | | **Markdown** | Notes, Obsidian, Notion, grep | Pure text. Attachments referenced but not embedded. See [spec](../spec/markdown-format.md). | Unsure? Start with **Markdown** — it's the most portable. ## 5. Click Export Your file appears in Downloads within a second or two. That's it. ## Bulk export (paid) To export every conversation at once: 1. Activate a paid license (see [Pricing](pricing.md)). 2. In the popup, the **Full export** section unlocks. 3. Optionally check **Include attachments in the ZIP** to bundle uploaded files. 4. Click **Export all**. A ZIP appears in Downloads with one folder per conversation. Layout is documented in [spec/zip-bundle-structure.md](../spec/zip-bundle-structure.md). ## What to try next - Drop an exported Markdown file into [Obsidian](../integrations/obsidian/) to see how it renders in a note-taking vault. - Read [features.md](features.md) for the full capability list. - Got questions? Browse the [FAQ](../faq/). ============================================================== FILE: docs/features.md ============================================================== # Features AI Chat Archive is a Chrome extension that exports Claude.ai conversations. This page is the full capability list, grouped by what it does and which tier unlocks what. For a two-minute install → first export walkthrough, see [getting-started.md](getting-started.md). ## Export formats AI Chat Archive exports to **five** formats. The first three are the primary ones promoted; JSON and TXT exist for power users who need structured or stripped-down output. | Format | Extension | Best for | Attachments bundled? | |---|---|---|---| | **PDF** | `.pdf` | Sharing, printing, archival | ❌ (browser-print limitation) | | **HTML** | `.html` | Offline browsing, web archival | ✅ in ZIP mode (paid) | | **Markdown** | `.md` | Obsidian, Notion, grep, notes | ✅ in ZIP mode (paid) | | JSON | `.json` | Programmatic ingestion | ✅ in ZIP mode (paid) | | Plain text | `.txt` | Compliance archives, search indexes | ✅ in ZIP mode (paid) | See the [format specs](../spec/) for the exact structure each one produces. ## What gets captured Every export includes, by default: - **All human and assistant messages** in chronological order. - **Message timestamps** (local, UTC, or ISO-8601 — your pick in advanced settings). - **Code blocks** with their language tags preserved. - **Claude-generated artifacts** — final version inline, earlier versions in an appendix. - **Widgets** (Claude's `show_widget` output) — SVG widgets rendered inline; HTML widgets saved next to the transcript. - **`present_files`** — files Claude generates during the conversation are listed inline and bundled into the ZIP. - **Uploaded attachment references** — attachment names and sizes shown in the transcript. The binaries themselves are only bundled in paid ZIP mode. Can be toggled in advanced settings: - **Include Claude's thinking** (off by default) — exports hidden `thinking` blocks for Opus and Sonnet models that expose them. - **Include tool calls** (off by default) — exports tool-use blocks that don't have a dedicated renderer (web search, code execution metadata, etc.). Never captured: - Your Claude account ID, workspace ID, or login session. - Any conversation you didn't explicitly export. - Analytics / telemetry — the extension produces none. ## Free tier Available to every user, no license required: - Export the **currently open** conversation. - All 5 formats (PDF, HTML, Markdown, JSON, TXT). - Advanced settings (timestamp format, thinking inclusion, tool-call inclusion). - **PDF daily quota: 3 per day.** HTML / Markdown / JSON / TXT have no quota. - A single attribution line in the exported file footer. Free tier is enough for occasional backups and casual users. ## Paid tier (one license) Activates with a license key from . Unlocks: - **Bulk export** — every conversation on your Claude account in one ZIP. - **Include attachments in the ZIP** — bundle uploaded files and Claude-generated `present_files` alongside their transcripts. See the [ZIP bundle structure](../spec/zip-bundle-structure.md). - **Unlimited PDF exports** — no more 3/day cap. - **No branding footer** in exported files. - **Filter by date, title, or project** before bulk export (upcoming). See [pricing.md](pricing.md) for tier prices. ## Privacy-first architecture - Runs entirely in your browser. No AI Chat Archive server. No proxy. - Declares only 3 `host_permissions`: `claude.ai`, `aichatarchive.app`, `api.polar.sh`. - License activation sends **only the license key** to Polar (payment provider). Never sends conversation data. - No analytics, no telemetry, no "phone home". Full details in [privacy.md](privacy.md). ## Browser support - **Chrome** (primary target). - **Chromium-based browsers**: Edge, Brave, Arc, Opera, Vivaldi. All supported. - **Firefox**: not supported. - **Safari**: not supported. ## What it *doesn't* do (and won't) Scope discipline keeps the product sharp. The following are explicitly out of scope: - ❌ Editing, searching, or manipulating conversations inside Claude.ai (that's a different product category). - ❌ Syncing exports to cloud storage. Your OS already does this better. - ❌ Scheduled / automatic background exports without your click. This would require standing permissions we don't want. - ❌ Exporting conversations from other platforms (ChatGPT, Gemini, Copilot). Maybe in separate products — not this one. ## Related - [Pricing](pricing.md) - [Privacy model](privacy.md) - [Output format spec](../spec/) - [Changelog](changelog.md) ============================================================== FILE: docs/privacy.md ============================================================== # Privacy model AI Chat Archive is designed around one rule: **your conversation data never leaves your browser**. This page is the technical overview. For the question "does it send my data anywhere?" answered in plain English, see [faq/does-it-send-data-anywhere.md](../faq/does-it-send-data-anywhere.md). ## Threat model We assume a Claude.ai user who wants their conversation history backed up locally without: 1. Trusting a third-party cloud service with the full content of their chats. 2. Giving a third party their Claude session cookie. 3. Running unreviewable server-side code on their data. AI Chat Archive's architecture makes (1), (2), and (3) structurally impossible, not just promised. ## Data flows ### While exporting ``` ┌──────────────────────┐ ┌──────────────┐ ┌────────────────┐ │ AI Chat Archive │ read │ claude.ai │ │ Your disk │ │ (runs in your tab) │◀──────▶│ API │ │ (Downloads/) │ │ │ │ │ │ Renders PDF / HTML │─────────── write to ──────────▶│ │ │ / Markdown locally │ │ │ └──────────────────────┘ └────────────────┘ ``` There is no fourth box. No AI Chat Archive server, no proxy, no analytics pipeline. ### While activating a paid license ``` ┌──────────────────────┐ license key ┌──────────────┐ │ AI Chat Archive │────────────────▶│ polar.sh │ │ (popup UI) │◀────────────────│ (billing) │ │ │ valid / invalid │ │ └──────────────────────┘ └──────────────┘ ``` Only the license key travels, only to Polar, only during activation and periodic revalidation. Your conversations are never part of this traffic. ## What the extension is permitted to do Chrome enforces the permissions declared in `manifest.json`. AI Chat Archive declares: | Permission | Why it's needed | |---|---| | `host_permissions: ["https://claude.ai/*"]` | Read conversations and attachments via the same API Claude.ai's own web app uses. | | `host_permissions: ["https://api.polar.sh/*"]` | Validate paid license keys. | | `downloads` | Write exported files into the Downloads folder. | | `storage` | Remember user settings (format preference, timestamp style, license key). | The extension cannot reach any host not on this list. If the extension tried to POST your conversation to a third-party server, Chrome would block the request — the manifest is the ceiling of what it can do. ## Local storage The extension stores only the following in Chrome's `chrome.storage.local`: - Your format preferences (PDF / HTML / Markdown). - Your timestamp style. - Your license key, if activated. - Daily PDF export counter (free tier: 3 PDFs/day). Never stored: conversation content, attachment bytes, or any identifier tied to your Claude account. ## How to verify - Open Chrome DevTools → **Network** tab before clicking Export. - Every request is visible. You will see only `claude.ai` traffic during a conversation export, and — if applicable — a single round-trip to `api.polar.sh` during license activation. - Open the extension's `manifest.json` (via `chrome://extensions` → **Details** → **Inspect views: service worker** → the Sources tab). The declared permissions are authoritative. ## What this means in practice - If Claude.ai is down, export is down. There is no cached copy of your data anywhere outside your browser. - If you uninstall the extension, every byte it ever handled is gone — because nothing was ever persisted. - If AI Chat Archive, Inc. ceases operations tomorrow, your already-exported files keep working forever. They are plain PDF / HTML / Markdown on your disk with no DRM and no phone-home. ## Related - [FAQ: does it send my data anywhere?](../faq/does-it-send-data-anywhere.md) - [Pricing](pricing.md) ============================================================== FILE: docs/pricing.md ============================================================== # Pricing AI Chat Archive is free to try, paid to go beyond single-conversation exports. Prices listed here are in USD and may change. For the live price, always check the [buy page](https://aichatarchive.app/buy). ## Free tier No license required. Install from the Chrome Web Store and start exporting. - Export any **currently-open** conversation. - All 5 formats (PDF, HTML, Markdown, JSON, Plain text). - **3 PDF exports per day.** HTML / Markdown / JSON / TXT have no daily limit. - Advanced settings (timestamp format, thinking inclusion, tool-call inclusion). - A single attribution line at the footer of exported files. ## Paid tier — one license Unlocks everything. Pick the tier that matches how you use Claude: | Plan | Price | Who it's for | |---|---|---| | **Starter** | $3.99 | One month of full export, for a single cleanup or migration. | | **Pro (annual)** | $19 | Best value. Unlimited for a year. | | **Lifetime** | $29.88 | Pay once. Works forever, including all future features. | ### What every paid plan includes - **Bulk export** every conversation on your Claude account into a single ZIP. - **Include attachments** — uploaded files and Claude-generated `present_files` bundle alongside transcripts. - **Unlimited PDF exports** — no 3/day cap. - **No branding footer** on any exported file. - One license activates on **all your Chromium browsers on the same machine**. ## How purchase + activation works 1. Click **Get a license** in the extension popup, or go to [aichatarchive.app/buy](https://aichatarchive.app/buy). 2. Checkout is hosted by **Polar**, a fully-featured merchant-of-record. They handle VAT, receipts, refunds. 3. After payment you receive a license key via email. 4. Paste the key into the extension popup's **License key** field → **Apply**. 5. Green check mark = activated. The paid features unlock immediately. All conversation data stays on your machine throughout this flow. Polar only ever sees your email, payment details, and the license key — never your Claude content. ## Payment methods Via Polar: - All major credit cards (Visa, Mastercard, Amex, Discover). - Apple Pay, Google Pay. - PayPal. - SEPA bank transfer (EU). - Regional methods in some countries. ## Refund policy 30-day money-back guarantee, no questions asked. Email with your license key. Refunded licenses are revoked; the extension checks revocation status when it validates the license. After revocation, the extension returns to free-tier behavior. Already-exported files are yours to keep — we have no way to take them back, and we wouldn't want to. ## Volume / team licenses Buying for a team of 5+? Email for a quote. Typical discounts: - **5–24 seats**: -20% - **25–99 seats**: -35% - **100+ seats**: custom ## Upgrading between tiers Purchased Starter but want Lifetime? Email us with your Starter order ID; we'll credit the Starter price toward the Lifetime upgrade. ## Related - [FAQ: does it send my data anywhere?](../faq/does-it-send-data-anywhere.md) - [Features](features.md) ============================================================== FILE: docs/changelog.md ============================================================== # Changelog Release notes for AI Chat Archive. For a live feed of fixes between releases, see the [extension's Chrome Web Store listing](https://chromewebstore.google.com/detail/ai-chat-archive/jeocjmohgejjmlfdhdeddjceehpahblj). Versions follow Chrome's required numeric format (no semver suffixes). ## v0.2.119 — April 2026 - PDF quota-exceeded message wraps cleanly into two lines (fixes a layout shift). - Dev tooling + store-review assets moved out of the shipped bundle. ## v0.2.118 — April 2026 - Quieted the PDF-format hints; removed the `DEV-` license backdoor used only in development. ## v0.2.117 — April 2026 - Surfaced PDF format limitations inline (attachments can't bundle into a printed PDF, the thinking toggle does nothing in PDF) instead of letting users hit them. ## v0.2.116 — April 2026 - **"Include attachments" auto-enables on first license activation.** Past users who activate a license now get the ZIP-with-attachments experience by default, without hunting through advanced settings. ## v0.2.115 — April 2026 — Polar license validation - **New:** full online license validation against Polar. - Licenses are re-checked at install time and every 24 hours. - 7-day offline grace window: if validation can't reach Polar (offline, rate limit), the license keeps working. - Revoked licenses return the extension to free-tier behavior on next check. ## v0.2.114 — March 2026 - Fixed: popup version string now pulled from `manifest.json`, no more drift between the shipped version and what the popup displays. ## v0.2.113 — March 2026 - Fixed: **"Include tool calls & artifacts"** toggle now actually hides tool-call blocks from the exported transcript when disabled. ## v0.2.112 — March 2026 - PDF daily quota surfaces on the Export button when depleted, with inline Upgrade link. - Consolidated paid UI into a single card. Floating Export button on claude.ai can now be hidden via settings. ## v0.2.110 — March 2026 - **New:** PDF daily quota (3/day) for free tier. - Batch export and over-quota PDF routes go to the checkout link. ## v0.2.108 — March 2026 - PDF typography overhaul — headings, spacing, and code blocks now match Claude's own UI conventions. ## v0.2.105 — February 2026 - Fixed: PDF logo renders reliably across viewers. - Icon bundles transparent corners for clean display on colored backgrounds. - Added print-header tip for users on Chromium variants that strip `@page`. ## v0.2.102 — February 2026 — Designed branding - New custom icon. - Zoho-style branding footer on free-tier exports. - Tighter print spacing. ## v0.2.100 — February 2026 - Fixed: PDF export now opens reliably and produces readable output across Chromium variants. ## v0.2.95 — January 2026 — HTML + PDF launch - **New:** HTML export (free tier). - **New:** PDF export via the browser print pipeline (free tier). - Batch export gated behind paid tier. ## v0.2.90 — December 2025 - Branding footer on free-tier exports; paid license removes it. ## v0.2.85 — November 2025 - Fixed: `present_files` bundle correctly when they only appear in tool-use blocks. ## Format stability pledge Once a format is shipped, its structure is frozen in place unless the version signals a major change. Specifically: - Markdown headers (`# title`, `## Human (…):`, `## Claude (…):`) will not rename. - Attachment prefixes (`> 📎 Attachment:`, `> 📎 File:`) will not change. - ZIP layout (`{date}_{safe-title}/attachments/`) is frozen. Third-party importers can rely on these invariants. See the [format specs](../spec/) for details. ## Older versions Pre-0.2.85 releases were internal or private-alpha and are not documented here. ============================================================== FILE: spec/markdown-format.md ============================================================== # 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](../docs/changelog.md) and a new version string will appear in `llms.txt`. ## Document skeleton ```markdown # {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. - If Claude.ai did not give the conversation a title, the file uses `Untitled Conversation`. - Timestamps default to the user's browser locale. Users can switch to UTC or ISO-8601 in the extension's advanced settings; if they do, every timestamp in the file — including the metadata block and every `## Human (…)` / `## Claude (…)` heading — switches uniformly. ## Turn headings Each turn begins with an H2. Two senders are supported: ```markdown ## Human (2026-04-23 14:07): ## Claude (2026-04-23 14:07): ``` If the source message has no timestamp, the parenthetical is dropped: ```markdown ## Human: ## Claude: ``` Turns are separated by a blank line and a horizontal rule: ```markdown (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: ```markdown ## 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](zip-bundle-structure.md) 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_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). | ## Artifact example ```markdown ## Claude (2026-04-23 14:08): Here's the component: **Artifact: Login form (React)** ​```jsx export function LoginForm() { return
; } ​``` 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](#versioned-artifacts) below). ## Versioned artifacts If Claude rewrote an artifact across multiple turns, the Markdown file ends with an appendix: ```markdown --- ## 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: ```markdown --- 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 - The user's Claude account ID, workspace ID, or any other identifier. - HTTP fetch URLs for attachments (those resolve server-side and would rot). - Inline base64 of images — binary assets are always bundled separately in ZIP mode, or dropped in standalone Markdown mode. - Any tracking pixels, IDs, or referrer markers. ## Stability guarantees - **Stable since:** v0.2.0 (March 2026). - **Header format is stable**: `# {title}`, `## Human (…):`, `## Claude (…):` will not change without a major version bump. - **Attachment prefixes are stable**: `> 📎 Attachment:` and `> 📎 File:` — safe to regex for. - **Block rendering rules may be extended** — new `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](../docs/changelog.md) or watch this repository. ## Related - [HTML format](html-format.md) - [ZIP bundle structure](zip-bundle-structure.md) - [How does it handle Claude Artifacts?](../faq/how-does-it-handle-artifacts.md) ============================================================== FILE: spec/html-format.md ============================================================== # AI Chat Archive — HTML export format This document specifies the HTML representation AI Chat Archive produces when exporting a Claude.ai conversation to HTML. The HTML output is designed to be **self-contained** and look visually identical to Claude's own web UI in light mode. You can open the file in any browser — today or ten years from now — and the conversation renders correctly without any network access. ## Document skeleton ```html {Conversation title}

{Conversation title}

Created: {timestamp} · Updated: {timestamp}

Human

Claude

``` ## Key design choices - **Self-contained.** All CSS is inlined into a `