How it works
Coda is a team of five specialist agents coordinated by a leader:
Coda writes code in git worktrees on
coda/* branches, so your main branch is never touched. It opens PRs; a human merges them. And it runs in your infrastructure, so your code stays on your machines. The only external calls go to your configured LLM provider.
Between them, the agents cover:
Scheduled tasks
Coda also shows up on its own. Two background tasks register at startup:
Repo sync always runs. The daily digest only registers when both
DIGEST_CHANNEL and SLACK_TOKEN are set in .env. Set DIGEST_CHANNEL to the Slack channel ID the summary should post to (right-click a channel in Slack, then View details to copy the ID).
Self-learning
Coda gets sharper the more you use it. It picks up your coding standards, conventions, and patterns. The learning is powered by Agno’s Learning Machines:Run locally
The Coda README walks through this in more detail.OPENAI_API_KEY comes from platform.openai.com. For GITHUB_ACCESS_TOKEN, create a fine-grained Personal Access Token with Contents (read and write), Pull requests (read and write), Issues (read and write), and Metadata (read). The full walkthrough is in docs/GITHUB_ACCESS.md. PARALLEL_API_KEY (from parallel.ai) is optional; it enables the Researcher agent. Without it the team runs with no web research.
Tell Coda which repos to learn by editing repos.yaml:
Connect to the AgentOS UI
- Open os.agno.com and sign in.
- Click Connect OS → Local and enter
http://localhost:8000.
Deploy to Railway
You’ll need the Railway CLI installed andrailway login completed.
railway_up.sh provisions a pgvector database, creates the coda service with the variables from your .env, deploys, and creates a public domain. The domain can take about 5 minutes; check progress with railway logs --service coda. See railway.json to adjust CPU, memory, and replica settings.
Production runs with RBAC on (RUNTIME_ENV=prd is the default) and rejects every request until you give it a verification key:
- Open os.agno.com, click Connect OS → Live, and enter your Railway domain.
- Go to Settings and generate a key pair.
- Add the public key to
.envasJWT_VERIFICATION_KEY(paste the full PEM block). - Push it and redeploy:
railway_env.sh handles multiline values, so the PEM key syncs correctly.
Connect to Slack
.env:
Each thread is its own conversation. Follow-ups in the same thread don’t need to @mention Coda again.
If Coda is deployed, point your Slack app’s Event Subscriptions Request URL at
https://<your-domain>/slack/events and wait for Slack to verify it.
Example prompts
Try these once your repos are configured:Run evals
Five eval categories cover the team’s behavior:
Evals call the real team, so set up a virtual environment and start the database first: