Contents — page 1 of 3
Day 39On desktop your app has windows, and nothing closes them for youA window holds a composition, a scope and native handles. Nothing releases them for you.Day 40Most mocking libraries do not work in commonTest, and the fix is better anywayDynamic proxies need a JVM. What replaces them asserts on outcomes instead of calls.Day 41The test that only failed on wasm was measuring the environmentA single-threaded target surfaces every real-clock dependency a JVM run hides.Day 42A klib is not a jar, and that changes how dependencies resolveMetadata, klibs and platform artifacts resolve through different Gradle variants.Day 43The module boundary that only the build file enforcedA layering rule nobody can violate is a dependency declaration, not a document.Day 44A sealed hierarchy exports as an open class, so Swift cannot switch on itExhaustiveness is why you used a sealed type, and it is exactly what does not cross.Day 45A staged rollout you control on one store and not on the othersFour channels, four halt latencies, and only one of them is under your hand.Day 46actual typealias looks like a shortcut and changes what you promisedAliasing to a platform type exports that type's whole surface to every caller.Day 47The shared module cost 400KB on Android and 11MB on iOSAndroid shrinks against a runtime already on the device. iOS links yours in.Day 48Kotlin/Native's memory model changed, and your atomics did notFreezing is gone, so the bugs it prevented at compile time are runtime bugs now.Day 49There is no shared background work, because three platforms disagree about whenWorkManager schedules under constraints, iOS grants windows, the browser has none.Day 50The biometric prompt belongs to the OS, and it can disappear mid-callYou suspend across a UI the system presents and may destroy without telling you.Day 51Why the build cache helps the JVM target and almost never the native onesCache keys for native compilation include the toolchain, so they rarely hit.Day 52Certificate pinning has no shared implementation, and should notEach engine pins through its own trust machinery, and one cannot pin at all.Day 53A Flow does not cross to Swift. A callback does.Exporting a Flow hands Swift something it has no way to collect.Day 54commonMain cannot ask which Android version it is running onA capability check belongs behind an expect, phrased as a capability.Day 55The Compose compiler version is not independent of your Kotlin versionA Kotlin bump without the matching plugin fails at a position no trace explains.Day 56composeResources qualifiers are not Android's, and the fallback differsA qualifier Android resolves may have no equivalent on iOS or the web.Day 57Compose for web loads a runtime before it draws anythingFirst paint waits on a wasm binary and a font, which no mobile profile shows.Day 58CocoaPods or Swift Package Manager: the choice belongs to the iOS teamEach channel constrains your publishing pipeline differently.Day 59Copy and share: two features that are entirely platform codeA gesture requirement, a presenting view controller, and neither on desktop.Day 60Every list you hand to Swift is copied, and the cost is per callA Kotlin List becomes an NSArray by conversion, not by reference.Day 61Your default arguments do not exist in SwiftSwift sees the full parameter list, every time.Day 62The same dp is a different number of pixels on every targetDensity comes from the platform and the user's font scale multiplies it.Day 63Dispatchers.IO is not in commonMain, and the reason mattersA browser has no thread pool to offload to.