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 imports it into the first-class memory archive as read-only Claude.ai records. Claude exports do not provide reliable creation or update timestamps for those records, so the memory view marks that provider limitation instead of inventing a timeline.
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.
Review an export in the app
Section titled “Review an export in the app”Open Conversations, make sure Web is enabled under Filter & sort → Include, then choose ChatGPT or Claude.ai under Source. Imported web conversations are account-scoped rather than repository-scoped, so start with the account label and conversation title instead of a project folder. Select a result to inspect its available messages, attachments, timestamps, model attribution, and explicit Not recorded fields.
Claude.ai memory records appear separately under Memories. Select the Claude.ai provider in the memory list and open an item to see its content, account provenance, and read-only provider note. A downloaded Windsurf trajectory appears in Conversations under the Windsurf source like its local history.
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.