Skip to content

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.

  1. Open Settings → Imports and select Import export…. First-run setup leaves exports for this step, once the archive exists.

  2. Under Export from, choose the provider that created the export.

  3. 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.

  4. 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.

  5. 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.

  1. In ChatGPT, open Settings → Data Controls → Export Data and request an export, or request one from the OpenAI Privacy Portal.

  2. Download the export before the link in the email 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

To print these steps in the terminal without importing anything:

Terminal window
hansard import chatgpt --instructions

Privacy 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:

Terminal window
hansard import chatgpt \
"/home/user/Downloads/OpenAI-export/User Online Activity" \
--username user@example.com

ChatGPT 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:

Terminal window
hansard memory import chatgpt /home/user/Downloads/chatgpt-memories.txt
  1. In Claude on the web or in the desktop app, open Settings → Privacy → Export data.

  2. 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, and frames-000.zip.

  3. 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:

Terminal window
hansard import claude-web --instructions

When 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.

Hansard can rebuild Claude.ai conversations from the export it preserved at import, without the downloaded original or a signed-in browser:

Terminal window
hansard rebuild --from-raw --source-type claude-web-export

Design 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.

Use Google Takeout to download your data, then select Gemini Apps activity as follows:

  1. Open Google Takeout and choose Deselect all.

  2. Select My Activity, open All activity data included, and select only Gemini Apps.

  3. Open the My Activity format options and choose JSON or English HTML.

  4. Choose Next step, Export once, and ZIP, then create the export.

  5. 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) 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:

Terminal window
hansard import muse-agent /home/user/Downloads/muse-export.zip --username Personal

Use 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 downloads one chat at a time as JSON. Import the file from the CLI with an account label:

Terminal window
hansard import qwen-chat /home/user/Downloads/chat-export.json --username Personal

Use 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.

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.

Terminal window
hansard import accounts list
hansard 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:

Terminal window
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.

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.

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.

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.

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.

  • 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.zip and other ZIPs, import the manifest or the parent folder.
  • If Hansard reports that it cannot identify a new account, add --username.
  • Add --json when a script needs the imported and skipped counts.

See Archive layout for how the archive stores original exports.