Agent skill

Kmp Starter Native App

by DevAtrii in DevAtrii/Kmp-Starter-Template

Build a KMP Starter app with NO shared UI — Compose on Android, native SwiftUI on iOS.

MITAuto-check passedMobile

Install Kmp Starter Native App

skills CLI
$ npx skills add DevAtrii/Kmp-Starter-Template --skill kmp-starter-native-app -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install DevAtrii/Kmp-Starter-Template kmp-starter-native-app --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/DevAtrii/Kmp-Starter-Template.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/kmp-starter/native-app .claude/skills/kmp-starter-native-app && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
kmp-starter-native-app
GitHub stars
167
Token cost
~2.5k tokens
SKILL.md length
538 words
Files
1
Skills in repo
23
Repo updated
First seen
Licence
MIT

At a glance

Build a KMP Starter app with NO shared UI — Compose on Android, native SwiftUI on iOS.

  • Works in 4 steps: Create the ios-runtime module → Wire the Xcode build phase to iosRuntime → Bootstrap — start Koin once → …
  • Tasks that involve iOS development
  • SKILL.md covers Architecture overview, 1. Create the ios-runtime module, 2. Wire the Xcode build phase… and 3. Bootstrap — start Koin once, plus 3 more sections
  • Instructions only: no scripts, shell commands, URLs or credentials in SKILL.md

What it does

Kmp Starter Native App is an agent skill from DevAtrii/Kmp-Starter-Template. Build a KMP Starter app with NO shared UI — Compose on Android, native SwiftUI on iOS. Create an ios-runtime module exported to the iOS app via SKIE, start Koin once in Swift, and build previewable MVI SwiftUI screens.

Its SKILL.md is about 2.5k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Mobile, covering iOS development. It works with iOS, SwiftUI, Android and Xcode. The repository describes itself as: Starter template is a multi-module KMP boilerplate for Android & iOS with clean architecture and high-quality code. It handles basics like remote config, in-app purchases, and… The licence is MIT.

When your agent uses it

  • Tasks that involve iOS development

Example prompts

  • “/kmp-starter-native-app”

Workflow steps

4 steps, taken from the step headings in SKILL.md.

  1. Create the ios-runtime module
  2. Wire the Xcode build phase to iosRuntime
  3. Bootstrap — start Koin once
  4. iOS screen structure — Screen + Root + ViewModel

What it can do on your machine

Read from SKILL.md and the folder at commit a8f7b27. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    No scripts in the folder and no shell commands in SKILL.md (its code samples are swift and kotlin).

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Links to these hosts (documentation or services it may open):

    • skie.touchlab.co
    • github.com

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Kmp Starter Native App loads about 2.5k tokens when it runs. Until then it costs about 60 tokens; SKILL.md has 538 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~60
When it runs · the whole SKILL.md, loaded when a task matches
~2.5k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from DevAtrii/Kmp-Starter-Template at commit a8f7b27, republished under its MIT licence (© DevAtrii). 538 words, ~2,490 tokens.

