// the find
joreilly/PeopleInSpace
Kotlin Multiplatform sample with SwiftUI, Jetpack Compose, Compose for Wear, Compose for Desktop, and Compose for Web clients along with Ktor backend.
PeopleInSpace is a Kotlin Multiplatform reference project that runs the same shared business logic across Android, iOS, Wear OS, desktop, web (Wasm), and a Ktor backend. It intentionally stays minimal — a small app showing who's currently in space — so the KMP plumbing is visible without being buried under product complexity. The author maintains it actively and uses it to track the KMP ecosystem as it evolves.
The platform breadth is genuine: this isn't 'Android plus a stub iOS target' — there are real SwiftUI screens, a working Wasm build, Wear OS tiles, and now an MCP server module all sharing the same common module. The tech stack is current: Kotlin 2.3.21, SKIE for Swift/Kotlin interop (which eliminates most of the Kotlin coroutines-to-Swift awkward bridging), and Compose Multiplatform on iOS rather than SwiftUI-only. CI covers each platform with separate workflows including Maestro for UI tests, which is more discipline than most KMP samples bother with. The MCP server module is a genuinely interesting addition — it reuses the same shared KMP code to expose a tool endpoint, showing that the 'write once' story extends beyond UI targets.
It's a sample, and the app itself does almost nothing — two API calls and a list. Don't mistake breadth of targets for breadth of solved problems; offline-first SQLDelight caching is there but anyone adopting this pattern for a real app will hit edge cases not covered here. The iOS project still lives in a separate Xcode folder with its own xcodeproj, which means the build story for a new contributor is 'open Android Studio, then also open Xcode separately' — not a KMP limitation, but the README doesn't warn you. Wasm/web output is purely Compose for Web, so if you need any DOM interop or need to ship something that looks like a normal web page, you're on your own. There's also no error handling to speak of in the shared code — network calls fail silently into empty state, which is fine for a demo but would mask real issues in production use.