Multi-module, production-ready starter with clean architecture, DI, analytics, in-app purchases, remote config, Room/DataStore, modular navigation, notifications and logging—streamlines app scaffolding and setup.
Project-agnostic, production-ready Kotlin Multiplatform starter for Android & iOS.
KMP Starter Template is a multi-module boilerplate built with:
It removes the repetitive setup work (analytics, purchases, remote config, etc.) so you can focus on building your app.
Each feature is isolated in its own module:
features/
analytics/
core/
database/
navigation/
purchases/
remoteconfig/
your-feature/
Every feature follows:
data/
domain/
presentation/
You can easily swap implementations (e.g., replace Mixpanel with PostHog) by changing the data layer.
Start with the CLI — @devatrii/starter . It scaffolds a full project under your app name and package, rewires modules and namespaces for you, and typically saves 2–3 hours of manual rename and setup work.
The CLI is in alpha — it generates projects successfully, but expect rough edges. If you hit an issue, please report it on GitHub Issues.
Requirements: Node.js 18+, Java 17
# Install globally
npm install -g @devatrii/starter
# Interactive create (prompts for name, package, modules, etc.)
starter create
# Or with flags
starter create \
--name MyApp \
--package com.example.myapp \
--feature notes \
--modules all
# Init starter.json in an existing project
starter init
# Add a starter module to an existing project
starter include --module purchases
# Print CLI version
starter -vCommands: create, init, include, version (-v / --version).
Open the generated project in Android Studio (KMP Plugin required).
Open iosApp/iosApp.xcodeproj in Xcode to run on iOS.
We are working to ship KMP Starter as published Maven libraries so existing projects can adopt modules incrementally (starter utilities, UI, and feature layers) without cloning the full template.
Artifacts are published under io.github.devatrii. They are not fully stable yet—APIs and module boundaries may change between releases.
Example libs.versions.toml for consumers:
[versions]
starter = "x.x.x"
[libraries]
# Starter
starter-core = { module = "io.github.devatrii:starter-core", version.ref = "starter" }
starter-utils = { module = "io.github.devatrii:starter-utils", version.ref = "starter" }
starter-native-bindings = { module = "io.github.devatrii:starter-native-bindings", version.ref = "starter" }
starter-ui-utils = { module = "io.github.devatrii:starter-ui-utils", version.ref = "starter" }
starter-ui-components = { module = "io.github.devatrii:starter-ui-components", version.ref = "starter" }
starter-ui-layouts = { module = "io.github.devatrii:starter-ui-layouts", version.ref = "starter" }
# Features
starter-feature-navigation = { module = "io.github.devatrii:feature-navigation", version.ref = "starter" }
starter-feature-analytics-data = { module = "io.github.devatrii:feature-analytics-data", version.ref = "starter" }
starter-feature-analytics-domain = { module = "io.github.devatrii:feature-analytics-domain", version.ref = "starter" }
starter-feature-core-data = { module = "io.github.devatrii:feature-core-data", version.ref = "starter" }
starter-feature-core-domain = { module = "io.github.devatrii:feature-core-domain", version.ref = "starter" }
starter-feature-core-presentation = { module = "io.github.devatrii:feature-core-presentation", version.ref = "starter" }
starter-feature-locale = { module = "io.github.devatrii:feature-locale", version.ref = "starter" }
starter-feature-remote-config-data = { module = "io.github.devatrii:feature-remote-config-data", version.ref = "starter" }
starter-feature-remote-config-domain = { module = "io.github.devatrii:feature-remote-config-domain", version.ref = "starter" }
starter-feature-remote-config-presentation = { module = "io.github.devatrii:feature-remote-config-presentation", version.ref = "starter" }
starter-feature-purchases-data = { module = "io.github.devatrii:feature-purchases-data", version.ref = "starter" }
starter-feature-purchases-domain = { module = "io.github.devatrii:feature-purchases-domain", version.ref = "starter" }
starter-feature-purchases-presentation = { module = "io.github.devatrii:feature-purchases-presentation", version.ref = "starter" }
starter-feature-notifications-core = { module = "io.github.devatrii:feature-notifications-core", version.ref = "starter" }
starter-feature-notifications-local = { module = "io.github.devatrii:feature-notifications-local", version.ref = "starter" }
starter-feature-notifications-push = { module = "io.github.devatrii:feature-notifications-push", version.ref = "starter" }Example dependency:
implementation(libs.starter.core)
implementation(libs.starter.feature.purchases.presentation)Catalog aliases use dots in Kotlin (starter-core → libs.starter.core). Adjust names to match your catalog if you prefer different aliases.
You are free to:
You are not allowed to:
See the full license here: https://github.com/DevAtrii/Kmp-Starter-Template/blob/main/LICENSE
Project-agnostic, production-ready Kotlin Multiplatform starter for Android & iOS.
KMP Starter Template is a multi-module boilerplate built with:
It removes the repetitive setup work (analytics, purchases, remote config, etc.) so you can focus on building your app.
Each feature is isolated in its own module:
features/
analytics/
core/
database/
navigation/
purchases/
remoteconfig/
your-feature/
Every feature follows:
data/
domain/
presentation/
You can easily swap implementations (e.g., replace Mixpanel with PostHog) by changing the data layer.
Start with the CLI — @devatrii/starter . It scaffolds a full project under your app name and package, rewires modules and namespaces for you, and typically saves 2–3 hours of manual rename and setup work.
The CLI is in alpha — it generates projects successfully, but expect rough edges. If you hit an issue, please report it on GitHub Issues.
Requirements: Node.js 18+, Java 17
# Install globally
npm install -g @devatrii/starter
# Interactive create (prompts for name, package, modules, etc.)
starter create
# Or with flags
starter create \
--name MyApp \
--package com.example.myapp \
--feature notes \
--modules all
# Init starter.json in an existing project
starter init
# Add a starter module to an existing project
starter include --module purchases
# Print CLI version
starter -vCommands: create, init, include, version (-v / --version).
Open the generated project in Android Studio (KMP Plugin required).
Open iosApp/iosApp.xcodeproj in Xcode to run on iOS.
We are working to ship KMP Starter as published Maven libraries so existing projects can adopt modules incrementally (starter utilities, UI, and feature layers) without cloning the full template.
Artifacts are published under io.github.devatrii. They are not fully stable yet—APIs and module boundaries may change between releases.
Example libs.versions.toml for consumers:
[versions]
starter = "x.x.x"
[libraries]
# Starter
starter-core = { module = "io.github.devatrii:starter-core", version.ref = "starter" }
starter-utils = { module = "io.github.devatrii:starter-utils", version.ref = "starter" }
starter-native-bindings = { module = "io.github.devatrii:starter-native-bindings", version.ref = "starter" }
starter-ui-utils = { module = "io.github.devatrii:starter-ui-utils", version.ref = "starter" }
starter-ui-components = { module = "io.github.devatrii:starter-ui-components", version.ref = "starter" }
starter-ui-layouts = { module = "io.github.devatrii:starter-ui-layouts", version.ref = "starter" }
# Features
starter-feature-navigation = { module = "io.github.devatrii:feature-navigation", version.ref = "starter" }
starter-feature-analytics-data = { module = "io.github.devatrii:feature-analytics-data", version.ref = "starter" }
starter-feature-analytics-domain = { module = "io.github.devatrii:feature-analytics-domain", version.ref = "starter" }
starter-feature-core-data = { module = "io.github.devatrii:feature-core-data", version.ref = "starter" }
starter-feature-core-domain = { module = "io.github.devatrii:feature-core-domain", version.ref = "starter" }
starter-feature-core-presentation = { module = "io.github.devatrii:feature-core-presentation", version.ref = "starter" }
starter-feature-locale = { module = "io.github.devatrii:feature-locale", version.ref = "starter" }
starter-feature-remote-config-data = { module = "io.github.devatrii:feature-remote-config-data", version.ref = "starter" }
starter-feature-remote-config-domain = { module = "io.github.devatrii:feature-remote-config-domain", version.ref = "starter" }
starter-feature-remote-config-presentation = { module = "io.github.devatrii:feature-remote-config-presentation", version.ref = "starter" }
starter-feature-purchases-data = { module = "io.github.devatrii:feature-purchases-data", version.ref = "starter" }
starter-feature-purchases-domain = { module = "io.github.devatrii:feature-purchases-domain", version.ref = "starter" }
starter-feature-purchases-presentation = { module = "io.github.devatrii:feature-purchases-presentation", version.ref = "starter" }
starter-feature-notifications-core = { module = "io.github.devatrii:feature-notifications-core", version.ref = "starter" }
starter-feature-notifications-local = { module = "io.github.devatrii:feature-notifications-local", version.ref = "starter" }
starter-feature-notifications-push = { module = "io.github.devatrii:feature-notifications-push", version.ref = "starter" }Example dependency:
implementation(libs.starter.core)
implementation(libs.starter.feature.purchases.presentation)Catalog aliases use dots in Kotlin (starter-core → libs.starter.core). Adjust names to match your catalog if you prefer different aliases.
You are free to:
You are not allowed to:
See the full license here: https://github.com/DevAtrii/Kmp-Starter-Template/blob/main/LICENSE