libs.versions.toml
[versions]
# Toolchain
kotlin = "2.0.20"
agp = "8.5.2"
compose-multiplatform = "1.7.0"
coroutines = "1.8.1"
koin = "4.0.0"
# Android target (keep aligned with the existing Stave Android module)
android-compileSdk = "34"
android-minSdk = "24"
android-targetSdk = "34"
androidx-activity-compose = "1.9.2"
# KMP-compatible lifecycle ViewModel (works on Android + Desktop JVM + iOS)
androidx-lifecycle = "2.8.3"
# UPnP — jUPnP is what the upstream Stave Android app already uses.
jupnp = "3.0.5"
# Desktop-only: libvlc bindings (system libvlc must be installed: `sudo apt install vlc`)
vlcj = "4.8.3"
# Desktop-only: Chromecast support. The Android side uses Google Play Services'
# CastFramework, which has no JVM/desktop port. We use sfuhrm's fork of
# chromecast-java-api-v2 — the original (su.litvak.chromecast:api-v2) was last
# released in 2019 and is dormant; sfuhrm's fork actively maintains the same
# protocol implementation with updated jackson/slf4j/protobuf deps. Package
# names inside the JAR are unchanged (still `su.litvak.chromecast.api.v2.*`);
# only the Maven coordinates differ.
chromecast-api = "0.12.20"
# Coil 3 — Kotlin Multiplatform image loading for Compose (desktop + android).
coil = "3.0.4"
# sh.calvin.reorderable — drag-to-reorder for LazyColumn in Compose Multiplatform.
# 2.4.x is the right branch for our Kotlin 2.0.20 + Compose 1.7.0 pinning.
reorderable = "2.4.3"
# javax.servlet API — required at runtime by jUPnP's embedded Jetty 9.x stream server
# (Jetty marks javax.servlet-api as provided-scope; the app supplies it).
javax-servlet = "4.0.1"
# Jetty 9.4.x — jUPnP 3.0.x uses Jetty 9.x as its default stream server transport,
# also marked provided-scope. We need jetty-server, jetty-servlet, jetty-client.
# Stay on 9.4.x (newest security release); 10.x switches to jakarta.servlet namespace which jUPnP doesn't target.
jetty = "9.4.58.v20250814"
# SLF4J 2.0.x binding — jUPnP 3.0.x brings slf4j-api 2.x in transitively, so the
# binding has to match that line; 1.7.x bindings are flat-out ignored at runtime
# ("Class path contains SLF4J bindings targeting slf4j-api versions 1.7.x or earlier").
# Without a matching binding loaded, errors during stream-server startup are
# silently swallowed; slf4j-simple writes everything to stderr.
slf4j = "2.0.17"
# Serialization, networking
kotlinx-serialization = "1.7.1"
okhttp = "4.12.0"
# Testing
kotest = "5.9.1"
# dbus-java — MPRIS2 Linux media integration (media-indicator popup + keyboard media keys)
dbus-java = "5.1.1"
[libraries]
# Coroutines
kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "coroutines" }
kotlinx-coroutines-swing = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-swing", version.ref = "coroutines" }
kotlinx-coroutines-android = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-android", version.ref = "coroutines" }
kotlinx-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "kotlinx-serialization" }
# Lifecycle — the KMP artifact works on commonMain and supplies ViewModel + viewModelScope.
androidx-lifecycle-viewmodel = { module = "org.jetbrains.androidx.lifecycle:lifecycle-viewmodel", version.ref = "androidx-lifecycle" }
androidx-lifecycle-viewmodel-compose = { module = "org.jetbrains.androidx.lifecycle:lifecycle-viewmodel-compose", version.ref = "androidx-lifecycle" }
# Koin — works on both Android and Desktop
koin-core = { module = "io.insert-koin:koin-core", version.ref = "koin" }
koin-compose = { module = "io.insert-koin:koin-compose", version.ref = "koin" }
koin-compose-viewmodel = { module = "io.insert-koin:koin-compose-viewmodel", version.ref = "koin" }
koin-android = { module = "io.insert-koin:koin-android", version.ref = "koin" }
# UPnP — jUPnP.
jupnp-core = { module = "org.jupnp:org.jupnp", version.ref = "jupnp" }
jupnp-support = { module = "org.jupnp:org.jupnp.support", version.ref = "jupnp" }
# Networking
okhttp = { module = "com.squareup.okhttp3:okhttp", version.ref = "okhttp" }
# Android Compose glue
androidx-activity-compose = { module = "androidx.activity:activity-compose", version.ref = "androidx-activity-compose" }
# Desktop: VLCJ
vlcj = { module = "uk.co.caprica:vlcj", version.ref = "vlcj" }
chromecast-api = { module = "de.sfuhrm:chromecast-java-api-v2", version.ref = "chromecast-api" }
# Coil 3 (KMP) — image loader with AsyncImage composable, and the OkHttp-backed network fetcher.
coil-compose = { module = "io.coil-kt.coil3:coil-compose", version.ref = "coil" }
coil-network-okhttp = { module = "io.coil-kt.coil3:coil-network-okhttp", version.ref = "coil" }
# Drag-to-reorder for Compose LazyColumn / LazyRow / grids.
reorderable = { module = "sh.calvin.reorderable:reorderable", version.ref = "reorderable" }
# Desktop: javax.servlet API for jUPnP's embedded Jetty
javax-servlet-api = { module = "javax.servlet:javax.servlet-api", version.ref = "javax-servlet" }
# Desktop: Jetty 9.4.x — provided deps of jUPnP, supplied by us.
jetty-server = { module = "org.eclipse.jetty:jetty-server", version.ref = "jetty" }
jetty-servlet = { module = "org.eclipse.jetty:jetty-servlet", version.ref = "jetty" }
jetty-client = { module = "org.eclipse.jetty:jetty-client", version.ref = "jetty" }
# Desktop: SLF4J 2.0 simple binding so jUPnP/Jetty log to stderr instead of being silent.
slf4j-simple = { module = "org.slf4j:slf4j-simple", version.ref = "slf4j" }
# Testing
kotest-assertions = { module = "io.kotest:kotest-assertions-core", version.ref = "kotest" }
# dbus-java (desktop-only) — MPRIS2 registration + multimedia-key support on Linux.
dbus-java-core = { module = "com.github.hypfvieh:dbus-java-core", version.ref = "dbus-java" }
dbus-java-transport-native-unixsocket = { module = "com.github.hypfvieh:dbus-java-transport-native-unixsocket", version.ref = "dbus-java" }
[plugins]
kotlin-multiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" }
kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" }
compose-multiplatform = { id = "org.jetbrains.compose", version.ref = "compose-multiplatform" }
compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" }
android-application = { id = "com.android.application", version.ref = "agp" }
android-library = { id = "com.android.library", version.ref = "agp" }