In short
- Shorebird Code Push: Dart code updates in seconds instead of days
- OTA updates are store-compliant as long as you don't change core app functionality
- Native code (Swift, Kotlin, plugins) can't be updated via Code Push
- Free up to 5,000 patch installs/month, then $20/month
- Best for hotfixes, critical bug fixes, and rapid iterations
Friday, 5:00 PM. Your app is live, 10,000 users are actively using it, and you discover a critical bug. The normal path: develop fix, create build, upload to App Store, wait for review. Minimum 24-48 hours with Apple, often longer.
With Code Push? Push the fix, 5 minutes later all users have the update. No store review, no waiting.
Sounds too good to be true? It's not. But there are limitations you need to know about.
What is Code Push Anyway?
Code Push (or Over-the-Air Updates, OTA) allows you to deliver app code directly to users, bypassing the App Store or Play Store. The app checks at startup (or at defined intervals) whether an update is available, downloads it in the background, and activates it on the next restart.
Important to understand: Code Push does NOT replace the App Store. You still need store releases for:
- New users (they always download from the store)
- Native code changes
- Major feature updates (store policy)
Code Push is an additional tool for rapid iterations and hotfixes.
Shorebird: The Code Push Solution for Flutter
For React Native, there was Microsoft CodePush (via App Center) for years. However, it was discontinued in March 2025. For Flutter, the situation was frustrating for a long time, there simply was no production-ready solution.
That changed with Shorebird, founded by Eric Seidel (former Flutter Team Lead at Google). Shorebird isn't a hack or workaround, it's a clean implementation using a modified Flutter fork.
How Shorebird Works Technically
- You build with Shorebird, instead of
flutter buildyou useshorebird release - Shorebird forks Flutter and replaces parts of the engine with custom code
- Patches are diffs, only changed Dart files are transmitted
- On device an updater runs that checks for updates on app start
The genius part: You continue using your normal Flutter project. No code changes needed (except optionally for manual update control).
Store Guidelines: What's Allowed?
Good news: Code Push is officially allowed, with restrictions.
Apple App Store (iOS)
"Interpreted code may be downloaded to an Application but only so long as such code: (a) does not change the primary purpose of the Application, (b) does not create a store or storefront for other code or applications, and (c) does not bypass signing, sandbox, or other security features of the OS." — Apple Developer Program License Agreement, Section 3.3.1b
Translation: You can download code as long as:
- The app doesn't suddenly do something completely different
- You don't build an alternative app store
- You don't bypass security mechanisms
Google Play Store (Android)
"An app may not download executable code from a source other than Google Play. This restriction does not apply to code that runs in a virtual machine or an interpreter." — Google Play Developer Policy
Since Dart runs in a VM (and Shorebird uses an interpreter on iOS), this is explicitly allowed.
What You Should NOT Do
- Submit app as "Calculator" and turn it into a game via Code Push
- Unlock paid features without store review
- Roll out completely new main features via OTA
Shorebird's clear statement: Abuse violates their ToS and leads to account termination.
Setup Guide: Shorebird in 10 Minutes
1. Installation
# macOS / Linux
curl --proto '=https' --tlsv1.2 https://raw.githubusercontent.com/shorebirdtech/install/main/install.sh -sSf | bash
# Windows (PowerShell)
iwr -UseBasicParsing 'https://raw.githubusercontent.com/shorebirdtech/install/main/install.ps1' | iex
2. Login & Initialize Project
shorebird login
cd your-flutter-project
shorebird init
This creates a shorebird.yaml with your app ID:
app_id: 12345678-1234-1234-1234-123456789abc
3. Create Release
# Android
shorebird release android
# iOS
shorebird release ios
Important: These releases must go to the store! Shorebird doesn't replace store uploads.
4. Deploy Patch
After users have your app, you can push patches:
# Fixed a bug? Patch it!
shorebird patch android
shorebird patch ios
The patch is immediately available. It downloads on the next app start and activates on the one after that.
5. Optional: Manual Update Handling
By default, Shorebird checks automatically on app start. For more control:
import 'package:shorebird_code_push/shorebird_code_push.dart';
final shorebirdCodePush = ShorebirdCodePush();
Future<void> checkForUpdate() async {
final isUpdateAvailable = await shorebirdCodePush.isNewPatchAvailableForDownload();
if (isUpdateAvailable) {
await shorebirdCodePush.downloadUpdateIfAvailable();
// Optional: Notify user and offer app restart
}
}
When Code Push Makes Sense (and When It Doesn't)
✅ Perfect Use Cases
| Situation | Why Code Push is Ideal |
|---|---|
| Critical bug in production | Immediate fix instead of 24-48h store review |
| Hotfixes for old versions | Reach users who don't update manually |
| Rapid iteration | Daily/weekly deploys without store overhead |
| A/B testing UI changes | Fast rollout and rollback |
| Compliance fixes | Roll out GDPR adjustments immediately |
❌ Not Suitable For
| Situation | Why Not |
|---|---|
| Native plugin updates | Code Push can only update Dart code |
| New permissions | Needs native code → store release |
| Major feature releases | Store policy requires review for "significant changes" |
| Asset updates (large images/videos) | Technically possible, but not efficient |
Pros and Cons, Honest Assessment
Advantages ✅
- Speed, Patches in minutes instead of days
- Rollback, One click and the last patch is gone (more in patch rollbacks)
- Reach all users, Even those who never manually update
- No downtime, Update happens in background
- CI/CD integration,
shorebird patchin your pipeline
Disadvantages ❌
- Dart code only, Native changes = store release
- Costs at scale, From 50k installs/month: $20+/month
- Dependency, Another service in your infrastructure
- ~1 MB larger app, Shorebird updater in bundle
- Delayed activation, Update activates on NEXT start
Hidden Gotchas 🔍
- Patch size correlates with code changes, Large refactors = large patches
- Each patch is a diff to the release, NOT to the previous patch
- Flutter version must match, Shorebird tracks Flutter Stable
Alternatives to Shorebird
| Solution | Status | For Whom? |
|---|---|---|
| Microsoft CodePush | ❌ Discontinued March 2025 | Was for React Native |
| Expo Updates | ✅ Active | React Native (Expo only) |
| Firebase Remote Config | ✅ Active | Configuration, NOT code |
| Custom solution | 🤷 Possible | If you have lots of time |
For Flutter, Shorebird is currently the only production-ready solution.
Pricing
| Plan | Patch Installs | Price |
|---|---|---|
| Free | 5,000/month | $0 |
| Pro | 50,000/month | $20/month |
| Business | 1,000,000/month | $400/month |
| Enterprise | Custom | On request |
"Patch Install" = One device downloads a patch. 10,000 users with 3 patches/month = 30,000 installs.
Conclusion: When Should You Use Shorebird?
Definitely YES if:
- You have an app in production
- Rapid iteration is important
- You've ever waited 2 days for a store review
Not yet if:
- You're still in MVP phase
- Your app consists mainly of native code
- You have under 1,000 users
Code Push isn't a replacement for solid release processes. It's insurance for emergencies and an accelerator for fast-moving teams.
The true value only shows when you need it: Friday, 5:00 PM, critical bug, 10,000 users affected. That's when you'll be glad you can type shorebird patch instead of waiting all weekend for Apple.
Are you using Code Push in your projects? What experiences have you had? Let us know, we'd love to hear your stories!



