Coda answers code questions in Slack channels and threads, reviews PRs, triages issues, and posts the daily digest. Each thread becomes its own session so follow-ups carry forward.
The full setup, including the Slack app manifest and the complete scope list, lives in the Coda repo: SLACK_CONNECT.md.
Prerequisites
- Coda running locally (setup) or deployed
- A Slack workspace where you can install apps
- ngrok (local development only)
Step 1: Give Slack a URL it can reach
Slack delivers events (DMs, mentions, channel messages) by POSTing to a URL. That URL has to be reachable from Slack’s servers.
For local development, ngrok creates a public tunnel to a local port:
Copy the https://...ngrok-free.app URL. For production, use your deployed Railway URL.
Free ngrok URLs rotate on every restart. If you stop and restart ngrok, you’ll need to update the URL in your Slack app’s Event Subscriptions page.
Step 2: Register the Slack app from a manifest
A Slack app is configured by a JSON manifest that declares its identity, scopes, and the events it should receive. A manifest keeps scopes explicit and reproducible.
The manifest requests the scopes Coda needs to read the workspace (search, channel and group history, IMs, user lookups) and to post replies. No admin scopes. The full list is in the manifest. Review it before installing.
Copy the manifest from SLACK_CONNECT.md, paste into Slack’s Create New App → From a manifest flow, and replace the placeholder URL with your URL from Step 1.
Step 3: Install Coda into your workspace
Installing the app creates the bot identity in your workspace and issues the credentials Coda uses to authenticate every event and call. Two values to copy after install:
| What | Where in Slack | Becomes |
|---|
| Bot User OAuth Token | Install App page | SLACK_TOKEN (xoxb-...) |
| Signing Secret | Basic Information → App Credentials | SLACK_SIGNING_SECRET |
The signing secret is what Slack uses to sign every incoming event. Coda verifies the signature on every request, which is how it knows the event actually came from Slack and not someone spoofing your endpoint.
Step 4: Wire credentials and restart
Add both values to .env:
# .env
SLACK_TOKEN="xoxb-..."
SLACK_SIGNING_SECRET="..."
Restart:
Verify
Open your Coda app at api.slack.com/apps → Event Subscriptions. The Request URL should show Verified with a green check. If it shows “Your URL didn’t respond”, click Retry and confirm before saving.
Then talk to Coda. Find it under Apps in the Slack sidebar and DM:
what repos are available?
walk me through the auth flow
Or invite it to a channel:
/invite @Coda
@Coda what are the open PRs on agno?
@Coda review PR #42
What Coda does once it’s in Slack
| Ask | What happens |
|---|
@Coda where is the webhook handler for Stripe events? | Explorer reads the code, traces the call chain, returns paths and line numbers |
@Coda review PR #42 | Coder pulls the PR, reads the diff, leaves inline comments |
@Coda triage the open issues and label them | Triager categorizes, labels, posts a summary |
@Coda plan adding webhook support to payments | Planner breaks it down into ordered GitHub issues |
@Coda add rate limiting to /api/v1/users using the same pattern as /orders | Coder writes in an isolated worktree and opens a PR |
Troubleshooting
The most common failure is “Your URL didn’t respond” during Slack’s verification challenge. That happens when Coda isn’t running at the moment Slack POSTs the challenge. Restart Coda, then retry from your Slack app’s Event Subscriptions page.
If your ngrok URL has changed (free URLs rotate on restart), update the Request URL in Event Subscriptions and click Retry.
If Coda doesn’t respond to mentions, check docker compose logs -f coda-api for signature verification errors. These usually mean the SLACK_SIGNING_SECRET in .env doesn’t match the one in your Slack app’s Basic Information page.
For everything else, see SLACK_CONNECT.md.
How it works
Coda uses Agno’s Slack interface. Each Slack thread timestamp becomes an AgentOS session ID, so threads stay isolated and follow-ups in the same thread don’t need to re-mention @Coda.
Next
Deploy to Railway →