Your .cursorrules, CLAUDE.md, and AGENTS.md are the same context, maintained four times over. Author it once — a Context Key hands any AI exactly the slice a task deserves: scoped, expiring, revocable. Authored, not scraped.
npx @ctrlai/cli initwrites CLAUDE.md · .cursorrules · AGENTS.md from one source — nothing leaves your machineRun it in any repo and the files your tools read appear — written from one source, nothing leaving your machine. No blank page. When you want it live in every tool, a free Context Key serves it fresh.
# 1 · in any repo — no account, nothing leaves your machine
npx @ctrlai/cli init
# → reads your rules + stack, writes CLAUDE.md · .cursorrules · AGENTS.md from one source
# 2 · go live: get a free Context Key, then fetch your context anywhere
curl https://api.ctrlai.com/v1/context \
-H "Authorization: Bearer ck_live_…"
# …or one line inside your own agent
const ctx = await ctrl.context({ key: process.env.CTRL_KEY, task })
messages.unshift({ role: "system", content: ctx.systemBlock })
# …or keep the files your tools already read in sync, live
npx @ctrlai/cli emit # → CLAUDE.md · .cursorrules · AGENTS.md, from your keyThe Context Key is the door. Behind it is the whole of Ctrl AI — one owned self, many faces, every agent — for you, your team, your company.
The whole of you — your stack, taste, constraints — authored, never scraped. Held in one place, mostly dark.
Masks of the self. Each face releases only the slice a context deserves — pseudonymous by default, under a ceiling.
Every tool you delegate to gets only what its task needs — and you get a receipt for exactly what crossed.