Like many developers, my daily workflow shifted dramatically with the advent of LLMs. I found myself keeping a messy "AI Prompts.txt" file on my desktop. Whenever I started a new coding session, I would painstakingly copy my React rules, paste them into ChatGPT, wait for an acknowledgment, copy my database schema, paste it in, and finally start coding.
When Claude 3.5 Sonnet dropped and proved superior at coding, I switched. But doing so meant porting my entire `Prompts.txt` workflow over. It was tedious, error-prone, and frustrating. I realized we needed an abstraction layer.
The Prototype
I started with a simple vision: a Chrome extension that holds a block of text and injects it into a textarea when a button is clicked. Simple enough, right?
Wrong. As I quickly discovered, modern AI interfaces like ChatGPT and Claude use complex Virtual DOMs (React) and rich-text editors (ProseMirror). A simple value = "text" assignment was instantly swallowed and erased by the React state machine. I spent three days just reverse-engineering how to simulate a keyboard event that ProseMirror would respect.
Scaling the Architecture
Once the injection worked, the project grew. I realized a single block of text wasn't enough. I needed "Profiles." When I am coding, I need my React rules. When I am writing marketing copy, I need my brand voice guidelines. Injecting both simultaneously would blow up the token budget and confuse the AI.
So, I architected a tagging system. Users create Markdown fields and tag them (`#coding`, `#writing`, `#design`). When injecting, the engine filters the context bundle by the active tags, composing a highly targeted payload.
The Privacy Decision
As the tool became more powerful, I faced a crossroads: do I add a backend to sync data across devices? The allure of recurring revenue was strong. But as I looked at my own context bundles—filled with proprietary source code and sensitive architectural decisions—I knew I could never trust a third-party startup with this data.
I committed to a 100% local-first architecture. It made development harder (managing state entirely within Chrome's isolated storage is tricky), but it was the only ethical path forward.
Open Source from Day One
I decided to open-source ContxtAI because this is a foundational problem. AI memory shouldn't be a closed-source moat controlled by OpenAI or Google. It should be a public good, an open standard that any user can control and any tool can plug into.
Building this has been one of the most challenging and rewarding engineering sprints of my life. And we are just getting started.