A Kotlin Multiplatform crypto market app built with Compose Multiplatform. Browse coins, track favourites, view details and charts, and search—all with a single shared codebase for Android, iOS, and Desktop.
Learning project – Built for learning KMP and Compose Multiplatform; not intended for production use.
- Market – List of crypto coins with price and 24h change; sort by popular, newest, gainers, losers, or market cap
- Favourites – Save coins to a list; favourites stay in sync when you add/remove from other screens (reactive list)
- Coin details – Price, stats, and historical price chart with period selector (24h, 7d, 30d, 90d)
- Search – Find coins by name or symbol with live results
- Offline cache – Coins cached locally (Room) for faster load and basic offline use
| Layer | Technologies |
|---|---|
| UI | Compose Multiplatform, Material 3 |
| Navigation | Jetpack Navigation Compose |
| DI | Koin |
| Networking | Ktor (OkHttp on Android/Desktop, Darwin on iOS) |
| Local DB | Room (SQLite) |
| Images | Coil 3 |
| Async | Kotlin Coroutines, Flow |
CryptoMarket/
├── composeApp/ # Shared KMP app
│ ├── src/
│ │ ├── commonMain/ # Shared code (UI, domain, data)
│ │ │ ├── kotlin/.../ # App package
│ │ │ │ ├── data/ # Repos, data sources, DB, mappers
│ │ │ │ ├── di/ # Koin modules
│ │ │ │ ├── domain/ # Use cases
│ │ │ │ ├── model/ # Domain models
│ │ │ │ ├── navigation/ # Nav routes & scaffold
│ │ │ │ └── ui/ # Screens, theme, components
│ │ │ └── composeResources/ # Drawables, strings
│ │ ├── androidMain/ # Android-specific (Application, DB driver, etc.)
│ │ ├── iosMain/ # iOS-specific
│ │ └── desktopMain/ # Desktop JVM entry
│ └── build.gradle.kts
├── iosApp/ # iOS app (Xcode project, embeds Compose framework)
├── build.gradle.kts
├── settings.gradle.kts
└── gradle/
└── libs.versions.toml
- JDK 11+
- Android Studio (or IDE with Android SDK) for Android
- Xcode (macOS) for iOS
- Kotlin 2.1.x
./gradlew :composeApp:installDebugOr open the project in Android Studio and run the composeApp Android configuration.
- Open
iosApp/iosApp.xcodeprojin Xcode. - Select a simulator or device and run (⌘R).
From terminal (macOS):
./gradlew :composeApp:linkDebugFrameworkIosSimulatorArm64
# Then build & run from Xcode./gradlew :composeApp:runMarket and coin data is provided by Coinranking API. The API key is not stored in the repo. Configure it per platform:
| Platform | How to set the key |
|---|---|
| Android | Copy local.properties.example to local.properties and set COINRANKING_API_KEY=your_key (local.properties is gitignored) |
| iOS | Set environment variable COINRANKING_API_KEY in your Xcode scheme (Edit Scheme → Run → Arguments → Environment Variables) |
| Desktop | Set env var before running: export COINRANKING_API_KEY=your_key (or add to your shell profile) |
Get a free API key at Coinranking developers.
If you previously committed an API key: revoke/regenerate that key in the Coinranking dashboard so the old value can no longer be used.
Watch the app in action on both platforms:
| Platform | Video |
|---|---|
| Android | Watch Android demo |
| iOS | Watch iOS demo |