Pick your framework and what you need. We will set up a pilot around it.

OTA updates for Flutter

Request a pilot
Framework
Service

One command builds the patch. The device downloads it on its next launch and runs it on the one after. Every line here is real output, from a Flutter app on Android.

CLI output, console and device logs from the acceptance run on the revon_test emulator, October 2026. Output trimmed.

Terminal, developer's Mac
revon patch android --release-version 1.0.0+1790803795 Building patch with Flutter 3.41.7 (b818ebb6d7) Running Gradle task 'bundleRelease'... 24.9s Verifying patch can be applied to release (12ms) Creating patch artifacts (2.0s) Platform: Android [arm32 (8.85 KB), arm64 (8.70 KB), x86_64 (8.82 KB)] Uploading artifacts (65ms) Published Patch 1!
Device log, revon_test emulator

Installed with revon preview00:31:45

Revon updater: no active patch.
Patch check response: patch_available: false
running label: RELEASE v1

It has a version, four artifacts, a hash and a seal. revon release android builds the app bundle with Revon's own Flutter engine and records all of it before anything ships.

Gradle took 42.2 s on the build Mac. The bundle is 47.5 MB. The patch you will see next is 8.70 KB.

Releases

ReleasePlatform
1.0.0+1790803795android active
app-release.aab45.3 MB
aarch64/libapp.so2.9 MB
arm/libapp.so3.2 MB
x86_64/libapp.so3.0 MB
Terminal, developer's Mac
revon release android Building Android app bundle with Flutter 3.41.7 (b818ebb6d7) Running Gradle task 'bundleRelease'... 42.2s Built build/app/outputs/bundle/release/app-release.aab (47.5MB) Release version: 1.0.0+1790803795 (3.6s) Creating release (78ms) Uploading artifacts (2.3s) Published Release 1.0.0+1790803795!
Device log, revon_test emulator

Not installed yet.

lib/main.dart
- const String kBuildLabel = 'RELEASE v1';
+ const String kBuildLabel = 'PATCH v2';

The patch is the difference, not the app: 8.70 KB for this change on arm64. Devices download it on their next launch and run it on the one after. No store review, no reinstall.

The patch step took 31 s end to end. Only Dart changes ship this way. Native code, assets and plugins with native code need a new release.

Step through it
Terminal, developer's Mac
revon patch android --release-version 1.0.0+1790803795 Building patch with Flutter 3.41.7 (b818ebb6d7) Running Gradle task 'bundleRelease'... 24.9s Verifying patch can be applied to release (12ms) Creating patch artifacts (2.0s) Platform: Android [arm32 (8.85 KB), arm64 (8.70 KB), x86_64 (8.82 KB)] Uploading artifacts (65ms) Published Patch 1!
Device log, revon_test emulator

Installed with revon preview00:31:45

Revon updater: no active patch.
Patch check response: patch_available: false
running label: RELEASE v1

Roll back is one action in the console. The server tells devices which patch numbers are withdrawn. They delete the patch at their next check and run the release again. Two launches, and the app is back on the release.

The launch that receives the withdrawal may still be running the patch. The next one never is.

Device activity

TimeReleaseAnswer
21:31:461.0.0+1790803795no patch
21:32:241.0.0+1790803795patch #1
21:32:281.0.0+1790803795patch #1
Console, release 1.0.0+1790803795
PatchState
#1liveRoll back

The next patch check answers rolled_back_patch_numbers: [1]. Devices delete the patch and run the release.

Device log, revon_test emulator

Launch 100:32:21

Patch check response: patch_available: true, patch 1
Downloaded patch (8911 bytes)
Patch 1 successfully downloaded. It will be launched when the app next restarts.
running label: RELEASE v1

Launch 200:32:25

Validating patch 1
Revon updater: active path: …/patches/1/dlc.vmcode
running label: PATCH v2

Revon is the whole pipeline, not a plugin. Your builds, the API, the console, the artifact server and, for Flutter, the engine itself run on infrastructure you control. Built on open source (MIT, Apache, BSD), so the toolchain is yours to rebuild, audit and keep.

Your infrastructure

  • revon CLI and CI/CD

    Builds, signs and releases on your machines and in your CI.

    cli/

  • API

    Releases, patches, keys, and the answer to every patch check. NestJS.

    platform/api

  • Console

    Roll back, promote, read the record. Next.js.

    platform/web

  • Postgres

    Apps, releases, patches, device checks.

    postgres 16

  • Object storage

    Release bundles and patch files. Any S3-compatible store.

    minio / s3

  • Artifact server

    Serves your engine builds and tools to the CLI.

    engine/scripts

  • Flutter engine

    Built from source. libflutter.so for arm64, arm and x86_64.

    revon/engine

  • Your app

    On your users' phones. It asks one update server: yours.

    revon.yaml

Outside the line: no third-party update service. Beyond your artifact server, builds fetch only the standard public packages every Flutter Android build needs.

update servers contacted at runtime · 1 · yours

From the packet capture of the acceptance run. Android's own connectivity check and Play services are operating-system traffic, not the app's.

1,284 patches shipped·0 store reviews waited for·2 launches to roll back

“A checkout bug reached production on a Thursday night. The fix was on phones before the store review queue opened, and the audit log already said who shipped it.”
Placeholder name · head of mobile · qirat
“Our security team asked where the update server lives. We pointed at our own rack. That was the whole meeting.”
Placeholder name · platform lead · sarab mobile

Placeholder numbers and quotes until launch. None of these are real customers.

Revon is in pilot with mobile teams that must own their release pipeline and answer to an auditor.