Skip to content

Getting Started

CLI version Maven version

Requirements

  • Kotlin 2.4.0
  • Java 17
  • Gradle 9.0 or later
  • Android Studio Otter 2025.2.3 or later
  • KMP Plugin for Android Studio
  • Xcode 26 or later
  • Node.js 18+ (for the CLI)

Android Studio Compatibility

Starter Template is compatible with Gradle 9.0, you can see list of android studio versions that supports gradle 9.0 here

Using the CLI

Start a project with the KMP Starter CLI (@devatrii/starter).

Alpha

The CLI is in alpha. It generates projects, but you may hit rough edges. If something breaks, please open a GitHub issue.

Install globally

npm install -g @devatrii/starter
CLI version

This installs the starter and kmp-starter commands.

Create a new project

Run interactively (prompts for app name, package, feature, modules, etc.):

starter create

Or pass options directly:

starter create \
  --name MyApp \
  --package com.example.myapp \
  --feature notes \
  --modules all

This generates a zip (and extracts it by default). Open the project in Android Studio, and open iosApp/iosApp.xcodeproj in Xcode to run on iOS.

Other commands

# Create starter.json in an existing project
starter init

# Include a starter module into an existing project
starter include --module purchases

# Print CLI version
starter -v

Add libraries to an existing project

Use published Maven artifacts (io.github.devatrii) when you already have a KMP app and only want starter modules.

From your project root:

# Once per repo (creates starter.json)
starter init

# Add a module (wires catalog + dependency)
starter include --module purchases
# or: starter include --module analytics-data

Option B — Manual

  1. Add the version + library entries to gradle/libs.versions.toml: Maven version
[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" }
  1. Depend on them from your app / feature module:
implementation(libs.starter.core)
implementation(libs.starter.feature.purchases.domain)
implementation(libs.starter.feature.purchases.data)
implementation(libs.starter.feature.purchases.presentation)
  1. Register the feature’s Koin modules in your startKoin { modules(...) } (e.g. purchasesDataModule, purchasesDomainModule, purchasesPresentationModule).

Don't forget Koin

Adding a Gradle dependency alone is not enough. Every starter feature ships its own Koin module(s) — you must include them in initKoin / startKoin, or injections will fail at runtime.


On the next page, learn about all modules.

Web wizard

A web wizard for generating projects in the browser is also planned. Until then, use the CLI.

Support My Project ☕️

If you find this project useful, consider supporting it by buying me a coffee. Your support will help me to continue working on this project and add more features.