Channels & update mode

Keep it simple first: use channel default with updateMode: "silent". Add custom channels only when you need separate release tracks.

Simple default setup

plugins: {
  Updater: {
    appId: "YOUR_APP_ID",
    publicKey: "YOUR_PUBLIC_KEY",
    defaultChannel: "default",
    updateMode: "silent",
    autoUpdate: true
  }
}

This behaves like a single-track OTA flow. Upload and release to default.

otakit upload --channel default
otakit release --channel default

Production + staging setup

Use env-driven build config. Production stays safe with silent updates, staging is stricter with eager startup checks.

// capacitor.config.ts
const channel = process.env.OTAKIT_CHANNEL ?? "default";
const updateMode = (process.env.OTAKIT_UPDATE_MODE ?? "silent") as
  | "silent"
  | "eager";

plugins: {
  Updater: {
    appId: process.env.OTAKIT_APP_ID,
    publicKey: process.env.OTAKIT_PUBLIC_KEY,
    defaultChannel: channel,
    updateMode,
    autoUpdate: true
  }
}
# Production build
export OTAKIT_CHANNEL=production
export OTAKIT_UPDATE_MODE=silent

# Internal QA build
export OTAKIT_CHANNEL=staging
export OTAKIT_UPDATE_MODE=eager

Recommended rollout flow

# 1) Validate in staging
otakit upload --channel staging
otakit release --channel staging

# 2) Release same version to production
otakit release --channel production

Runtime channel overrides are intentionally not supported. Channel is a build-time decision.