6 min read

Kotlin Multiplatform Newsletter #9

Kotlin 2.3.20 released, Room supporting KMP for JavaScript and WASM, context-aware recomposition budgets for Compose, IntelliJ code selection plugin, how Compose and SwiftUI work under the hood, KMP jobs at Touchlab, and more.

The Log

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

🚀
The Kotlin 2.3.20 release is out!

Here are the main highlights:
- Gradle: Compatibility with Gradle 9.3.0 and Kotlin/JVM compilation uses the Build tools API by default.
- Maven: Simplified setup for Kotlin projects.
- Kotlin compiler plugins: Lombok is Alpha and improved JPA support in the kotlin.plugin.jpa plugin.
- Language: Support for name-based destructuring declarations.
- Standard library: New API for creating immutable copies of Map.Entry.
- Kotlin/Native: New interoperability mode for C and Objective-C libraries.
💽
The first alpha of Room 3.0 has been released!

Room 3.0 is a major breaking version of the library that focuses on Kotlin Multiplatform (KMP) and adds support for JavaScript and WebAssembly (WASM) on top of the existing Android, iOS and JVM desktop support.

Expect Actual

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

💲
How KPayment Makes Google Pay & Apple Pay Boring Across Android, iOS, and Web

Integrating Apple Pay and Google Pay in a Kotlin Multiplatform app sounds straightforward until you actually try it. Different SDKs, different lifecycles, different UI entry points. Suddenly, your shared UI is full of platform checks, and the platform source sets are packed with empty stubs just to make things compile.
🌤️
Tiered Data Fetching: How I Reduced API Calls by ~80% Without Sacrificing Freshness

A cache strategy built around how data actually changes - not how often users open screens. The naive approach to fetching data is simple: the user opens a screen, you fetch the latest data. Every single time. It works. But it’s also incredibly wasteful in ways that compound quickly once you think about the actual nature of the data you’re fetching.
📖
Gradle vocabulary: projects, builds, artifacts…

To understand discussions about Gradle, it's necessary to understand how things are named—and that can be quite confusing. This is a short article to summarize the various concepts and list tips and tricks I've learned over the years.
🔍
I tried context parameters, Kotlin's new multi-receiver extension functions

Kotlin is getting a new concept that will widen the possibility of extension functions. The feature is still experimental in the latest Kotlin version, which makes it the perfect time to try them out.

LazyColumn

Compose Multiplatform tips, tricks, and code snippets.

🚀
Introducing Rebound: context-aware recomposition budgets for Compose

The Compose ecosystem has solid tooling for tracking recompositions. Layout Inspector shows counts and skip rates. Compiler reports surface stability issues. Rebugger logs argument changes. ComposeInvestigator traces recomposition causes automatically. Each of these tools answers an important question well.

But none of them answer this one:
"Is this composable recomposing too much for what it does?"
👀
How Compose Preview Works Under the Hood

In this article, you'll explore the full pipeline that transforms a @Preview annotation into a rendered image, tracing the journey from the annotation definition itself, through ComposeViewAdapter (the FrameLayout that orchestrates the render), ComposableInvoker (which calls your composable via reflection while respecting the Compose compiler's ABI), Inspectable (which enables inspection mode and records composition data), and the ViewInfo tree that maps rendered pixels back to source code lines.
🏎️
Under the Hood: How Compose and SwiftUI Handle What Happens Off-Screen

The user sees a smooth screen transition, a list that populates, a dialog that appears at just the right moment. What they don’t see is the coroutine that launched in the background, the listener that was cleaned up on exit, the scope that held everything together just long enough to be useful. All that happens off-screen. In the pit lane.

The Dependency Graph

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

  • Rebound
    Compose recomposition budget monitor — catch runaway recompositions before they ship. Kotlin compiler plugin + IDE cockpit + CLI. Full KMP support.
  • Composable Selection
    A lightweight IntelliJ plugin that selects the nearest function call at your cursor. Press again to expand to the parent call — effortless navigation through nested Kotlin function hierarchies.
  • KPayment
    A Kotlin Multiplatform payment library with Compose Multiplatform UI components for Google Pay and Apple Pay across Android, iOS, and Web. One API, shared types, reactive availability detection, and platform-native payment buttons.

Target: Production

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

GitHub - kevinguitar/budgetplus: Budget+ is a co-spending tracker, available on Android and iOS. Built by KMP and CMP.
Budget+ is a co-spending tracker, available on Android and iOS. Built by KMP and CMP. - kevinguitar/budgetplus

Careers

Kotlin Multiplatform job postings and opportunities.

👉
iOS Developer (Swift/KMP) at Touchlab

This role will involve directly building client applications using the latest Swift-based tools and Xcode, and coding and interacting with Kotlin libraries. It will include helping to define how our tools will evolve to serve iOS developers better, and directly working on the tools and libraries we publish.
👉
Kotlin Multiplatform Developer (Contract) at Touchlab

This is a contract relationship for project-based engagements. Touchlab has been at the forefront of Kotlin Multiplatform (KMP) since the first Kotlin code ran on an iPhone. We’ve made significant contributions to the KMP ecosystem and are excited to continue growing and improving the community. We’re looking for talented developers with a strong foundation in one or more areas of software development in the competencies listed below. This is a unique opportunity to work on challenging and innovative projects across different industries, from startups to established enterprises.
🍽️
Kotlin Multiplatform Product Engineer at Superb

Superb gathers all the tools to open, run and grow your hospitality business — in one platform. We are looking for one more remote Kotlin Multiplatform Product Engineer to join our team and play a key role in shaping our mobile products for restaurateurs. In this role, you will work on delivering seamless experiences across multiple platforms using KMP, ensuring high performance and maintainability.

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