[versions] agp = "8.11.2" android-compileSdk = "36" android-minSdk = "24" android-targetSdk = "36" androidx-activity = "1.13.0" androidx-appcompat = "1.7.1" androidx-core = "1.18.0" androidx-espresso = "3.7.0" androidx-lifecycle = "2.10.0" androidx-security-crypto = "1.1.0" androidx-testExt = "1.3.0" appauth = "0.11.1" # AppAuth-iOS version is pinned in iosApp.xcodeproj's Package.resolved (SwiftPM) # since 2026-04-28 — see .planning/phases/02-authentication-foundation/DECISION-drop-cocoapods.md. composeHotReload = "1.0.0" composeMultiplatform = "1.10.3" exposed = "0.55.0" flyway = "12.4.0" hikari = "6.2.1" junit = "4.13.2" kermit = "2.1.0" koin = "4.2.1" kotlin = "2.3.20" kotlinx-coroutines = "1.10.2" kotlinx-serialization = "1.7.3" ktor = "3.4.1" logback = "1.5.32" material3 = "1.10.0-alpha05" multiplatformSettings = "1.3.0" postgresql = "42.7.10" spotless = "8.4.0" testcontainers = "1.21.4" [libraries] kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" } kotlin-testJunit = { module = "org.jetbrains.kotlin:kotlin-test-junit", version.ref = "kotlin" } junit = { module = "junit:junit", version.ref = "junit" } # kotlinx.serialization (shared DTOs — D-27) kotlinx-serializationJson = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "kotlinx-serialization" } androidx-core-ktx = { module = "androidx.core:core-ktx", version.ref = "androidx-core" } androidx-testExt-junit = { module = "androidx.test.ext:junit", version.ref = "androidx-testExt" } androidx-espresso-core = { module = "androidx.test.espresso:espresso-core", version.ref = "androidx-espresso" } androidx-appcompat = { module = "androidx.appcompat:appcompat", version.ref = "androidx-appcompat" } androidx-activity-compose = { module = "androidx.activity:activity-compose", version.ref = "androidx-activity" } compose-uiTooling = { module = "org.jetbrains.compose.ui:ui-tooling", version.ref = "composeMultiplatform" } androidx-lifecycle-viewmodelCompose = { module = "org.jetbrains.androidx.lifecycle:lifecycle-viewmodel-compose", version.ref = "androidx-lifecycle" } androidx-lifecycle-runtimeCompose = { module = "org.jetbrains.androidx.lifecycle:lifecycle-runtime-compose", version.ref = "androidx-lifecycle" } compose-runtime = { module = "org.jetbrains.compose.runtime:runtime", version.ref = "composeMultiplatform" } compose-foundation = { module = "org.jetbrains.compose.foundation:foundation", version.ref = "composeMultiplatform" } compose-material3 = { module = "org.jetbrains.compose.material3:material3", version.ref = "material3" } compose-ui = { module = "org.jetbrains.compose.ui:ui", version.ref = "composeMultiplatform" } compose-components-resources = { module = "org.jetbrains.compose.components:components-resources", version.ref = "composeMultiplatform" } compose-uiToolingPreview = { module = "org.jetbrains.compose.ui:ui-tooling-preview", version.ref = "composeMultiplatform" } kotlinx-coroutinesSwing = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-swing", version.ref = "kotlinx-coroutines" } kotlinx-coroutinesTest = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-test", version.ref = "kotlinx-coroutines" } logback = { module = "ch.qos.logback:logback-classic", version.ref = "logback" } ktor-serverCore = { module = "io.ktor:ktor-server-core-jvm", version.ref = "ktor" } ktor-serverNetty = { module = "io.ktor:ktor-server-netty-jvm", version.ref = "ktor" } ktor-serverTestHost = { module = "io.ktor:ktor-server-test-host-jvm", version.ref = "ktor" } # Koin (client DI — D-14) koin-bom = { module = "io.insert-koin:koin-bom", version.ref = "koin" } koin-core = { module = "io.insert-koin:koin-core" } koin-compose = { module = "io.insert-koin:koin-compose" } koin-composeViewmodel = { module = "io.insert-koin:koin-compose-viewmodel" } koin-android = { module = "io.insert-koin:koin-android" } # Kermit (client logger — D-15) kermit = { module = "co.touchlab:kermit", version.ref = "kermit" } # Server: Ktor content-negotiation + JSON serializer + Flyway + Postgres (D-16) ktor-serverContentNegotiation = { module = "io.ktor:ktor-server-content-negotiation-jvm", version.ref = "ktor" } ktor-serializationKotlinxJson = { module = "io.ktor:ktor-serialization-kotlinx-json-jvm", version.ref = "ktor" } flyway-core = { module = "org.flywaydb:flyway-core", version.ref = "flyway" } flyway-database-postgresql = { module = "org.flywaydb:flyway-database-postgresql", version.ref = "flyway" } postgresql = { module = "org.postgresql:postgresql", version.ref = "postgresql" } # Phase 2 — Server: Ktor auth + JWT + call logging + status pages (D-21..D-23) ktor-serverAuth = { module = "io.ktor:ktor-server-auth-jvm", version.ref = "ktor" } ktor-serverAuthJwt = { module = "io.ktor:ktor-server-auth-jwt-jvm", version.ref = "ktor" } ktor-serverCallLogging = { module = "io.ktor:ktor-server-call-logging-jvm", version.ref = "ktor" } ktor-serverStatusPages = { module = "io.ktor:ktor-server-status-pages-jvm", version.ref = "ktor" } # Phase 2 — Client: Ktor client core + auth + content-negotiation + logging + engines (D-16..D-18) # `ktor-serializationKotlinxJsonMpp` is the multiplatform variant (no `-jvm` classifier) for # commonMain consumption; the `-jvm` variant above stays available to the server module. ktor-clientCore = { module = "io.ktor:ktor-client-core", version.ref = "ktor" } ktor-clientAuth = { module = "io.ktor:ktor-client-auth", version.ref = "ktor" } ktor-clientContentNegotiation = { module = "io.ktor:ktor-client-content-negotiation", version.ref = "ktor" } ktor-clientLogging = { module = "io.ktor:ktor-client-logging", version.ref = "ktor" } ktor-clientOkhttp = { module = "io.ktor:ktor-client-okhttp", version.ref = "ktor" } ktor-clientDarwin = { module = "io.ktor:ktor-client-darwin", version.ref = "ktor" } ktor-clientCio = { module = "io.ktor:ktor-client-cio", version.ref = "ktor" } ktor-serializationKotlinxJsonMpp = { module = "io.ktor:ktor-serialization-kotlinx-json", version.ref = "ktor" } # Phase 2 — Client: AppAuth + Android secure storage + multiplatform-settings (D-01, D-13, AUTH-02) appauth = { module = "net.openid:appauth", version.ref = "appauth" } androidx-security-crypto = { module = "androidx.security:security-crypto", version.ref = "androidx-security-crypto" } multiplatform-settings = { module = "com.russhwolf:multiplatform-settings", version.ref = "multiplatformSettings" } multiplatform-settings-coroutines = { module = "com.russhwolf:multiplatform-settings-coroutines", version.ref = "multiplatformSettings" } # Phase 2 — Server: Exposed DSL + Hikari (D-26) exposed-core = { module = "org.jetbrains.exposed:exposed-core", version.ref = "exposed" } exposed-jdbc = { module = "org.jetbrains.exposed:exposed-jdbc", version.ref = "exposed" } exposed-java-time = { module = "org.jetbrains.exposed:exposed-java-time", version.ref = "exposed" } hikari = { module = "com.zaxxer:HikariCP", version.ref = "hikari" } # Phase 2 — Server tests: Testcontainers (D-21..D-25) testcontainers-postgresql = { module = "org.testcontainers:postgresql", version.ref = "testcontainers" } testcontainers-junit-jupiter = { module = "org.testcontainers:junit-jupiter", version.ref = "testcontainers" } [plugins] androidApplication = { id = "com.android.application", version.ref = "agp" } androidLibrary = { id = "com.android.library", version.ref = "agp" } composeHotReload = { id = "org.jetbrains.compose.hot-reload", version.ref = "composeHotReload" } composeMultiplatform = { id = "org.jetbrains.compose", version.ref = "composeMultiplatform" } composeCompiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } kotlinJvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } kotlinSerialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } ktor = { id = "io.ktor.plugin", version.ref = "ktor" } kotlinMultiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" } spotless = { id = "com.diffplug.spotless", version.ref = "spotless" } flywayPlugin = { id = "org.flywaydb.flyway", version.ref = "flyway" }