ChatGPT's export is a DAG (directed acyclic graph) where edits create branches. Claude uses typed content blocks with tool_use/tool_result structures. Gemini is in Google Takeout. Cursor is local SQLite. Perplexity has citation arrays. They're all just conversations, but none are interoperable.
AMP normalizes all 8 into one schema. One command:
npx @purmemo.ai/migrate import conversations.json
It auto-detects the platform and outputs clean, chronological JSON.v0.2 (just shipped) adds Level 3 — full fidelity:
- content_parts[] — a discriminated union of 7 types (text, image, code, tool_use, tool_result, citation, thinking). A Claude response with tool calls preserves the actual structure. ChatGPT multimodal messages keep images. Extended thinking is captured, not discarded.
- alternates[] — ChatGPT's edit history. When you rephrase and regenerate, AMP captures all branches, not just the canonical path.
- observed_at — bi-temporal: when the converter ran vs when the platform created the conversation. Makes dedup and incremental sync reliable.
The spec is layered: Level 1 = 4 required fields (trivially implementable). Level 2 = timestamps + model + provenance. Level 3 = rich content + branches. Backward compatible — the plain text content field stays required at every level.
Everything is Apache 2.0. Schema is Zod + TypeScript. Converters are pure functions — no network calls, no accounts, runs entirely on your machine.
This is the open-source layer of pūrmemo (https://purmemo.ai), a cross-platform AI memory layer. But AMP is designed to stand alone — if someone builds a competing product on the same format, that's the point. Think IMAP for AI conversations.
Happy to answer questions about the schema design, the per-platform quirks, or anything else.