libs.versions.toml
Each line, with the release that last changed it.
| 0.5.0 | 1 | [versions] |
| 2 | # Toolchain | |
| 3 | kotlin = "2.0.20" | |
| 4 | agp = "8.5.2" | |
| 5 | compose-multiplatform = "1.7.0" | |
| 6 | coroutines = "1.8.1" | |
| 7 | koin = "4.0.0" | |
| 8 | ||
| 9 | # Android target (keep aligned with the existing Stave Android module) | |
| 10 | android-compileSdk = "34" | |
| 11 | android-minSdk = "24" | |
| 12 | android-targetSdk = "34" | |
| 13 | androidx-activity-compose = "1.9.2" | |
| 14 | ||
| 15 | # KMP-compatible lifecycle ViewModel (works on Android + Desktop JVM + iOS) | |
| 16 | androidx-lifecycle = "2.8.3" | |
| 17 | ||
| 18 | # UPnP — jUPnP is what the upstream Stave Android app already uses. | |
| 19 | jupnp = "3.0.5" | |
| 20 | ||
| 21 | # Desktop-only: libvlc bindings (system libvlc must be installed: `sudo apt install vlc`) | |
| 22 | vlcj = "4.8.3" | |
| 23 | ||
| 24 | # Desktop-only: Chromecast support. The Android side uses Google Play Services' | |
| 25 | # CastFramework, which has no JVM/desktop port. We use sfuhrm's fork of | |
| 26 | # chromecast-java-api-v2 — the original (su.litvak.chromecast:api-v2) was last | |
| 27 | # released in 2019 and is dormant; sfuhrm's fork actively maintains the same | |
| 28 | # protocol implementation with updated jackson/slf4j/protobuf deps. Package | |
| 29 | # names inside the JAR are unchanged (still `su.litvak.chromecast.api.v2.*`); | |
| 30 | # only the Maven coordinates differ. | |
| 31 | chromecast-api = "0.12.20" | |
| 32 | ||
| 33 | # Coil 3 — Kotlin Multiplatform image loading for Compose (desktop + android). | |
| 34 | coil = "3.0.4" | |
| 35 | ||
| 36 | # sh.calvin.reorderable — drag-to-reorder for LazyColumn in Compose Multiplatform. | |
| 37 | # 2.4.x is the right branch for our Kotlin 2.0.20 + Compose 1.7.0 pinning. | |
| 38 | reorderable = "2.4.3" | |
| 39 | ||
| 40 | # javax.servlet API — required at runtime by jUPnP's embedded Jetty 9.x stream server | |
| 41 | # (Jetty marks javax.servlet-api as provided-scope; the app supplies it). | |
| 42 | javax-servlet = "4.0.1" | |
| 43 | ||
| 44 | # Jetty 9.4.x — jUPnP 3.0.x uses Jetty 9.x as its default stream server transport, | |
| 45 | # also marked provided-scope. We need jetty-server, jetty-servlet, jetty-client. | |
| 46 | # Stay on 9.4.x (newest security release); 10.x switches to jakarta.servlet namespace which jUPnP doesn't target. | |
| 47 | jetty = "9.4.58.v20250814" | |
| 48 | ||
| 49 | # SLF4J 2.0.x binding — jUPnP 3.0.x brings slf4j-api 2.x in transitively, so the | |
| 50 | # binding has to match that line; 1.7.x bindings are flat-out ignored at runtime | |
| 51 | # ("Class path contains SLF4J bindings targeting slf4j-api versions 1.7.x or earlier"). | |
| 52 | # Without a matching binding loaded, errors during stream-server startup are | |
| 53 | # silently swallowed; slf4j-simple writes everything to stderr. | |
| 54 | slf4j = "2.0.17" | |
| 55 | ||
| 56 | # Serialization, networking | |
| 57 | kotlinx-serialization = "1.7.1" | |
| 58 | okhttp = "4.12.0" | |
| 59 | ||
| 60 | # Testing | |
| 61 | kotest = "5.9.1" | |
| 62 | ||
| 63 | # dbus-java — MPRIS2 Linux media integration (media-indicator popup + keyboard media keys) | |
| 64 | dbus-java = "5.1.1" | |
| 65 | ||
| 66 | [libraries] | |
| 67 | # Coroutines | |
| 68 | kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "coroutines" } | |
| 69 | kotlinx-coroutines-swing = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-swing", version.ref = "coroutines" } | |
| 70 | kotlinx-coroutines-android = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-android", version.ref = "coroutines" } | |
| 71 | kotlinx-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "kotlinx-serialization" } | |
| 72 | ||
| 73 | # Lifecycle — the KMP artifact works on commonMain and supplies ViewModel + viewModelScope. | |
| 74 | androidx-lifecycle-viewmodel = { module = "org.jetbrains.androidx.lifecycle:lifecycle-viewmodel", version.ref = "androidx-lifecycle" } | |
| 75 | androidx-lifecycle-viewmodel-compose = { module = "org.jetbrains.androidx.lifecycle:lifecycle-viewmodel-compose", version.ref = "androidx-lifecycle" } | |
| 76 | ||
| 77 | # Koin — works on both Android and Desktop | |
| 78 | koin-core = { module = "io.insert-koin:koin-core", version.ref = "koin" } | |
| 79 | koin-compose = { module = "io.insert-koin:koin-compose", version.ref = "koin" } | |
| 80 | koin-compose-viewmodel = { module = "io.insert-koin:koin-compose-viewmodel", version.ref = "koin" } | |
| 81 | koin-android = { module = "io.insert-koin:koin-android", version.ref = "koin" } | |
| 82 | ||
| 83 | # UPnP — jUPnP. | |
| 84 | jupnp-core = { module = "org.jupnp:org.jupnp", version.ref = "jupnp" } | |
| 85 | jupnp-support = { module = "org.jupnp:org.jupnp.support", version.ref = "jupnp" } | |
| 86 | ||
| 87 | # Networking | |
| 88 | okhttp = { module = "com.squareup.okhttp3:okhttp", version.ref = "okhttp" } | |
| 89 | ||
| 90 | # Android Compose glue | |
| 91 | androidx-activity-compose = { module = "androidx.activity:activity-compose", version.ref = "androidx-activity-compose" } | |
| 92 | ||
| 93 | # Desktop: VLCJ | |
| 94 | vlcj = { module = "uk.co.caprica:vlcj", version.ref = "vlcj" } | |
| 95 | chromecast-api = { module = "de.sfuhrm:chromecast-java-api-v2", version.ref = "chromecast-api" } | |
| 96 | ||
| 97 | # Coil 3 (KMP) — image loader with AsyncImage composable, and the OkHttp-backed network fetcher. | |
| 98 | coil-compose = { module = "io.coil-kt.coil3:coil-compose", version.ref = "coil" } | |
| 99 | coil-network-okhttp = { module = "io.coil-kt.coil3:coil-network-okhttp", version.ref = "coil" } | |
| 100 | ||
| 101 | # Drag-to-reorder for Compose LazyColumn / LazyRow / grids. | |
| 102 | reorderable = { module = "sh.calvin.reorderable:reorderable", version.ref = "reorderable" } | |
| 103 | ||
| 104 | # Desktop: javax.servlet API for jUPnP's embedded Jetty | |
| 105 | javax-servlet-api = { module = "javax.servlet:javax.servlet-api", version.ref = "javax-servlet" } | |
| 106 | ||
| 107 | # Desktop: Jetty 9.4.x — provided deps of jUPnP, supplied by us. | |
| 108 | jetty-server = { module = "org.eclipse.jetty:jetty-server", version.ref = "jetty" } | |
| 109 | jetty-servlet = { module = "org.eclipse.jetty:jetty-servlet", version.ref = "jetty" } | |
| 110 | jetty-client = { module = "org.eclipse.jetty:jetty-client", version.ref = "jetty" } | |
| 111 | ||
| 112 | # Desktop: SLF4J 2.0 simple binding so jUPnP/Jetty log to stderr instead of being silent. | |
| 113 | slf4j-simple = { module = "org.slf4j:slf4j-simple", version.ref = "slf4j" } | |
| 114 | ||
| 115 | # Testing | |
| 116 | kotest-assertions = { module = "io.kotest:kotest-assertions-core", version.ref = "kotest" } | |
| 117 | ||
| 118 | # dbus-java (desktop-only) — MPRIS2 registration + multimedia-key support on Linux. | |
| 119 | dbus-java-core = { module = "com.github.hypfvieh:dbus-java-core", version.ref = "dbus-java" } | |
| 120 | dbus-java-transport-native-unixsocket = { module = "com.github.hypfvieh:dbus-java-transport-native-unixsocket", version.ref = "dbus-java" } | |
| 121 | ||
| 122 | [plugins] | |
| 123 | kotlin-multiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" } | |
| 124 | kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } | |
| 125 | kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } | |
| 126 | compose-multiplatform = { id = "org.jetbrains.compose", version.ref = "compose-multiplatform" } | |
| 127 | compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } | |
| 128 | android-application = { id = "com.android.application", version.ref = "agp" } | |
| 129 | android-library = { id = "com.android.library", version.ref = "agp" } |


