5 min read

Kotlin Multiplatform Newsletter #13

We celebrate the Golden Kodee Awards finalists and dive into a technical deep dive on running Room databases client-side in the browser via Kotlin/Wasm and SQLite. We also explore how Koin annotations can make expect/actual obsolete, the implementation of cross-platform shaders in Compose Multiplatform, and a breakdown of shared element transitions in Navigation 3. Plus, new tools for validation, geolocation, and a cyberpunk glitch effect in Jetpack Compose.

The Log

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

🏅
Golden Kodee Awards finalists have been chosen

Winners will be announced at KotlinConf'26 in Munich, May 20-22.

The Main Thread

Community's most insightful threads, curated from social media platforms and websites.

💢
At the Mountains of Madness: Rewriting a 100-Line PowerShell Script as a KMP Desktop App

Not sure when it happened, but at some point I contracted this strange illness that compels someone to tinker with their OS on their spare time. The latest symptom: a floating clock widget written in Powershell, that is visible at all times. (I hide my taskbar cause I pretend I'm a minimalist).

Since Powershell kinda sucks, I wondered if I could do the same with a proper Compose desktop app. Let's lose a few braincells together, shall we?

Expect Actual

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

⤵️
Koin Annotations Make expect/actual Obsolete in KMP

Today, we can go further. With Koin annotations and the Koin compiler, you can completely bypass expect/actual. This method works seamlessly with Compose Multiplatform and lets you maintain a clean architecture while keeping platform-specific logic where it belongs.
💽
Room Database in the Browser: Kotlin/Wasm and SQLite with OPFS

Room 3.0 shipped with Kotlin Multiplatform support, and tucked inside that release is something most developers missed: web support. Not “web” as in REST APIs. Actual Room database operations, running client-side in the browser, powered by SQLite compiled to WebAssembly and storing data in the Origin Private File System (OPFS).

This article walks through a minimal working example — a Note-taking app — to show exactly how this works, what the moving parts are, and where the gotchas hide.

LazyColumn

Compose Multiplatform tips, tricks, and code snippets.

❇️
How to Implement Shaders in Compose Multiplatform (Android, iOS, Desktop & Web)

In this article, you’ll learn how to build a clean and reusable shader abstraction using Compose Multiplatform that works seamlessly across Android, iOS, Desktop (Windows/macOS/Linux), and Web (WASM/JS) from a shared commonMain codebase.
Sinasamaki

This is a place to learn how to build delightful apps. Here you will find illuminating articles, detailing implementation of inventive and mesmerizing designs, using Jetpack Compose.
〰️
Glitch Effect in Jetpack Compose

Glitch effects are a staple in sci-fi movies and cyberpunk games. In this article, we will see how easy it is to implement this effect in Jetpack Compose.
🏎️
Smooth Handoff

I had Navigation 3 set up, screens were flowing, and I wanted to add shared element transitions. An image from a list item that morphs into the header of a detail screen. The kind of detail that makes an app feel deliberate. I spent an afternoon hunting for the Nav3 equivalent of what I knew from Navigation 2. Found nothing. So I did what any developer does under a deadline: I switched back to Nav2 and shipped.

Months later, while reading through the Navigation 3 source, I found LocalNavAnimatedContentScope. It had been there the whole time. The smooth handoff was always available. I just did not know where to pick up the baton.

The Dependency Graph

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

  • KVerify
    Type-safe, composable validation for Kotlin Multiplatform. KVerify is what validation should have been. A clean DSL, typed failures, automatic path tracking — and nothing your project didn't already have.
  • barK
    A lightweight, extensible logging library for Kotlin Multiplatform.
  • RikkaIcons
    Semantic icon tokens for Compose Multiplatform. One API, any icon pack. Built with & for Jetpack Compose.
  • Geolocation-KMP
    A hassle-free Geolocation and Geocoding library for KMP. Get location permissions, fetch GPS coordinates, and translate them into localized street addresses using a clean, coroutine-first API.
  • FileMapper KMP
    A lightweight, powerful Kotlin Multiplatform (KMP) library designed to seamlessly map files (XLSX, JSON) to Kotlin Data Classes. Supporting Android, iOS, Desktop, and Web (Wasm/JS), it provides both Compose-ready UI triggers and pure logic-based APIs.

Target: Production

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

Sweeper - by sinasamaki App - App Store
Download Sweeper - by sinasamaki by sinasamaki on the App Store. See screenshots, ratings and reviews, user tips, and more apps like Sweeper - by sinasamaki.

→ Play Store version available here.

Kado - Community Decks
Browse and download community flashcard decks for the Kado spaced repetition app.

→ Link to Kado GitHub Repository

Careers

Kotlin Multiplatform job postings and opportunities.


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