Implementing Shorebird for Flutter App Updates
Flutter doesn't have a React Native CodePush equivalent — until Shorebird appeared. Dart code compiles to native instructions that can't simply be replaced with a JS bundle. Shorebird solved this through its own Dart runtime with patch support: changes in Dart code are packaged into a compact diff and downloaded to the device without going through Store Review.
How It Works
Shorebird embeds a modified Dart VM in the app. On startup, the VM checks for patches on Shorebird servers. If there are patches — it downloads and applies them. A patch contains only changed Dart objects, not the whole bundle. This fundamentally differs from CodePush: here, compiled Dart code changes, not interpreted JS.
What you can update via Shorebird:
- All Dart/Flutter code
- Dart dependencies (pub packages) if they're pure Dart
What you cannot:
- Native plugins (platform channels with Kotlin/Swift code)
- Assets (images, fonts) — not yet supported
- Changes to
AndroidManifest.xml/Info.plist
Installation and First Release
# Install CLI
curl --proto '=https' --tlsv1.2 https://raw.githubusercontent.com/shorebirdtech/shorebird/main/install.sh -sSf | bash
# Initialize in project
shorebird init
# First release (full build + upload to Shorebird)
shorebird release android
shorebird release ios
After shorebird init, the project gets a shorebird.yaml with app_id. This file is committed to the repository.
Releasing via Shorebird is a full app build. Upload this artifact to Play Store / App Store — it contains the Shorebird runtime.
Creating a Patch
# Patch for Android
shorebird patch android --release-version 1.2.3+42
# Patch for iOS
shorebird patch ios --release-version 1.2.3+42
--release-version — the version to which the patch applies. Users with version 1.2.3+42 get the patch automatically on next startup.
CI/CD Integration
# .github/workflows/shorebird-patch.yml
name: Shorebird Patch
on:
push:
branches: [hotfix/*]
jobs:
patch:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: subosito/flutter-action@v2
with:
flutter-version: '3.x'
- uses: shorebirdtech/setup-shorebird@v1
with:
cache: true
- name: Create patch
run: |
shorebird patch android \
--release-version ${{ inputs.release_version }}
env:
SHOREBIRD_TOKEN: ${{ secrets.SHOREBIRD_TOKEN }}
SHOREBIRD_TOKEN is created via shorebird login:ci similar to Fastlane firebase login:ci.
Monitoring and Rollback
Shorebird Console shows patch statistics: percentage of devices that got the patch, crash rate after applying. Rollback: shorebird patch rollback android --patch-number 5 — Shorebird stops serving the patch to new devices, already updated devices get the previous version on next startup.
Pricing Model and Limitations
Shorebird is a paid service (free tier: 5000 MAU). This needs to be factored into architecture: dependency on third-party service is critical for production apps. Self-hosted option is unavailable — runtime code is proprietary.
For apps with strict security requirements (finance, medical), verify platform policies: App Store Review Guidelines 3.3.2 forbids executable code loading via interpreter, but Shorebird appeals to the fact that patches are modifications of existing code, not new code.
Process
Audit Flutter dependencies for native components → integrate Shorebird SDK → first release via Shorebird (instead of standard flutter build) → configure CI for patches → test patch delivery → configure monitoring → write documentation.
Timeline: 2–3 days. Cost is calculated individually.







