Experience Seamless Production Updates with Shorebird in Flutter

A note before diving in: Shorebird is a live, actively-developing SaaS product, and its CLI commands, pricing, and account flow can change between releases. The commands below reflect the general workflow, but verify the exact syntax against docs.shorebird.dev before running anything in a real project — this is the one area of this guide most likely to drift out of date.
Publishing a one-line text fix to the App Store or Play Store means a full review cycle — sometimes hours, sometimes days, sometimes a rejection that sends you back to the start. Shorebird is a code-push service built specifically for Flutter that lets you patch your app's Dart code in production without going through that review cycle at all, for the category of change it can actually make.
What Shorebird can and can't do — read this before anything else
This is the single most important thing to understand before adopting Shorebird, and it's usually left for the end of a tutorial or skipped entirely: Shorebird can only patch Dart code. It cannot ship a new native dependency, a new permission, a new app icon, a change to Info.plist or AndroidManifest.xml, or anything that touches the native shell of the app. Fixing a typo in a widget, correcting broken business logic, or adjusting a Dart-level bug is exactly what it's for. Adding a new plugin that touches native code, or changing anything Apple/Google review actually cares about, still requires a normal store release.
This works at all because Shorebird ships a forked version of the Flutter engine with a Dart interpreter built in — patches are interpreted at runtime rather than compiled ahead-of-time like the rest of your app, which is also why development against a Shorebird-enabled app uses shorebird run instead of flutter run --release: it's running against that modified engine, not stock Flutter.
Setting up
1. Install the CLI:
# macOS/Linux
curl --proto '=https' --tlsv1.2 https://raw.githubusercontent.com/shorebirdtech/install/main/install.sh -sSf | bash
# Windows (PowerShell)
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
iwr 'https://raw.githubusercontent.com/shorebirdtech/install/main/install.ps1' | iex
2. Create an account and log in. Shorebird requires a Shorebird account before you can push a release — sign up at their site, then:
shorebird login
Worth knowing up front: Shorebird's pricing is based on patch installs per month, with a free tier for smaller apps and paid tiers beyond it. Check their current pricing page before committing a production app to it, since this is exactly the kind of detail that changes as the product matures.
3. Initialize your project:
shorebird init
This generates a shorebird.yaml file containing a unique app_id that identifies your app to Shorebird's backend for every future release and patch:
app_id: a1b2c3d4-e5f6-7890-abcd-ef1234567890
Creating a release
A release is the baseline version that future patches will apply against — you need one release published before you can push any patches to it:
shorebird release android
shorebird release ios
By default this produces a production-ready app bundle (.aab on Android). Pin the Flutter version explicitly if your project depends on a specific one:
shorebird release android --flutter-version=3.24.0
This release still needs to go through the normal App Store / Play Store submission process once — Shorebird doesn't skip that first step; it's what makes every subsequent Dart-only fix skip it.
Previewing before you ship
shorebird preview
This installs the release build on a connected device or emulator so you can verify it behaves as expected before real users see it — a sanity check worth doing every time, since a release is the thing every future patch is diffed against.
Pushing a patch
Once a release is live, ship a Dart-only fix without a new store submission:
shorebird patch android
shorebird patch ios
Under the hood, this command:
Builds the updated Dart artifacts from your current code.
Downloads the corresponding release artifacts to diff against.
Computes a binary patch — the difference between the release and your current code, not the whole app.
Uploads that patch to Shorebird's backend.
Promotes the patch to the stable channel, making it available to install.
When users actually see the update
This is worth stating plainly, since "seamless" and "instant" get used loosely in code-push marketing generally: a pushed patch does not apply to an app that's currently running. Users see the update the next time they fully restart the app — not mid-session, and not via a hot-reload-style live update while they're actively using it. "Seamless" here means "no store review and no manual update prompt," not "changes appear while the app is open." If your use case specifically requires a change to take effect without any restart at all, code push isn't the right tool for that regardless of provider.
A realistic use case
The scenario code push is built for: you ship a release, and within a day discover a typo in an error message, a miscalculated discount percentage, or a broken conditional in a Dart file — nothing native, nothing requiring a new permission. Instead of a new build working through review for days, shorebird patch gets the fix in front of users on their next app open, typically within minutes of the patch being promoted.
What it's not built for: a UI change requiring a new native plugin, an SDK upgrade for a native library, or anything Apple or Google's review process is specifically checking for — those still need a full release cycle, and no code-push tool changes that.
Conclusion
Shorebird fills a real, long-standing gap in Flutter's release story — the ability to fix a Dart-only bug without a multi-day review cycle standing between you and your users. Its value is genuinely large for the specific category of fix it addresses, and correspondingly limited outside that category: it's not a general bypass of app store review, it doesn't apply changes mid-session, and it requires the same forked-engine shorebird run/shorebird release workflow instead of the stock Flutter commands you're used to. Understood with those boundaries in mind, it's one of the more genuinely useful additions to the Flutter ecosystem in recent years — just verify the exact current commands and pricing against Shorebird's own docs, since a tool this young moves faster than any blog post about it can keep up with.
References






