Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
ahmed3elshaer avatar

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)
At a glance

kmp-di capabilities & compatibility

Capabilities
dependency injection · koin setup · kmp di · service locator
Use cases
api development
From the docs

What kmp-di says it does

Dependency Injection for KMP. Koin multiplatform setup, platform modules, and manual DI patterns.
SKILL.md
Cross-platform dependency injection with Koin.
SKILL.md
npx skills add https://github.com/ahmed3elshaer/everything-claude-code-mobile --skill kmp-di

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs49
repo stars60
Last updatedJune 14, 2026
Repositoryahmed3elshaer/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

SKILL.mdMarkdownGitHub ↗

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.

Mobile Developmentbackendintegrations

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.