<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>KMP Bits</title><description>A blog about Kotlin Multiplatform and mobile development.</description><link>https://kmpbits.com/</link><item><title>Torque Spec: Shared Form State and Validation in KMP</title><link>https://kmpbits.com/posts/composure-kmp-forms/</link><guid isPermaLink="true">https://kmpbits.com/posts/composure-kmp-forms/</guid><description>The spec says 120 Nm and you already knew that. Knowing the number was never the hard part. My validation rules were already shared. The sixty lines of state around them were not.</description><pubDate>Mon, 24 Aug 2026 00:00:00 GMT</pubDate></item><item><title>Lights Out: Automatic Skeleton Loading in Compose Multiplatform</title><link>https://kmpbits.com/posts/skeletal-compose-multiplatform/</link><guid isPermaLink="true">https://kmpbits.com/posts/skeletal-compose-multiplatform/</guid><description>Five ligths go out and every car reacts to the same signal at once. My shimmer effect wasn&apos;t doing that. Every skeleton on screen was running its own private clock.</description><pubDate>Mon, 17 Aug 2026 00:00:00 GMT</pubDate></item><item><title>Same Car, Every Time: Deterministic Feature Module Generation in KMP</title><link>https://kmpbits.com/posts/deterministic-kmp-feature-module-script/</link><guid isPermaLink="true">https://kmpbits.com/posts/deterministic-kmp-feature-module-script/</guid><description>AI generation adapts to anything you ask. A bash script adapts to nothing. After a few months of scaffolding KMP feature modules both ways, I know which one I trust.</description><pubDate>Thu, 06 Aug 2026 00:00:00 GMT</pubDate></item><item><title>Change the Map: Feature Flags and Remote Config in Kotlin Multiplatform</title><link>https://kmpbits.com/posts/feature-flags-kmp/</link><guid isPermaLink="true">https://kmpbits.com/posts/feature-flags-kmp/</guid><description>A driver changes the engine map from the wheel, mid-race, no pit stop required. Feature flags do the same for your app: change behaviour without shipping a build. Here&apos;s how I structure flags and remote config once, in commonMain, for both platforms.</description><pubDate>Mon, 13 Jul 2026 00:00:00 GMT</pubDate></item><item><title>The Same System: Advanced expect/actual in KMP</title><link>https://kmpbits.com/posts/expect-actual-advanced-kmp/</link><guid isPermaLink="true">https://kmpbits.com/posts/expect-actual-advanced-kmp/</guid><description>expect/actual is easy until you leave the trivial expect fun behind. Here&apos;s what bites with expect classes, constructors, actual typealiases, and the compiler rules nobody warns you about.</description><pubDate>Mon, 06 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Safety Car: Coroutine Exception Handling in KMP</title><link>https://kmpbits.com/posts/coroutine-exception-handling-kmp/</link><guid isPermaLink="true">https://kmpbits.com/posts/coroutine-exception-handling-kmp/</guid><description>An uncaught coroutine exception crashes your KMP app on both platforms, and the platform safety nets don&apos;t extend to iOS. Here&apos;s how I build crash boundaries in commonMain.</description><pubDate>Mon, 29 Jun 2026 00:00:00 GMT</pubDate></item><item><title>Warm Tyres: Image Loading and Caching in Compose Multiplatform with Coil 3</title><link>https://kmpbits.com/posts/coil3-compose-multiplatform/</link><guid isPermaLink="true">https://kmpbits.com/posts/coil3-compose-multiplatform/</guid><description>Tyre warmers keep rubber at temperature so the car has grip the instant it leaves the box. Coil 3&apos;s memory and disk cache do the same for images — and the same code now runs on Android and iOS from commonMain.</description><pubDate>Mon, 15 Jun 2026 00:00:00 GMT</pubDate></item><item><title>Through the Lens: Barcode Scanning in Compose Multiplatform</title><link>https://kmpbits.com/posts/barcode-scanning-compose-multiplatform/</link><guid isPermaLink="true">https://kmpbits.com/posts/barcode-scanning-compose-multiplatform/</guid><description>expect/actual isn&apos;t just for business logic. Here&apos;s how to build a shared barcode scanner Composable that reads through any platform&apos;s lens.</description><pubDate>Mon, 08 Jun 2026 00:00:00 GMT</pubDate></item><item><title>Homologated: Publishing Your Kotlin Multiplatform Library to Maven Central</title><link>https://kmpbits.com/posts/kmp-maven-central/</link><guid isPermaLink="true">https://kmpbits.com/posts/kmp-maven-central/</guid><description>Before a race car can compete, it needs to be homologated. Before your KMP library can be used by anyone, it needs Maven Central.</description><pubDate>Mon, 01 Jun 2026 00:00:00 GMT</pubDate></item><item><title>The Pit Crew: Advanced Ktor Client Configuration for KMP</title><link>https://kmpbits.com/posts/ktor-client-advanced/</link><guid isPermaLink="true">https://kmpbits.com/posts/ktor-client-advanced/</guid><description>The pit crew doesn&apos;t wait to be asked. They intercept the car, do their work, and the driver rejoins the race. Ktor plugins work the same way: auth, logging, and retry all happen before your business logic sees a thing.</description><pubDate>Mon, 25 May 2026 00:00:00 GMT</pubDate></item><item><title>Every Commit on the Clock: CI/CD for Kotlin Multiplatform with GitHub Actions</title><link>https://kmpbits.com/posts/drafts/kmp-github-actions/</link><guid isPermaLink="true">https://kmpbits.com/posts/drafts/kmp-github-actions/</guid><description>In endurance racing every car carries a timing transponder: the circuit knows exactly where you are, every lap, every sector. This is how to put one on your KMP project.</description><pubDate>Thu, 21 May 2026 00:00:00 GMT</pubDate></item><item><title>KMP Splash: How I Stopped Opening Xcode for Splash Screens</title><link>https://kmpbits.com/posts/kmp-splash-plugin/</link><guid isPermaLink="true">https://kmpbits.com/posts/kmp-splash-plugin/</guid><description>The pit crew was always there. I just had to build it: a Gradle plugin that automates iOS and Android splash screen setup from a single config block.</description><pubDate>Mon, 18 May 2026 00:00:00 GMT</pubDate></item><item><title>Drop the Clutch: Three Metro DI Patterns Every KMP Developer Should Know</title><link>https://kmpbits.com/posts/drop-the-clutch/</link><guid isPermaLink="true">https://kmpbits.com/posts/drop-the-clutch/</guid><description>Metro drops the clutch on runtime DI errors. Three patterns in a real KMP app: binding contributions, platform graphs, and child scopes.</description><pubDate>Mon, 11 May 2026 00:00:00 GMT</pubDate></item><item><title>The Clean Line: Swift Export for KMP</title><link>https://kmpbits.com/posts/swift-export-kmp/</link><guid isPermaLink="true">https://kmpbits.com/posts/swift-export-kmp/</guid><description>Objective-C headers turned your Kotlin enums into class wrappers and your function signatures into noise. Swift Export sends the same data over a cleaner channel.</description><pubDate>Mon, 04 May 2026 00:00:00 GMT</pubDate></item><item><title>KMP Modularization: From Layers to Features</title><link>https://kmpbits.com/posts/kmp-modularization-intro/</link><guid isPermaLink="true">https://kmpbits.com/posts/kmp-modularization-intro/</guid><description>Why organising your garage by components is slowing down your pit stops.</description><pubDate>Thu, 23 Apr 2026 00:00:00 GMT</pubDate></item><item><title>Program Your Pit Wall: Custom Gemini Commands in Android Studio</title><link>https://kmpbits.com/posts/gemini-custom-commands-android-studio/</link><guid isPermaLink="true">https://kmpbits.com/posts/gemini-custom-commands-android-studio/</guid><description>A pit wall crew knows exactly what to do without being told from scratch. Custom Gemini commands work the same way.</description><pubDate>Thu, 23 Apr 2026 00:00:00 GMT</pubDate></item><item><title>Clean Lap: UI Testing in Compose Multiplatform</title><link>https://kmpbits.com/posts/compose-ui-test-cmp/</link><guid isPermaLink="true">https://kmpbits.com/posts/compose-ui-test-cmp/</guid><description>Before the car hits the grid, telemetry confirms every sector. Before your UI ships, runComposeUiTest confirms every composable.</description><pubDate>Mon, 20 Apr 2026 00:00:00 GMT</pubDate></item><item><title>Smooth Handoff</title><link>https://kmpbits.com/posts/nav3-shared-elements/</link><guid isPermaLink="true">https://kmpbits.com/posts/nav3-shared-elements/</guid><description>Navigation 3 supports shared element transitions. It always did. LocalNavAnimatedContentScope was the piece the docs never mentioned.</description><pubDate>Sun, 12 Apr 2026 00:00:00 GMT</pubDate></item><item><title>Do You Really Need a Pit Wall?</title><link>https://kmpbits.com/posts/do-you-really-need-a-pit-wall/</link><guid isPermaLink="true">https://kmpbits.com/posts/do-you-really-need-a-pit-wall/</guid><description>The intermediary between your app and the database never disappeared. It just stopped being your problem.</description><pubDate>Sun, 05 Apr 2026 00:00:00 GMT</pubDate></item><item><title>The White Lines: Enforcing Design System Rules with Detekt</title><link>https://kmpbits.com/posts/detekt-custom-rules-kmp/</link><guid isPermaLink="true">https://kmpbits.com/posts/detekt-custom-rules-kmp/</guid><description>Track limits don&apos;t stop you from going wide. They penalise you for it. Custom Detekt rules work the same way.</description><pubDate>Tue, 31 Mar 2026 00:00:00 GMT</pubDate></item><item><title>Crossing the Finish Line: StateFlow &amp; SharedFlow in Kotlin Multiplatform</title><link>https://kmpbits.com/posts/stateflow-kmp/</link><guid isPermaLink="true">https://kmpbits.com/posts/stateflow-kmp/</guid><description>StateFlow is your lap timer — always showing the latest lap. SharedFlow is the race radio — you only hear what&apos;s broadcasted while you&apos;re tuned in.</description><pubDate>Sat, 21 Mar 2026 00:00:00 GMT</pubDate></item><item><title>Under the Hood: How Compose and SwiftUI Handle What Happens Off-Screen</title><link>https://kmpbits.com/posts/sideeffects-under-the-hood/</link><guid isPermaLink="true">https://kmpbits.com/posts/sideeffects-under-the-hood/</guid><description>Same engine, different cockpit: how Compose and SwiftUI handle side effects when sharing a Kotlin Multiplatform ViewModel.</description><pubDate>Fri, 13 Mar 2026 00:00:00 GMT</pubDate></item><item><title>Master Compose Shared Element Transitions: A Smooth UI Journey</title><link>https://kmpbits.com/posts/shared-element-transition/</link><guid isPermaLink="true">https://kmpbits.com/posts/shared-element-transition/</guid><description>Building fluid, reliable shared element transitions in real-world Compose apps</description><pubDate>Mon, 26 Jan 2026 00:00:00 GMT</pubDate></item><item><title>🎄 A Christmas Checklist for Kotlin Multiplatform Projects</title><link>https://kmpbits.com/posts/christmas-checklist-kmp/</link><guid isPermaLink="true">https://kmpbits.com/posts/christmas-checklist-kmp/</guid><description>What Is Really Worth Sharing</description><pubDate>Sat, 27 Dec 2025 00:00:00 GMT</pubDate></item><item><title>Testing Jetpack Compose UI on the JVM: The Discovery That Changed My Workflow</title><link>https://kmpbits.com/posts/robolectric-compose/</link><guid isPermaLink="true">https://kmpbits.com/posts/robolectric-compose/</guid><description>How Robolectric Made Compose UI Tests Fast and CI Friendly</description><pubDate>Mon, 08 Dec 2025 00:00:00 GMT</pubDate></item><item><title>🧩 Koin Injection on iOS Without Reified Crashes: A Clean KMM Pattern</title><link>https://kmpbits.com/posts/koin-inject-kmp/</link><guid isPermaLink="true">https://kmpbits.com/posts/koin-inject-kmp/</guid><description>Tired of Koin blowing up on iOS because of reified generics? Here’s the definitive fix. Clean, type-safe, Swift-friendly. No crashes, no leaks, no nonsense.</description><pubDate>Fri, 21 Nov 2025 00:00:00 GMT</pubDate></item><item><title>🔔 Cross-Platform Notifications with KMP — All in Kotlin!</title><link>https://kmpbits.com/posts/notifications-kmp/</link><guid isPermaLink="true">https://kmpbits.com/posts/notifications-kmp/</guid><description>All logic, all flows, all platform calls are written in Kotlin.</description><pubDate>Sun, 19 Oct 2025 00:00:00 GMT</pubDate></item><item><title>🚀 Exploring Multi-Layer Navigation in Jetpack Compose with Navigation 3</title><link>https://kmpbits.com/posts/task-navigation3/</link><guid isPermaLink="true">https://kmpbits.com/posts/task-navigation3/</guid><description>A simple, clean, and shows how to combine multiple NavDisplays in a way that scales beautifully as your app grows.</description><pubDate>Sun, 12 Oct 2025 00:00:00 GMT</pubDate></item><item><title>No, Emitting Loading State from the Repository Doesn’t Make You a Junior Dev</title><link>https://kmpbits.com/posts/loading-state-repository/</link><guid isPermaLink="true">https://kmpbits.com/posts/loading-state-repository/</guid><description>Why handling loading in your repository isn’t bad architecture, it’s actually a sign of experience and clean design.</description><pubDate>Wed, 23 Jul 2025 00:00:00 GMT</pubDate></item><item><title>Sleeping But Working: Cross-Platform Background Sync with KMP</title><link>https://kmpbits.com/posts/background-sync-kmp/</link><guid isPermaLink="true">https://kmpbits.com/posts/background-sync-kmp/</guid><description>How to keep your app busy while your users (and you) sleep.</description><pubDate>Thu, 10 Jul 2025 00:00:00 GMT</pubDate></item><item><title>🧊 How Talking to Myself, Vanilla PHP, and an Ice Cream Led Me to Kotlin Multiplatform</title><link>https://kmpbits.com/posts/vanilla-php-icecream/</link><guid isPermaLink="true">https://kmpbits.com/posts/vanilla-php-icecream/</guid><description>A funny and honest story about bugs, PHP, and how one vanilla ice cream helped me realize that talking to myself was actually my greatest debugging tool.</description><pubDate>Fri, 27 Jun 2025 00:00:00 GMT</pubDate></item><item><title>NetFlow Part 1: Why I Took the Leap from Android-Only to Kotlin Multiplatform</title><link>https://kmpbits.com/posts/netflow-part1/</link><guid isPermaLink="true">https://kmpbits.com/posts/netflow-part1/</guid><description>A real-world story of how one Android-first library became a Kotlin Multiplatform (KMP) journey.</description><pubDate>Tue, 24 Jun 2025 00:00:00 GMT</pubDate></item><item><title>🚨 iOS 26’s Liquid Glass Is a Game-Changer for Kotlin Multiplatform — And a Wake-Up Call for Flutter</title><link>https://kmpbits.com/posts/ios26-liquid-glass/</link><guid isPermaLink="true">https://kmpbits.com/posts/ios26-liquid-glass/</guid><description>A stunning leap in visual design that only native apps truly get to experience.</description><pubDate>Mon, 16 Jun 2025 00:00:00 GMT</pubDate></item><item><title>Ktorfit + Kotlin Multiplatform: Retrofit-like Networking for KMP Apps</title><link>https://kmpbits.com/posts/ktor-kmp/</link><guid isPermaLink="true">https://kmpbits.com/posts/ktor-kmp/</guid><description>Bring Retrofit’s simplicity to Kotlin Multiplatform with Ktorfit — type-safe networking that just works everywhere.</description><pubDate>Tue, 10 Jun 2025 00:00:00 GMT</pubDate></item><item><title>Flutter vs Kotlin Multiplatform: KMP with SwiftUI — Native Code with Kotlin Brain</title><link>https://kmpbits.com/posts/kmp-swiftui/</link><guid isPermaLink="true">https://kmpbits.com/posts/kmp-swiftui/</guid><description>Differences between KMP and Flutter</description><pubDate>Sat, 07 Jun 2025 00:00:00 GMT</pubDate></item><item><title>🧩 Injecting Fun: KMP + Koin Annotations Made Easy</title><link>https://kmpbits.com/posts/koin-annotations/</link><guid isPermaLink="true">https://kmpbits.com/posts/koin-annotations/</guid><description>Koin Annotations on Compose Multiplatform</description><pubDate>Sat, 31 May 2025 00:00:00 GMT</pubDate></item><item><title>🚀 Good News for Kotlin Multiplatform Devs: It Just Got Way Easier!</title><link>https://kmpbits.com/posts/kmp-project-creation/</link><guid isPermaLink="true">https://kmpbits.com/posts/kmp-project-creation/</guid><description>If you’ve been curious about Kotlin Multiplatform (KMP) or already building cross-platform apps, I’ve got some great news for you.</description><pubDate>Tue, 20 May 2025 00:00:00 GMT</pubDate></item></channel></rss>