An archive becomes useful when it can answer three different questions: What was said? What do I believe is current now? Why did it change?
One enormous “master” conversation cannot answer those questions reliably for years of material. Even when every old message is still visible, the useful details compete for a limited working context. The better design is less magical: preserve the evidence, maintain a small reviewed current-state layer, and rebuild search indexes whenever you need them.
Table of Contents
Keep the original export immutable
Begin with the account export you already control. Keep the downloaded archive unchanged in a private, backed-up location. Record when it was obtained and calculate a hash before converting anything:
sha256sum chat-export.zip > chat-export.zip.sha256
The hash does not prove that every statement inside is true. It proves that the file being processed later is the same file you preserved today.
Extract a working copy, then give every conversation and message a stable identifier. Preserve the original order, timestamps, role, text, attachment references, and source filename. A clean Markdown view is convenient for reading; a JSON or SQLite record is convenient for queries. Neither should replace the raw export.
OpenAI’s current ChatGPT usage guide describes data exports as files that can be attached for comparison, extraction, and reorganization, while also advising people to review important claims against the original sources. That is the right division of labour here: software can propose structure, but the archive should keep the evidence needed to check it.
Separate evidence from current state
Do not ask one summary to be both history and truth. Use two linked records.
An evidence record says what appeared in a particular conversation:
{
"id": "ev-2024-0612-0042",
"conversation_id": "chat-2024-0612",
"message_id": "msg-0042",
"observed_at": "2024-06-12T09:14:00Z",
"kind": "user_statement",
"text": "The project is waiting for a revised quotation.",
"review": "confirmed"
}
A current-state record says what should be treated as active now, and points back to the evidence that supports it:
{
"id": "state-project-orchid-status",
"subject": "project-orchid",
"field": "status",
"value": "waiting for revised quotation",
"effective_at": "2024-06-12",
"evidence": ["ev-2024-0612-0042"],
"reviewed_at": "2024-06-13",
"supersedes": "state-project-orchid-status-v1"
}
This small separation solves several hard problems at once. Old facts remain available for a timeline. Current tasks stay compact. A later correction does not erase the earlier record. Most importantly, a new answer can show why a field is current instead of asking the reader to trust a fresh summary.
For sensitive health-related notes, preserve the wording as a dated personal report, not as a diagnosis. The same rule applies more generally: record what the source actually supports, not the strongest interpretation a model can invent.
Give AI suggestions their own status
The easiest way for a suggestion to become a false fact is to store both in the same list. Add a small claims ledger with explicit states:
proposed— extracted or suggested, but not reviewed;confirmed— accepted by the owner and supported by cited evidence;rejected— checked and found unsuitable or incorrect;superseded— once current, but replaced by a later confirmed record;uncertain— worth retaining, but not safe to use as current state.
New conversations may create proposed updates. They should not silently change the current-state files. A review can accept, edit, reject, or merge each proposal. Save that decision and its time as another event rather than overwriting the evidence.
This is slower than accepting every generated summary. It is much faster than discovering months later that an abandoned idea has become an active plan, or that a model’s guess has become part of a personal history.
Make the indexes disposable
Your source records and review decisions are the durable system. Search indexes are replaceable views.
Start with metadata and full-text search. Index the conversation ID, date, people or project tags, record type, review state, and text. Add embeddings only if real searches fail because the same idea is described with different words. Keep the chunk-to-message mapping so every result can reopen the original surrounding messages.
Use different paths for different questions:
- “What is active now?” reads the current-state records first.
- “How did this change?” reads the dated evidence and supersession links.
- “Where did this come from?” opens the exact source message and nearby context.
- “What might I have forgotten?” searches confirmed and uncertain evidence, but does not promote it to current state.
If the database or vector store breaks, rebuild it from the records. If the records exist only inside the index, the index has quietly become another fragile master chat.
Process the backlog in checkpoints
Do not feed hundreds of conversations into one review session. Work in bounded batches and finish each batch before starting the next:
- Normalize the source conversations without interpreting them.
- Extract candidate evidence records with exact message references.
- Review only the candidates that could change current state, a timeline, or a retained project record.
- Write accepted state changes and rejection decisions.
- Run a small set of known questions and open every cited source.
- Save a checkpoint manifest with counts, hashes, exceptions, and the last processed source ID.
The next batch begins from the durable files and checkpoint, not from the previous model conversation. A failed or exhausted chat can be discarded without losing completed work.
Use a folder structure you can inspect
A plain layout is enough:
archive/
├── raw/ # unchanged exports and hashes
├── conversations/ # normalized messages with stable IDs
├── evidence/ # cited facts, decisions, tasks, and events
├── state/ # small reviewed current-state records
├── reviews/ # accepted, rejected, and superseded proposals
├── indexes/ # rebuildable full-text or vector indexes
└── manifests/ # checkpoints, versions, and validation results
Back up the durable folders separately from the indexes. Keep private archives encrypted and avoid uploading the whole collection to a service merely to test whether the architecture works.
Before trusting it, write ten questions whose answers you already know: a current task, an obsolete plan, a changed date, a decision, a contradiction, and several exact-source lookups. The system passes only when it returns the right state and lets you inspect the source that justifies it.
Inspect a small working pattern
I built a small source-to-decision example that keeps a transcript immutable, turns reviewed passages into typed records, and preserves a correction as a superseding event. Its downloadable JSON shows the evidence and state pattern without requiring a large context window. Local Knowledge Terminal is the public project behind that provenance work.
The example uses project-written meeting material; it is not a finished ChatGPT importer. The useful part is the contract: source records do not move, current state is reviewed, corrections remain visible, and indexes can be rebuilt.
If you have a private archive that fits on one existing machine, the USD 250 Local Knowledge Terminal collection-fit sprint can test up to 12 representative source units and 20 real questions before a larger build. It starts with a free fit check; no archive upload or payment is needed to establish the scope.
The goal is not to make one model remember everything. It is to make forgetting recoverable.
