Inspiration
AI conversations are where a lot of learning and project decisions happen, but that knowledge becomes scattered across ChatGPT, Claude, Gemini, email, and other tools. When it is time to write an email, explain a topic, or continue building, finding the right past conversation is slow and repetitive.
CatchMyWords was inspired by the idea that your past conversations should help you in the moment you are writing, without forcing you to hand over your personal history to another database.
What it does
CatchMyWords is a local-first Chrome extension that imports supported conversation exports, indexes them on the user's device, and retrieves relevant context when they are writing anywhere on the web.
It can turn retrieved context into five useful formats:
- Explanation
- Technical briefing
- Context block for a new AI chat
- Direct reply to highlighted text
Users can refine an output in place, start a clean chat when needed, copy or paste a draft themselves, and inspect where the retrieved context came from. The extension also includes a searchable, category-based library of 51 apps with logos, official export guidance, and clear labels showing whether an import is ready, automatic, or guide-only.
Your conversation history is indexed only on your device. We never store your conversation data.
How I built it
We built CatchMyWords as a Manifest V3 Chrome extension using WXT, React, and strict TypeScript. Local search and indexing run in an offscreen extension document, with SQLite-WASM, OPFS persistence, FTS5 search, and local retrieval logic.
The generation path uses a thin stateless Cloudflare Worker proxy so the extension never contains a provider API key. Retrieved context is passed with source provenance, and the prompts are designed to stay faithful to the user's actual history rather than inventing details.
I used Codex with GPT-5.6 throughout the build to accelerate implementation, debugging, UI iteration, import-parser design, test coverage, production packaging, and documentation. Codex was especially useful for turning product decisions into small testable modules, such as deduplication, sanitisation, output-format enforcement, and source-specific import handling.
Challenges we ran into
The biggest challenge was that every service exports data differently. Some provide clean JSON exports, while others use MBOX, text files, or constrained ZIP archives. Some services do not provide a portable export route at all.
I handled that by making the import directory honest: an app is only marked as import-ready when there is a safe, tested path. Imports are checked locally, unsupported or suspicious files are rejected, imported content is sanitised, and imported files are never executed.
Another challenge was making the extension feel useful inside any text field. A page such as Gmail should suggest an email by default, but a user asking “explain what I learnt in HTML and CSS” needs an assistant-style explanation, not an email with a greeting and sign-off. We added assistant-first intent routing while preserving explicit format choices.
Accomplishments that we're proud of
I am proud that CatchMyWords is a working local-first extension rather than just a concept. It supports local import, retrieval, provenance, deletion controls, five output formats, highlighted-text replies, in-place refinements, and a packaged judge build with fictional sample data.
We are also proud of the privacy and safety decisions behind it: no conversation index is sent to a server, no API key is placed in the extension, and the app does not pretend every platform has a safe import route.
What we learned
I learned that privacy is not just a policy statement; it changes the architecture. Keeping the index on-device required careful use of browser extension lifecycles, local persistence, offscreen computation, and a narrowly scoped generation proxy.
I also learned that retrieval quality matters more than fluent output. A polished answer is not useful if it mixes unrelated past chats or invents context. That led us to prioritise source provenance, constrained generation, deduplication, follow-up context handling, and explicit thin-context behaviour.
Finally, I learned how much faster iteration can be with Codex and GPT-5.6 when the work is broken into clear decisions, tests, and small components.
What's next for CatchMyWords
Next, we will expand to add permission-based automatic import only where an official API or safe browser-local route exists, improve retrieval quality on larger personal archives, add more user controls around writing style, and deploy the generation proxy with production authentication and billing safeguards.
The goal is to make CatchMyWords a trusted memory layer for the work people already do across AI tools and the web.
Built With
- 4.5
- anthropic
- chrome
- claude
- cloudflare
- codex
- extension
- fts5
- haiku
- json
- manifestv3
- node.js
- openai
- opfs
- pnpm
- react
- sdk
- typescript
- vitest
- wxt
Log in or sign up for Devpost to join the conversation.