ChatGPT, Claude.ai, and Gemini exports
ChatGPT, Claude.ai, and Gemini keep your conversations in your online account, not on your machine. To add them to your archive, download an export from the service, then import the ZIP or extracted folder in the app or from the CLI.
Gemini Notebook (formerly NotebookLM) has a separate NotebookLM Takeout importer. The picker also offers Gemini Notebook / NotebookLM, which accepts one ZIP or an extracted folder.
Import in the app
Section titled “Import in the app”-
Open Settings → Imports and select Import export…. First-run setup leaves exports for this step, once the archive exists.
-
Under Export from, choose the provider that created the export.
-
Under Archive account, choose an existing account, or keep New account and enter an Account label or email. Choose the same account again for later exports from that account.
-
Under Export files, select Choose files… for the export ZIPs or JSON files, or Choose folder… for an extracted export. Include every part of a split export and its attachments.
-
Select Import, and keep the page open until the files finish copying.
The import then continues in the background. The Imports list on the same page shows its status, even after you close and reopen the page. If you select Cancel import, the conversations already imported stay in the archive. The app includes everything the import needs, so you do not need to install the CLI.
The app first copies the files locally and checks that the disk has room for the export plus a 2 GB reserve. One import can include up to 20 GB and 20,000 files. When the import finishes, Hansard deletes its temporary copies. Your downloaded files stay where they are, and the archive keeps a copy of the original export.
ChatGPT
Section titled “ChatGPT”-
In ChatGPT, open Settings → Data Controls → Export Data and request an export, or request one from the OpenAI Privacy Portal.
-
Download the export before the link in the email 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
To print these steps in the terminal without importing anything:
hansard import chatgpt --instructionsPrivacy Portal exports can arrive as several Conversations__…chatgpt…part-0001
ZIPs or folders. Pass their parent User Online Activity folder so Hansard
combines every conversation part, manifest, and attachment:
hansard import chatgpt \ "/home/user/Downloads/OpenAI-export/User Online Activity" \ --username user@example.comChatGPT exports do not include your saved memories. To archive them, copy them from ChatGPT’s Settings → Personalization → Manage memories into a text file, then import it:
hansard memory import chatgpt /home/user/Downloads/chatgpt-memories.txtClaude.ai
Section titled “Claude.ai”-
In Claude on the web or in the desktop app, open Settings → Privacy → Export data.
-
Download the export from the link in the email while you are signed in. Claude exports arrive as a manifest JSON file plus split ZIPs such as
conversations-000.zip,memories-000.zip,projects-000.zip,light_metadata-000.zip, andframes-000.zip. -
Import the manifest, any one of the ZIPs, or their parent folder.
Terminal window hansard import claude-web /home/user/Downloads/manifest-claude-export.json \--username example-account \--display-name "Example Account"
To print these steps in the terminal:
hansard import claude-web --instructionsWhen the export includes Claude memories, Hansard adds them to Memories as
read-only Claude.ai records. The main conversation memory, each project’s
memory, and each per-file memory under memories/<account-uuid>.json become
separate items. Claude’s older memory data has no reliable creation or update
times, so the app shows that the time is unknown instead of inventing one.
Per-file memories keep the updated_at time Claude recorded.
Rebuild from the preserved export
Section titled “Rebuild from the preserved export”Hansard can rebuild Claude.ai conversations from the export it preserved at import, without the downloaded original or a signed-in browser:
hansard rebuild --from-raw --source-type claude-web-exportDesign chats in the export keep their text, thinking, tool calls and output, attachment descriptors, and project. Run the rebuild to add them to an export imported earlier. Design chats from an export and from the browser extension stay separate conversations.
Replay supports ZIP, JSON, folder, and combined export inputs. It verifies the preserved files and matches the account and conversation identities before rebuilding. A missing or changed file stops that conversation’s rebuild.
When captures and exports both shaped a Claude.ai conversation, replay follows
the order its import recorded them in. A conversation archived before Hansard
kept that record refuses replay and keeps its archive, which can hold files the
latest inputs lack. For a copy that replays, import the export and captures
into a separate, empty archive (another HANSARD_HOME). Legacy
conversation-style memory exports remain unsupported by raw replay. Current export memories remain separate
read-only records under Memories.
Gemini
Section titled “Gemini”Use Google Takeout to download your data, then select Gemini Apps activity as follows:
-
Open Google Takeout and choose Deselect all.
-
Select My Activity, open All activity data included, and select only Gemini Apps.
-
Open the My Activity format options and choose JSON or English HTML.
-
Choose Next step, Export once, and ZIP, then create the export.
-
Download the export, then import it with Import export… in Settings → Imports, choosing Gemini, or from the CLI.
Terminal window hansard import gemini-web /home/user/Downloads/takeout.zip --username Personal
The separate Gemini product in Takeout exports Gems. Your chats are under
My Activity. To print these steps in the terminal, run
hansard import gemini-web --instructions.
Hansard accepts ZIPs, extracted folders, MyActivity.json, and MyActivity.html. Select every
ZIP part of a split download together, and include the media files when you
choose an extracted folder. HTML requires English activity labels and zoned
timestamps. Choose JSON for other locales, full timestamp precision, or
generated-media references that HTML can omit even when the ZIP includes the
files. Unlinked files remain in the raw ZIP without guessed message associations.
Hansard groups activity into conversations by each chat’s Gemini link, orders turns by activity time, and keeps prompts without a chat link as separate conversations. Activity that is not a chat, such as opening Gemini, is skipped. Responses are converted from HTML to Markdown, and uploaded or generated media is kept. Takeout sometimes leaves out responses, and Hansard does not rebuild them. Each response uses its activity’s time, because Takeout records no separate response time.
Takeout includes no models, tool calls, or token usage. Any token counts
estimated from text are marked as estimates. Takeout also does not identify
your account: enter an account label on the first import, then choose the same
account, or pass --account-id <id>, for later exports.
Muse (Personal Agent)
Section titled “Muse (Personal Agent)”Muse (Personal Agent) exports import from the CLI. In Muse, open Settings → Data controls → Download your agent data, then import the ZIP or extracted folder with an account label:
hansard import muse-agent /home/user/Downloads/muse-export.zip --username PersonalUse the same label, or --account <id-or-label>, for every later export of
that account. Hansard keeps one timeline per account, because the export names
no account or conversation. A later export adds its new turns, and the
workspace files it bundles stay in the archive as original files. If a
workspace file the export lists is missing or does not match its declared
size, the import stops without changing your archive. Exports whose
workspace file names contain colons import as well; run the import again with
the same label for one that an earlier version rejected. The export
records no models, usage, or tool calls. Muse Code is a separate source; see
Muse Code.
Qwen Chat
Section titled “Qwen Chat”Qwen Chat downloads one chat at a time as JSON. Import the file from the CLI with an account label:
hansard import qwen-chat /home/user/Downloads/chat-export.json --username PersonalUse the same label, or --account <id-or-label>, for later downloads of that
account. The download names its Qwen account, so Hansard refuses one from a
different account. Each file holds one chat of up to 32 MiB, and bulk or
archived exports are not accepted. Qwen leaves some citations and the original
bytes of attached files out of the download, so the archive cannot restore
them. When the browser extension already captured the chat, the captured
history takes precedence. Import export… in the app does not offer Qwen
Chat yet.
Accounts across imports and devices
Section titled “Accounts across imports and devices”Every export belongs to an account in your archive. A new ChatGPT, Claude.ai,
or Gemini account needs --username unless the export identifies the account
itself. --display-name sets the name the app shows.
hansard import accounts listhansard import accounts rename claude-web example-account \ --display-name "Documentation Account"When an export includes the service’s account ID, Hansard uses the same account on every device. Personal Sync keeps one copy of each conversation per service, account, and conversation ID, and keeps every original export. Account labels and links sync with your profile settings.
When an export has no account ID, Hansard creates one from the export’s
contents. Two such exports stay separate accounts even if you enter the same
label. To add a later export to an existing account, choose it under Archive
account or pass --account-id <id>. To merge two accounts, link them with
the IDs from hansard import accounts list:
hansard accounts link chatgpt <source-account-id> <target-account-id>Importing the same export again is safe. Unchanged conversations are skipped, and changed ones are updated without storing another copy of the whole export. An older export never replaces a newer copy of a conversation.
Imports are recorded as local by default. Pass --scope team only if you want
the imported conversations recorded as team-scoped.
Review an export in the app
Section titled “Review an export in the app”Open Sessions, select Filter & sort, make sure Web is on under Include, and set Source to ChatGPT, Claude.ai, or Gemini. Exported conversations belong to an account rather than a project folder, so look for them by account label and title. Select a conversation to see its messages, attachments, timestamps, and model, with anything the export left out marked as not recorded. Claude.ai records the model selected for each conversation rather than the model behind each reply, so the conversation and Stats show that selected model. When a Claude.ai or Gemini conversation names no model at all, they show Unknown Claude model or Unknown Gemini model instead of guessing.
Claude.ai memories appear under Memories. Choose Claude.ai in the memory list and open an item to see its content, the account it came from, and a note that it is read-only.
What the provider reports
Section titled “What the provider reports”For ChatGPT and Claude.ai, Hansard also keeps what the provider reports about each conversation: its model, settings such as web search or memory, whether it is starred, archived, or temporary, its project with the project’s description and instructions, how many branches it has, and how its messages relate to each other. Open Show details in a conversation and select the row named for the provider to see them. Fields Hansard does not recognize, and steps it could not read, are listed there too.
When the browser extension also captures a conversation, each detail shows its most recently observed value, whichever source reported it. Claude.ai captures also read the names and sizes of the project’s documents, never their contents. Other branches of a Claude.ai or ChatGPT conversation open from the capture under Branches in the provider’s record in the Details panel, redacted as the transcript is; they are not added to the transcript or its totals.
To add these details to conversations imported before an upgrade, import the export again.
What Hansard keeps
Section titled “What Hansard keeps”Each imported conversation gets the same files as a conversation from a local harness: its details, transcript, events, a Markdown copy, the app’s view of it, and its attachments.
Hansard keeps one copy of the export ZIP, or of the files it read from an extracted folder. Every conversation from that export refers to this one copy instead of storing its own.
Common questions
Section titled “Common questions”Can I search ChatGPT and Claude.ai conversations with my coding agent history?
Section titled “Can I search ChatGPT and Claude.ai conversations with my coding agent history?”Yes. Imported conversations join the same archive, so one search in
Sessions or hansard history covers them too. Agents that search through
recall skip imported web chats unless they ask for them.
Does the ChatGPT export include my ChatGPT memories?
Section titled “Does the ChatGPT export include my ChatGPT memories?”No. Copy them from ChatGPT’s Manage memories page into a text file, then run
hansard memory import chatgpt <file>. See
Import ChatGPT memories.
Troubleshoot an export
Section titled “Troubleshoot an export”- If a ZIP does not open, it may be damaged. Extract it and import the extracted folder instead.
- If the terminal cannot read your downloads folder, move the export to a folder it can read.
- For a ChatGPT export split into several parts, import the parent folder.
- For a Claude.ai export split into
conversations-000.zipand other ZIPs, import the manifest or the parent folder. - If Hansard reports that it cannot identify a new account, add
--username. - Add
--jsonwhen a script needs the imported and skipped counts.
See Archive layout for how the archive stores original exports.