Taking Kotlin Multiplatform from zero to Google Play
Notes for teams evaluating a Kotlin Multiplatform developer — what actually shipped in the Income Tax Calculator app and what I'd do again.
Why KMP for this product
Ten country tax systems, one product vision, limited budget for separate Android and iOS teams. Compose Multiplatform let us share UI — not just domain logic — across Android, iOS and a Wasm web target.
Architecture
- Shared: tax rule engines (pure Kotlin), ViewModels, navigation state, Ktor API client, kotlinx.serialization models.
- expect/actual: Play Billing, AdMob + UMP consent, secure preferences, platform date/locale edge cases.
- Remote rules: Supabase Postgres stores versioned draft/published tax packs; publish RPC promotes rules without app updates.
Hard parts (honest)
- iOS through CMP still needs Xcode signing, App Store Connect and Apple-specific QA — not "free" iOS.
- Wasm web target tooling moves fast; pin versions and CI early.
- Third-party SDKs often lack KMP artifacts — wrap with expect/actual or keep SDK calls platform-side.
Outcome
Live on Google Play. Unit tests per country engine in shared code. GitHub Actions for Android signing.