PPrepLearn
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

PhaseDaysFocusKey Output
Phase 1 β€” KMP FoundationsDays 1–12Project structure, source sets, expect/actual, Gradle KSPWorking KMP project on Android + iOS
Phase 2 β€” Shared Business LogicDays 13–28Ktor, SQLDelight, Koin, kotlinx.serialization, coroutinesFull shared data layer
Phase 3 β€” Compose MultiplatformDays 29–42CMP UI, Voyager navigation, shared design system, animationsIdentical UI on Android + iOS + Desktop
Phase 4 β€” Platform APIs & iOS InteropDays 43–54SKIE, Swift interop, camera, GPS, Keychain, notificationsNative platform features from shared Kotlin
Phase 5 β€” Production & CI/CDDays 55–60Testing, Fastlane, GitHub Actions, App Store + Play StoreFully automated ship pipeline

πŸ› οΈ Complete tech stack

LayerTechnology
LanguageKotlin 2.x
BuildGradle Kotlin DSL + Convention Plugins
Shared UICompose Multiplatform (CMP)
NavigationVoyager
NetworkingKtor Client
Local DBSQLDelight
DIKoin
Serialisationkotlinx.serialization
AsyncKotlin Coroutines + Flow
iOS InteropSKIE
Image loadingCoil 3 (KMP)
Date/Timekotlinx-datetime
Testingkotlin.test, Turbine, Paparazzi
CI/CDGitHub Actions + Fastlane
AnalyticsFirebase 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

Related