Authentication
Device-code OAuth login, where the API key lives, and how to provision CI / headless machines.
You need an API key to publish a mini-app. You do not need one to develop locally — the dev-server has no network dependency on the i99dash backend.
Interactive (recommended)
sdk-i99dash loginThe CLI uses OAuth 2.0 Device Authorization Grant (RFC 8628):
- The CLI asks the backend for a device code and a user code.
- The CLI prints a URL and the user code, and opens the URL in your browser.
- You log in to i99dash, paste the user code, and approve.
- The CLI polls the backend. On approval it receives a long-lived API key and stores it in your OS keychain.
Nothing about your password / session cookie ever touches the CLI.
Where the key lives
| Platform | Store |
|---|---|
| macOS | Keychain Access, service i99dash.sdk, account default |
| Windows | Credential Manager, generic credential i99dash.sdk |
| Linux (with libsecret) | libsecret collection default, schema i99dash.sdk |
| Linux (without libsecret) | ~/.config/i99dash/sdk.json, mode 0600, with console warning |
Check via sdk-i99dash whoami.
Log out
sdk-i99dash logoutPurges the keychain entry (or deletes the fallback file).
CI / headless machines
Skip login entirely. Set:
export I99DASH_API_KEY="<value>"The CLI prefers I99DASH_API_KEY over the keychain, so a CI runner
with the env var set behaves identically to a logged-in dev.
To mint a CI key: run sdk-i99dash login on a dev machine, then copy
the key out of the keychain and store it as a CI secret. Rotate
periodically — see below.
Rotation
sdk-i99dash logout(clears the local copy)sdk-i99dash loginagain (mints a new one)- The old key is invalidated server-side.
For shared service accounts, coordinate rotation across your team — there's no per-seat key in v1.
What the CLI does with the key
Exhaustively — network calls with the key attached:
GET /api/v1/dev/me(identity probe).POST /api/v1/mini-apps/upload-url(publish).PUT <presigned url>(publish, no auth header — presigned URL is the credential).POST /api/v1/mini-apps/submit(publish).GET /api/v1/mini-apps/mine(listing your apps; optional).
Nothing else.