[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" }