Download SKILL.mdSave it as .claude/skills/kmp-starter-native-app/SKILL.md (or your agent's skills folder).
name
kmp-starter-native-app
description
Build a KMP Starter app with NO shared UI — Compose on Android, native SwiftUI on iOS. Create an ios-runtime module exported to the iOS app via SKIE, start Koin once in Swift, and build previewable MVI SwiftUI screens.
author
DevAtrii
license
MIT

Native App (No Shared UI)

Use when the user wants separate UIs per platform: Compose Multiplatform on Android, native SwiftUI on iOS. Shared code is still KMP — domain, data, database, DI — but there is no shared UI between Android and iOS.

  • Android — uses the existing composeApp module as-is.
  • iOS — native SwiftUI app, backed by a thin ios-runtime Kotlin module that exports shared logic (no Compose).

Architecture overview

shared (KMP):  starter/*  features/*  (data + domain + database — NO presentation/Compose)
      │                              │
      ▼                              ▼
composeApp (Android, Compose)    ios-runtime (KMP framework)  →  iosApp (SwiftUI)

The iOS binary must not contain any Compose UI code. Only domain/data/database modules are linked into the iOS framework.

1. Create the ios-runtime module

Add a new Gradle module ios-runtime (KMP, iOS targets only) and register it in settings.gradle.kts:

kotlin
include(":iosRuntime")

It should:

  • Target iosArm64() + iosSimulatorArm64() with a framework { baseName = "iosRuntime"; isStatic = true }.
  • Depend on the non-UI modules only: starter/core, features/core/domain, features/core/data, features/database, features/your-feature/domain, features/your-feature/data, starter/utils, etc. Do not include composeApp, starter/ui/*, or any *-presentation module.
  • Export those dependencies (api(...)) so their types surface in the generated Swift API.
Apply SKIE

Add the SKIE Gradle plugin to the ios-runtime module (the module that builds the Xcode framework). It enhances the Kotlin→Swift export (Flow interop, better enums/optionals/suspending functions).

kotlin
plugins {
    // ...
    id("co.touchlab.skie") version "0.10.14"
}

Disable SKIE analytics:

kotlin
skie {
    analytics {
        enabled.set(false)
    }
}

The plugin must be applied only in the module(s) that create the Xcode framework. It instruments everything exported in that framework (including dependency types). See SKIE installation and configuration.

2. Wire the Xcode build phase to iosRuntime

Update the "Run Script" / embedAndSignAppleFrameworkForXcode build phase in all iOS targets so the Swift app imports iosRuntime instead of ComposeApp:

cd "$SRCROOT/.."
./gradlew :iosRuntime:embedAndSignAppleFrameworkForXcode

Then in Swift:

swift
import iosRuntime

3. Bootstrap — start Koin once

Create a thin bootstrap object (like SharedRuntime) in ios-runtime (.../shared/SharedRuntime.kt). It starts Koin once and exposes repositories/logics to Swift.

Key rules for Swift-friendliness (learned from a real Starter project):

  • Start Koin once, guard with @Volatile so repeated calls are no-ops.
  • Kotlin default params are invisible to Swift — expose no-arg wrappers and CSV string factories instead of Kotlin List/Map constructors.
  • Prefer primitive/String/ByteArray return types over complex Kotlin generics where possible.
kotlin
@OptIn(ExperimentalStarterApi::class)
object SharedRuntime {
    @Volatile private var started = false

    fun start(config: KoinAppDeclaration? = null) {
        if (started) return
        startKoin {
            config?.invoke(this)
            modules(
                utilsModule,
                databaseModule,
                coreDataModule,
                coreDomainModule,
                yourFeatureDataModule,
                yourFeatureDomainModule,
            )
        }
        started = true
    }

    fun isDebug(): Boolean = platform.debug
    fun platform(): Platform.Ios = platform as Platform.Ios

    fun yourRepository(): YourRepository = KoinPlatform.getKoin().get()
    fun yourLogic(): YourLogic = KoinPlatform.getKoin().get()

    // Swift-friendly factory: CSV strings instead of Kotlin lists
    fun makeThing(name: String, tagsCsv: String, count: Int): Thing =
        Thing(name = name, tags = tagsCsv.split(',').map { it.trim() }.filter { it.isNotEmpty() })
}

In iosApp/iOSApp.swift, start Koin once at launch (in App.init() or the AppDelegate):

swift
import SwiftUI
import iosRuntime

@main
struct iOSApp: App {
    init() {
        SharedRuntime.shared.start(config: nil)
    }

    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}
Show full SKILL.md (207 more words)Show less

4. iOS screen structure — Screen + Root + ViewModel

Mirror the Compose Screen / Content split with native SwiftUI. Each feature folder holds:

FeatureX/
    HomeScreen.swift        # pure, previewable view
    HomeRootScreen.swift    # wires ViewModel + lifecycle + sheets/alerts
    HomeViewModel.swift     # @MainActor ObservableObject, MVI
HomeScreen — dumb, previewable

Pure SwiftUI, primitives + closures only, no ViewModel. Add #Preview so it previews in Xcode:

swift
import SwiftUI

struct HomeScreen: View {
    let greeting: String
    let items: [HomeItem]
    let isLoading: Bool
    let onStart: () -> Void
    let onOpen: (Int) -> Void

    var body: some View {
        List {
            Section {
                Button(action: onStart) { Label("New", systemImage: "plus") }
            }
            Section {
                if isLoading {
                    ProgressView()
                } else if items.isEmpty {
                    ContentUnavailableView("Nothing here", systemImage: "tray")
                } else {
                    ForEach(items) { item in
                        Button { onOpen(item.id) } label: { Text(item.title) }
                    }
                }
            }
        }
        .listStyle(.insetGrouped)
        .navigationTitle(greeting)
    }
}

#Preview("Home") {
    NavigationStack {
        HomeScreen(
            greeting: "Hello, Jamie",
            items: [HomeItem(id: 1, title: "First")],
            isLoading: false,
            onStart: {},
            onOpen: { _ in }
        )
    }
}
HomeViewModel — MVI (State / Actions / Events)

@MainActor final class ... : ObservableObject. Follow the Starter MVI semantics in Swift:

  • State — @Published private(set) properties (the screen's state).
  • Actions — methods the UI calls (openEditor, save, ...).
  • Events — one-shot UI signals (presented via sheets/alerts bindings, or a published event + ConsumedEvent pattern).
swift
import SwiftUI
import iosRuntime

@MainActor
final class HomeViewModel: ObservableObject {
    @Published private(set) var greeting: String = "Hello"
    @Published private(set) var items: [HomeItem] = []
    @Published private(set) var isLoading = true
    @Published var errorMessage: String?

    private var observeTask: Task<Void, Never>?

    func start() {
        refresh()
        observeTask?.cancel()
        observeTask = Task { await observe() }
    }

    func stop() {
        observeTask?.cancel()
        observeTask = nil
    }

    func open(_ id: Int) { /* action */ }

    private func refresh() {
        let runtime = SharedRuntime.shared
        greeting = runtime.greeting()
    }

    private func observe() async {
        let repo = SharedRuntime.shared.yourRepository()
        for await data in repo.observeItems() {   // SKIE turns Flow into AsyncSequence
            if Task.isCancelled { return }
            items = data.map { HomeItem(id: Int($0.id), title: $0.title) }
            isLoading = false
        }
    }
}
HomeRootScreen — wire it together

