Onboarding a provider for `ss state`
When ss state refresh reports skipped for a provider, it’s because
that provider’s API token isn’t in the vault. Each adapter’s
preflight() error message includes the exact ss vault set-key
command — this runbook gathers them in one place.
After running the right set-key and a fresh ss state refresh, the
provider’s resources will start appearing in ss state list.
Railway
Section titled “Railway”- Generate a Personal Access Token at https://railway.app/account/tokens (no scope picker — Railway PATs have full account access)
- Store it:
Terminal window ss vault set-key railway api_key=<token> - Verify:
ss state refresh --provider=railwayshould report a non-zero discovery count.
Hetzner Cloud
Section titled “Hetzner Cloud”- Open https://console.hetzner.cloud → your project → Security → API tokens → Generate API token
- Permissions: Read & Write (Read-only is enough for inventory, but the provisioner needs Write — single token is fine).
- Store:
Terminal window ss vault set-key hetzner api_token=<token> - Verify:
ss state refresh --provider=hetzner
Supabase
Section titled “Supabase”- Generate a Personal Access Token at https://supabase.com/dashboard/account/tokens
- Store:
Terminal window ss vault set-key supabase api_key=<sbp_...> - Verify:
ss state refresh --provider=supabase
The same token powers
ss vault rotate-supabasefor refreshing the per-projectSUPABASE_CONNECTION_STRING+ service-role key entries.
Cloudflare
Section titled “Cloudflare”- Generate an API token at https://dash.cloudflare.com/profile/api-tokens → Create Token → Custom token
- Permissions needed:
- Account → Account Settings:Read
- Account → Cloudflare Pages:Read
- Account → Workers Scripts:Read
- Zone → Zone:Read
- Account/Zone resources: all accounts, all zones.
- Store:
Terminal window ss vault set-key cloudflare api_token=<token> - Verify:
ss state refresh --provider=cloudflare
GitHub
Section titled “GitHub”- Create a token at https://github.com/settings/tokens
- Fine-grained (preferred) — give it Contents: read and Metadata: read on every repo you want indexed (or “All repos I have access to”).
- Classic —
reposcope is sufficient.
- Store:
Terminal window ss vault set-key github api_key=<gho_... | ghp_...> - Verify:
ss state refresh --provider=github
GitHub’s API has a rate ceiling at 5,000 reqs/hr. A full sweep does roughly
2 + 2 × reposrequests (one for /user/repos and /user/orgs, then workflows + deployments per repo). At ~50 repos you’re well under the ceiling; at ~500+ consider running the sweep less often or filter by org via fine-grained scope.
Inspecting what’s stored
Section titled “Inspecting what’s stored”ss vault list-keys <provider> # one providerss vault list-all # everythingss state providers lists what’s registered in the inventory layer
even if a vault key is missing — useful for seeing what’ll come online
once a new key is added.
Rotating a token
Section titled “Rotating a token”ss vault delete-key <provider> <key>ss vault set-key <provider> <key>=<new-token>No restart needed; the next ss state refresh reads the new value.