Your AI coding tools have been quietly logging everything you type
on: kruzovic7/ai-data-extractor
Your AI coding assistant knows a lot about you. Every refactor you asked for, every error you pasted in, every half-formed architecture question you typed at midnight - it's all sitting in a local SQLite database or a folder of JSONL files on your machine, and most people have no idea it's there.
This toolkit makes that data portable. It auto-discovers conversation history from ten different tools - Claude Code, Cursor, Codex CLI, Windsurf, Trae, Continue, Gemini CLI, OpenCode, Cline/Roo Code, and Aider - and normalizes everything into a single JSONL schema with consistent fields for messages, roles, timestamps, code context, tool calls, and session metadata. No dependencies beyond the standard library, Python 3.9 or later.
The engineering is honest about its own limits in a way that's worth noting. Cursor, Windsurf, and Trae don't publish their storage schemas, and Cursor alone has gone through at least three distinct storage shapes. The extractor handles all three Cursor shapes explicitly. For Windsurf and Trae, it falls back to a heuristic that scans for chat-related keys and walks parsed JSON looking for role-plus-text pairs. The README calls this "honest best-effort" and tells you exactly which constant to edit when a future version breaks it. That's the right posture.
Aider is the most structurally interesting case. Unlike every other tool here, it has no central session store - it drops a markdown transcript into each project directory. The extractor scans the home directory and a handful of common project-root names up to five levels deep, skipping noise like node_modules and .git. If your projects live somewhere unusual, you pass --search-path flags. The README includes Aider specifically to demonstrate that the toolkit isn't just "SQLite or JSONL in one app-data folder" - it generalizes.
All database reads use read-only connections, so a running editor won't block extraction. Corrupt or locked files are caught per-file rather than crashing the whole run. The output schema guarantees only three fields across all sources - messages, source, and session_id - because that's genuinely all that every tool records; everything else like project_path, token usage, and model name is source-dependent.
The privacy section is practical rather than performative. It recommends running detect-secrets against the output before doing anything with it, flags code_context and tool_use as the most likely places to find API keys or proprietary paths, and notes that extracted_data/ is already in .gitignore. The training snippet shows how to pipe the output directly into a Hugging Face dataset and apply a chat template.
The extension interface is two functions: find_installations and extract. The README points at continue_ext.py as the simplest template. That's a reasonable entry point for anyone who wants to add a tool the project doesn't cover yet.
A no-dependency toolkit that actually reads the undocumented local databases your AI coding tools have been quietly accumulating.