Owns the @StateObject ViewModel, calls start()/stop(), and presents sheets/alerts from ViewModel state:

swift
struct HomeRootScreen: View {
    @StateObject private var viewModel = HomeViewModel()

    var body: some View {
        HomeScreen(
            greeting: viewModel.greeting,
            items: viewModel.items,
            isLoading: viewModel.isLoading,
            onStart: { viewModel.open(0) },
            onOpen: { viewModel.open($0) }
        )
        .task { viewModel.start() }
        .onDisappear { viewModel.stop() }
        .alert("Error", isPresented: Binding(
            get: { viewModel.errorMessage != nil },
            set: { if !$0 { viewModel.errorMessage = nil } }
        )) {
            Button("OK", role: .cancel) { viewModel.errorMessage = nil }
        } message: {
            Text(viewModel.errorMessage ?? "")
        }
    }
}

Rules

  • No shared UI. Android = composeApp (Compose), iOS = native SwiftUI.
  • The iOS framework must export no Compose code — only data/domain/database modules.
  • Apply SKIE only in the framework-building module (ios-runtime); disable its analytics.
  • Start Koin exactly once in the iOS app entry point.
  • Every screen gets a previewable, dumb Screen view + a Root that wires the ViewModel.
  • Follow the Apple Human Interface Guidelines for SwiftUI views (native List, NavigationStack, .insetGrouped, ContentUnavailableView, SF Symbols, large titles).
  • Keep MVI: @Published state, action methods, one-shot events via bindings.
  • Bridge Swift-unfriendly Kotlin (default params, List/Map) with explicit wrappers in SharedRuntime.

