piashcse /
kmp-movie
KMP Movie 📱 app for Android, iOS, Desktop and Web built with Compose Multiplatform, Coroutine, Flow and ViewModel based on MVVM architecture recommended by Google.
75/100 healthLoading repository data…
Sircjarr / repository
Kotlin Multiplatform and reactive clean architecture sample app targeting both Android and iOS. Discover hero stats and competitive win/pick rates from the game Marvel Rivals.
A transparent discovery signal based on current public GitHub metadata.
This score does not audit code, security, maintainers, documentation quality, or suitability. Verify the repository and its current documentation before adoption.
Compact Kotlin Multiplatform and reactive clean architecture sample mobile app targeting both Android and iOS platforms. In this project, all code is shared between the platforms except for the native UI.
| List to details | Search and filtering | Redirect to external browser |
|---|---|---|
![]() | ![]() | ![]() |
| Topic | Android | iOS | KMP |
|---|---|---|---|
| Dependency injection | - | - | Koin |
| Network | CIO engine | Darwin engine | Ktor + kt serialization plugin |
| Reactive programming | - | - | SKIE plugin |
Selected from shared topics, language and repository description—not editorial ratings.
piashcse /
KMP Movie 📱 app for Android, iOS, Desktop and Web built with Compose Multiplatform, Coroutine, Flow and ViewModel based on MVVM architecture recommended by Google.
75/100 healththomaskioko /
Tv-Maniac is a personalized entertainment tracking and recommendation Multiplatform app (Android & iOS) for tracking TV Shows using TMDB API.
82/100 healthjarroyoesp /
| Unit test runner |
| - |
| - |
| Jetbrains kotlin-test |
| UI | Jetpack Compose + Compose Navigation | SwiftUI + SwiftUI Navigation | - |
| Image loading | Coil-Compose AsyncImage | SwiftUI AsyncImage | - |

