Skip to content
Back to skills

Ota Updates

ASecurity

Configure over-the-air mobile updates — Shorebird for Flutter, CodePush or EAS Update for React Native — with update channels, staged rollout, forced vs optional update policies, rollback procedures, crash-rate monitoring, and CI integration

  • 15 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added May 29, 2026
ai-agentsjavascriptgojavareactdockerterraformtestinggitapici/cd

Works with

  • cli
  • api

Security analysis

A100/100

Scanned May 29, 2026

npx -y skills add tinh2/skills-hub-registry --skill ota-updates --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Ota Updates?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Ota Updates
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/tinh2-ota-updates/badge)](https://www.skillsdirectory.com/skills/tinh2-ota-updates)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: ota-updates
description: "Configure over-the-air mobile updates — Shorebird for Flutter, CodePush or EAS Update for React Native — with update channels, staged rollout, forced vs optional update policies, rollback procedures, crash-rate monitoring, and CI integration"
version: "2.0.0"
category: deploy
platforms:
  - CLAUDE_CODE
---

You are in AUTONOMOUS MODE. Do NOT ask questions. Do NOT pause for confirmation.
Execute every phase below in sequence, making decisions based on what you find.

============================================================
PHASE 0 — INPUT
============================================================

$ARGUMENTS may contain:
- A specific OTA platform: `shorebird`, `codepush`, `eas-update`
- A specific focus: `rollback`, `channels`, `ci-integration`, `update-policy`
- If no arguments, configure the complete OTA infrastructure for the detected framework

============================================================
PHASE 1 — FRAMEWORK DETECTION
============================================================

1. Detect the mobile framework:
   - `pubspec.yaml` with flutter SDK -> Flutter (use Shorebird)
   - `package.json` with `react-native` -> React Native (use CodePush or EAS Update)
   - `package.json` with `expo` -> Expo (use EAS Update)
   - `*.xcodeproj` (native iOS) -> Custom OTA or no-code-push strategy
   - `build.gradle.kts` (native Android) -> Play In-App Updates API

2. Determine OTA eligibility:
   - OTA CAN update: JavaScript bundles (RN), Dart code (Flutter/Shorebird), assets, configuration
   - OTA CANNOT update: native code, new permissions, native module changes, new SDK integrations
   - Document what changes require a full store release vs OTA

============================================================
PHASE 2 — FLUTTER / SHOREBIRD SETUP
============================================================

If Flutter is detected, configure Shorebird:

**Initialization**:
- Install Shorebird CLI
- Run `shorebird init` in project
- Generate `shorebird.yaml` with app ID and flavor-based channel definitions

**Channel configuration**:
- `development`: dev app ID
- `staging`: staging app ID
- `production`: production app ID

**Release workflow**:
- `shorebird release android/ios --flavor production` — creates a new store release baseline
- `shorebird patch android/ios --flavor production` — pushes OTA patch to existing release

**CI integration** (`.github/workflows/ota-patch.yml`):
- `workflow_dispatch` with platform and flavor inputs
- Uses `shorebirdtech/setup-shorebird@v1` with `SHOREBIRD_TOKEN` secret
- Runs on `macos-14` for iOS, `ubuntu-latest` for Android

============================================================
PHASE 3 — REACT NATIVE / CODEPUSH / EAS UPDATE
============================================================

If React Native is detected, configure the appropriate OTA solution:

**Expo (EAS Update)**:
- Configure `eas.json` with update channels per environment (development, staging, production)
- Push updates: `eas update --channel staging --message "description"`
- Channel promotion flow: staging -> production

**Bare React Native (CodePush)**:
- Install `react-native-code-push` SDK
- Configure update check behavior:
  - `checkFrequency: ON_APP_RESUME`
  - `installMode: ON_NEXT_RESUME` (non-mandatory)
  - `mandatoryInstallMode: IMMEDIATE` (mandatory/critical)
  - `minimumBackgroundDuration: 60` seconds

============================================================
PHASE 4 — NATIVE APPS
============================================================

For native iOS/Android apps without OTA framework support:

**Android — Play In-App Updates**:
- Flexible update (downloads in background, non-blocking)
- Immediate update (blocks app usage until installed)
- Check `updateAvailability()` and `isUpdateTypeAllowed()` before prompting

**iOS — App Store Version Check**:
- Query iTunes lookup API for latest version
- Compare with current bundle version
- Prompt user to update if newer version exists

**Custom OTA for config/assets**:
- Firebase Remote Config for feature flags and configuration
- Asset bundles downloaded on demand
- No code changes via OTA (would violate store guidelines)

============================================================
PHASE 5 — UPDATE CHANNELS & ENVIRONMENTS
============================================================

Configure update channels matching deployment environments:

| Channel | Target | Update Mode | Rollout |
|---------|--------|-------------|---------|
| development | Dev builds | Immediate | 100% |
| staging | QA/staging | Immediate | 100% |
| production-canary | 5% of production | On next resume | 5% |
| production | All production | On next resume | 100% |

Channel promotion flow:
1. Push patch to staging channel
2. QA verifies on staging builds
3. Promote to production-canary (5% rollout)
4. Monitor crash-free rate for 24 hours
5. If stable (crash-free > 99%), promote to production (100%)

============================================================
PHASE 6 — UPDATE POLICIES
============================================================

Implement update policy logic with three severity tiers:

**Critical (forced)** — blocks app until installed:
- Security vulnerability fix
- Data corruption fix
- Authentication bypass fix
- API breaking change requiring client update

**Important (strongly recommended)** — persistent banner, dismissible once per session:
- Major bug fix
- Performance improvement
- New required feature

**Optional (informational)** — dismissible dialog, not shown again for this version:
- Minor improvement
- New optional feature
- UI polish

Generate a version compatibility config:
```json
{
  "minSupportedVersion": "2.1.0",
  "latestVersion": "2.3.0",
  "forceUpdateBelow": "2.0.0"
}
```

============================================================
PHASE 7 — ROLLBACK STRATEGY
============================================================

Document rollback procedures for each platform:

**Shorebird**: `shorebird patch rollback android/ios --release-version 1.0.0`

**EAS Update**: `eas update:republish --group <previous-update-group-id> --channel production`

**CodePush**: `appcenter codepush rollback -a owner/AppName-Platform Production`

**Automated rollback trigger**:
- Monitor crash-free rate after OTA push
- If crash-free rate drops below 98%, automatically rollback
- Send alert to team channel (Slack, PagerDuty)

============================================================
PHASE 8 — A/B UPDATE TESTING
============================================================

Configure A/B testing for OTA updates:
1. Create two update variants targeting different user segments
2. Use rollout percentage to split traffic
3. Monitor metrics per variant: crash-free rate, session duration, feature adoption, retention
4. Promote the winning variant to 100%


============================================================
SELF-HEALING VALIDATION (max 2 iterations)
============================================================

After completing deployment/infrastructure changes, validate:

1. Verify all generated files are syntactically valid (YAML, JSON, HCL, Dockerfile).
2. Run validation commands if available (terraform validate, docker build --check, kubectl dry-run).
3. Verify no secrets, credentials, or sensitive values are hardcoded.
4. If validation fails, diagnose and fix the specific syntax or config error.
5. Repeat up to 2 iterations.

IF STILL FAILING after 2 iterations:
- Document what failed and the exact error
- Include partial output if available

============================================================
OUTPUT
============================================================

```
## OTA Update Infrastructure Complete

### Framework: {Flutter / React Native / Expo / Native}
### OTA Platform: {Shorebird / EAS Update / CodePush / Custom}

### Update Channels
| Channel | Target | Mode | Rollout |
|---------|--------|------|---------|
| {channel} | {audience} | {immediate/resume} | {%} |

### Update Policy
| Severity | Behavior | User Experience |
|----------|----------|-----------------|
| Critical | Force update | Blocks app until updated |
| Important | Recommend | Persistent banner |
| Optional | Inform | Dismissible dialog |

### Rollback Procedure
{step-by-step rollback for the configured platform}

### CI Integration
{workflow files created for automated OTA patches}

### Files Created
{list all generated files with paths}
```

============================================================
NEXT STEPS
============================================================

1. Push your first OTA patch to the staging channel to verify the setup
2. Run `deploy/mobile-ci-cd` to integrate OTA patches into the CI/CD pipeline
3. Set up crash monitoring (Sentry, Crashlytics) to enable automated rollback triggers
4. Test the rollback procedure before relying on it in production


============================================================
SELF-EVOLUTION TELEMETRY
============================================================

After producing output, record execution metadata for the /evolve pipeline.

Check if a project memory directory exists:
- Look for the project path in `~/.claude/projects/`
- If found, append to `skill-telemetry.md` in that memory directory

Entry format:
```
### /ota-updates — {{YYYY-MM-DD}}
- Outcome: {{SUCCESS | PARTIAL | FAILED}}
- Self-healed: {{yes — what was healed | no}}
- Iterations used: {{N}} / {{N max}}
- Bottleneck: {{phase that struggled or "none"}}
- Suggestion: {{one-line improvement idea for /evolve, or "none"}}
```

Only log if the memory directory exists. Skip silently if not found.
Keep entries concise — /evolve will parse these for skill improvement signals.

============================================================
DO NOT
============================================================

- Do NOT push OTA updates that include native code changes — these require store review
- Do NOT skip staging channel testing before production push
- Do NOT set all updates to force-update — this creates a poor user experience
- Do NOT deploy without a tested rollback procedure
- Do NOT push to production without monitoring crash-free rate
- Do NOT bypass store guidelines by delivering app functionality via remote config that would normally require review
- Do NOT store OTA tokens or API keys in source code

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…