Code Push: Ship Flutter Updates Without the App Store (AI-generated cover image) Cover image: AI-generated

Code Push: Ship Flutter Updates Without the App Store

Published:
1 min read

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

  1. You build with Shorebird, instead of flutter build you use shorebird release
  2. Shorebird forks Flutter and replaces parts of the engine with custom code
  3. Patches are diffs, only changed Dart files are transmitted
  4. 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

SituationWhy Code Push is Ideal
Critical bug in productionImmediate fix instead of 24-48h store review
Hotfixes for old versionsReach users who don't update manually
Rapid iterationDaily/weekly deploys without store overhead
A/B testing UI changesFast rollout and rollback
Compliance fixesRoll out GDPR adjustments immediately

❌ Not Suitable For

SituationWhy Not
Native plugin updatesCode Push can only update Dart code
New permissionsNeeds native code → store release
Major feature releasesStore policy requires review for "significant changes"
Asset updates (large images/videos)Technically possible, but not efficient

Pros and Cons, Honest Assessment

Advantages ✅

  1. Speed, Patches in minutes instead of days
  2. Rollback, One click and the last patch is gone (more in patch rollbacks)
  3. Reach all users, Even those who never manually update
  4. No downtime, Update happens in background
  5. CI/CD integration, shorebird patch in your pipeline

Disadvantages ❌

  1. Dart code only, Native changes = store release
  2. Costs at scale, From 50k installs/month: $20+/month
  3. Dependency, Another service in your infrastructure
  4. ~1 MB larger app, Shorebird updater in bundle
  5. 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

SolutionStatusFor Whom?
Microsoft CodePush❌ Discontinued March 2025Was for React Native
Expo Updates✅ ActiveReact Native (Expo only)
Firebase Remote Config✅ ActiveConfiguration, NOT code
Custom solution🤷 PossibleIf you have lots of time

For Flutter, Shorebird is currently the only production-ready solution.

Pricing

PlanPatch InstallsPrice
Free5,000/month$0
Pro50,000/month$20/month
Business1,000,000/month$400/month
EnterpriseCustomOn 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!

Let's Connect! 🚀

Ready for your next project?
Let's get started!

Let's get started

Tell me about your vision – just drop me an email or use the contact form. Let's plan your digital success together! 💪