The Problem with Bugs in Production
It has probably happened to you: after days of working hard on a new feature and waiting for your app to be approved on App Store or Google Play, you finally release it and… surprise, it has a bug. Fixing it is not immediate—you need to generate another build, upload it again, and then wait for the store to review it. On iOS, that process can feel endless.
And what if the bug is critical? You cannot afford to let users keep running that version (they could even break everything, like throwing the goblin barrel twenty times in Clash Royale).
As a user, Apple’s strict review process is great because it keeps the store much cleaner than Android. But as a developer, it means that continuous deployment to production is more of a dream than a reality.
What if I Need an Urgent Hot-fix?
If the app in production has a small but annoying error—or worse, a major one that destroys the user experience—you cannot just upload a new build and expect it to instantly be available. The approval process stands in the way. This is where CodePush becomes a lifesaver.
What is CodePush?
If your app is built with React Native, Flutter, or other hybrid frameworks, CodePush allows you to skip the store review cycle. Instead of compiling, uploading, and waiting, you can deliver changes straight to your users. As soon as they open the app, they get the update automatically.
What Does CodePush Solve?
- Fix bugs in minutes!: no waiting around for Apple or Google to approve the new version.
- Protect your reputation!: critical issues do not linger for days.
- Make quick changes!: update texts, colors, or small UI tweaks without shipping a whole new version.
- Fewer heavy builds!: save time and avoid unnecessary headaches.
For hybrid or cross-platform apps, CodePush becomes essential for staying fast and responsive.
👉 React Native has official support.
👉 Flutter does not… but that is where Shorebird steps in.
Shorebird: The Flutter Alternative
Since I enjoy working with Flutter, I use Shorebird, built by former Flutter team members.
- It offers a surprisingly generous free plan.
- It integrates easily with CI/CD pipelines.
- The CLI makes the setup smooth and simple.
In other words, there is really no excuse to not use it.
Another Problem: Versions Out of Your Control
On Android especially, there are cases where websites scrape your APK and re-upload it, or users share it directly. Sometimes this can be useful (for example, in regions without access to Google Play), but the downside is you lose control over the distribution and versioning of your app.
That is where Forced Update comes in.
What is Forced Update?
Forced Update is not exactly a tool, but rather a technique. It forces users to keep the app updated, either for security reasons or because the current version is no longer compatible.
Examples:
- Your app crashes whenever the microphone is used → block that version and force an update.
- A severe bug, like WhatsApp exposing private conversations → mark the version as obsolete immediately.
- Database structure changes → prevent older versions from working so users switch to the new endpoint.
This technique is flexible too:
- You can force only critical updates.
- You can let some versions be optional.
- You can display a friendly notification pointing users directly to the store.
How to Implement It
One of the easiest ways is through Firebase Remote Config:
- You define values in the cloud (e.g., minimum_version = 2.0).
- When the app starts, it asks: “What version should I be using today?”
- If the installed version is too old, the app forces an update.
You control how often the app checks these values—every 12 hours, once a day, etc.—to avoid overloading requests. And if you do not want to depend on external services, you can always build your own version-checking API.
Conclusion
In mobile development, production bugs are not a matter of “if,” but when. The real challenge is being prepared to act quickly and reduce the damage.
- With CodePush (or Shorebird for Flutter), you can push hotfixes and changes instantly, bypassing long review cycles.
- With Forced Update, you guarantee that no one is left using outdated, broken, or insecure versions.
Together, they create a powerful combo that saves you from countless production headaches—and helps your users always have the best possible experience. 🚀