Progress Β· 0/6 phases
π π Kotlin Multiplatform (KMP) β Complete Roadmap
4 min read Β· Notion
π One Kotlin codebase. Android. iOS. Desktop. Web. From KMP project setup to production-grade shared logic, Compose Multiplatform UI, iOS interop with SKIE, and full CI/CD pipeline.
π What this roadmap covers
KMP is not βwrite once run anywhere.β It is share logic, own the platform. Business rules, networking, databases, and state management live in shared Kotlin. The UI and platform-specific behaviour stay native or use Compose Multiplatform. This roadmap builds that system end-to-end.
πΊοΈ Roadmap at a glance
| Phase | Days | Focus | Key Output |
|---|---|---|---|
| Phase 1 β KMP Foundations | Days 1β12 | Project structure, source sets, expect/actual, Gradle KSP | Working KMP project on Android + iOS |
| Phase 2 β Shared Business Logic | Days 13β28 | Ktor, SQLDelight, Koin, kotlinx.serialization, coroutines | Full shared data layer |
| Phase 3 β Compose Multiplatform | Days 29β42 | CMP UI, Voyager navigation, shared design system, animations | Identical UI on Android + iOS + Desktop |
| Phase 4 β Platform APIs & iOS Interop | Days 43β54 | SKIE, Swift interop, camera, GPS, Keychain, notifications | Native platform features from shared Kotlin |
| Phase 5 β Production & CI/CD | Days 55β60 | Testing, Fastlane, GitHub Actions, App Store + Play Store | Fully automated ship pipeline |
π οΈ Complete tech stack
| Layer | Technology |
|---|---|
| Language | Kotlin 2.x |
| Build | Gradle Kotlin DSL + Convention Plugins |
| Shared UI | Compose Multiplatform (CMP) |
| Navigation | Voyager |
| Networking | Ktor Client |
| Local DB | SQLDelight |
| DI | Koin |
| Serialisation | kotlinx.serialization |
| Async | Kotlin Coroutines + Flow |
| iOS Interop | SKIE |
| Image loading | Coil 3 (KMP) |
| Date/Time | kotlinx-datetime |
| Testing | kotlin.test, Turbine, Paparazzi |
| CI/CD | GitHub Actions + Fastlane |
| Analytics | Firebase KMP wrapper |
π Full project structure
MyKMPApp/
βββ build-logic/ # Convention plugins
β βββ src/main/kotlin/
β βββ KmpLibraryConventionPlugin.kt
β βββ AndroidAppConventionPlugin.kt
βββ shared/ # Shared KMP module
β βββ src/
β βββ commonMain/kotlin/
β β βββ data/
β β βββ domain/
β β βββ presentation/
β βββ commonTest/kotlin/
β βββ androidMain/kotlin/
β βββ androidTest/kotlin/
β βββ iosMain/kotlin/
β βββ iosTest/kotlin/
βββ composeApp/ # Compose Multiplatform UI
β βββ src/
β βββ commonMain/kotlin/ # All Compose UI here
β βββ androidMain/kotlin/ # Android entry point
β βββ iosMain/kotlin/ # iOS entry point
β βββ desktopMain/kotlin/ # Desktop entry point
βββ androidApp/ # Android standalone (optional)
βββ iosApp/ # Xcode project
β βββ iosApp.xcodeproj/
β βββ iosApp/
β βββ ContentView.swift
βββ gradle/
βββ libs.versions.toml # Version catalogπ My progress
- Current phase: Phase 1
- Current day: Day 1 of 60
- Platforms running: 0 / 4
- Shared modules built: 0
- KMP apps shipped: 0
π Phase pages
- π¦ Phase 1 β KMP Foundations (Days 1β12)
- π Phase 2 β Shared Business Logic (Days 13β28)
- π¨ Phase 3 β Compose Multiplatform UI (Days 29β42)
- π± Phase 4 β Platform APIs & iOS Interop (Days 43β54)
- π Phase 5 β Production & CI/CD (Days 55β60)
π The KMP mental model
commonMain β pure Kotlin. NO platform imports. Runs on every target.
Domain models, use cases, repository interfaces,
Ktor calls, SQLDelight queries, Koin modules, Flows.
androidMain β Android-specific actual implementations.
Context, Android Keystore, Room (if not using SQLDelight).
iosMain β iOS-specific actual implementations.
UIKit/SwiftUI interop, Keychain, NSUserDefaults.
desktopMain β JVM desktop implementations.
File system, system tray, JVM-specific APIs.The rule: if you find yourself importing android.* or platform.UIKit.* inside commonMain/, you need an expect/actual abstraction.
π KMP Daily Tracker