Show HN: Chatlens – Search and browse your ChatGPT and Claude chats offline Chatlens, a new open-source tool by an unnamed developer, lets users search and browse their ChatGPT and Claude chat histories entirely offline in the browser, with full-text search, usage timelines, and per-topic insights. The single HTML file, with no dependencies, processes exports locally, indexing up to 100,000 messages in about 13 seconds and searching in under 120 milliseconds, ensuring no data leaves the device. Explore your ChatGPT & Claude history — 100% in your browser. Drop your export and instantly get full-text search, a usage timeline, per-topic insights, and a clean reader across thousands of chats. Nothing is uploaded, tracked, or stored. Everything runs on your device. Screenshots use built-in sample data. Your real conversations never leave your browser. You know you asked your AI that one thing back in March — but the official apps give you no real search and no way to see your own history. chatlens turns your data export into something you can actually explore. It's a single HTML file with no build step and no dependencies. Just open it: double-click index.html works offline, straight from disk , or Serve it: python3 -m http.server then visit the printed URL, or host the one file anywhere static GitHub Pages, Netlify, an S3 bucket… . Then load your export, or click Explore with sample data to try it with a synthetic dataset — no export needed. chatlens accepts three shapes, auto-detected: A single — the standard ChatGPT/Claude export. Drop it or click to choose. conversations.json A folder of per-conversation files — some ChatGPT exports split each chat into its own .json . Drag the whole folder onto the page, or use "select a whole folder." Multiple files at once — select any number of .json files together. Getting the export ChatGPT → Settings → Data controls → Export data → unzip the emailed archive. Claude → Settings → Privacy → Export data → unzip. Both provider formats are detected automatically. chatlens reconstructs each conversation's canonical thread following the active branch , so regenerated / edited-away branches are excluded from counts — you see the conversation as it stands. Everything is indexed in-browser in a background Web Worker, so the UI never freezes. Measured on desktop Chrome M-class laptop : | Export size | Conversations | Messages | One-time index | Search | |---|---|---|---|---| | 30 MB real export | 222 | 4,362 | ~1.9 s | 6–15 ms | | 53 MB synthetic | 2,446 | 50,000 | ~7.8 s | ~70 ms | | 85 MB synthetic | 4,857 | 100,000 | ~13 s | ~120 ms | Indexing is a one-time cost on load , shown with a progress bar, and scales roughly linearly with total text. Search stays fast well under a quarter-second even when a query matches tens of thousands of messages. Honest ceiling: past ~100k messages / a few hundred MB, indexing runs into the tens of seconds and memory use climbs the index keeps a lowercased copy of message text, so peak RAM is a small multiple of the file size . It's built for real personal histories — thousands to ~100k messages — not for indexing a shared multi-account archive. Extremely large exports may be slow or memory-bound on low-RAM devices. Full-text search across every message, built as an in-browser inverted index.- Multi-word queries match messages containing all the words. "quoted phrases" for exact matches. /regex/ for regular expressions e.g. /colou?r/ .- Filter by you vs the AI , and jump straight from a result into the reader. - Multi-word queries match messages containing Timeline — messages per month, plus a day-of-week × hour-of-day heatmap. Insights — totals, words written, busiest day, peak hour, models used, longest conversations, and what you talk about most. Reader — a clean serif reading view of any conversation with lightweight Markdown code blocks, lists, bold, links and per-message model labels. Light & dark themes paper by default; a warm "reading at night" dark mode . No backend, no network calls. Open your browser's Network tab, or disconnect from the internet — it works the same. Reload the tab and all data is gone.- Parsing and indexing run in a Web Worker ; the main thread only renders. If a browser blocks Blob-URL workers some file:// setups , it transparently falls back to a same-interface main-thread parser. - The web client is a single vanilla HTML/CSS/JS file — easy to audit end to end. No cloud, no LLM calls, no "continue this chat." chatlens reads and understands your existing history; it doesn't talk to any model. MIT