Where should you start?
Duet overview
What Duet is, what you get, what it requires of your project, and the two project cards that scaffold it.
Duet tutorials
Nine hands-on tutorials build one native iOS and Android app, Foyer, from a first Kotlin feature to the CI checks, theming, localization and analytics.
Should you share code between iOS and Android?
The three ways to ship two apps, what each can prove about behavior, what sharing costs, and who should skip it.
Starting a new project
How the new-project flow works and how to pick between the multiplatform, iPhone-only, prototype and game templates.
Set up the Android toolchain
What the install-the-Android-SDK banner means and what its button installs.
Learn Duet by building one app
The Duet tutorial series teaches Duet by building one native iOS and Android app, Foyer, from its first Kotlin feature to its analytics: a splash, a sign-in gate, an onboarding gate, a home tab with one paid feature, an upgrade flow and a profile tree. You write each feature’s logic once in Kotlin, mount it in a SwiftUI app and a Compose app, and record its behavior so the checks replay the same recordings on both platforms. Every tutorial opens a starting tree and ends with a finished tree in the public duet-tutorials repository; every tree is pinned to one family release and checked in that repository’s CI. Tutorials 1 to 6 build on each other in order; Tutorials 7, 8 and 9 each start from Tutorial 6’s finished tree, so you can take them in any order. Tutorial 1 needs a JDK only; from Tutorial 2 onward you need Xcode, XcodeGen and the Android SDK, which the series index lists. The index also maps every Duet concept and engineering practice to the tutorial step that teaches it. The nine tutorials, in order:- Tutorial 1: Your first feature: state, actions and effects as data, a pure reducer, and a scenario recorded and replayed, in Kotlin with no UI.
- Tutorial 2: One behavior, two apps: the Kotlin core as an Apple framework, and a SwiftUI shell and a Compose shell over the same store.
- Tutorial 3: Composing features: a feature tree mounted from state, delegate events as parent actions, ports, and chain recordings.
- Tutorial 4: Workers: an on-device backend, streams observed by workers, and a slice projected down to two tabs.
- Tutorial 5: Navigation as state: route state, back as an action, deep links, process-death restore, and lateral state between siblings.
- Tutorial 6: The checks in CI: the lanes, the ten commands, one GitHub Actions workflow, and the mutation drill.
- Tutorial 7: Theming with design tokens: a token vocabulary generated for both platforms and a second theme with no feature-code change.
- Tutorial 8: Localizing the app: refusals as values, string catalogs and resources, and a second language that changes no recording.
- Tutorial 9: Adding analytics: events emitted from reducers as effect data, a console sink worker, and the taxonomy read back out of the recordings.
How does Duet compare to the alternatives?
The best cross-platform frameworks in 2026
Flutter, React Native, Compose Multiplatform, KMP, MAUI, Ionic, Skip and two native apps on one set of axes.
Duet vs Flutter
Which layer draws the screen, what ships in the binary, and what verifies that the two apps behave the same.
Duet vs React Native
Shared logic in a shipped JavaScript engine versus a compiled Kotlin core verified with recordings.
Duet vs Compose Multiplatform
Both are Kotlin Multiplatform; one shares the UI on a canvas, the other keeps SwiftUI native.
Best iOS app architecture
TCA, RIBs, VIPER, MVVM, MVC and Clean Architecture scored on testability, onboarding, cross-platform reach and AI-agent fit.
What does a Duet app look like inside?
Inside a Duet Android app
A thin Compose shell over a shared Kotlin core: one Gradle module per feature, plus the recorded fixtures the iOS app replays.
How to build testable Android apps
Logic in pure reducers, nondeterminism behind effects, recorded scenarios as the regression suite.
Handling platform-specific UI
The presentation contract, the kind-to-renderer registry, and the ledger that records deliberate iOS/Android divergence.
Migrating a CombineRIBs app to Duet
How an existing app gains a shared Kotlin core and an Android app one feature at a time, with the iOS app shipping throughout.
What do you need to know about Android first?
How Android apps work
An APK or app bundle: a manifest declaring entry points, Compose screens driven by state holders, and a Gradle build behind it.
Android API levels
Every Android version with its API level, codename, year and live device coverage, and how to choose a minSdk.
Where is the reference material?
Duet glossary
Every Duet term defined in one place, with the name the tools use for each.
The Duet framework on GitHub
Both flavors, the recording toolchain and the versioned contracts.
Where does Duet live outside these docs?
- Duet on modaal.dev is the product page: what Modaal scaffolds and what it costs.
- github.com/modaal-agent/duet holds the framework itself under an open license, with its contracts and CONTRIBUTING rules.
- github.com/modaal-agent/duet-tutorials holds every tutorial’s starting and finished tree, pinned to one family release and gated in that repository’s CI.