Deploying ContextAgora
Quick start
If you already have your credentials ready:
# 1. Installcurl -fsSL https://contextagora.com/install.sh | bash # 2. Configurecd contextagora && nano .env # fill in your credentials # 3. Startdocker compose up -d # 4. Verifycurl http://localhost:8080/health # should return 200
Open http://localhost:8080 and you're ready to go.
Before you start
1. Create a GitHub repository for your modules
ContextAgora stores all your modules in a GitHub repository that you own. You need to create this repo before configuring ContextAgora.
- Go to github.com/new
- Give it any name (e.g.
my-contextagora-modules) - Set visibility to Private (recommended) or Public
- Check Add a README file — this creates the
mainbranch (required) - Note the owner (your GitHub username or org) and repo name — you'll need both for
.env
2. Create a GitHub Personal Access Token
ContextAgora needs a fine-grained PAT to access the modules repo.
- Go to GitHub > Settings > Developer settings > Fine-grained tokens
- Set a descriptive name (e.g.
contextagora-modules) - Under Repository access, select Only select repositories and pick the repo you just created
- Under Permissions > Repository permissions, set:
Contents: Read and write (read to fetch modules, write to create/edit from the UI)
- Click Generate token and save the value — this is your
GH_TOKEN
LLM API key
ContextAgora has a built-in chat feature that needs access to an LLM. Any OpenAI-compatible provider works (Anthropic, OpenAI, Google Gemini, Ollama, etc.). Set LLM_API_KEY, LLM_BASE_URL, and LLM_MODEL in your .env.
Prerequisites
- Docker Engine ≥ 24.0 with Docker Compose V2
- A GitHub repo for your modules — create one at github.com/new with a README (modules are added through the UI)
1. Install
curl -fsSL https://contextagora.com/install.sh | bash
This creates a contextagora/ directory with docker-compose.yml and .env, and pulls the latest image.
2. Configure
Edit the .env file with your credentials:
# ── GitHub Module Source ─────────────────────────────────────────GH_OWNER=your-github-orgGH_REPO=your-modules-repoGH_TOKEN=github_pat_... # ── LLM Provider ────────────────────────────────────────────────LLM_API_KEY=your-api-keyLLM_BASE_URL=https://...LLM_MODEL=... # ── Infisical (only if modules use secrets) ─────────────────────# INFISICAL_CLIENT_ID=# INFISICAL_CLIENT_SECRET=# INFISICAL_PROJECT_ID=# INFISICAL_ENVIRONMENT=dev# INFISICAL_SITE_URL=https://app.infisical.com
Provider reference:
| Provider | LLM_BASE_URL |
LLM_MODEL example |
|---|---|---|
| Anthropic | https://api.anthropic.com |
claude-sonnet-4 |
| OpenAI | https://api.openai.com/v1 |
gpt-4o |
| Google Gemini | https://generativelanguage.googleapis.com/v1beta/openai |
gemini-2.5-pro |
| Ollama Cloud | https://ollama.com/v1 |
glm-5.1 |
3. Start
docker compose up -d
Open http://localhost:8080.
Updating
docker compose pulldocker compose up -d
Setting up secrets (optional)
If your modules need secrets (API keys, tokens, etc.), ContextAgora resolves them at runtime via Varlock + Infisical. You can set this up later — modules without secrets work fine without it.
Step 1 — Create an Infisical account and project
- Sign up at app.infisical.com
- Click Create a new project and give it a name (e.g.
contextagora) - After the project is created, open Project Settings (gear icon in the left sidebar)
- Copy the Project ID shown at the top of the page — this is your
INFISICAL_PROJECT_ID
Step 2 — Choose (or create) an environment
Infisical creates development, staging, and production environments by default. Pick one to use — development is fine to start.
The short slug for each environment is what goes in INFISICAL_ENVIRONMENT:
| Display name | Slug to use |
|---|---|
| Development | dev |
| Staging | staging |
| Production | prod |
You can create a custom environment under Project Settings > Environments and use its slug.
Step 3 — Add secrets for each module
Secrets are organized by folder. Each module must have its own folder named exactly after the module slug.
- In your project, go to Secrets and select the environment you chose
- Click Add Folder and name it after the module (e.g.
linear,openweather) - Open the folder and click Add Secret to add each key-value pair the module needs
Repeat for every module that requires secrets.
Step 4 — Create a Machine Identity (get Client ID + Client Secret)
- In the left sidebar, click Access Control > Machine Identities
- Click Create identity, give it a name (e.g.
contextagora-runtime), and assign the Member role - After creating the identity, click on it and open the Authentication tab
- Click Add Auth Method, select Universal Auth, and save with the defaults
- Under the Universal Auth section, click Create Client Secret
- Copy both values that appear:
- Client ID →
INFISICAL_CLIENT_ID - Client Secret →
INFISICAL_CLIENT_SECRET(shown only once — save it immediately)
- Client ID →
Step 5 — Grant the identity access to your project
- In your project, go to Access Control > Members
- Switch to the Machine Identities tab and click Add identity
- Select the identity you just created and assign the Member role
- Click Add
Step 6 — Add the credentials to your .env
INFISICAL_CLIENT_ID=your-client-idINFISICAL_CLIENT_SECRET=your-client-secretINFISICAL_PROJECT_ID=your-project-idINFISICAL_ENVIRONMENT=devINFISICAL_SITE_URL=https://app.infisical.com
INFISICAL_SITE_URLonly needs to change if you are self-hosting Infisical.
Reverse Proxy / HTTPS
For production, put ContextAgora behind a reverse proxy (Caddy, Nginx, etc.) that terminates TLS and forwards to localhost:8080. Bind the container to 127.0.0.1 so it's only reachable through the proxy — change "8080:8080" to "127.0.0.1:8080:8080" in docker-compose.yml.
Troubleshooting
If something isn't working, check the logs: docker compose logs contextagora
Notes
- The app is stateless — no volumes or database needed. Modules are fetched from GitHub on demand.
- Recommend at least 2 GB RAM and 2 CPU cores.