
Headless, plug-and-play SDK offering networking, auth, HTTP cache, offline queue, logging, telemetry and MVI contracts; modular feature modules, dependency registry, and three integration paths including full offline-first with host SQL.
Headless Kotlin Multiplatform SDK for Android and iOS.
Networking, auth, cache/offline sync, and MVI contracts — you own all UI (Compose, SwiftUI, XML, …).
| Maven | in.co.niteshkukreja:kmp-sdk |
| Version |
[Releases] (also sdkVersion in gradle.properties) |
Scan I want to…, check What’s inside for keywords (UseCase, ViewModel, …), then open Go to.
| I want to… | What’s inside | Go to |
|---|---|---|
Install & KmpSdk.init in 5 minutes |
Dependency, init, KmpSdk.get, feature modules, host register
|
getting-started |
| See Path A vs B vs C | Comparison table, Path A UseCase sample, Path B cache flags, Path C + ViewModel / bindSyncList
|
integration-paths |
| Copy-paste a working snippet | Path A/B/C, analytics, auth, push, upload, sync banner, SSL, drafts, deep link, env switch | recipes |
| Fix a build / runtime error | Gradle, iOS publish, logging plugin, QueryKit, host register, TLS / pinning |
troubleshooting |
| I want to… | What’s inside | Go to |
|---|---|---|
| Offline list + CRUD | Feature Kit, RestResourceApi, generator, OpenAPI import, installRestResourceFeature
|
feature-kit |
| UseCase + feature module |
KmpSdkModule, register / get UseCase, Path A UseCase example |
getting-started · integration-paths · recipes |
| ViewModel / MVI / list binding | Path C notes: host ViewModel + bindSyncList; MVI contracts in SDK (MviViewModel) |
integration-paths · api-reference |
| HTTP cache, upload, realtime, resilience | Path B cache, retry / circuit breaker, fileUpload, WebSocket / SSE, dedup / rate-limit |
networking |
| SSL / certificate pinning |
CertificateParams, certificateBuilder, openssl, Android-only, captive-portal vs pin fail |
networking § SSL |
| Offline queue & sync UI | Offline mutations, syncCoordinator, syncStatus banner, dirty sync, drafts, QueryKit |
offline-sync |
| I want to… | What’s inside | Go to |
|---|---|---|
| AppAnalytics / custom classes / telemetry | Custom interface/class, expect/actual, register, feature UseCase wiring, KmpSdk.telemetry bridge |
getting-started §4 |
| Auth & session |
auth { }, tokenRefreshHandler, sessionManager.login / events |
auth-and-config |
| Firebase Remote Config | Host Firebase fetch → remoteConfig { } map, getBoolean / TTL key |
auth-and-config § RC |
| Environments / tenant | Env vault (dev/staging/prod), switchTo, tenantManager
|
auth-and-config |
| DI, deep links, push, background | Koin / Hilt / Kodein bridges, deep link routes, push router, backgroundWork
|
platform-integration |
| Messages → snackbar / toast |
messageEventBus collect → your UI |
platform-integration § Messages |
| I want to… | What’s inside | Go to |
|---|---|---|
API / KmpSdk.* cheat sheet |
Globals, init flags (certificateBuilder, …), debugger snapshot |
api-reference |
| What changed recently | Feature Kit, sync, upload, DI, docs notes | changelog |
| Consumer / sample checklist | Path A/B/C demos, host injection, sync banner checklist | sample-app |
| Full docs index | Same goals, single index page | docs/README |
| Generate a feature from YAML | CLI, product.yaml / order.yaml, SQL option |
feature-generator |
| Import OpenAPI → Feature Kit | Spec → YAML → generated feature | openapi-import |
| SQLDelight migration helper | Host schema migration tips | migration-helper |
Need YOUR SQL offline for this feature?
YES → Path C → docs/feature-kit.md
NO → Last HTTP response offline OK?
YES → Path B → docs/networking.md + docs/integration-paths.md
NO → Path A → docs/getting-started.md
More detail: docs/integration-paths.md.
| Do | Don’t |
|---|---|
| Pick one path (A/B/C) per feature | Mix Path C SQL + Path B cache for the same list without a reason |
register host types in KmpSdk.init
|
Expect Koin/Hilt alone to feed feature modules |
| Keep Firebase, Analytics, UI in the host app | Expect the SDK to ship screens or Firebase |
| Use recipes + the table above to find docs | Treat this README as the full API manual |
Pin with certificateBuilder on prod Android when you have real pins |
Debug pinning on captive portal / wrong-host certs |
// shared/build.gradle.kts
implementation("in.co.niteshkukreja:kmp-sdk:[Releases]")
// Application.onCreate
KmpSdk.init(this) {
baseUrl = "https://api.example.com"
install(YourFeatureModule)
}Repositories: mavenCentral() (add mavenLocal() only when testing a local publish).
Next (optional): SSL pinning → networking · Analytics → getting-started §4 · Firebase RC → auth-and-config
No in-repo Android/iOS sample yet. Use your consumer test app (e.g. TestingKmpSdk) — checklist: docs/sample-app.md.
.\gradlew.bat :kmp-sdk:compileDebugKotlinAndroid :kmp-sdk:allTests --no-daemonMac (incl. iOS targets for publish):
./gradlew :kmp-sdk:assemble --no-daemonPublish iOS artifacts from a Mac (or macOS CI). See CONTRIBUTING.md.
install / get)NSURLSession if needed)Headless Kotlin Multiplatform SDK for Android and iOS.
Networking, auth, cache/offline sync, and MVI contracts — you own all UI (Compose, SwiftUI, XML, …).
| Maven | in.co.niteshkukreja:kmp-sdk |
| Version |
[Releases] (also sdkVersion in gradle.properties) |
Scan I want to…, check What’s inside for keywords (UseCase, ViewModel, …), then open Go to.
| I want to… | What’s inside | Go to |
|---|---|---|
Install & KmpSdk.init in 5 minutes |
Dependency, init, KmpSdk.get, feature modules, host register
|
getting-started |
| See Path A vs B vs C | Comparison table, Path A UseCase sample, Path B cache flags, Path C + ViewModel / bindSyncList
|
integration-paths |
| Copy-paste a working snippet | Path A/B/C, analytics, auth, push, upload, sync banner, SSL, drafts, deep link, env switch | recipes |
| Fix a build / runtime error | Gradle, iOS publish, logging plugin, QueryKit, host register, TLS / pinning |
troubleshooting |
| I want to… | What’s inside | Go to |
|---|---|---|
| Offline list + CRUD | Feature Kit, RestResourceApi, generator, OpenAPI import, installRestResourceFeature
|
feature-kit |
| UseCase + feature module |
KmpSdkModule, register / get UseCase, Path A UseCase example |
getting-started · integration-paths · recipes |
| ViewModel / MVI / list binding | Path C notes: host ViewModel + bindSyncList; MVI contracts in SDK (MviViewModel) |
integration-paths · api-reference |
| HTTP cache, upload, realtime, resilience | Path B cache, retry / circuit breaker, fileUpload, WebSocket / SSE, dedup / rate-limit |
networking |
| SSL / certificate pinning |
CertificateParams, certificateBuilder, openssl, Android-only, captive-portal vs pin fail |
networking § SSL |
| Offline queue & sync UI | Offline mutations, syncCoordinator, syncStatus banner, dirty sync, drafts, QueryKit |
offline-sync |
| I want to… | What’s inside | Go to |
|---|---|---|
| AppAnalytics / custom classes / telemetry | Custom interface/class, expect/actual, register, feature UseCase wiring, KmpSdk.telemetry bridge |
getting-started §4 |
| Auth & session |
auth { }, tokenRefreshHandler, sessionManager.login / events |
auth-and-config |
| Firebase Remote Config | Host Firebase fetch → remoteConfig { } map, getBoolean / TTL key |
auth-and-config § RC |
| Environments / tenant | Env vault (dev/staging/prod), switchTo, tenantManager
|
auth-and-config |
| DI, deep links, push, background | Koin / Hilt / Kodein bridges, deep link routes, push router, backgroundWork
|
platform-integration |
| Messages → snackbar / toast |
messageEventBus collect → your UI |
platform-integration § Messages |
| I want to… | What’s inside | Go to |
|---|---|---|
API / KmpSdk.* cheat sheet |
Globals, init flags (certificateBuilder, …), debugger snapshot |
api-reference |
| What changed recently | Feature Kit, sync, upload, DI, docs notes | changelog |
| Consumer / sample checklist | Path A/B/C demos, host injection, sync banner checklist | sample-app |
| Full docs index | Same goals, single index page | docs/README |
| Generate a feature from YAML | CLI, product.yaml / order.yaml, SQL option |
feature-generator |
| Import OpenAPI → Feature Kit | Spec → YAML → generated feature | openapi-import |
| SQLDelight migration helper | Host schema migration tips | migration-helper |
Need YOUR SQL offline for this feature?
YES → Path C → docs/feature-kit.md
NO → Last HTTP response offline OK?
YES → Path B → docs/networking.md + docs/integration-paths.md
NO → Path A → docs/getting-started.md
More detail: docs/integration-paths.md.
| Do | Don’t |
|---|---|
| Pick one path (A/B/C) per feature | Mix Path C SQL + Path B cache for the same list without a reason |
register host types in KmpSdk.init
|
Expect Koin/Hilt alone to feed feature modules |
| Keep Firebase, Analytics, UI in the host app | Expect the SDK to ship screens or Firebase |
| Use recipes + the table above to find docs | Treat this README as the full API manual |
Pin with certificateBuilder on prod Android when you have real pins |
Debug pinning on captive portal / wrong-host certs |
// shared/build.gradle.kts
implementation("in.co.niteshkukreja:kmp-sdk:[Releases]")
// Application.onCreate
KmpSdk.init(this) {
baseUrl = "https://api.example.com"
install(YourFeatureModule)
}Repositories: mavenCentral() (add mavenLocal() only when testing a local publish).
Next (optional): SSL pinning → networking · Analytics → getting-started §4 · Firebase RC → auth-and-config
No in-repo Android/iOS sample yet. Use your consumer test app (e.g. TestingKmpSdk) — checklist: docs/sample-app.md.
.\gradlew.bat :kmp-sdk:compileDebugKotlinAndroid :kmp-sdk:allTests --no-daemonMac (incl. iOS targets for publish):
./gradlew :kmp-sdk:assemble --no-daemonPublish iOS artifacts from a Mac (or macOS CI). See CONTRIBUTING.md.
install / get)NSURLSession if needed)