A personal diet app built with Kotlin Multiplatform. Native Android UI with Compose, native iOS UI with SwiftUI, shared business logic.
Testing
| Layer | Technology |
|---|---|
| Language | Kotlin 2.3.20 |
| Multiplatform | Kotlin Multiplatform + Compose Multiplatform 1.10.3 |
| Android UI | Jetpack Compose |
| iOS UI | SwiftUI |
| Auth | Firebase Auth via gitlive 2.4.0 |
| Networking | Ktor 3.4.2 |
| DI | Koin 4.2.1 |
| iOS interop | SKIE 0.10.11 |
| Formatting | Spotless + ktlint |
| Git hooks | Lefthook |
Multi-module KMP project. No single shared module — functionality is split across typed modules:
:composeApp → Android app entry point
:iosApp → iOS app entry point (Xcode project)
:libs:auth → Aggregator (api + impl)
:libs:auth:api → AuthRepository interface, AuthState
:libs:auth:impl → Firebase Auth implementation
:libs:network → Ktor HttpClient, auth token injection
:libs:coroutines → CoroutineDispatchers, shared CoroutineScope
:libs:di → Koin composition root
Module conventions:
:libsmodules always have:api(public contract) and:impl(implementation) — consumers depend on the aggregator- Future
:featuremodules will follow a:ui/:data/:domainsplit — UI lives in the native codebases - Convention plugins in
:build-logichandle shared Gradle config (yaseyo.kmp.library)
- JDK 17
- Android Studio (latest stable)
- Xcode 15+
- Homebrew
git clone <repo-url>
cd yaseyo-mobile
./scripts/setup.shOr via Gradle if you prefer:
./gradlew setupThis installs Lefthook (if needed) and registers the git hooks for auto-formatting on commit.
These files are gitignored — get them from Firebase console or a teammate:
- Android: place
google-services.jsonincomposeApp/ - iOS: place
GoogleService-Info.plistiniosApp/iosApp/
Open iosApp/iosApp.xcodeproj in Xcode and add the Firebase iOS SDK via SPM:
File→Add Package Dependencies- URL:
https://github.com/firebase/firebase-ios-sdk - Add
FirebaseAuthandFirebaseCoreto theiosApptarget
Android
./gradlew :composeApp:assembleDebugiOS
Open iosApp/iosApp.xcodeproj in Xcode and run.