Connect your first provider
GitHub OAuth in three clicks — five minutes from "no integration" to "agent has a scoped delegation."
You're going to bind a SaaS account to your organization. This is the only time a real OAuth token enters the system — Nomos stores it encrypted and never gives it back to your agent.
We use GitHub for this walkthrough because the OAuth scopes are familiar. The same flow works for Slack, Google, Notion, Linear, Stripe, Discord. Pick the one you actually need; only the consent screen differs.
Before you start
- An organization on Nomos (Get started → Install the dashboard).
- A GitHub account you can sign into right now.
Prefer the CLI?
cb connections create --provider github opens the same OAuth consent
screen in your browser and writes the encrypted token back. See the
Quickstart for the
side-by-side CLI / MCP / SDK paths.
Step-by-step
- 1Open Connections
From the dashboard left nav, go to Connections. A fresh org shows an empty table with a "Connect provider" button.

The Connections page on a fresh organization. - 2Click Connect → GitHub
The picker shows every connector Nomos supports. Click the GitHub tile.

Pick a provider. Tiles labeled 'GA' are production-ready. - 3Approve the OAuth consent screen
GitHub opens its standard consent screen in a new tab. Pick the org you want Nomos to be able to talk to on your behalf. Nomos asks for
repo,read:user,read:org— adjust later via Cedar; the OAuth scope is a ceiling, not the enforcement layer.
GitHub's own consent screen. Pick the org you want exposed to Nomos. Click Authorize Nomos. GitHub redirects back to the dashboard.
- 4Verify the connection row
You're back on
/app/connectionswith one row: GitHub, your username, "active", "refreshable". Token expiry shows up on the right; Nomos refreshes it automatically on a 1-hour cadence with a 24-hour lookahead.
One row per connected account. The token is encrypted in the broker — you never see it.
Verify it worked
- The Connections row shows
status: activeand a token expiry in the future. - Clicking the row opens a side drawer with: connected account, granted scopes, refresh-token availability, last-used timestamp.
- No raw OAuth token is visible anywhere in the UI. That's the point — only the PDP can decrypt it, and only at request time.
One connection, many apps
A Connection isn't tied to an App. You'll create multiple Apps later (one per agent) and each will reference this single GitHub connection. That's how you give five different agents narrow GitHub access without ever cloning the OAuth token.
Common failures
I see 'OAuth callback URL mismatch'+
Self-hosted: confirm OAUTH_REDIRECT_URI matches the GitHub OAuth App's callback URL exactly — including trailing slash. Hosted: this never happens, the callback is fixed.GitHub says 'this app isn't allowed in this org'+
Your GitHub org has approval-required for third-party OAuth apps. An org owner needs to approve Nomos under GitHub Settings → Third-party access. Until they do, the consent screen denies.Connection shows 'token expired' immediately+
Rare. Means GitHub returned a token that's already past its expiry. Disconnect, re-connect, and if it persists open a ticket — usually a clock skew on a self-hosted PDP.