---
applyTo: "**/*.kt,**/*.kts"
description: Kotlin Multiplatform conventions
---

# Kotlin Multiplatform

- Put code in `commonMain` by default. Only platform APIs go in `androidMain`, `iosMain`, `jvmMain`, `wasmJsMain`.
- Prefer interfaces + DI for platform services; use `expect`/`actual` only for small primitives (e.g. `expect fun platformName(): String`).
- Use multiplatform libraries: Ktor client, kotlinx.serialization, kotlinx.coroutines, kotlinx-datetime, SQLDelight or Room KMP. No `java.*` imports in common code.
- Coroutines: expose `suspend` functions and `Flow`; inject dispatchers; never `GlobalScope`.
- For iOS consumers, keep public API Swift-friendly (avoid deep generics, sealed hierarchies are fine with SKIE if configured).
- Versions in `gradle/libs.versions.toml`.
- Immutable `data class` models with `@Serializable`.
- Tests in `commonTest` using `kotlin.test` and `kotlinx-coroutines-test` (`runTest`).

## Check
`./gradlew check` (runs all target tests) passes, and `./gradlew :shared:linkDebugFrameworkIosSimulatorArm64` if iOS is a target.
