ctx: The Personal Context Engine Every One of My Agents Shares Zack Proser built ctx, a personal context engine that lives outside any single AI tool or vendor, to solve the problem of having to re-explain his life and work to every new agent. ctx is a single Postgres table behind a private MCP server at ctx.zackproser.com, reachable over MCP, REST, and OAuth, allowing any agent from any provider to connect with one line and immediately know his current context. Proser designed ctx so that memory outlives whichever tool is in fashion, inspired by Cerebras's internal knowledge base approach. I use a lot of agents, and they keep changing shape. Claude Code in my terminal. Claude in the browser. Codex from OpenAI. pi. An agent on my phone. New ones show up every few weeks, in a new form factor, from a new provider. And every single one starts every conversation the same way: knowing nothing about me. So I re-explain. Who my clients are, how I like commits written, what's due this week, which repo is which, what I decided last month and why. The same context, typed again, into a different box, forever. The thing that finally made me stop and build was noticing that the context never changes — only the wrapper does. Whether I'm in a terminal or a browser tab or a phone app, whether the model behind it is Anthropic's or OpenAI's, the facts about my life and work are identical. The agent is a stranger every time not because the information is hard, but because it lives in my head and in a dozen silos, and none of the silos talk to each other or to each other's vendors. Because the per-tool memory features are silos, by design. Claude Code has its CLAUDE.md . Cursor has its rules file. Each chat product has its own memory feature, scoped to that product and that company. A fact I teach one is invisible to all the others, and it rots independently in each place. The form factors multiply and the providers multiply, and every combination is another island I have to re-provision by hand. I was maintaining the same context in a dozen places and still starting cold in every one. So I built the memory as its own thing, outside any single tool or vendor, and let all of them plug into it. It's called ctx. It's a single Postgres table behind a private MCP https://modelcontextprotocol.io server at ctx.zackproser.com , reachable over open protocols — MCP for the agents that speak it, plain REST for the ones that don't, OAuth for the browser. Any agent, any form factor, any provider — mine or a brand-new one I spin up tomorrow — connects with one line and immediately knows my current context. It is deliberately nobody's product. That's the point: the memory outlives whichever tool is in fashion this quarter. This post is the blueprint: the schema, the retriever, the security wall, and the specific failures that shaped all three. I built the whole thing in a day, but the day had structure, and the structure is the interesting part. The shape of the problem Finding information about your own life is the same problem as finding information inside a company: it's scattered across tools that are each excellent at their one job and terrible at sharing. My todos live in Obsidian. My tickets live in Linear — two accounts, personal and work. My meetings live in cal.com and Granola. Decisions and preferences live in my head and in chat transcripts that evaporate. Nobody is going to consolidate all of that into one app, and they shouldn't; the tools are good because they're specialized. The Cerebras team wrote up how they built their internal knowledge base https://www.cerebras.ai/blog/how-we-built-our-knowledge-base around exactly this insight — meet the data where it lives, land everything in one embeddings table, and expose dumb-fast retrieval primitives that the calling agent orchestrates. Their corpus is millions of documents across a company. Mine is a few thousand items for one person. I stole the ideas that survive the scale-down and threw out the ones that don't. Before I let Claude write a single line of code, I made it get the design straight. I ran the whole thing through Nick Nisi's ideation plugin https://github.com/nicknisi/ideation — an evidence-gated interview that turns a brain dump into a contract and then into implementation specs, with adversarial plan critics stress-testing it along the way. The interview forced me to answer the questions I'd otherwise have discovered halfway through the build: what's owned versus mirrored, where the scope wall lives, what "done" actually means. Four plan critics — scope-creep, over-engineering, hidden-dependency, success-criteria — then attacked the contract before it became specs. Only once the specs were approved did any code get written. That front-loading is why a day was enough. The north star was never corpus size or feature count. It was this: the right five items in the agent's context within 300 milliseconds, with a hard second constraint that some of my most private context — legal, financial, family — can never leak into a work-context surface. Retrieval accuracy is the goal. The wall is the thing I refuse to get wrong. One table, one interface At the center is a single Postgres table. Every source — an Obsidian note, a Linear ticket, a calendar event, a distilled fact from a chat — lands in it with the same shape. Anything in the table is retrievable through the same query. New sources are just new writers. That deliberate sameness is what keeps the system small enough for one person to hold in their head. create table items id uuid primary key default gen random uuid , scope text not null check scope in 'personal','work','shared' , origin text not null check origin in 'mirror','memory' , kind text not null check kind in 'fact','preference','decision','project','task', 'episode','person','reference','event' , title text not null, body text not null, entities text not null default '{}', source text not null, external key text, -- '