CLI Reference
Use the CLI to upload bundles, release them, inspect bundle and release history, and manage apps.
Project config
Project commands read from capacitor.config.*.
// capacitor.config.ts
import type { CapacitorConfig } from "@capacitor/cli";
const config: CapacitorConfig = {
appId: "com.example.myapp",
appName: "My App",
webDir: "out",
plugins: {
OtaKit: {
appId: "app_xxxxxxxx",
// Optional named channel:
// channel: "staging"
// Optional compatibility lane:
// runtimeVersion: "2026.04"
}
}
};
export default config;Authentication
For local development, sign in once and the CLI stores a token locally. For CI or non-interactive environments, use an organization secret key instead.
If your account has multiple organizations, login asks you to choose a default by name for commands that are not tied to an app. Change it with otakit organization select. Configured apps still use their owning organization, and organization keys are already bound to one.
# Local development otakit login # CI / non-interactive export OTAKIT_TOKEN=otakit_sk_... export OTAKIT_APP_ID=app_xxxxxxxx
Release flow
- Upload only:
otakit upload - Upload and release to the base channel:
otakit upload --release - Upload and release to a named channel:
otakit upload --release beta - Promote an existing bundle later:
otakit release <bundleId> --channel production
Resolution order
The CLI resolves values in a deterministic order.
- App ID:
--app-id->OTAKIT_APP_ID->capacitor.config.* - Server URL:
--server->OTAKIT_SERVER_URL->plugins.OtaKit.serverUrl-> hosted default - Auth token:
OTAKIT_TOKEN-> stored login token - App-less organization:
OTAKIT_ORGANIZATION_ID-> stored login default - Upload path: CLI path argument ->
OTAKIT_BUILD_DIR->capacitor.config.* webDir - Release channel:
--release-> base channel,--release <channel>-> named channel - Runtime version:
plugins.OtaKit.runtimeVersion-> bundle metadata during upload - Upload version:
--version->OTAKIT_VERSION-> auto-generated version
Command reference
otakit upload[path]
Upload a bundle. Optionally release it immediately.
otakit upload --release
otakit release[bundleId]
Release a bundle to the base channel or a named channel. The bundle already carries its runtimeVersion, so release only chooses the rollout channel.
otakit release --channel production --rollout 10
otakit rollout[releaseId]
Show active rollouts, or raise, lower, complete, or cancel one. Without a release ID it acts on the rollout of the selected channel.
otakit rollout --channel production --percent 50
otakit preview[bundleId]
Create a private link and QR code that open a bundle in the installed app on one phone, without releasing it. Defaults to the latest upload. The app needs previewLinks: true and a custom URL scheme.
otakit preview --scheme myapp
otakit compatibility
Check the local native plugin set against a channel's current release without uploading.
otakit compatibility --channel production
otakit list
List uploaded bundles.
otakit list --limit 20
otakit releases
Show release history across all streams or a specific target.
otakit releases --base
otakit delete<bundleId>
Delete a bundle.
otakit delete abc123 --force
otakit register
Create a new app and print the plugin snippet to paste into capacitor.config.ts.
otakit register --slug com.example.myapp
otakit login
Sign in with email OTP and store a token locally.
otakit login --email you@example.com
otakit whoami
Show current authenticated user and organization context.
otakit whoami
otakit organization select
Choose the default organization for commands not tied to an app. Configured apps always use their owning organization.
otakit organization select
otakit logout
Remove stored token for a server.
otakit logout
otakit config resolve
Show effective CLI values and where they came from.
otakit config resolve --json
otakit connect
Connect this project to your coding agent. Signs in if needed, then writes the client's MCP configuration after showing exactly what it resolved and what it will write.
npx -y @otakit/cli@latest connect
otakit push send
Send a push notification to your app users. Needs the Push notifications add-on (Settings → Add-ons) and an APNs key and/or Firebase service account for the app. Shows the audience size and asks before sending.
otakit push send --title "New drop" --body "Open the app to see it" --url /shop --topic news
otakit push campaigns
List recent push campaigns with delivery counts.
otakit push campaigns
otakit push campaign<campaignId>
Show one campaign: status, devices targeted and accepted by Apple/Google, failures and removed tokens.
otakit push campaign 11dead02-8f6f-4349-8ea3-7667c2a4382c
otakit mcp
Start the local MCP server, bound to one project and organization for its lifetime.
npx -y @otakit/cli@latest mcp --project-root .
otakit config validate
Validate the OtaKit-related values in capacitor.config.*.
otakit config validate
otakit generate-signing-key
Generate an ES256 key pair for manifest signing.
otakit generate-signing-key
otakit generate-encryption-key
Generate an AES-256 bundle encryption key. Keep it in CI as OTAKIT_ENCRYPTION_KEY and ship it in the app's bundleKeys config.
otakit generate-encryption-key
Troubleshooting
- Missing app ID: add
plugins.OtaKit.appIdtocapacitor.config.ts, or pass--app-id. - Missing
index.html: build your web app and verifywebDiror the explicit upload path. - Need to create an app from automation: use
otakit register --slug <slug>.