A practical recovery kit for scattered histories
AI coding assistants accumulate valuable records in incompatible places. Claude Code and Codex use event-oriented JSONL, Cursor and Windsurf keep important state in SQLite, Gemini CLI uses project-hash directories, and OpenCode spreads sessions, messages, and parts across files. AI Data Extraction collects dedicated scripts for eight clients and writes a more approachable JSONL record for each conversation.
The appeal is breadth. Exports can include prompts, assistant answers, models, timestamps, working directories, selected code, proposed diffs, tool calls, and command results. That is more useful than a text-only transcript when the goal is auditing past work, moving personal history, or preparing examples for a private experiment. Each conversation becomes one JSON line, making the result easy to stream, filter, compress, or load into common dataset software.
This is extraction code, not a training pipeline. The README includes a small fine-tuning example, but it does not normalize every client's events into a strict common schema, remove secrets, decide data rights, score answer quality, or create train and evaluation splits. That separation is healthy if users understand it.
The scripts are refreshingly direct
Installation is little more than a clone and Python 3.6 or newer. The individual extractors use the standard library, including json, pathlib, and sqlite3, so there is no environment resolver or service to operate. Each script discovers likely client directories by operating system and saves a timestamped file under extracted_data. The shell wrapper runs all eight in sequence and creates a combined file.
The source is readable enough to audit. Cursor's extractor accounts for several generations of its storage, including old chat records, inline Composer conversations, separate bubble records, and later agent data. The OpenCode extractor understands both CLI and desktop locations. The Claude Code and Codex scripts walk project or date-based session trees. Read-only SQLite mode is used in the Cursor paths, reducing the chance that extraction interferes with the original database.
There is no common command-line interface, however. You cannot pass an output directory, custom source root, date range, client selection, or redaction policy as normal flags. The README tells users with unusual paths to edit a function. That is tolerable for a one-off recovery and awkward for a repeatable internal process. Some parsers also catch malformed JSON or broad exceptions and continue, which helps salvage a damaged collection but can turn missing records into a warning or silence rather than a failed job.
Complete is an ambition, not a guarantee
The README repeatedly describes complete extraction, then correctly lists partial and deleted conversations among data that may be missing. The second statement is the one to plan around. These clients do not publish a stable shared archive format. A client update can rename a key, split messages differently, move a database, or add an event the parser ignores.
Current project history illustrates that maintenance burden. OpenCode support landed in January 2026, while an open pull request later proposed support for its newer SQLite storage. Other open contributions add more assistants and packaging changes. Those patches show continued demand, but they do not help users of the main branch until reviewed and merged. There are no fixtures or automated tests in the repository to demonstrate that old and current formats still produce equivalent conversations.
The combined shell script has a concrete repeat-run trap. It counts and concatenates every *.jsonl already in extracted_data. Because individual exports are timestamped and earlier combined exports remain there, a second run can include yesterday's records alongside today's and can fold a prior combined file into the next one. Anyone creating a dataset should start with an empty output directory or deduplicate by stable session identity afterward.
Privacy work begins after extraction
The value of the result is also its main risk. Coding transcripts can contain unreleased source, internal paths, customer data, pasted credentials, environment output, and tool results. The scripts write that material as ordinary JSONL using the process's default file permissions. They do not scan, redact, encrypt, or separate especially sensitive fields.
The README does warn users to scan with detect-secrets, review paths and proprietary code, keep exports on encrypted storage, and avoid committing them. Follow that advice before copying the data anywhere. Secret scanning alone is insufficient: it will not decide whether a client name, database row, source excerpt, or customer request is lawful training material. Employers should establish ownership and retention rules before running a home-directory-wide collector.
Licensing deserves a pause as well. The README labels the project MIT, yet the repository tree has no LICENSE file and GitHub exposes no detected license. That may be an omission rather than intent, but organizations that need a clean license record should ask for a conventional license file before redistributing modified scripts.
Health and the right way to use it
The main branch's last commit was January 21, 2026, and there is no published GitHub release. Contributor issues and pull requests remained active through August 2026, including work on new clients and safer export ideas. The combined open count is ten and includes pull requests, so it does not mean ten confirmed bugs. Still, the gap between community proposals and main-branch updates matters for software coupled to fast-changing private schemas.
Use the toolkit like a collection of forensic adapters. Pin a commit, run one extractor at a time against a copied or closed client store, inspect counts and random sessions against the original interface, and record known omissions. Then redact and deduplicate before analysis. For an ongoing application you control, an observability system such as Langfuse or Phoenix will create a more stable record at capture time. For recovering yesterday's local assistant history, this small repository is a useful head start, provided you do not mistake a successful exit for a complete or safe dataset.