From app-gtm-release
Set up over-the-air (OTA) updates for Flutter apps using Shorebird Code Push. Use this skill when the user asks about hot updates, OTA updates, code push, patching without store review, instant updates, bypassing store releases, Shorebird setup, or deploying Dart code changes without going through the app store submission process. Also triggers on: 'push a fix without store update', 'update without releasing', 'Shorebird', 'patch my app', or 'instant deploy'.
How this skill is triggered — by the user, by Claude, or both
Slash command
/app-gtm-release:code-pushThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
<!-- TODO: framework-agnostic split — Shorebird is Dart-only. When a second framework lands (e.g., MAUI Hot Reload, Capacitor Live Updates, EAS Update for RN), fork this into per-framework skills (code-push-flutter, code-push-maui, etc.) routed by /ship-{framework}. -->
Shorebird Code Push lets you deploy Dart code changes instantly to users without going through the app store review process. Fix bugs, update logic, and ship improvements in minutes instead of days.
Understanding the boundaries is critical before relying on this tool:
Rule of thumb: if the change touches only lib/ and pure Dart dependencies, it can be patched. Anything else requires a store release.
1. Create release: shorebird release android → baseline release → upload to stores
2. Users install from store
3. Make Dart code changes
4. Create patch: shorebird patch android → diff against release → uploaded to Shorebird cloud
5. Users open app → Shorebird checks for patches → downloads diff → applies on next restart
The modified Flutter engine included with Shorebird:
# macOS/Linux
curl --proto '=https' --tlsv1.2 https://raw.githubusercontent.com/shorebirdtech/install/main/install.sh -sSf | bash
# Verify
shorebird doctor
cd your_flutter_project
shorebird init
This creates shorebird.yaml with a unique app_id:
# shorebird.yaml
app_id: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Commit shorebird.yaml to your repository.
# Android release
shorebird release android
# iOS release
shorebird release ios
# With flavor
shorebird release android --flavor production
# With specific version
shorebird release android -- --build-number=42
This produces store-ready artifacts (AAB for Android, IPA for iOS) with the Shorebird engine embedded. Upload these to the stores as you normally would.
After making Dart code changes:
# Patch Android
shorebird patch android
# Patch iOS
shorebird patch ios
# Patch specific release
shorebird patch android --release-version=1.0.0+1
# Patch with flavor
shorebird patch android --flavor production
The patch is a diff against the release — only changed code is downloaded by users.
# List releases
shorebird releases list
# List patches for a release
shorebird patches list --release-version=1.0.0+1
# Check patch status
shorebird patches list
# .github/workflows/shorebird-release.yml
name: Shorebird Release
on:
push:
tags:
- 'v*.*.*'
jobs:
release-android:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Shorebird
uses: shorebirdtech/setup-shorebird@v1
with:
cache: true
- name: Setup Java
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: '17'
- name: Create Shorebird release
env:
SHOREBIRD_TOKEN: ${{ secrets.SHOREBIRD_TOKEN }}
run: shorebird release android
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: android-release
path: build/app/outputs/bundle/release/app-release.aab
# .github/workflows/shorebird-patch.yml
name: Shorebird Patch
on:
workflow_dispatch:
inputs:
platform:
description: 'Platform to patch'
required: true
type: choice
options: [android, ios]
jobs:
patch:
runs-on: ${{ inputs.platform == 'ios' && 'macos-latest' || 'ubuntu-latest' }}
steps:
- uses: actions/checkout@v4
- name: Setup Shorebird
uses: shorebirdtech/setup-shorebird@v1
- name: Create patch
env:
SHOREBIRD_TOKEN: ${{ secrets.SHOREBIRD_TOKEN }}
run: shorebird patch ${{ inputs.platform }}
# In codemagic.yaml, add to scripts:
scripts:
- name: Install Shorebird
script: |
curl --proto '=https' --tlsv1.2 https://raw.githubusercontent.com/shorebirdtech/install/main/install.sh -sSf | bash
echo "PATH=$HOME/.shorebird/bin:$PATH" >> $CM_ENV
- name: Create Shorebird release
script: |
shorebird release android
# Or for patching:
# shorebird patch android
Generate a Shorebird CI token:
shorebird login:ci
This outputs a token. Add it as SHOREBIRD_TOKEN in your CI secrets.
The recommended flow integrates Shorebird into the existing CI/CD pipeline:
New feature / major change:
└─ Normal release flow (CI/CD → store submission → review)
└─ shorebird release android/ios
└─ Upload to stores
Bug fix / minor Dart change:
└─ shorebird patch android/ios
└─ Users get fix on next app restart (no store review)
Only one patch is active per release at a time. A new patch replaces the previous one.
| Platform | Status | Notes |
|---|---|---|
| Android | Stable | AAB and APK supported |
| iOS | Stable | IPA supported |
| macOS | Supported | AAR format |
| Web | Not supported | Not applicable (web deploys differently) |
| Windows | Not yet | Planned |
| Linux | Not yet | Planned |
| Plan | Patches/month | Price |
|---|---|---|
| Hobby | 5,000 | Free |
| Team | 50,000 | $20/month |
| Business | 500,000 | Custom |
Patch = one user receiving one update.
Both Apple and Google allow over-the-air code updates as long as:
Shorebird's approach (modified Flutter engine that checks for Dart code updates) complies with both stores' policies. Shorebird only patches Dart code — it cannot modify native code or add new native capabilities.
Provides UI/UX resources: 50+ styles, color palettes, font pairings, guidelines, charts for web/mobile across React, Next.js, Vue, Svelte, Tailwind, React Native, Flutter. Aids planning, building, reviewing interfaces.
Fetches up-to-date documentation from Context7 for libraries and frameworks like React, Next.js, Prisma. Use for setup questions, API references, and code examples.
npx claudepluginhub dojocodinglabs/app-gtm-release-toolkit --plugin app-gtm-release