everychat
Search every AI conversation you've ever had. ChatGPT, Claude, Gemini, Claude Code and Codex, in one local index. Free, offline, and your coding agent can query it over MCP.
$ everychat search "sourdough starter"
[412] chatgpt · 2024-07-01 · Sourdough starter help
assistant: …Not dead, just hungry. Feed it twice a day for three days. [sourdough starter] that smells like acetone…
[88] claude-code · 2026-03-02 · Bakery timer app
user: …wire the [sourdough starter] schedule into the notification…
You have asked an AI the same question three times across three products. everychat makes the first answer findable.
Why
- Chat history is split across vendors, and the built-in search in each one is weak or missing.
- Coding agents (Claude Code, Codex) keep sessions on disk in formats nobody reads.
- Your next conversation would be better if the model could see what you decided last month.
What you get
- One command to index local agent sessions.
everychat syncfinds Claude Code and Codex logs on your machine. - Import vendor exports. Drop in the zip or JSON from ChatGPT, Claude.ai, or Google Takeout (Gemini).
- Fast substring search in any language. SQLite FTS5 with trigram tokens, so Chinese, Japanese and code identifiers work without a word segmenter.
- MCP server. Add it to Claude Code, Codex, Cursor or any MCP client. Ask "did I already solve this?" and the agent looks it up.
- Optional semantic search, fully local, no API key.
- No cloud. One SQLite file in
~/.everychat. Nothing is uploaded anywhere.
Install
uv tool install git+https://github.com/WayneLY-Chen/everychat
# or: pipx install git+https://github.com/WayneLY-Chen/everychat
Python 3.10 or newer. Nothing else. A PyPI release (uv tool install everychat) is coming.
Use
everychat sync # index Claude Code + Codex sessions on this machine
everychat import ~/Downloads/chatgpt-export.zip # ChatGPT data export (zip or conversations.json)
everychat import ~/Downloads/claude-export.zip # Claude.ai data export
everychat import ~/Takeout/My\ Activity/Gemini\ Apps/MyActivity.json
everychat search "rate limiter" # search everything
everychat search "寫一個" --source claude-code # filter by source
everychat show 412 # print one conversation
everychat recent --limit 10
everychat stats
Run everychat sync again any time. Unchanged files are skipped.
Give your coding agent a memory
claude mcp add everychat -- everychat mcp # Claude Code
For Codex, Cursor or any other MCP client, register a stdio server with the command everychat mcp. The server exposes four tools: search_chats, get_chat, recent_chats, list_sources.
Then, in a new session:
"I set up a Postgres connection pool for this project a few weeks ago. Find how I configured it."
The agent calls search_chats, reads the old conversation with get_chat, and continues from there.
Semantic search (optional)
uv tool install "everychat[semantic] @ git+https://github.com/WayneLY-Chen/everychat"
everychat embed # one-off, runs a small multilingual model on CPU
everychat search --semantic "that time the deploy broke because of timezones"
The model is paraphrase-multilingual-MiniLM-L12-v2 via fastembed. It is downloaded once (about 120 MB) and never phones home.
Where to get your exports
| Source | How |
|---|---|
| ChatGPT | Settings → Data controls → Export data. You get a zip with conversations.json. |
| Claude.ai | Settings → Privacy → Export data. You get a zip with conversations.json. |
| Gemini | Google Takeout → My Activity → choose JSON format → Gemini Apps → MyActivity.json. |
| Claude Code | Nothing to do. everychat sync reads ~/.claude/projects. |
| Codex | Nothing to do. everychat sync reads ~/.codex/sessions. |
Gemini's Takeout does not group turns into conversations, so each prompt and its reply become a two-message conversation.
How it works
exports / session logs → importers → SQLite (conversations, messages, FTS5 trigram index)
↑ ↓
everychat embed everychat search / mcp
- Importers normalise each format to
Conversation(source, external_id, title, messages[]). Re-importing the same conversation replaces it; nothing is duplicated. - For ChatGPT, only the branch you last viewed is kept (the export stores every regenerated branch).
- For Claude Code and Codex, only human and assistant text is indexed. Tool calls, tool output, thinking blocks, subagent threads and injected context (
<system-reminder>,<app-context>, AGENTS.md instructions) are stripped. - Search collapses to the best hit per conversation. Queries under three characters use
LIKEbecause the trigram tokenizer needs three.
Set EVERYCHAT_HOME to move the database. CLAUDE_CONFIG_DIR and CODEX_HOME are honoured.
Roadmap
- Cursor, Gemini CLI, OpenCode, Aider session importers
- Watch mode: re-index when a session file changes
- Tiny local web UI
- Export search results as Markdown for pasting into a new chat
Contributions for new importers are very welcome. An importer is one file with detect() and parse(); see src/everychat/importers/claude_web.py for the shortest example.
Privacy
Everything stays on your machine. The database is a plain SQLite file; delete it and it's gone. The MCP server only answers the client you attach it to.
License
MIT
中文說明
把你所有 AI 對話變成可搜尋的記憶。 ChatGPT、Claude、Gemini、Claude Code、Codex 全部進同一個本地索引,免費、離線,而且你的 coding agent 可以透過 MCP 查詢它。
uv tool install git+https://github.com/WayneLY-Chen/everychat
everychat sync # 自動索引本機的 Claude Code 與 Codex 對話
everychat import chatgpt-export.zip # 匯入 ChatGPT / Claude.ai 匯出檔
everychat search "上次那個 timezone 的 bug"
claude mcp add everychat -- everychat mcp # 讓 Claude Code 能查你的歷史
中文搜尋直接可用,不需要斷詞。所有資料都留在 ~/.everychat,不會上傳到任何地方。
Metadata
Release files for everychat 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| everychat-0.1.0.tar.gz | 176.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| everychat-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 201.3 kB
Release files / everychat-0.1.0.tar.gz
| Download URL | everychat-0.1.0.tar.gz |
|---|---|
| Size | 176.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
68d2fbe08a2968c9fcb6b4f709602efc12e44aa4ec84bdb92e755eb762ebfa35
|
|
BLAKE2b-256 checksum How to use checksums |
1049cd651ba4ee1720cce04282d700f77673d7b89d16213a3a0e73c6b29bdfec
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 8, 2026.
Transparency logRelease files / everychat-0.1.0-py3-none-any.whl
| Download URL | everychat-0.1.0-py3-none-any.whl |
|---|---|
| Size | 25.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
b76947b8555b4281d753b854e5e52722da3f5a05e02ac96176c8891988d096dc
|
|
BLAKE2b-256 checksum How to use checksums |
edc855d39cecff672f0d45532c7e7a5133e6542e01857fcdab9a00c7f318eb17
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 8, 2026.
Transparency log