
This project is named after the Kaluga, the world's biggest freshwater fish, which is found in the icy Amur river.
Kaluga's main goal is to provide access to common features used in cross-platform mobile app development, separated into modules such as architecture (MVVM), location, permissions, bluetooth etc.
To reach this goal it uses Kotlin, specifically Kotlin Multiplatform which allows running Kotlin code not just on JVM+Android, but also iOS/iPadOS, amongst others (inndeed some kaluga modules also work for Kotlin.js and/or JVM standalone).
Where appropriate coroutines and Flow are used in the API. This enables developers to use cold streams for a modern and efficient design.
While Kaluga modules can be used individually, together they form a comprehensive approach to cross-platform development with shared native code and native UIs, including SwiftUI and Compose.
Short examples
With Kaluga it is possible to create cross-platform functionality in a few lines of code, that would normally take many lines of code even on just one platform.
Below are some examples, using a commonMain source-set:
Scanning for nearby devices with Bluetooth LE:
BluetoothBuilder().create().devices().collect {
i("discovered device: $it")
}
Showing a spinner while doing some work:
suspend fun doWork(hudBuilder: HUD.Builder) {
hudBuilder.presentDuring {
delay(1000)
}
}
in this case, since HUD is a UI component the builder needs to be configured on the platform side:
val builder = HUD.Builder()
builder.subscribe(activity)
builder.unsubscribe(activity)
However Kaluga's architecture module offers a cross-platform LifecycleViewModel class (which extends androidx.lifecycle.ViewModel on Android) that will automatically bind the builder to its lifecycle:
class HudViewModel(private val hudBuilder: HUD.Builder): BaseLifecycleViewModel(hudBuilder) {
suspend fun doWork() =
hudBuilder.presentDuring {
delay(1000)
}
}
More examples
Kaluga contains an example project that is used to test the developed modules.
Using Kaluga
NOTE: Older versions of Kotlin may cause a Thread Deadlock when running some modules on iOS. For this reason, it is recommended to target Kotlin 2.2.21 or higher
For starting a new project based on Kaluga see the kaluga-starter repo, which shows how to do this step by step.
Kaluga is available on Maven Central. For example the Kaluga Alerts can be imported like this:
repositories {
mavenCentral()
}
dependencies {
implementation("com.splendo.kaluga:alerts:$kalugaVersion")
}
You can also use the SNAPSHOT version based on the latest in the develop branch:
repositories {
maven("https://s01.oss.sonatype.org/content/repositories/snapshots/")
}
dependencies {
implementation("com.splendo.kaluga:alerts:$kalugaDevelopVersion-SNAPSHOT")
}
To use kaluga with SwiftUI and/or Combine we have a repo with Sourcery templates to generate some Swift code to help get you started.
Available Modules
Friends of kaluga
Of course not every possible functionality is provided by kaluga. However, this is often because other good multiplatform libraries that work nicely with kaluga already exist. These use similar patterns such as coroutines and Flow, and include the following:
Kaluga also uses some multiplatform libraries itself, so our thanks to:
| Project | Usage |
|---|
| Napier | powers the logging module |
| Koin | dependency injection |
Developing Kaluga
see DEVELOP.