Reference

© DevAtrii, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .agents/skills/kmp-starter/native-app of DevAtrii/Kmp-Starter-Template.

Open the folder on GitHubat commit a8f7b27

Compare with similar skills

Kmp Starter Native App next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Kmp Starter Native App compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Kmp Starter Native App this skillDevAtrii/Kmp-Starter-Template167—~2.5kAutomated safety check: PassMIT
Streamadrianhajdin/react-native-lingua150—~1.9kAutomated safety check: PassNone
Mobile App Builderrevfactory/harness-1001.3k—~1.8kAutomated safety check: PassApache-2.0
Update Swiftui APIsAvdLee/SwiftUI-Agent-Skill3.7k—~1.2kAutomated safety check: PassMIT
Expo Brownfield Integrationmweinbach/agent-coworker1562 repos~900Automated safety check: NotesCustom licence
SwiftUI Design SkillWholiver/swiftui-design-skill210—~2.8kAutomated safety check: PassMIT

Similar skills

  • Stream

    adrianhajdin/react-native-lingua

    Stream router for Chat, Video, Feeds, and Moderation. An agent skill from adrianhajdin/react-native-lingua.

    150 GitHub stars~1.9k tokensUpdated 4 mo ago
    MobileAuto-check passed
  • Mobile App Builder

    revfactory/harness-100

    Full mobile app development pipeline. An agent skill from revfactory/harness-100.

    1.3k GitHub stars~1.8k tokensUpdated 6 mo ago
    MobileAuto-check passed
  • Update Swiftui APIs

    AvdLee/SwiftUI-Agent-Skill

    Scan Apple's SwiftUI documentation for deprecated APIs and update the SwiftUI Expert Skill with modern replacements.

    3.7k GitHub stars~1.2k tokensUpdated yesterday
    MobileAuto-check passed
  • Expo Brownfield Integration

    mweinbach/agent-coworker

    Helps add Expo and React Native to an existing native iOS or Android app, and choose between a prebuilt AAR or XCFramework and a fully integrated build.

    156 GitHub starsUsed in 2 repos~900 tokens
    MobileAuto-check: notes
  • SwiftUI Design Skill

    Wholiver/swiftui-design-skill

    Guides the agent to design distinctive SwiftUI interfaces for iOS and macOS, with six anti-generic rules, a design direction workflow and a five-dimension review.

    210 GitHub stars~2.8k tokensUpdated 5 mo ago
    MobileAuto-check passed
  • Audit Xcode Security Settings

    superagents-lab/xcode27-skills

    Audit and enable security-oriented Xcode build settings. An agent skill from superagents-lab/xcode27-skills.

    337 GitHub stars~4.6k tokensUpdated 4 mo ago
    MobileAuto-check passed

More from DevAtrii/Kmp-Starter-Template

