# ChatGPT, Claude.ai, and Gemini exports

> Import conversation exports from ChatGPT, Claude.ai, and Gemini into your archive, in the app or from the CLI.

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](https://www.hansard.dev/imports/notebooklm/). The picker also offers
**Gemini Notebook / NotebookLM**, which accepts one ZIP or an extracted folder.

## Import in the app

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.

> **Exports contain private account data:** Keep downloaded exports and your Hansard archive on storage you trust.
> [Redaction](https://www.hansard.dev/privacy/redaction/) covers the conversations Hansard shows
> and searches, but the archived copy of the original export is not redacted.

## ChatGPT

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.

   ```sh
   hansard import chatgpt /home/user/Downloads/chatgpt-export.zip \
     --username user@example.com
   ```

To print these steps in the terminal without importing anything:

```sh
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:

```sh
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:

```sh
hansard memory import chatgpt /home/user/Downloads/chatgpt-memories.txt
```

## Claude.ai

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.

   ```sh
   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:

```sh
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.

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

```sh
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**.

## Gemini

Use [Google Takeout to download your data](https://support.google.com/accounts/answer/3024190?hl=en),
then select Gemini Apps activity as follows:

1. Open [Google Takeout](https://takeout.google.com/) 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.

   ```sh
   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)

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:

```sh
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](https://www.hansard.dev/imports/muse-code/).

## Qwen Chat

Qwen Chat downloads one chat at a time as JSON. Import the file from the CLI
with an account label:

```sh
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.

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

```sh
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`:

```sh
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

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

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

**Conversations**

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.

**Original export**

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

### 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?

No. Copy them from ChatGPT's **Manage memories** page into a text file, then run
`hansard memory import chatgpt <file>`. See
[Import ChatGPT memories](https://www.hansard.dev/guides/memories/#import-chatgpt-memories).

## 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.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](https://www.hansard.dev/reference/archive-layout/) for how the archive
stores original exports.
