# aapunain/kmp architecture

> Architecture diagram of the GitHub repository aapunain/kmp, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-25). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/aapunain/kmp
- Repository: https://github.com/aapunain/kmp

## Overview

This is a Kotlin Multiplatform sample app that displays items from a shared Compose UI, with a shared domain/data/network stack and a Ktor server exposing the same items endpoint. The principal flow is platform launch → shared app and items screen → domain use case and repository → remote data source → HTTP API, with results mapped for presentation. The README also documents Android, iOS, Web, Desktop, and Server targets. Several intermediate implementations are represented by their tree paths; their exact call wiring was not sampled, so uncertain edges are omitted.

Main entry points: [`core/network/src/commonMain/kotlin/com/self/kmp/network/items/datasource/ItemsRemoteDataSource.kt`](https://github.com/aapunain/kmp/blob/main/core/network/src/commonMain/kotlin/com/self/kmp/network/items/datasource/ItemsRemoteDataSource.kt) (Items remote source), [`presentation/src/commonMain/kotlin/com/self/kmp/presentation/items/ItemsViewModel.kt`](https://github.com/aapunain/kmp/blob/main/presentation/src/commonMain/kotlin/com/self/kmp/presentation/items/ItemsViewModel.kt) (Items view model), [`app/shared/src/commonMain/kotlin/com/self/kmp/App.kt`](https://github.com/aapunain/kmp/blob/main/app/shared/src/commonMain/kotlin/com/self/kmp/App.kt) (Shared app), [`server/src/main/kotlin/com/self/kmp/Application.kt`](https://github.com/aapunain/kmp/blob/main/server/src/main/kotlin/com/self/kmp/Application.kt) (Ktor server)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_hosts["Platform hosts"]
  node_android_host["Android host<br/>[MainActivity.kt]"]
  node_ios_host["iOS host"]
  node_desktop_host["Desktop host<br/>[main.kt]"]
  node_web_host["Web host<br/>[main.kt]"]
  node_shared_app["Shared app<br/>[App.kt]"]
end

subgraph group_ui["Presentation"]
  node_items_screen["Items screen<br/>[ItemsScreen.kt]"]
  node_items_viewmodel["Items view model<br/>[ItemsViewModel.kt]"]
  node_ui_state["UI state<br/>[ItemsUiState.kt]"]
  node_ui_intent["UI intents<br/>[ItemsIntent.kt]"]
  node_error_messages["Error messages"]
end

subgraph group_domain_data["Domain and data"]
  node_get_items["Get items<br/>[GetItemsUseCase.kt]"]
  node_repository_port["Items repository port<br/>[ItemsRepository.kt]"]
  node_repository_impl["Items repository"]
  node_item_mapper["Item mapper<br/>[ItemMapper.kt]"]
  node_error_mapper["API error mapper<br/>[ApiErrorMapper.kt]"]
end

subgraph group_network_contract["Network and contract"]
  node_remote_source["Items remote source"]
  node_http_client["HTTP client"]
  node_safe_call["Safe API calls<br/>[SafeApiCall.kt]"]
  node_api_routes["API routes<br/>[ApiRoutes.kt]"]
  node_items_dto["Items response DTO"]
end

subgraph group_backend["Server"]
  node_server_app["Ktor server<br/>[Application.kt]"]
  node_server_greetings["Root greeting<br/>[Greetings.kt]"]
end

node_user(("App user"))
node_api_service(("Items API"))

node_user -->|"launches"| node_android_host
node_user -->|"launches"| node_ios_host
node_user -->|"launches"| node_desktop_host
node_user -->|"launches"| node_web_host
node_android_host -->|"opens"| node_shared_app
node_ios_host -->|"opens"| node_shared_app
node_desktop_host -->|"opens"| node_shared_app
node_web_host -->|"opens"| node_shared_app
node_shared_app -->|"renders"| node_items_screen
node_items_screen -->|"uses"| node_items_viewmodel
node_items_viewmodel -->|"updates"| node_ui_state
node_items_viewmodel -->|"handles"| node_ui_intent
node_items_viewmodel -->|"formats errors"| node_error_messages
node_items_viewmodel -->|"requests items"| node_get_items
node_get_items -->|"requests items"| node_repository_port
node_repository_impl -->|"fetches items"| node_remote_source
node_repository_impl -->|"maps records"| node_item_mapper
node_repository_impl -->|"maps errors"| node_error_mapper
node_remote_source -->|"uses client"| node_http_client
node_remote_source -->|"wraps requests"| node_safe_call
node_remote_source -->|"builds request"| node_api_routes
node_remote_source -->|"decodes response"| node_items_dto
node_api_service -->|"serves request"| node_remote_source
node_server_app -->|"registers route"| node_api_routes
node_server_app -->|"responds with"| node_items_dto
node_server_app -->|"uses greeting"| node_server_greetings
node_api_service -->|"handles request"| node_server_app

click node_android_host "https://github.com/aapunain/kmp/blob/main/app/androidApp/src/main/kotlin/com/self/kmp/MainActivity.kt"
click node_ios_host "https://github.com/aapunain/kmp/blob/main/app/shared/src/iosMain/kotlin/com/self/kmp/MainViewController.kt"
click node_desktop_host "https://github.com/aapunain/kmp/blob/main/app/desktopApp/src/main/kotlin/com/self/kmp/main.kt"
click node_web_host "https://github.com/aapunain/kmp/blob/main/app/webApp/src/webMain/kotlin/com/self/kmp/main.kt"
click node_shared_app "https://github.com/aapunain/kmp/blob/main/app/shared/src/commonMain/kotlin/com/self/kmp/App.kt"
click node_items_screen "https://github.com/aapunain/kmp/blob/main/presentation/src/commonMain/kotlin/com/self/kmp/presentation/items/ItemsScreen.kt"
click node_items_viewmodel "https://github.com/aapunain/kmp/blob/main/presentation/src/commonMain/kotlin/com/self/kmp/presentation/items/ItemsViewModel.kt"
click node_ui_state "https://github.com/aapunain/kmp/blob/main/presentation/src/commonMain/kotlin/com/self/kmp/presentation/items/ItemsUiState.kt"
click node_ui_intent "https://github.com/aapunain/kmp/blob/main/presentation/src/commonMain/kotlin/com/self/kmp/presentation/items/ItemsIntent.kt"
click node_error_messages "https://github.com/aapunain/kmp/blob/main/presentation/src/commonMain/kotlin/com/self/kmp/presentation/items/AppErrorMessages.kt"
click node_get_items "https://github.com/aapunain/kmp/blob/main/core/domain/src/commonMain/kotlin/com/self/kmp/domain/items/usecase/GetItemsUseCase.kt"
click node_repository_port "https://github.com/aapunain/kmp/blob/main/core/domain/src/commonMain/kotlin/com/self/kmp/domain/items/repository/ItemsRepository.kt"
click node_repository_impl "https://github.com/aapunain/kmp/blob/main/core/data/src/commonMain/kotlin/com/self/kmp/data/items/repository/ItemsRepositoryImpl.kt"
click node_item_mapper "https://github.com/aapunain/kmp/blob/main/core/data/src/commonMain/kotlin/com/self/kmp/data/items/mapper/ItemMapper.kt"
click node_error_mapper "https://github.com/aapunain/kmp/blob/main/core/data/src/commonMain/kotlin/com/self/kmp/data/common/ApiErrorMapper.kt"
click node_remote_source "https://github.com/aapunain/kmp/blob/main/core/network/src/commonMain/kotlin/com/self/kmp/network/items/datasource/ItemsRemoteDataSource.kt"
click node_http_client "https://github.com/aapunain/kmp/blob/main/core/network/src/commonMain/kotlin/com/self/kmp/network/core/HttpClientFactory.kt"
click node_safe_call "https://github.com/aapunain/kmp/blob/main/core/network/src/commonMain/kotlin/com/self/kmp/network/core/SafeApiCall.kt"
click node_api_routes "https://github.com/aapunain/kmp/blob/main/contract/src/commonMain/kotlin/com/self/kmp/contract/ApiRoutes.kt"
click node_items_dto "https://github.com/aapunain/kmp/blob/main/contract/src/commonMain/kotlin/com/self/kmp/contract/items/ItemsResponseDto.kt"
click node_server_app "https://github.com/aapunain/kmp/blob/main/server/src/main/kotlin/com/self/kmp/Application.kt"
click node_server_greetings "https://github.com/aapunain/kmp/blob/main/server/src/main/kotlin/com/self/kmp/Greetings.kt"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_android_host,node_ios_host,node_desktop_host,node_web_host,node_shared_app,node_user toneBlue
class node_items_screen,node_items_viewmodel,node_ui_state,node_ui_intent,node_error_messages toneAmber
class node_get_items,node_repository_port,node_repository_impl,node_item_mapper,node_error_mapper,node_api_service toneMint
class node_remote_source,node_http_client,node_safe_call,node_api_routes,node_items_dto toneRose
class node_server_app,node_server_greetings toneIndigo
```

## Components

### Platform hosts

- [Android host](https://github.com/aapunain/kmp/blob/main/app/androidApp/src/main/kotlin/com/self/kmp/MainActivity.kt): `app/androidApp/src/main/kotlin/com/self/kmp/MainActivity.kt`
- [iOS host](https://github.com/aapunain/kmp/blob/main/app/shared/src/iosMain/kotlin/com/self/kmp/MainViewController.kt): `app/shared/src/iosMain/kotlin/com/self/kmp/MainViewController.kt`
- [Desktop host](https://github.com/aapunain/kmp/blob/main/app/desktopApp/src/main/kotlin/com/self/kmp/main.kt): `app/desktopApp/src/main/kotlin/com/self/kmp/main.kt`
- [Web host](https://github.com/aapunain/kmp/blob/main/app/webApp/src/webMain/kotlin/com/self/kmp/main.kt): `app/webApp/src/webMain/kotlin/com/self/kmp/main.kt`
- [Shared app](https://github.com/aapunain/kmp/blob/main/app/shared/src/commonMain/kotlin/com/self/kmp/App.kt): `app/shared/src/commonMain/kotlin/com/self/kmp/App.kt`

### Presentation

- [Items screen](https://github.com/aapunain/kmp/blob/main/presentation/src/commonMain/kotlin/com/self/kmp/presentation/items/ItemsScreen.kt): `presentation/src/commonMain/kotlin/com/self/kmp/presentation/items/ItemsScreen.kt`
- [Items view model](https://github.com/aapunain/kmp/blob/main/presentation/src/commonMain/kotlin/com/self/kmp/presentation/items/ItemsViewModel.kt): `presentation/src/commonMain/kotlin/com/self/kmp/presentation/items/ItemsViewModel.kt`
- [UI state](https://github.com/aapunain/kmp/blob/main/presentation/src/commonMain/kotlin/com/self/kmp/presentation/items/ItemsUiState.kt): `presentation/src/commonMain/kotlin/com/self/kmp/presentation/items/ItemsUiState.kt`
- [UI intents](https://github.com/aapunain/kmp/blob/main/presentation/src/commonMain/kotlin/com/self/kmp/presentation/items/ItemsIntent.kt): `presentation/src/commonMain/kotlin/com/self/kmp/presentation/items/ItemsIntent.kt`
- [Error messages](https://github.com/aapunain/kmp/blob/main/presentation/src/commonMain/kotlin/com/self/kmp/presentation/items/AppErrorMessages.kt): `presentation/src/commonMain/kotlin/com/self/kmp/presentation/items/AppErrorMessages.kt`

### Domain and data

- [Get items](https://github.com/aapunain/kmp/blob/main/core/domain/src/commonMain/kotlin/com/self/kmp/domain/items/usecase/GetItemsUseCase.kt): `core/domain/src/commonMain/kotlin/com/self/kmp/domain/items/usecase/GetItemsUseCase.kt`
- [Items repository port](https://github.com/aapunain/kmp/blob/main/core/domain/src/commonMain/kotlin/com/self/kmp/domain/items/repository/ItemsRepository.kt): `core/domain/src/commonMain/kotlin/com/self/kmp/domain/items/repository/ItemsRepository.kt`
- [Items repository](https://github.com/aapunain/kmp/blob/main/core/data/src/commonMain/kotlin/com/self/kmp/data/items/repository/ItemsRepositoryImpl.kt): `core/data/src/commonMain/kotlin/com/self/kmp/data/items/repository/ItemsRepositoryImpl.kt`
- [Item mapper](https://github.com/aapunain/kmp/blob/main/core/data/src/commonMain/kotlin/com/self/kmp/data/items/mapper/ItemMapper.kt): `core/data/src/commonMain/kotlin/com/self/kmp/data/items/mapper/ItemMapper.kt`
- [API error mapper](https://github.com/aapunain/kmp/blob/main/core/data/src/commonMain/kotlin/com/self/kmp/data/common/ApiErrorMapper.kt): `core/data/src/commonMain/kotlin/com/self/kmp/data/common/ApiErrorMapper.kt`

### Network and contract

- [Items remote source](https://github.com/aapunain/kmp/blob/main/core/network/src/commonMain/kotlin/com/self/kmp/network/items/datasource/ItemsRemoteDataSource.kt): `core/network/src/commonMain/kotlin/com/self/kmp/network/items/datasource/ItemsRemoteDataSource.kt`
- [HTTP client](https://github.com/aapunain/kmp/blob/main/core/network/src/commonMain/kotlin/com/self/kmp/network/core/HttpClientFactory.kt): `core/network/src/commonMain/kotlin/com/self/kmp/network/core/HttpClientFactory.kt`
- [Safe API calls](https://github.com/aapunain/kmp/blob/main/core/network/src/commonMain/kotlin/com/self/kmp/network/core/SafeApiCall.kt): `core/network/src/commonMain/kotlin/com/self/kmp/network/core/SafeApiCall.kt`
- [API routes](https://github.com/aapunain/kmp/blob/main/contract/src/commonMain/kotlin/com/self/kmp/contract/ApiRoutes.kt): `contract/src/commonMain/kotlin/com/self/kmp/contract/ApiRoutes.kt`
- [Items response DTO](https://github.com/aapunain/kmp/blob/main/contract/src/commonMain/kotlin/com/self/kmp/contract/items/ItemsResponseDto.kt): `contract/src/commonMain/kotlin/com/self/kmp/contract/items/ItemsResponseDto.kt`

### Server

- [Ktor server](https://github.com/aapunain/kmp/blob/main/server/src/main/kotlin/com/self/kmp/Application.kt): `server/src/main/kotlin/com/self/kmp/Application.kt`
- [Root greeting](https://github.com/aapunain/kmp/blob/main/server/src/main/kotlin/com/self/kmp/Greetings.kt): `server/src/main/kotlin/com/self/kmp/Greetings.kt`

### Other components

- **App user**
- **Items API**

## Connections

- App user → Android host: launches
- App user → iOS host: launches
- App user → Desktop host: launches
- App user → Web host: launches
- Android host → Shared app: opens
- iOS host → Shared app: opens
- Desktop host → Shared app: opens
- Web host → Shared app: opens
- Shared app → Items screen: renders
- Items screen → Items view model: uses
- Items view model → UI state: updates
- Items view model → UI intents: handles
- Items view model → Error messages: formats errors
- Items view model → Get items: requests items
- Get items → Items repository port: requests items
- Items repository → Items remote source: fetches items
- Items repository → Item mapper: maps records
- Items repository → API error mapper: maps errors
- Items remote source → HTTP client: uses client
- Items remote source → Safe API calls: wraps requests
- Items remote source → API routes: builds request
- Items remote source → Items response DTO: decodes response
- Items API → Items remote source: serves request
- Ktor server → API routes: registers route
- Ktor server → Items response DTO: responds with
- Ktor server → Root greeting: uses greeting
- Items API → Ktor server: handles request
