convoviz
Turn your ChatGPT data export into a folder of Markdown notes you own, plus a page of charts about how you've used ChatGPT.
- One readable note per conversation. Each note has its properties (dates, models, message count), your prompts and the answers, and its sources as footnotes. Reasoning, code and tool output are folded away. Charts become tables, shopping picks become lists, and drafted emails and posts become labelled sections. Edited and regenerated replies are kept too, folded at the point where they branch.
- Works with today's exports. That includes split exports (
conversations-000.json…), attachments stored as.datfiles, ZIPs nested inside ZIPs, and multi-part downloads. Unknown content is kept as plain text and reported, never dropped silently. - Safe to re-run. Run it again on a newer export and only changed conversations are rewritten. Notes you've edited, moved or deleted are respected.
- Made for Obsidian, and readable anywhere. The notes are plain CommonMark/GFM, so they also render on GitHub, in VS Code, or as text. The archive comes with a
Conversations.basetable view. - Private. Everything runs on your computer, and nothing is sent anywhere.
Quick start
1. Get your export. In ChatGPT, go to Settings → Data controls → Export data. OpenAI emails you a download link, and the ZIP lands in your Downloads folder.
2. Install convoviz. It needs uv, which also takes care of Python:
uv tool install convoviz
No uv yet? One-line installers
macOS / Linux:
curl -LsSf https://raw.githubusercontent.com/mohamed-chs/convoviz/main/install.sh | sh
Windows (PowerShell):
powershell -ExecutionPolicy ByPass -c "irm https://raw.githubusercontent.com/mohamed-chs/convoviz/main/install.ps1 | iex"
Both install uv if it's missing, then convoviz.
3. Run it.
convoviz
convoviz finds the newest export in your Downloads folder, asks you to confirm, and writes the archive to ~/Documents/ChatGPT Archive. To choose the input or output yourself:
convoviz ~/Downloads/chatgpt-export.zip -o ~/Notes/ChatGPT
You can also pass an extracted folder or a bare conversations.json. If OpenAI split your export into …-part-0001.zip, …-part-0002.zip, …, pass any one of them and the other parts are picked up automatically.
What you get
ChatGPT Archive/
├── conversations/
│ └── 2026/
│ └── 2026-03-14 Planning a trip to Kyoto.md
├── attachments/ your uploads and generated images
├── canvas/ the final version of each Canvas document (.md, .py, …)
├── index.md every conversation, newest first
├── Custom instructions.md each version of your custom instructions
├── Conversations.base a sortable table in Obsidian
└── insights.html charts and word clouds of how you've used ChatGPT
A note looks like this:
---
title: "Planning a trip to Kyoto"
created: 2026-03-14T09:30:12
updated: 2026-03-14T10:02:45
source: "chatgpt"
conversation_id: "67d3…"
url: "https://chatgpt.com/c/67d3…"
models:
- "gpt-5-5-thinking"
messages: 6
tags:
- "chatgpt"
---
# Planning a trip to Kyoto
## You · 2026-03-14 09:30
Three days in Kyoto in April — what should I not miss?
## ChatGPT · 2026-03-14 09:31
<details>
<summary>Thought for 8s</summary>
…
</details>
Fushimi Inari early in the morning, before the crowds[^1]. …
[^1]: [Fushimi Inari Taisha](https://inari.jp/en/) — inari.jp
insights.html is a single self-contained file: your activity calendar, when in the week you ask, models and features over time, and word clouds of what you asked about, for all years and for each year on its own. Open it in any browser; it works offline, in light and dark mode, and each word cloud can be saved as an image.
Updating your archive
Request a new export whenever you like and run convoviz again on the same output folder:
- new and changed conversations are written, and unchanged ones are left alone;
- a conversation renamed in ChatGPT has its note renamed too;
- notes you've edited are kept as they are. If the conversation has newer messages, the summary tells you (
--forcereplaces your version); - notes you moved or renamed (into your own folders, say) are found again and updated where they are;
- notes you deleted stay deleted (
--forcebrings them back); index.md,Conversations.baseandinsights.htmlare refreshed, unless you changed them;- conversations missing from the new export are kept, since exports are sometimes incomplete.
convoviz recognizes its notes by their conversation_id property, and keeps track of what it wrote in .convoviz/state.json inside the output folder. You can point it at an existing Obsidian vault: it never overwrites files it didn't create.
Options
| Flag | |
|---|---|
-o, --output PATH |
Output folder (default ~/Documents/ChatGPT Archive). |
--layout year|flat |
One folder per year (default) or a single folder. |
--branches all|active |
Keep edited/regenerated alternatives folded (default), or only the branch you last viewed. |
--timezone ZONE |
Time zone for dates, e.g. Europe/Paris (default: your computer's). |
--no-insights |
Skip insights.html. |
--force |
Overwrite notes and files you edited, and recreate notes you deleted. |
-y, --yes |
Don't ask before using the export found in Downloads. |
-q, --quiet / -v, --verbose |
Less or more output. |
To make settings permanent, run convoviz config init and edit the file it creates. convoviz config path shows where it is. In that file you can also rename the turn labels ("You", "ChatGPT"), hide timestamps, reasoning or tool output, set the tags added to every note, and list words to leave out of the word clouds.
PDFs
To turn notes into PDFs, try convpdf:
npm install -g convpdf
cd ~/Documents/"ChatGPT Archive"
convpdf "conversations/**/*.md" -o PDF/
Something looks wrong?
ChatGPT's export format is undocumented and changes often. When convoviz meets something new, the end-of-run summary says so. To report it:
convoviz inspect --json ~/Downloads/chatgpt-export.zip
This prints a description of the export's structure only: field names, content types and counts. It never includes titles, message text, links, file names or ids. Paste it into a bug report. Please don't attach your export itself.
Notes
- Coming from convoviz 0.x? 1.0 writes to a new folder,
~/Documents/ChatGPT Archive, and leaves your oldChatGPT-Datafolder alone. Don't point it at the old folder: 1.0 would treat the old notes as ones you edited and keep them. If you made a config file with 0.x, runconvoviz config init --forceto get the new format. - Business, Enterprise and Edu workspaces can't use ChatGPT's export feature. That's an OpenAI limitation, and convoviz needs the export.
- Images missing? Some 2026 exports leave out generated images or library files on OpenAI's side. convoviz puts a placeholder in the note and counts what's missing in the summary.
- Custom instructions are collected in
Custom instructions.md, one section per version, with the dates each was in use. Saved memories are not written anywhere.
Contributing
Ideas, quirks, or just a note that it worked for you: open an issue. If convoviz is useful to you, a ⭐ helps others find it.
See CONTRIBUTING.md. For how the code fits together, see docs/dev/architecture.md. What's known about the export format is in docs/dev/export-format.md.
License
MIT
Metadata
Release files for convoviz 1.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| convoviz-1.0.0.tar.gz | 74.7 kB | With provenance | Details for convoviz-1.0.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| convoviz-1.0.0-py3-none-any.whl | Python 3 | none | any | Details for convoviz-1.0.0-py3-none-any.whl |
Total release size: 157.4 kB
Release files / convoviz-1.0.0.tar.gz
| Download URL | convoviz-1.0.0.tar.gz |
|---|---|
| Size | 74.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
5355db63af08a16c06ef7505374a9ebed4057d3101d2d9df562362cceba64106
|
|
BLAKE2b-256 checksum How to use checksums |
47e0442dc9b81eb9cc93c75b0e9c608a9dd42a53c01b8a65a4f02968370b8208
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 4, 2026.
Transparency logRelease files / convoviz-1.0.0-py3-none-any.whl
| Download URL | convoviz-1.0.0-py3-none-any.whl |
|---|---|
| Size | 82.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
332bcc8353398988786397af1bdac5372d9c15f86403593c7eb4746c63b71358
|
|
BLAKE2b-256 checksum How to use checksums |
06e8830e29536c9d529d28e52cea6242f278dac5feea79378424ebb2de315919
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 4, 2026.
Transparency logSecurity for convoviz 1.0.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for convoviz-1.0.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 4, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.