A personal, queryable archive of your AI conversations across providers
Project description
chatstrata
A personal, queryable archive of your AI conversations across providers.
Every conversation you've had with Claude, ChatGPT, or any other LLM is a record of how you think, what you're working on, and how that's changed over time. Most of that record lives scattered across browser exports, hidden JSONL files, and SaaS dashboards you don't fully control. chatstrata pulls it into one place, normalizes it, and lets you actually query and analyze it.
The name is from "strata" — layers of conversation deposited over time, with the deeper layers telling you who you were.
Why this exists
LLM providers collect rich data about how you interact with their models and use it (in aggregate) to improve the experience for everyone. chatstrata is the same idea, but for an audience of one: you. Your conversations, on your machine, queryable on your terms.
Concretely, with chatstrata you can:
- Find every conversation where you discussed a topic, across providers.
- See how your prompting has changed over months or years.
- Audit every bash command you ran through Claude Code, grouped by project.
- Build a corpus that helps you brief a new model on who you are and what you care about.
- Identify abandoned projects, dropped threads, recurring patterns.
Status
Early alpha. v0 includes adapters for Claude Code, claude.ai exports, Codex CLI, and OpenCode. The architecture is built so that adding more sources (ChatGPT exports, Cursor, etc.) is the work of one adapter — see docs/adapter-guide.md.
Quickstart
Requires Python 3.10+. DuckDB is installed as a Python dependency; you do not need to install a separate DuckDB server or CLI.
uv tool install chatstrata
# or: pipx install chatstrata
# Create the local DuckDB archive and show detected sources
chatstrata init
# Ingest your Claude Code transcripts
chatstrata ingest claude_code --incremental
# See what's there
chatstrata stats
# Run a query
chatstrata query "SELECT model, COUNT(*) FROM messages GROUP BY model"
The default database lives at a platform-appropriate user data directory
(e.g. ~/.local/share/chatstrata/chatstrata.duckdb on Linux). Override with
CHATSTRATA_DB or --db. Run chatstrata paths to see the exact paths for
your machine.
MCP server
chatstrata ships an MCP server that exposes
your archive to MCP-aware clients (Claude Desktop, etc.) through a single
read-only query tool plus a chatstrata://schema resource. The client can
then write and run SQL against your conversations directly.
1. Install with MCP support
uv tool install "chatstrata[mcp]"
# or: pipx install "chatstrata[mcp]"
2. Create and populate the archive
The MCP server reads an existing database; make sure you've ingested something first:
chatstrata init
chatstrata ingest claude_code --incremental
chatstrata paths # note the database path for the next step
3. Point your MCP client at chatstrata
The installed chatstrata-mcp executable speaks MCP over stdio. If you use
uvx, clients can run the published package without needing the absolute path
to that executable.
For Claude Code, run:
claude mcp add --transport stdio --scope user chatstrata -- uvx --from "chatstrata[mcp]" chatstrata-mcp
Or ask chatstrata to print the command:
chatstrata mcp config claude-code
For Claude Desktop, add an entry to its mcpServers config (Settings →
Developer → Edit Config):
{
"mcpServers": {
"chatstrata": {
"type": "stdio",
"command": "uvx",
"args": ["--from", "chatstrata[mcp]", "chatstrata-mcp"]
}
}
}
You can generate that JSON with:
chatstrata mcp config claude-desktop
If CHATSTRATA_DB is omitted, the server falls back to the default platform
path. To pin the MCP server to a specific database, pass --db when generating
the setup snippet:
chatstrata mcp config claude-desktop --db /absolute/path/to/chatstrata.duckdb
Restart the client. The chatstrata server should appear with a query tool
available; ask it something like "what topics have I discussed most this month?"
and it will query your archive.
Data model
chatstrata normalizes every conversation into the same shape regardless of source:
- conversations — one per session/thread
- messages — one per turn (user, assistant, system)
- content_blocks — one per content unit within a message (text, tool_use, tool_result, thinking, attachment)
- tool_calls — denormalized view of tool_use blocks for easy querying
- raw_events — the source data, line-for-line, for re-parsing without re-ingestion
See docs/schema.md for the full schema.
Adding a source
Each source (Claude Code, ChatGPT export, etc.) is an adapter that implements a
small protocol: discover() finds available conversations, parse() turns them
into the canonical record types. See docs/adapter-guide.md
for the worked example using Claude Code.
Adapters can be contributed as PRs to this repo or as standalone pip packages that register via entry points.
Privacy
Your data stays on your machine. chatstrata makes no network calls during
ingestion or querying. Semantic search can optionally use DuckDB's VSS
extension; chatstrata only installs that extension when
CHATSTRATA_INSTALL_DUCKDB_VSS=1 is set.
If you want to share queries or notebooks publicly, an optional redaction layer
(uv tool install "chatstrata[redact]") wraps Microsoft Presidio with
chatstrata-specific recognizers for API keys, file paths, and other things that
commonly appear in LLM transcripts. See docs/redaction.md.
Contributing
Contributions welcome. Especially valuable: new source adapters. See CONTRIBUTING.md.
License
Apache 2.0. See LICENSE.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file chatstrata-0.1.0.tar.gz.
File metadata
- Download URL: chatstrata-0.1.0.tar.gz
- Upload date:
- Size: 598.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5a3c3f3cb0e6e5864f298a8cfc1de6427f38858f12968ab0ca2742930025cf27
|
|
| MD5 |
40ec3b7594e71a6e88d29bb7d1b9bfee
|
|
| BLAKE2b-256 |
13df7e4833d0a0c2e7d115f15b8cb5ffb01d9d537ef91e7630119a7db9f7fa4e
|
Provenance
The following attestation bundles were made for chatstrata-0.1.0.tar.gz:
Publisher:
publish.yml on brandonbosch/chatstrata
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
chatstrata-0.1.0.tar.gz -
Subject digest:
5a3c3f3cb0e6e5864f298a8cfc1de6427f38858f12968ab0ca2742930025cf27 - Sigstore transparency entry: 1660635884
- Sigstore integration time:
-
Permalink:
brandonbosch/chatstrata@7c4a9c26a3dee2b3fe5c683f46dd03675c84b563 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/brandonbosch
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@7c4a9c26a3dee2b3fe5c683f46dd03675c84b563 -
Trigger Event:
release
-
Statement type:
File details
Details for the file chatstrata-0.1.0-py3-none-any.whl.
File metadata
- Download URL: chatstrata-0.1.0-py3-none-any.whl
- Upload date:
- Size: 67.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
51508e82b8f1437541a7ae81d0b11cc724e6425096aa81be8a57d932de6d3a68
|
|
| MD5 |
9da6f49a2d6c7b175f399b94aad8a6a1
|
|
| BLAKE2b-256 |
2fb95a163891414f2e9234ce24fb17586c8234bc28c77fde0bebe928da45c7dd
|
Provenance
The following attestation bundles were made for chatstrata-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on brandonbosch/chatstrata
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
chatstrata-0.1.0-py3-none-any.whl -
Subject digest:
51508e82b8f1437541a7ae81d0b11cc724e6425096aa81be8a57d932de6d3a68 - Sigstore transparency entry: 1660635976
- Sigstore integration time:
-
Permalink:
brandonbosch/chatstrata@7c4a9c26a3dee2b3fe5c683f46dd03675c84b563 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/brandonbosch
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@7c4a9c26a3dee2b3fe5c683f46dd03675c84b563 -
Trigger Event:
release
-
Statement type: