Skip to content

Web exports

Web products do not expose their conversation history through the normal local source scan. Download an official export, then pass the ZIP or extracted folder to its dedicated import command.

  1. Request an export from ChatGPT under Settings → Data Controls → Export Data, or use the OpenAI Privacy Portal.

  2. Download the export before its emailed link expires.

  3. Import the ZIP or extracted folder with an account label.

    Terminal window
    hansard import chatgpt /home/user/Downloads/chatgpt-export.zip \
    --username user@example.com \
    --scope local

Print the walkthrough in the terminal without beginning an import:

Terminal window
hansard import chatgpt --instructions

Privacy-portal exports can contain several Conversations__…chatgpt…part-0001 ZIPs or folders. Pass their parent User Online Activity folder so Hansard can combine all conversation parts, manifests, and attachments:

Terminal window
hansard import chatgpt \
"/home/user/Downloads/OpenAI-export/User Online Activity" \
--username user@example.com
  1. Open Claude on the web or in the desktop app and choose Settings → Privacy → Export data.

  2. Download the export from the emailed link while signed in.

  3. Import the ZIP or extracted directory.

    Terminal window
    hansard import claude-web /home/user/Downloads/claude-export.zip \
    --username example-account \
    --display-name "Example Account" \
    --scope local

Print the current provider instructions with:

Terminal window
hansard import claude-web --instructions

When the export includes Claude memory data, Hansard preserves it as supplementary, pinned memory conversations. Claude exports do not provide reliable creation or update timestamps for those records, so the archive marks their time as recovered but unknown.

A new ChatGPT or Claude.ai export account needs --username unless the export contains enough account metadata to infer one. The value identifies separate imports; --display-name controls the label shown in Hansard.

Terminal window
hansard import accounts list
hansard import accounts rename claude-web example-account \
--display-name "Documentation Account"

Use --scope local for a machine-local import. --scope team places the normalized web conversations in team-scoped storage and should be used only when that sharing boundary is intentional.

Repeated imports are safe: unchanged conversations with the same account and content fingerprint are skipped. Changed conversations are normalized again without duplicating the preserved export for every session.

Local Windsurf storage can contain readable plans alongside protobuf-only conversation bodies. Import a Download trajectory Markdown export to add the full readable transcript:

Terminal window
hansard import windsurf \
/home/user/Downloads/cascade-chat-conversation.md

If a local protobuf repair stub shows a claim token, replace that stub with the downloaded trajectory explicitly:

Terminal window
hansard import windsurf \
--claim ws-0123456789abcdef \
/home/user/Downloads/cascade-chat-conversation.md

Unclaimed imports can also point at a directory containing several downloaded trajectory Markdown files.

Each imported conversation receives the same metadata, transcript, events, Markdown, viewer payload, and attachment sidecars as a local-source session.

  • Run hansard doctor if a ZIP cannot be opened. ZIP imports require the unzip system tool; an extracted folder is an alternative.
  • Move the export to a readable local directory if the terminal cannot access the download location.
  • Import the parent folder when a ChatGPT export is split into several parts.
  • Supply --username when Hansard reports that a new account cannot be identified.
  • Add --json when a script needs imported and skipped counts.

See the archive layout for the raw and normalized data boundary.