Fast to ship.
Safe to undo.
Pushing code to phones is easy. Making sure nothing goes wrong on a device you'll never see is the hard part, and that's what OverPush is built around.
Every patch is verified on the device
A phone only runs a patch after it confirms the patch is genuine and meant for it. If anything doesn't check out, the phone keeps running the code it shipped with.
- signed with your app's key
- meant for this app and release
- not revoked
- arrived complete and unmodified
Bad patches undo themselves
If a new patch stops your app from starting, the device removes it and goes back to the code it shipped with. It all happens on the phone, so it works even with no network.
Staged rollouts
Send a patch to 10% of devices, watch what happens, then raise it. Devices stay in the rollout once they're in, so users don't flip between versions.
Kill switch
overpush patches revoke 7 stops a patch on every device. It doesn't need the signing key, so anyone on the team can stop a bad release from any laptop.
Small downloads
Patches download in the background, once, so users never wait. On Android, a patch carries only what changed: a small fix is a few hundred KB.
Roll back to any patch
Patch 4 has a problem but patch 3 was fine? Serve patch 3 again with one command.
Nothing to wire up
No changes to main.dart, no native code, no asset entries. Add the package and you're done.
A live dashboard
Daily active devices, patch installs, failures and adoption per release, plus each device's release, patch and errors. You know a fix actually landed.
Dry run first
--dry-run builds and checks a patch without publishing it, and tells you about changes a patch can't carry.
Built for CI
One token for your CI secrets, --yes on every command, and release files kept on the server, so a fresh runner can patch any release.
Built for teams
Put your apps in an organization and add teammates once. Viewer, developer, admin and owner roles decide who can publish, roll back or manage the team.
Activity log
Who published which patch, changed a rollout or rolled something back, and whether from the console or the CLI.
Roll back from the console
Every patch has a menu: change its rollout, roll it back, or roll it forward again. No terminal needed.
Release mode, on both stores.
Patches work on real release builds, the ones your users actually install, not just debug builds.
iOS
App Store safeBuilt to follow Apple's rules. Patches never contain native code, so your app stays within App Store guidelines.
- No native code in any patch
- Everything you need is set up by the CLI
- Works with TestFlight and App Store builds
- Works with obfuscated builds
Android
Full speedWorks with your normal Flutter setup. Patched apps run at the same speed as the original release.
- Nothing extra to install
- No Android code to add to your app
- Play Store app bundles (AAB) and APKs
- Every phone Flutter runs on: 64-bit and 32-bit ARM, x86_64
- Works with obfuscated builds
Your app, your update UI.
OverPush puts nothing on screen. It tells your app what's happening, so you can show it in your own design or not at all.
Found, downloading, ready.
Listen to OverPush.events and get every step of an update: a new patch found, the download percent, and when it's ready for the next start. The same events on Android and iOS.
OverPush.events.listen((event) { switch (event) { case OverPushPatchFound(): show('New update found'); case OverPushDownloading(:final percent): show('Downloading update · $percent%'); case OverPushPatchReady(): show('Restart the app to apply it'); default: break; } });
main.dart, ready to copy. The banner is your app's code, not OverPush.
Everything included, from day one.
Every plan, including the free one, gets signed patches, staged rollouts, and automatic rollback.