Afterfade records seven five-second videos over the course of a day and turns them into one lo-fi track. It runs on Kotlin Multiplatform (KMP) and Compose Multiplatform, live on both the App Store and Google Play. I wrote four posts while building it — this one is the short version.
The numbers
Android took six days to build. iOS — my first iOS app — took two. 70.6% of the code is shared (9,011 of 12,764 lines). The music engine is 2,236 lines of pure Kotlin with zero external dependencies. Platform-specific code is almost entirely camera, video, billing, and ads.
commonMain 9,011 androidMain 1,537 iosMain 1,017 Swift 1,199
Everything written for iOS is the right two columns: 2,216 lines. → Full story
I deleted the server
Music generation started as Python on AWS Lambda — about a minute per track, cost scaling with users, and people's recordings traveling to my server. The engine is pure computation, so I ported it to Kotlin, put it in the shared source set, and it ran on both platforms. Generation now takes about 10 seconds, costs nothing, works in airplane mode, and nothing leaves the device.
The 52 tests I had written for Android ran on the iOS simulator without changing a line. I moved it on day 5 and deleted the AWS side the next day. → Full story
Where it broke
An iOS completion callback never returned to Kotlin/Native. I spent a full day on it, then rewrote the video export in Swift. Swift is 1,199 lines today, 9.4% of the codebase. App logic and screens took zero lines of it. → Full story
Where your app might land
Three questions:
- On-device computation is the core → shareable
- You draw your own UI → shareable
- Camera, maps, or sensors are the point → per platform
If you already have an Android app in Kotlin: find one piece of logic that calls no OS API, move it into a shared module, and run its existing tests on the iOS simulator. They go green without a change, or they don't — and you know what you are working with.
Afterfade is built for RevenueCat Shipaton 2026.
- App Store: https://apps.apple.com/us/app/afterfade/id6800247416
- Google Play: https://play.google.com/store/apps/details?id=com.afterfade.app
Detailed posts:
- I Had Never Written an iOS App. The iOS Version Took Two Days. — Choosing KMP, what shared and what didn't
- Still 90% Kotlin, 9% Swift — The one piece I could not write in Kotlin
- One Canvas-Drawn Cassette Deck UI, Identical on Android and iOS — Not a single Material Button; the drawing exists once in commonMain
- No Server, Same Track on Both Platforms
Top comments (0)