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.
ChatGPT
Section titled “ChatGPT”-
Request an export from ChatGPT under Settings → Data Controls → Export Data, or use the OpenAI Privacy Portal.
-
Download the export before its emailed link expires.
-
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:
hansard import chatgpt --instructionsPrivacy-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:
hansard import chatgpt \ "/home/user/Downloads/OpenAI-export/User Online Activity" \ --username user@example.comClaude.ai
Section titled “Claude.ai”-
Open Claude on the web or in the desktop app and choose Settings → Privacy → Export data.
-
Download the export from the emailed link while signed in.
-
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:
hansard import claude-web --instructionsWhen 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.
Account labels and scope
Section titled “Account labels and scope”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.
hansard import accounts listhansard 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.
Windsurf trajectories
Section titled “Windsurf trajectories”Local Windsurf storage can contain readable plans alongside protobuf-only conversation bodies. Import a Download trajectory Markdown export to add the full readable transcript:
hansard import windsurf \ /home/user/Downloads/cascade-chat-conversation.mdIf a local protobuf repair stub shows a claim token, replace that stub with the downloaded trajectory explicitly:
hansard import windsurf \ --claim ws-0123456789abcdef \ /home/user/Downloads/cascade-chat-conversation.mdUnclaimed imports can also point at a directory containing several downloaded trajectory Markdown files.
What is preserved
Section titled “What is preserved”Each imported conversation receives the same metadata, transcript, events, Markdown, viewer payload, and attachment sidecars as a local-source session.
Hansard copies the source ZIP or relevant extracted files into one shared, content-hashed raw export area. Session manifests refer to that copy rather than duplicating the entire account export for every conversation.
Troubleshooting an export
Section titled “Troubleshooting an export”- Run
hansard doctorif a ZIP cannot be opened. ZIP imports require theunzipsystem 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
--usernamewhen Hansard reports that a new account cannot be identified. - Add
--jsonwhen a script needs imported and skipped counts.
See the archive layout for the raw and normalized data boundary.