Our own proposal: tag every chunk of your history with who wrote it, because without a role filter a search mostly returns the assistant's text. In a real ChatGPT export of 1,462 conversations split into 152,760 chunks, 125,485 (82.1%) were written by the assistant and 25,813 (16.9%) by the person.
On October 27, 2026 we indexed three real exports with ModelBrain 0.6.6 on a Mac and counted the chunks by who wrote them. Chunks carry a role tag, user or assistant, and none carries both.
| Export | Conversations | Chunks | You wrote | The assistant wrote |
|---|---|---|---|---|
| ChatGPT | 1,462 | 152,760 | 25,813 (16.9%) | 125,485 (82.1%) |
| Claude | 223 | 83,621 | 17,509 (20.9%) | 65,889 (78.8%) |
| Grok | 309 | 9,525 | 1,347 (14.1%) | 7,869 (82.6%) |
The remainder carry neither tag, one per conversation (1,462 of the 152,760 ChatGPT chunks). Indexing took 118 seconds for ChatGPT, 23 for Claude and 6 for Grok.
In the ChatGPT export there are 4.9 assistant chunks for every chunk you wrote. A search of your own history that ignores who spoke will mostly return the model's side of the conversation, including answers you never agreed with. The question you asked, which is usually the better clue to what you were working on, is the minority.
Store the role with each chunk when you import, so a search can be narrowed to your own words or widened to the whole exchange. Doing it at import time is cheap. Doing it afterward means re-reading the export and guessing from formatting. The three exports make guessing harder than it looks: ChatGPT uses user and assistant, Claude uses sender with human and assistant values, and Grok writes the assistant three ways (details here).
Walk each conversation from current_node to the root so abandoned branches are not counted (how that works), split the text into chunks, and tally by author.role. Skip conversations with is_do_not_remember set. The Claude equivalent is described in our Claude export guide.