
Kmp Di
- 49 installs
- 60 repo stars
- Updated June 14, 2026
- ahmed3elshaer/everything-claude-code-mobile
kmp-di is a Claude Code skill providing Kotlin Multiplatform dependency-injection patterns using Koin with shared and platform modules.
About
kmp-di is a Claude Code skill with dependency-injection patterns for Kotlin Multiplatform using Koin. A developer uses it to define shared modules, wire platform-specific dependencies, and start Koin on Android, iOS, and Compose Multiplatform. It also shows a manual service-locator alternative.
- Koin multiplatform setup with shared and platform modules
- ViewModel/ScreenModel injection for Android and iOS
- factory vs single vs scoped, named dependencies, and manual DI fallback
Kmp Di by the numbers
- 49 all-time installs (skills.sh)
- Ranked #597 of 1,039 Mobile Development skills by installs in the Skillselion catalog
- Data as of Aug 4, 2026 (Skillselion catalog sync)
kmp-di capabilities & compatibility
- Capabilities
- dependency injection · koin setup · kmp di · service locator
- Use cases
- api development
What kmp-di says it does
Dependency Injection for KMP. Koin multiplatform setup, platform modules, and manual DI patterns.
Cross-platform dependency injection with Koin.
npx skills add https://github.com/ahmed3elshaer/everything-claude-code-mobile --skill kmp-diAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 49 |
|---|---|
| repo stars | ★ 60 |
| Last updated | June 14, 2026 |
| Repository | ahmed3elshaer/everything-claude-code-mobile ↗ |
What it does
Set up Koin dependency injection across shared and platform modules in a Kotlin Multiplatform app.
Who is it for?
KMP developers setting up Koin dependency injection across platforms
Skip if: Single-platform projects not using Koin or KMP
When should I use this skill?
You are wiring Koin DI across shared and platform modules in a KMP app
By the numbers
- Covers Koin setup for Android, iOS, and Compose Multiplatform
- Explains factory, single, and scoped definitions
Files
KMP Dependency Injection
Cross-platform dependency injection with Koin.
Koin Multiplatform Setup
Dependencies
// build.gradle.kts (shared module)
sourceSets {
val commonMain by getting {
dependencies {
implementation("io.insert-koin:koin-core:${koinVersion}")
implementation("io.insert-koin:koin-test:${koinVersion}")
}
}
val androidMain by getting {
dependencies {
implementation("io.insert-koin:koin-android:${koinVersion}")
}
}
}Module Definition
// commonMain/kotlin/di/AppModule.kt
val sharedModule = module {
// ViewModels (Android) / ScreenModels (multiplatform)
factory { HomeViewModel(get(), get()) }
factory { DetailViewModel(get()) }
// Use Cases
factory { GetUsersUseCase(get()) }
factory { GetUserDetailUseCase(get()) }
// Repositories
single<UserRepository> { UserRepositoryImpl(get(), get()) }
// Data Sources
single { UserApi(get()) }
single { createDatabase(get()) }
}Platform Modules
// androidMain/kotlin/di/PlatformModule.kt
val androidPlatformModule = module {
includes(sharedModule)
// Android-specific dependencies
single { android.content.Context() }
single { PlatformConnectivityMonitor(get()) }
single { PlatformFileService(get()) }
}
// iosMain/kotlin/di/PlatformModule.kt
val iosPlatformModule = module {
includes(sharedModule)
// iOS-specific dependencies
single { PlatformConnectivityMonitor() }
single { PlatformFileService() }
}Koin Start
Android
// androidMain/kotlin/MyApp.kt
class MyApp : Application() {
override fun onCreate() {
super.onCreate()
startKoin {
androidContext(this@MyApp)
modules(androidPlatformModule)
}
}
}iOS
// iosMain/kotlin/di/KoinInit.kt
fun initKoin() {
startKoin {
modules(iosPlatformModule)
}
}
// Called from Swift
// KotlinKMMSharedKt.doInitKoin()Compose Multiplatform
// commonMain/kotlin/Main.kt
fun main() {
startKoin {
modules(sharedModule)
}
App()
}ViewModel Injection
Android (ViewModel)
// androidMain/kotlin/ui/HomeScreen.kt
@Composable
fun HomeScreen(
viewModel: HomeViewModel = koinViewModel()
) {
val state by viewModel.state.collectAsStateWithLifecycle()
HomeContent(state)
}iOS (ScreenModel)
// commonMain/kotlin/ui/HomeScreen.kt
@Composable
fun HomeScreen() {
val model = getScreenModel<HomeScreenModel>()
val state by model.state.collectAsState()
HomeContent(state)
}Repository Pattern
Factory vs Single
// ✅ factory - creates new instance each time
factory { HomeViewModel(get(), get()) }
// ✅ single - shared instance
single<UserRepository> { UserRepositoryImpl(get(), get()) }
// ✅ scoped - tied to component lifetime
scoped(HomeScope.homeScope) { HomeData(get()) }Named Dependencies
// ✅ Named dependencies
module {
single(named("default")) { DefaultLogger() }
single(named("analytics")) { AnalyticsLogger() }
factory { MyRepository(logger = get(named("default"))) }
}Manual DI (Alternative)
Simple Service Locator
// commonMain/kotlin/di/ServiceLocator.kt
object ServiceLocator {
private val services = mutableMapOf<String, Any>()
fun <T> get(key: String): T {
return services[key] as T
}
fun register(key: String, service: Any) {
services[key] = service
}
fun init() {
register("repository", UserRepositoryImpl())
register("api", UserApi())
}
}Pure Kotlin DI
// commonMain/kotlin/di/AppContainer.kt
class AppContainer(
private val platformService: PlatformService
) {
val api: UserApi = UserApi()
val database: AppDatabase = createDatabase()
val userRepository: UserRepository by lazy {
UserRepositoryImpl(api, database)
}
val homeViewModel: HomeViewModel by lazy {
HomeViewModel(userRepository, platformService)
}
}Testing with DI
// commonTest/kotlin/di/TestModule.kt
val testModule = module {
single<MockUserService> { MockUserService() }
single<UserService>(override = true) { get<MockUserService>() }
}
// In tests
@BeforeTest
fun setup() {
startKoin { modules(testModule) }
}
@AfterTest
fun tearDown() {
stopKoin()
}---
Remember: DI simplifies testing. Use it to inject mocks and fakes easily.
Related skills
FAQ
Which DI library does it use?
Koin, with a shared module plus platform-specific modules that include it, and a manual service-locator fallback.
How are dependencies scoped?
It explains factory (new instance), single (shared), and scoped (tied to component lifetime), plus named dependencies.