ContextAgora.com
A context layer that gives AI agents the operational context of your product: docs, integration keys, and live data — without leaking any of it across tasks.
ContextAgora.com
A context layer that gives AI agents the operational context of your product: docs, integration keys, and live data — without leaking any of it across tasks.
Role: Founder & lead developer
Timeline: Ongoing
Stack: Python (FastAPI), React (Vite, TanStack), SQLite, Docker, Varlock + Infisical, Claude Code
The problem
Generic AI agents start every chat amnesic about your product. You re-paste schemas, runbooks, and API quirks — and even then, exports go stale, integration keys leak across tasks, and there's no way to tell whether the changes you made to "the prompt" actually helped.
ContextAgora is a Docker container you run on your own infra (or we host). Modules live in your GitHub repo. The agent loads only what each task needs. Secrets resolve per-command via Varlock + Infisical and disappear when the command exits. A benchmark layer measures whether your context changes actually moved the needle.
How it's built
Three-layer file model
Files live in three tiers:
context/— what the agent sees, populated by symlinksmodules-repo/— local git working copy- Remote GitHub — durable source of truth
Loading a module is one symlink. Edits the agent makes inside context/ flow back to the local clone and surface as dirty git state in the sync UI. No copies. No merge logic. Pulling from remote is a hard reset — push first if you care about local changes.
Remote GitHub modules-repo/ context/
(source of truth) (local working copy) (agent view)
| | |
|--------- pull ------------|---------- symlink ---------|
| |
|<------- push ------------|
Secrets the agent uses but never reads
module.yaml declares which secrets a module needs by name only. At runtime, varlock run -- resolves values from Infisical, injects them into one command's environment, and they're gone on exit. Stdout and stderr are redacted. The agent uses the secret; it can't cat it. There's no .env file on disk to leak, no plaintext in long-lived process state, and printenv from inside the agent won't expose anything between commands.
module.yaml
secrets:
[name only]
|
v
varlock run --
resolve from
Infisical
|
v
command env
[INJECTED]
|
v
command executes
|
v
[GONE on exit]
One file per module: module.yaml
A module is a folder with info.md, optional docs/*.md, and a module.yaml declaring secrets: and dependencies:. Tasks are modules with kind: task — same git repo, same editor, same symlink workflow, different scaffold. One storage model, one sync path.
my-module/
├── module.yaml <-- kind, secrets, dependencies
├── info.md <-- module docs
└── docs/
└── *.md <-- optional extra docs
Benchmarks that compare context, not models
A benchmark task is a YAML file with a prompt and a judge prompt. Running it spawns a headless claude -p against the current workspace, parses the session transcript into a phase-by-phase timing + token table, then asks a second claude -p whether the output satisfied the goal. Each run is tagged with a sha256 of the context/ tree, so runs against the same context are recognizable.
benchmark.yaml
|
|--> prompt ---> headless claude ---> transcript
| |
| v
|--> judge prompt <------------ parse (timing + tokens)
|
v
pass / fail
Pluggable LLM backend
LLM_API_KEY, LLM_BASE_URL, and LLM_MODEL are mapped at chat-spawn time onto the Claude CLI's env vars. Deployers can route the agent through OpenRouter, LiteLLM, or an internal proxy without forking the backend.
LLM_API_KEY |
LLM_BASE_URL --+--> chat spawn --> claude CLI env
LLM_MODEL |
Live in production
- MAAT — SaaS for martial arts gyms. 90% faster support resolution; the agent reaches into the production DB on its own to answer questions ops used to escalate.
- Soundmurai — live music marketplace. The agent pulls live data from their DB to draft posts for
insights.soundmurai.com.