Your mobile infrastructure: CI/CD for every framework, and over-the-air updates for Flutter and React Native, on servers you control.
$ revon patch android --release-version 1.0.0+1790803795Platform: Android [arm64 (8.70 KB)]✓ Published Patch 1!
Pick your framework and what you need. We will set up a pilot around it.
OTA updates for Flutter
Request a pilotOne 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.
Installed with revon preview00:31:45
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
| Release | Platform | Flutter | Artifacts |
|---|---|---|---|
| 1.0.0+1790803795 | android active |
Not installed yet.
- 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.
Installed with revon preview00:31:45
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
| Time | Release | Answer |
|---|---|---|
| 21:31:46 | 1.0.0+1790803795 | no patch |
| 21:32:24 | 1.0.0+1790803795 | patch #1 |
| 21:32:28 | 1.0.0+1790803795 | patch #1 |
| Patch | State | Artifact | |
|---|---|---|---|
| #1 | live | android/aarch64 8.7 KB |
The next patch check answers rolled_back_patch_numbers: [1]. Devices delete the patch and run the release.
Launch 100:32:21
Launch 200:32:25
Installed with revon preview00:31:45
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.”
“Our security team asked where the update server lives. We pointed at our own rack. That was the whole meeting.”
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.