Tooling

Mobile — Compose Multiplatform

JetBrains' Compose UI on iOS, Android, desktop, and web — the UI layer for KMP.

Compose Multiplatform (CMP) is JetBrains' port of Jetpack Compose to iOS, desktop (JVM), and web (Wasm). It sits on top of Kotlin Multiplatform and lets you ship one Compose UI tree to every platform. iOS support went stable in 2024, and through 2025–26 has matured into a genuine third option alongside Flutter and React Native for full-UI sharing.

CMP is free / Apache 2.0.

Core

  • Compose Multiplatform — JetBrains; stable on Android, iOS, desktop; web (Wasm) in stable / experimental depending on module.
  • Compose Material 3 — Material 3 theme on top.
  • Compose HTML — older Compose-for-web; superseded by Wasm-based Compose for new projects.

What's shared vs platform-specific

  • Shared: most widgets, layout, gestures, animation, typography.
  • Platform-specific: deep platform integration (haptics, share sheets, system pickers) — written in Kotlin per target with expect/actual.
  • iOS-native look: not bundled — Compose uses Material widgets cross-platform; for native iOS look you write UIKitView/SwiftUI bridges, or use a community Cupertino-shaped library, or fall back to native SwiftUI per screen.

Routing

  • Jetpack Navigation Compose — multiplatform since Compose 1.7.
  • Voyager — type-safe screen model + nav; popular in CMP.
  • Decompose — non-Compose-coupled navigation; works well at scale.
  • PreCompose — minimal nav library.

State / data flow

  • Kotlin Coroutines + StateFlow — the canonical pattern.
  • Molecule (Cash App) — turn Compose into a state-machine engine.

Resources

  • compose-multiplatform-resources — multiplatform images, fonts, strings.
  • jb-compose-icons — large icon pack.

SwiftUI ↔ Compose interop

  • UIKitView / UIViewControllerRepresentable equivalents for embedding Compose in SwiftUI and vice versa.
  • Skie (Touchlab) — Swift-friendly KMP exports; pairs naturally with Compose iOS.

Build / CI

Testing

  • Compose UI tests — multiplatform; runComposeUiTest works on iOS too.
  • Paparazzi — Android JVM snapshot only.
  • Roborazzi — Robolectric-based; Android only.
  • For iOS snapshots, use SwiftUI snapshot testing on the iOS app target.

Limitations to know

  • iOS app size — CMP apps ship the Kotlin runtime; ~5-10 MB extra.
  • iOS look-and-feel — not native by default; expect to mix in SwiftUI for system pickers, action sheets, large titles.
  • Accessibility — improving but not yet at SwiftUI/Compose-Android parity on iOS.
  • Hot reload / preview on iOS — improved in 2024–25 but not as smooth as SwiftUI Previews.

Pick this if…

  • You want Compose everywhere and accept Material-flavored iOS: CMP.
  • You want one Kotlin codebase but native iOS look: KMP shared logic + SwiftUI per platform.
  • You want native everywhere with Swift as source-of-truth: Skip.
  • You want Dart-based one-runtime: Flutter.
  • JS team: React Native.

On this page