.
├── composeApp
│ └── src/androidMain/kotlin/com/sircjarr/marvelrivalsherolookup
│ ├── MainActivity.kt
│ ├── di
│ │ └── AndroidDiModule.kt
│ └── ui
│ ├── MainNavHost.kt
│ ├── composables
│ │ ├── ErrorMessageWithRetry.kt
│ │ └── LoadingMessage.kt
│ ├── res
│ │ ├── ColorRes.kt
│ │ └── RateColor.kt
│ ├── screens
│ │ ├── herodetails
│ │ │ ├── HeroDetailsAndroidViewModel.kt
│ │ │ ├── HeroDetailsContent.kt
│ │ │ ├── HeroDetailsScreen.kt
│ │ │ ├── HeroImageHeader.kt
│ │ │ └── HeroNameHeader.kt
│ │ └── heroeslist
│ │ ├── HeroesListAndroidViewModel.kt
│ │ ├── HeroesListContent.kt
│ │ ├── HeroesListScreen.kt
│ │ └── HeroesListTopBar.kt
│ └── util
│ └── TextFormatter.kt
├── iosApp
│ ├── iosApp
│ ├── MyPlayground.playground
│ ├── NavGraph.swift
│ ├── iOSApp.swift
│ ├── lib
│ │ ├── ArrayExtensions.swift
│ │ ├── CheckBox.swift
│ │ ├── ColorExtensions.swift
│ │ └── DictExtensions.swift
│ └── ui
│ ├── res
│ │ ├── ColorRes.swift
│ │ └── RateColor.swift
│ ├── screens
│ │ ├── herodetails
│ │ │ ├── HeroDetailsArgs.swift
│ │ │ ├── HeroDetailsIosViewModel.swift
│ │ │ ├── HeroDetailsScaffold.swift
│ │ │ ├── HeroDetailsScreen.swift
│ │ │ ├── HeroImageHeader.swift
│ │ │ └── HeroNameHeader.swift
│ │ └── heroeslist
│ │ ├── HeroesListContent.swift
│ │ ├── HeroesListIosViewModel.swift
│ │ ├── HeroesListScaffold.swift
│ │ ├── HeroesListScreen.swift
│ │ └── HeroesListTopBar.swift
│ └── views
│ ├── ErrorMessageWithRetry.swift
│ └── LoadingMessage.swift
└── shared
└── src
├── androidMain
│ └── kotlin/com/sircjarr/marvelrivalsherolookup
│ ├── di
│ │ └── IntermediateSetAndroidModule.kt
│ └── externalbrowserlauncher
│ └── ExternalBrowserLauncherAndroid.kt
├── commonMain
│ └── kotlin/com/sircjarr/marvelrivalsherolookup
│ ├── FakeData.kt
│ ├── di
│ │ └── CommonDiModule.kt
│ ├── feature
│ │ ├── herodetails
│ │ │ ├── di
│ │ │ │ └── HeroDetailsModule.kt
│ │ │ ├── domain
│ │ │ │ ├── GetHeroDetailsUseCase.kt
│ │ │ │ ├── HeroDetailsModel.kt
│ │ │ │ ├── HeroDetailsRepo.kt
│ │ │ │ └── LoadHeroDetailsUseCase.kt
│ │ │ └── ui
│ │ │ ├── HeroDetails.kt
│ │ │ ├── HeroDetailsViewModel.kt
│ │ │ └── HeroDetailsViewState.kt
│ │ └── heroeslist
│ │ ├── di
│ │ │ └── HeroesListModule.kt
│ │ ├── domain
│ │ │ ├── GetHeroesListUseCase.kt
│ │ │ ├── HeroesListModel.kt
│ │ │ ├── HeroesListRepo.kt
│ │ │ └── LoadHeroesListUseCase.kt
│ │ └── ui
│ │ ├── HeroesList.kt
│ │ ├── HeroesListViewModel.kt
│ │ └── HeroesListViewState.kt
│ ├── feature_api
│ │ ├── data_hero
│ │ │ ├── ApiDataHeroModule.kt
│ │ │ ├── HeroDataSource.kt
│ │ │ ├── HeroDataSourceKtor.kt
│ │ │ ├── HeroDetailsDto.kt
│ │ │ ├── HeroListItemDto.kt
│ │ │ └── HeroRatesDto.kt
│ │ └── ui
│ │ └── Screen.kt
│ └── lib
│ └── ExternalBrowserLauncher.kt
├── commonTest
│ └── kotlin
│ ├── HeroDetailsRepoTest.kt
│ └── HeroesListRepoTest.kt
└── iosMain
└── kotlin/com/sircjarr/marvelrivalsherolookup
├── di
│ ├── IntermediateSetIosModule.kt
│ └── KoinIosHelper.kt
└── externalbrowserlauncher
└── ExternalBrowserLauncherIos.kt
| Source set | Type | Description |
|---|---|---|
| shared/commonMain | common | Shared code containing core business logic accessible by all the source sets |
| shared/commonTest | common | commonMain non-instrumented unit tests |
| shared/androidMain | intermediate | Android-specific implementations of commonMain interfaces |
| shared/iOSMain | intermediate | iOS-specific implementations of commonMain interfaces |
| composeApp | target | Entry point for Android application and Compose code. Depends on androidMain. |
| iOSApp | target | Entry point for iOS application and SwiftUI code. Depends on iOSMain. |
Koin modules are organized by source set and feature; making them small and encapsulated.
// Feature-level modules
val apiDataHeroModule = module {
singleOf(::HeroDataSourceKtor) bind HeroDataSource::class // Singleton
singleOf(::HeroDataSourceKtor) { createdAtStart() }
}
val heroesListModule = module {
singleOf(::HeroesListRepo) { createdAtStart() }
singleOf(::GetHeroesListUseCase) { createdAtStart() }
singleOf(::LoadHeroesListUseCase) { createdAtStart() }
singleOf(::HeroesListViewModel) { createdAtStart() }
}
val heroDetailsModule = module {
singleOf(::HeroDetailsRepo) { createdAtStart() }
factoryOf(::GetHeroDetailsUseCase) // Inject on-demand
factoryOf(::LoadHeroDetailsUseCase)
factoryOf(::HeroDetailsViewModel)
}
// Consolidate feature modules into one
val commonDiModule = module {
includes(apiDataHeroModule, heroesListModule, heroDetailsModule)
}
// androidMain
val intermediateSetAndroidModule = module {
factoryOf(::ExternalBrowserLauncherAndroid) bind ExternalBrowserLauncher::class
factoryOf(::ExternalBrowserLauncherAndroid)
}
// iosMain
val intermediateSetIosModule = module {
factoryOf(::ExternalBrowserLauncherIos) bind ExternalBrowserLauncher::class
factoryOf(::ExternalBrowserLauncherIos)
}
// On app startup
startKoin {
androidContext(application)
modules(commonDiModule, intermediateSetAndroidModule, composeAppModule)
}
// Additional target-level module needed for Koin to inject Anrdoid ViewModels
val composeAppModule = module {
viewModel { HeroesListAndroidViewModel(get()) }
viewModelOf(::HeroesListAndroidViewModel)
viewModel { HeroDetailsAndroidViewModel(get()) }
viewModelOf(::HeroDetailsAndroidViewModel)
}
// On app startup
init() {
KoinIosHelper.companion.startKoin()
}
// Helper in iosMain; access Koin indirectly in Swift code
class KoinIosHelper {
companion object: KoinComponent {
fun startKoin() {
org.koin.core.context.startKoin {
modules(commonDiModule, intermediateSetIosModule)
}
}
val heroesListViewModel: HeroesListViewModel by inject()
val heroDetailsViewModel: HeroDetailsViewModel by inject()
}
}
commonMain, commonTest, and iosMain source setsTests exist in the commonTest source set and use the Jetbrains kotlin-test runner
This is a project primarily for demo purposes and is not open to MRs. However, if you would like to work on top of it feel free to fork away.
Thanks to https://lunarapi.org/ for the API.
If this project caught your interest enough to star or read all the way through — thank you!
This a non-official application and not endorsed by NetEase Games or Marvel Entertainment in any way. NetEase, Marvel Entertainment, and all associated properties are trademarks or registered trademarks of Marvel Entertainment.
Android & iOS App using MVVM pattern and LiveData on the presentation layer + Clean Arch on the common shared code.
TaehoonLeee /
Android and Kotlin Multiplatform Multi Module Clean Architecture Proejct
56/100 healthenteraname74 /
A music player for Android and Desktop using Compose Multiplatform.
79/100 healthelnatand /
Kotlin Multiplatform movie database app built with Compose Multiplatform and Navigation 3. Browse movies, discover new releases, and explore detailed information powered by The Movie Database (TMDB) API. Features Clean Architecture, Room persistence, and runs on Android & iOS.
78/100 health