6 min read

Kotlin Multiplatform Newsletter #34

Kotlin 2.4.20 lands with coroutine stack trace recovery and auto-generated Package.swift files for SwiftPM, while Kotlin Toolchain 0.12.0 brings multiplatform library publishing and CLI-driven Compose Hot Reload. We also unpack sharing commonMain ViewModels with SwiftUI via SKIE, porting Compose Multiplatform to tvOS, animating numeric state transitions, and generating type-safe multiplatform forms using Formidable. Plus, a remote Lead Mobile Engineer contract opportunity at HAULER HERO.

The Log

The only Kotlin Multiplatform and Compose Multiplatform news you actually need to know.

The Kotlin 2.4.20 release is out!

Here are the main highlights:
- Standard library: Support for coroutine stack trace recovery, new functions for checking equality and uniqueness of collection elements, and new overloads for kotlin.test assertion functions.
- Kotlin/Native: New Swift export features, improved incremental compilation, and automatically generated Package.swift files for SwiftPM dependencies.
- Kotlin/Wasm: Changes to top-level require() calls in @JsFun declarations, improved companion object initialization order, and support for Wasmtime in the Kotlin Gradle plugin.
- Kotlin/JS: A new DSL for browser testing, support for exporting suspend lambdas as async functions, and improved exportability of data classes.
- Gradle: Support for Gradle 9.7.0 and improved reporting in the Problems API.
- Build tools API: Support for new targets: Kotlin/JS, Kotlin/Wasm, and Kotlin metadata.
- Kotlin compiler: The `kotlinr` runner command and a separate native image.
Kotlin Toolchain 0.12: Multiplatform Library Publishing, Wasm Apps, and More

Kotlin Toolchain 0.12.0 is out. This release brings some long-awaited features: multiplatform libraries publication, a preview of Wasm application support, Compose Hot Reload from the command line, and more. 

Expect Actual

Technical deep dives, or solving the "how-the-hell-do-I-test-this" problems.

From Android to iOS: Sharing a ViewModel in Kotlin Multiplatform with SKIE — Without Losing Your Mind

You’ve moved your business logic into commonMain. Your API calls work. Your repository works. Your use cases work. Your MVI ViewModel works. Your StateFlow is happily emitting states. Then you open Xcode...
My Journey Making Compose Multiplatform Work on tvOS, and What I Learned

I am an Android and Android TV developer with about ten years of experience. For the last few years I have been leading a streaming app at Devolic that has to run on Android mobile, Android TV, desktop, iOS and tvOS. This series is about how that requirement ended with me maintaining a fork of Compose Multiplatform with tvOS support, and what I learned along the way.
Compose Multiplatform Is a Business Decision, Not a Technical One

If you are weighing Flutter, maintaining two native UI codebases "for now", or assuming cross-platform means giving something up, read this before your next roadmap conversation.
Two Racing Lines: Annotations and the DSL in NetFlow 0.7.0

I have been building NetFlow, my Kotlin Multiplatform networking library, since it was an Android-only thing called Communication. Version 0.6 I added a transform parameter. The compiler forces you to provide whenever your DTO and your domain model are different types. Forget it and the build fails. No runtime surprise, no half-mapped object reaching the UI. Then I started a new data layer in a side project, opened an empty file, and typed @GET. Into my own library. Which did not have annotations.

LazyColumn

Compose Multiplatform tips, tricks, and code snippets.

Animating between numbers in Jetpack Compose

While in a lot of cases, the implementation in apps will just cause these values to switch straight to the new value, there’s better ways for us to do this. Not only does this miss an opportunity to demonstrate the growth (or decline) between the values, but it also doesn’t look very polished. Instead, we can animate between the values.

The Dependency Graph

Curated libraries, tools and plugins that won't break your Gradle build.

  • Formidable
    Formidable generates type-safe form controllers from annotated Kotlin data classes. Define your form once — get state management, validation, and Compose integration on Android, iOS, and Web.
  • Daemonitor
    Desktop Activity Monitor for your Gradle daemons — live process insight + build history with AI-agent attribution.
  • KMP Swift Code Bundling
    Write Swift next to your Kotlin, get one framework with both inside.
  • Compose tvOS
    Gradle plugin that adds Apple tvOS support to Compose Multiplatform apps — keep your stock org.jetbrains.compose and androidx.tv coordinates, get tvOS builds from Maven Central.

Target: Production

Showcase of real-world apps proving KMP is ready for prime time.

Brain Rusher 60 - Apps on Google Play
Find 60 numbers fast. Test your visual search, reflexes & focus.
Sleevd - TCG Management - Apps on Google Play
Track your trading card collection across Pokemon, Magic, One Piece and more!

Careers

Kotlin Multiplatform job postings and opportunities.

Lead Mobile Engineer (Contractor) at HAULER HERO
Remote — Eastern Europe & LATAM

We are hiring a Lead Mobile Engineer (Contractor) to be the most senior engineer on our mobile team. Today we have a native Kotlin Android app; you will help evaluate Kotlin Multiplatform and lead the build-out of our first iOS app (iPad first, phones later) while strengthening the offline-first foundation across both platforms.

Got something interesting to share with the Kotlin Multiplatform community? Submit your link for a chance to get featured in the next issue of commonMain.dev.

🤝 Support the Build

commonMain.dev is made possible by our partners. If you have a tool or service that helps KMP developers ship to production faster, we’d love to help you reach our community. Collaborate with us.

✍ Code Review

This newsletter is curated and written by a real human being. I’m always looking for ways to optimize the build. Was there something you liked or disliked in particular? Or did you find a bug in this issue? Simply reply to this email - I read every comment from the community and take your feedback into account for the next release.

Until next time,
Stay platform-independent!
Bogdan • Founder of commonMain.dev