Guide · every vendor fact quoted from the vendor’s own page, 10 September 2026

    Cross-platform app builders in 2026: what each one actually ships

    “Cross-platform” is the most-used and least-defined word in app tools. It can mean a website in a phone-shaped shell, a JavaScript app that drives native views on both phones, a Flutter app, two separate native apps written by the same agent, or one shared core with a native interface on each platform. Those five things are not the same product, and the difference decides what your Android app is, who can work on it, and whether you can leave. This page sorts ten builders by the only property that settles the question: what comes out.

    Verified

    The short answer. If your team writes JavaScript and you want one codebase for both stores, a React Native builder — Vibecode, Newly, Bolt with Expo, or Bubble’s native beta — is the natural choice, and there are more of them than of anything else. If you want real Swift and real Kotlin, you have two options in 2026: a tool that writes two separate native apps and keeps them alike by discipline (Rork), or one that writes each feature’s logic once and renders it natively on each platform, with the build checking that both behave the same (Modaal). If you only want an iPhone app, this is the wrong page — how to make an iPhone app is the right one, and Superapp and Modaal’s iPhone-only template both live there.

    What almost every “best cross-platform app builder” list skips is the question the phrase is hiding: what is the Android app? A second project? The same screens as iPhone, because they are the same code? A Kotlin project someone can open in Android Studio? Below, that question is asked of every tool, in the vendor’s own words.

    What “cross-platform” means in 2026 — five different things

    Sort the market by output and it falls into five kinds. The names matter less than the artefact you end up holding.

    1. A web app in a shell. The builder produces a website; a wrapper (a PWA, or Capacitor for the stores) makes it installable. Lovable is the honest example: its FAQ says “Lovable does not generate React Native projects” and points to a PWA or a Capacitor wrapper for the stores. The Android and iPhone “apps” are the same web page. Native vs web app covers what that costs on the phone.

    2. One JavaScript codebase driving native views — React Native. The screens are written once, in JavaScript, and rendered through platform components on both phones. This is what most cross-platform AI builders ship: Vibecode (“built using React Native and Expo”), Newly (“Built with React Native and Expo”), Bolt through its Expo integration (“build mobile apps for both iPhone and Android using the same code”), Adalo (“Our mobile builds use React Native”) and Bubble’s native mobile beta (its manual lists the iOS and Android versions “our current version of React Native will support”).

    3. Flutter. A Dart codebase that draws its own interface on both platforms. FlutterFlow is the visual builder in this category; its generated project is a standard Flutter one — “the lib/ directory contains all the Dart code that drives your Flutter app.”

    4. Two separate native apps. Swift and SwiftUI for iPhone, Kotlin and Jetpack Compose for Android, written as two projects. Rork moved here in 2026 — its docs now say “React Native is a cross-platform approach … Rork used to build apps this way and no longer does for new projects” and “Rork writes a real Android Studio project in Kotlin.” One Rork project can hold both apps, and “each app has its own code.”

    5. One shared core, two native interfaces. Each feature’s logic is written once; each platform gets its own native screen. This is what Modaal builds with Duet, and it is the category the rest of this page spends the most time on, because it is the newest and the least understood. Whether it is right for you is a separate question, and one the page answers against ourselves where needed.

    The first three kinds share the screens between platforms. The fourth shares nothing. The fifth shares the behaviour and not the screens. That sentence is the whole taxonomy.

    The trade React Native builders make — and why it is often the right one

    React Native’s founding argument is the one every JavaScript team has heard: one team, one codebase, two stores. In 2026 it is still true, and the tools built on it are the most numerous, the most mature, and the easiest to hire for. If your product is a list of things with forms and a feed — most apps — and your developers already write React, a React Native builder will get you to both stores faster than anything on this page, and the code you export (Vibecode, Newly and Bolt all let you download the project) is a project a React developer can carry on.

    The trade is structural, not a matter of quality. Because the screens are written once, they are the same screens on both phones. A settings page that follows Apple’s conventions on iPhone follows them on Android too, and vice versa; when you want the two to differ, you write the difference by hand, per platform, inside the shared code. And because the logic runs in JavaScript, everything the phone offers reaches your app through a bridge — first-party frameworks land in Swift and Kotlin at announcement, and reach React Native afterwards, through wrappers. Vibecode and Newly both write that their apps “compile to native iOS and Android code”; the accurate reading is that the views are native components and the logic is JavaScript executed on the device. Neither is a criticism. It is the deal, and it is a good deal for a lot of apps.

    React Native vs native argues the decision at length; for iPhone-only projects, Swift vs React Native does. This page only needs the one-line version: if you want the two apps to be the same, share the screens. If you want them to be native, don’t.

    Two native apps, nothing shared: the Rork route

    Rork is the interesting mover of 2026. It built React Native apps, benchmarked its own agent, and concluded — in its own words — that the agent “writes better Swift apps”, so new projects are now native: Swift for iPhone, Kotlin for Android, React for web, each “with its own code” inside one project with one chat context.

    What you get is real: an Xcode project and an Android Studio project, exportable on paid plans (“Paid users own all generated code. Download it via GitHub!”), each following its own platform’s conventions because each is written in that platform’s language. What you don’t get is any mechanism that keeps the two apps behaving the same. The iPhone app and the Android app are two implementations of your product, written by the same agent from the same conversation, and they stay in sync as long as you ask for every change twice and check both. For a small app that is fine. For an app with twenty features, business rules, and edge cases, “the Android version does something slightly different here” is not a bug you’ll notice in the chat window; you’ll notice it in a review.

    This is the route to pick when you want native on both platforms and your product is simple enough that two implementations are cheaper than one shared core.

    Share the logic, not the screens: the Modaal route

    Modaal builds native apps with an architecture called Duet, and Duet makes the opposite trade from React Native. The docs put it in one sentence: “you write the views twice and the behavior once.”

    Concretely: “each feature’s logic — its state, the actions that change it, the effects it requests — is written once.” That core is a pure function — no clocks, no network, no IDs inside it; anything nondeterministic goes out as an effect and comes back as an action. “The iPhone app renders that state in SwiftUI; the Android app renders it in Jetpack Compose.” So the iPhone screen follows Apple’s Human Interface Guidelines and the Android screen follows Material 3, because they are two native screens, written in the two native toolkits, by the same agent.

    The part that makes this different from “two apps that happen to share a library” is how parity is proven. Each feature starts as a one-page spec — the states, the transitions, a row per ending — written as Given / When / Then scenarios. A tool compiles the scenarios into fixture files, and “both platforms replay the same fixtures and the gate is byte equality, so a divergence fails the build on the commit that caused it.” Fixtures are build products: never edited by hand, and where a fixture and the prose disagree, the fixture wins. When you want the platforms to differ — a share sheet on iPhone, a different affordance on Android — the divergence is recorded as a decision, not left as an accident.

    Two practical consequences. You don’t have to decide about Android on day one: the new-project wizard offers “iPhone and Android together” and “iPhone now, Android later”, and the second records every feature exactly as the first would, so adding Android later is per-feature work in the same repository, not a rewrite. And the output is ordinary: an Xcode project and an Android Studio project on your Mac, in Swift and Kotlin, that any platform developer can open — there is no Modaal runtime in the app.

    The honest limits, from the same docs page: you write the views twice, so a screen costs two implementations; “you still need a Mac”, because iOS builds run through Xcode; building both platforms is a Pro feature (the free plan builds one); games start from a different template; and Duet itself is pre-release — the framework is open on GitHub, but no packaged artifacts are published yet. Modaal is free for one project with unlimited prompts on one platform; Pro is €9 per user per month billed annually (€15 monthly) and unlocks both platforms — details on the pricing page. For the full mechanism, read the Duet framework overview; for where it sits against Flutter, React Native and Compose Multiplatform, the framework comparison.

    The six questions to ask any cross-platform builder

    Put these to every tool before you put your product into it. Every answer on this page came from asking them of the vendor’s documentation.

    1. What is the Android app, physically? A web page, a JavaScript bundle inside a native shell, a Dart app, or a Kotlin project. The answer to everything else follows from this one.

    2. Is Android a second project or the same one? Same code (React Native, Flutter, web shell); separate code in one project (Rork); one shared core, two shells (Modaal). Each has a different cost curve as the app grows.

    3. Can a platform developer open it? An Android developer can open a Kotlin project in Android Studio and a React developer can open an Expo project; neither can do much with a Bubble app, which “can only be run on the Bubble platform.”

    4. On which plan is the code yours? Vibecode, Newly, Bolt and Superapp say export is available; Rork says paid plans; FlutterFlow lists code download from its Basic plan; Bubble says never; Adalo does not offer it as of September 2026. The export table has the plan-by-plan detail for nineteen tools.

    5. What happens on the day Apple or Google ships a new API? First-party stacks get it at announcement. Everything else gets it when a wrapper does.

    6. Who keeps the two apps behaving the same? You, by testing both (separate native apps); nobody, because they are the same code (shared screens); or the build (shared core with recorded fixtures).

    If a vendor page can’t answer one of these in a sentence, that is also an answer.

    When cross-platform is the wrong goal

    Sometimes the right number of platforms is one. If your users are on iPhone and your team is small, an iPhone-only native app with a real Swift codebase — Superapp, or Modaal’s “iPhone now, Android later” template — beats a mediocre app on two stores, and you keep the option to add Android when the numbers say so. Games should not be cross-platform-by-framework at all; they start from a game template and share art, not architecture. And if the “app” is really a website people should be able to open from a link, a well-made web app is the honest product and no wrapper improves it.

    Whether sharing code between the platforms is right for your app is a real question with two defensible answers, and our documentation argues both sides before recommending anything. Read that before you read any vendor page, including ours.

    Which cross-platform app builder should you use?

    Sorted by what you want to end up holding.

    Your team writes React, and one codebase for both stores is the point → a React Native builder. Vibecode and Newly are mobile-first and both export the Expo project; Bolt reaches the same place through Expo if you say “mobile app” in the first prompt. Bubble’s native mobile is the same category in public beta, without export.

    You want a visual builder and Flutter is your stack → FlutterFlow. Real Dart project; code download from the Basic plan.

    You want native Swift and Kotlin on both stores and your app is simple → Rork. Two native projects, one chat, parity by your own testing.

    You want native on both stores and the app will grow → Modaal. One shared core per feature, SwiftUI and Compose screens, parity enforced by the build, Xcode and Android Studio projects on your Mac. Needs a Mac; both platforms need Pro.

    You only want an iPhone app, today → Superapp (Swift, browser or Mac version, export on any plan) or Modaal’s iPhone-only template — compared in how to make an iPhone app.

    You are choosing by criteria rather than by namehow to choose an AI mobile app builder, and the alternatives pages for one-to-one comparisons. And if the question is not which builder but how the build actually goes from one project to two native apps, that is the companion guide.

    Ten cross-platform app builders by what comes out

    BuilderWhat comes outThe Android app is…Code export (vendor’s words, 10 Sep 2026)
    ModaalSwift/SwiftUI + Kotlin/Compose, one shared core per featureA native Compose app on the same core; parity checked by the buildXcode + Android Studio projects on your Mac from the first build
    RorkSwift/SwiftUI + Kotlin/Compose, separate apps“A real Android Studio project in Kotlin” — “each app has its own code”“Paid users own all generated code. Download it via GitHub!”
    SuperappSwift/SwiftUI, iPhone onlyNot offered (no Android on the site)“You fully own the code and can export it anytime.”
    VibecodeReact Native / ExpoThe same JavaScript screens, rendered on Android“Download Code” — “a complete React Native/Expo project”
    NewlyReact Native / ExpoThe same JavaScript screens, rendered on Android“Full access to your app’s source code. Export, modify, and deploy anywhere.”
    Bolt (Expo)React Native / Expo“Both iPhone and Android using the same code”“Download the code and open it in a code editor”
    AdaloReact Native (“our mobile builds use React Native”)The same screens, rendered on AndroidNot offered as of Sep 2026 (open feature request since 2022)
    Bubble (native beta)React Native, public betaThe same screens, rendered on Android“No way of exporting your application as code”
    FlutterFlowFlutter / DartThe same Flutter screens, drawn on Android“Code Download” from the Basic plan
    LovableWeb app; PWA or Capacitor wrapperThe same web page in a shellZIP download or Git sync — of the web app

    Every cell from the vendor’s own documentation or site, read 10 September 2026. No prices on purpose — plans change; the code-export guide tracks them.

    Frequently asked questions

    A tool that produces an app for both iPhone and Android from one project. What that means physically varies: a web app in a shell, one JavaScript codebase driving native views (React Native), a Flutter app, two separate native apps, or one shared core with a native interface per platform. The category name hides the difference; the output is what you should compare.

    Its views are native components; its logic is JavaScript running on the device and reaching the platform through a bridge. Whether that counts as native depends on what you need from the phone. For most list-and-form apps it is more than enough; for apps that lean on new platform frameworks the day they ship, first-party Swift and Kotlin get there first. The React Native vs native guide covers the decision.

    Yes, on several of the tools above: you describe the app, an agent writes it, and both apps come out. The choice is what they are made of. React Native builders give you one codebase and identical screens; Rork gives you two native apps written separately; Modaal gives you one shared core with native SwiftUI and Compose screens and a build that checks the two behave the same.

    Our term for the fifth category on this page: both apps are native — real SwiftUI on iPhone, real Jetpack Compose on Android — and they share their feature logic rather than their screens, so the shared part is written once and the interfaces follow each platform’s conventions. Parity is proven by replaying recorded scenarios on both platforms in the build, not by testing twice.

    In the vendors’ own words: Vibecode, Newly, Bolt and Superapp offer export; Rork on paid plans; FlutterFlow lists code download from its Basic plan; Modaal writes the projects to your Mac from the first build; Bubble says there is no way to export the application as code; Adalo does not offer it as of September 2026. The code-export guide tracks nineteen tools plan by plan.

    To compile and sign an iPhone app yourself, yes — Xcode only runs on macOS. Cloud builders (the React Native tools, Superapp’s browser version, FlutterFlow) compile on their own machines so you don’t need one. Modaal runs on your Mac and builds through Xcode, so it needs one. For any tool, check the vendor’s own requirements page — they change.

    On a React Native or Flutter builder, Android is usually already there — same code. On Rork you add a second native app to the project. On Modaal, the “iPhone now, Android later” template records every feature the same way the two-platform template does, so adding Android is per-feature work in the same repository: the Kotlin core is written against the scenarios already recorded from the Swift one, and a half-migrated project is a normal, shippable state.

    Flutter draws its own interface with its own rendering engine on both platforms rather than using the platform’s components, and compiles Dart to machine code. The screens are the same on both phones by design. FlutterFlow produces a standard Flutter project you can download from its Basic plan.

    The free plan is one project with unlimited prompts on one platform. Building both platforms is a Pro feature: €9 per user per month billed annually, or €15 monthly. You bring your own AI agent subscription, so there is no credit meter — the pricing page has the details.

    Start free. Ship native.

    One project, unlimited prompts. No card.

    Keep reading