Kotlin Multiplatform makes you write a hand-maintained bridge layer on iOS — one file per domain that wraps, streams, and re-maps every Kotlin type into Swift. This is the anti-corruption layer, what it costs, and why a Rust + UniFFI core deletes it as a standing module.
Put the whole domain — session, repositories, use cases, networking — in Rust, and let SwiftUI and Compose sit on top. The bridge is auto-generated and gitignored. This walks through the idea, the generated bindings, what you lose in Swift and Kotlin at the call site, and whether it scales to hundreds of feature modules.
On iOS, Kotlin Multiplatform ships your whole shared layer as one linked framework. So does a change to any shared module rebuild everything? I measured it — cold and cached, low-dependency and high-dependency modules, and as the shared layer grows. Real numbers, and the levers that move them.