All 23 skills in this repo
  • Kmp Starter

    DevAtrii/Kmp-Starter-Template

    Build production Android & iOS apps on the KMP Starter Template (Clean Architecture, MVI, Koin, Compose Multiplatform).

    167 GitHub stars~3.3k tokensUpdated 1 mo ago
    Auto-check passed
  • Kmp Starter Memory

    DevAtrii/Kmp-Starter-Template

    Persistent per-project memory for KMP Starter Template apps.

    167 GitHub stars~963 tokensUpdated 1 mo ago
    Auto-check passed
  • Kmp Starter Architecture

    DevAtrii/Kmp-Starter-Template

    Clean Architecture module and package layout for KMP Starter Template features — data/domain/presentation layers, core dependency rule, screen-based package organization, the Screen vs Content…

    167 GitHub stars~1.6k tokensUpdated 1 mo ago
    Auto-check passed
  • Kmp Starter Create Fresh App

    DevAtrii/Kmp-Starter-Template

    Research and plan a brand-new app before scaffolding it on the KMP Starter Template.

    167 GitHub stars~1.4k tokensUpdated 1 mo ago
    Auto-check passed
  • Kmp Starter Data

    DevAtrii/Kmp-Starter-Template

    Data layer on the KMP Starter Template — repositories and data sources, Logics guidance, DataStore persistence, Room database, StarterFileManager, and the Calf file picker.

    167 GitHub stars~1.1k tokensUpdated 1 mo ago
    Auto-check passed
  • Kmp Starter Feature Analytics

    DevAtrii/Kmp-Starter-Template

    The KMP Starter Template analytics system — AppEvent/EventsTracker, Analytics routing, Mixpanel + Firebase providers, combining providers, and runtime swaps.

    167 GitHub stars~1.8k tokensUpdated 1 mo ago
    Auto-check passed

Categories

Questions about Kmp Starter Native App

What does Kmp Starter Native App do?

Build a KMP Starter app with NO shared UI — Compose on Android, native SwiftUI on iOS. Kmp Starter Native App is an agent skill from DevAtrii/Kmp-Starter-Template. Build a KMP Starter app with NO shared UI — Compose on Android, native SwiftUI on iOS.

When should I use Kmp Starter Native App?

Kmp Starter Native App fits situations like: tasks that involve iOS development.

How do I install Kmp Starter Native App in Claude Code?

Run `npx skills add DevAtrii/Kmp-Starter-Template --skill kmp-starter-native-app -a claude-code`. Or copy the skill folder (.agents/skills/kmp-starter/native-app in DevAtrii/Kmp-Starter-Template) into .claude/skills/kmp-starter-native-app in your project. Claude Code loads it when a task matches its description.

How do I install Kmp Starter Native App in Codex?

Run `npx skills add DevAtrii/Kmp-Starter-Template --skill kmp-starter-native-app -a codex`. Or copy the skill folder (.agents/skills/kmp-starter/native-app in DevAtrii/Kmp-Starter-Template) into .agents/skills/kmp-starter-native-app in your project. Codex loads it when a task matches its description.

Can I use Kmp Starter Native App in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add DevAtrii/Kmp-Starter-Template --skill kmp-starter-native-app -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/kmp-starter-native-app, .gemini/skills/kmp-starter-native-app, .github/skills/kmp-starter-native-app and .opencode/skills/kmp-starter-native-app in your project.

What does Kmp Starter Native App need to run?

SKILL.md names no scripts, command-line tools or credentials: Kmp Starter Native App is instructions for the agent only.

Does Kmp Starter Native App access the network?

SKILL.md names 2 domains. As links in the text: skie.touchlab.co and github.com. This is read from the text; nothing was executed.

Is Kmp Starter Native App safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Kmp Starter Native App use?

Kmp Starter Native App is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Kmp Starter Native App use?

About 2.5k tokens (SKILL.md is roughly 10k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Kmp Starter Native App?

Skills that share tags, products or a category with Kmp Starter Native App: Stream (adrianhajdin/react-native-lingua, 150 stars), Mobile App Builder (revfactory/harness-100, 1.3k stars), Update Swiftui APIs (AvdLee/SwiftUI-Agent-Skill, 3.7k stars) and Expo Brownfield Integration (mweinbach/agent-coworker, 156 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Kmp Starter Native App?

DevAtrii (a GitHub user) maintains it in DevAtrii/Kmp-Starter-Template, which has 167 GitHub stars. The repository holds 23 skills in this directory. The repository was last updated on September 1, 2026.

Source: DevAtrii/Kmp-Starter-Template on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.