Search the site
EXPO FOR FLUTTER
Expo is the reason React Native is pleasant to work in: one command to start, builds on somebody else's machines, store submission, updates that reach users without a review, and, through Expo Router, API routes and server functions that deploy to EAS Hosting. Flutter gives you flutter run and each platform's own release tooling, and stops there. Dartvel is that missing layer for Flutter, with a backend framework in the same language: data models, auth, queues, mail and an admin.
Install a development build of your app once. After that, dartvel dev prints a QR code; scan it and the app pairs and hot reloads over your network.
dartvel build android, ios, macos, windows, linux, tvos, tizen, sony-elinux, vscode and more. --cloud sends the build to Dartvel Cloud, which is not open yet.
dartvel deploy --store play, appstore, testflight or firebase-app-distribution hands the upload to that store's own tool.
dartvel updates patch sends a Dart fix over the air through Shorebird, or to Android apps from your own web-server binary. A patch has been applied on Android and not yet on an iPhone.
dartvel build android --profile development
dartvel dev # QR code, pair, hot reload
dartvel deploy --store play
dartvel updates patch --platform androidCopy code to clipboard
SIDE BY SIDE
Language
Expo: TypeScript or JavaScript, with React
Dartvel: Dart, front and back
Run on a device
Expo: npx expo start, with Expo Go or a development build
Dartvel: A development build, or Dartvel Preview, paired by dartvel dev over a QR code
Cloud builds
Expo: EAS Build, with a free tier and paid plans
Dartvel: dartvel build --cloud. Cloud is not open yet
Local builds
Expo: npx expo run, or eas build --local
Dartvel: dartvel build android, ios, linux and the rest
Store submission
Expo: EAS Submit
Dartvel: dartvel deploy --store, through each store's own tool
Over the air
Expo: EAS Update, on Android and iOS
Dartvel: dartvel updates, through Shorebird or your own binary. Proven on Android; your own binary serves Android only
Server code
Expo: Expo Router API routes (+api.ts), server middleware, and React Server Functions in beta
Dartvel: @DVBackendFunction, with a typed client generated from it
Hosting the server
Expo: EAS Hosting, or most other hosts
Dartvel: One binary from dartvel build web-server, on a machine you run
Database
Expo: expo-sqlite on the device. For a server database the docs point to Convex, Supabase or Firebase
Dartvel: Data models on SQLite, Postgres or MySQL, with migrations
Auth
Expo: Guides for OAuth providers and auth SDKs, and redirects in Expo Router
Dartvel: Sessions, passkeys, OAuth sign-in, SAML, LDAP and second factors, built in
Admin
Expo: None built in
Dartvel: Studio, served by your own binary
TVs
Expo: Android TV and Apple TV, through react-native-tvos
Dartvel: Android TV, Apple TV, Samsung Tizen
Desktop and embedded
Expo: Not covered by the Expo docs
Dartvel: macOS, Windows, Linux, Sony embedded Linux
Thanks to the projects these targets are built on:
by Samsung
by the FlutterTV authors
by Sony
by SlowGen
THE BACKEND
An Expo Router API route is a file such as app/hello+api.ts that exports GET or POST handlers, and a React Server Function is called from a component like a typed function. Both deploy to EAS Hosting or another host, and a native build finds them through the origin set in the Expo Router config plugin, which Expo marks as alpha. What Expo leaves to you is what sits behind the handler: its database guide sends you to Convex, Supabase or Firebase, and sign-in comes from an auth SDK. Dartvel's backend is a framework of its own. A backend function is Dart, the client that calls it is generated from it, so renaming an argument breaks the build, and auth, policies and queues come with it. It cannot use the generated data models yet, because they import Flutter and the server is pure Dart.
@DVBackendFunction()
Future<String> _issue(String orderId) async => 'INV-$orderId';
// in the app, typed, generated, no fetch and no string URL
final String number = await issue(orderId: order.id);Copy code to clipboard
A data model generates its table, its migration, a typed client, a form and an admin screen.
Model change streams and an offline store are built. Carrying a change from the server to a phone is not built yet, so a list on one device does not update when another device writes.
One binary from dartvel build web-server runs the site, the API and Studio, with SQLite created beside it.
HONESTLY
EAS is running today, with a free tier and paid plans: Build, Submit, Update, Hosting and Workflows. Dartvel Cloud is built and not open, so --cloud needs a token nobody can buy yet. Local builds, store uploads and Android patches from your own binary are free and work now.
EAS Update reaches iOS and Android. Dartvel's over-the-air patches are proven on Android only, and its own patch source serves Android only.
Expo Go is in the App Store and on Google Play and runs a project with no build of your own. Dartvel Preview does the same on Android and desktops, built from source and in no store yet, and a physical iPhone pairs only when the app is started from Xcode or flutter run.
eas deploy puts API routes on a hosted server in one command. Dartvel's web-server binary runs on a machine you provide.
Expo's ecosystem of config plugins and prebuilt modules is years old and very large, and React Native has more people to hire and more answers already written down.
Is this a fair comparison?
Expo is very good at what it does, and Dartvel copies the shape of it on purpose. Both reach the server now: Expo through API routes and server functions, Dartvel through a backend framework in the language the app is written in. If you want React and a hosted pipeline that works today, choose Expo. If you want Flutter, targets past the phone, and data models, auth and an admin in the same repository, that is what Dartvel is for.
ALSO
FSL-1.1-MIT licensed. Built with Dartvel.
Dartvel is made by
To the bottom