# This file is the SINGLE SOURCE OF TRUTH for all project dependencies. # Organized by Domain: Frontend (KMP) vs. Backend (Spring/JVM) # Last updated: 2026-02-03 [versions] # ============================================================================== # === FRONTEND & KMP CORE === # ============================================================================== # Kotlin & Tooling kotlin = "2.3.20" ksp = "2.3.4" # KotlinX (Core Libraries) kotlinx-coroutines = "1.10.2" kotlinx-serialization-json = "1.9.0" kotlinx-datetime = "0.7.1" # UI: Compose Multiplatform # Aligned with Kotlin 2.3.20 composeMultiplatform = "1.10.3" composeHotReload = "1.0.0" materialIconsExtended = "1.7.3" androidx-lifecycle = "2.9.6" uiDesktop = "1.7.0" # Network: Ktor (Client & Server) # Align with Kotlin 2.3.0 – upgrade to 3.4.0 (runtime OpenAPI + lifecycle improvements) ktor = "3.4.1" # Dependency Injection koin = "4.1.1" koinCompose = "4.1.1" # Local Persistence (Frontend) # Room removed in favor of SQLDelight for JS/Wasm support sqldelight = "2.2.1" sqlite = "2.6.2" # Web Tooling (NPM) copyWebpackPlugin = "11.0.0" sqliteWasm = "3.51.1-build2" # ============================================================================== # === BACKEND & INFRASTRUCTURE === # ============================================================================== # Spring Ecosystem springBoot = "3.5.9" # Downgraded from 2025.1.0 (Oakwood) to 2025.0.1 (Northfields) for Spring Boot 3.5.x compatibility springCloud = "2025.0.1" springDependencyManagement = "1.1.7" springdoc = "2.8.9" # Server Persistence # Final release 1.0.0 (UUID API refinements vs. rc-4) exposed = "1.1.1" postgresql = "42.7.8" hikari = "7.0.2" h2 = "2.4.240" flyway = "11.19.1" redisson = "4.0.0" # Spring Boot 3.5.x manages Lettuce 6.6.x; keep aligned to avoid binary/API mismatches. lettuce = "6.6.0.RELEASE" springDataValkey = "0.2.0" # Observability micrometer = "1.16.1" micrometerTracing = "1.6.1" springMail = "3.5.9" zipkin = "3.5.1" zipkinReporter = "3.5.1" resilience4j = "2.3.0" # Auth & Security auth0Jwt = "4.5.0" keycloakAdminClient = "26.0.7" # Utilities openpdf = "2.0.3" bignum = "0.3.10" jmdns = "3.5.12" logback = "1.5.25" caffeine = "3.2.3" reactorKafka = "1.3.23" jackson = "3.0.3" jakartaAnnotation = "3.0.0" slf4j = "2.0.17" kotlin-logging = "7.0.13" # Testing junitJupiter = "5.11.3" junitPlatform = "1.11.3" mockk = "1.14.7" assertj = "3.27.7" testcontainers = "2.0.3" testcontainersKeycloak = "4.0.1" testcontainersJunitJupiter = "1.21.4" testcontainersPostgresql = "1.21.4" testcontainersKafka = "1.21.4" archunit = "1.4.1" # Gradle Plugins foojayResolver = "1.0.0" benManesVersions = "0.51.0" detekt = "1.23.6" ktlint = "12.1.1" dokka = "2.2.0" firebaseDatabaseKtx = "22.0.1" [libraries] # ============================================================================== # === FRONTEND: KOTLIN MULTIPLATFORM CORE === # ============================================================================== kotlin-stdlib-wasm-js = { module = "org.jetbrains.kotlin:kotlin-stdlib-wasm-js", version.ref = "kotlin" } kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" } kotlin-reflect = { module = "org.jetbrains.kotlin:kotlin-reflect", version.ref = "kotlin" } kotlin-test-junit5 = { module = "org.jetbrains.kotlin:kotlin-test-junit5", version.ref = "kotlin" } kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "kotlinx-coroutines" } kotlinx-coroutines-swing = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-swing", version.ref = "kotlinx-coroutines" } kotlinx-coroutines-test = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-test", version.ref = "kotlinx-coroutines" } kotlinx-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "kotlinx-serialization-json" } kotlinx-datetime = { module = "org.jetbrains.kotlinx:kotlinx-datetime", version.ref = "kotlinx-datetime" } # ============================================================================== # === FRONTEND: COMPOSE UI === # ============================================================================== # Note: Core Compose libraries (runtime, foundation, material3) are usually added via the # 'compose' Gradle plugin extension (e.g. implementation(compose.runtime)). # These entries are for specific additional artifacts. 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" } ui-desktop = { module = "androidx.compose.ui:ui-desktop", version.ref = "uiDesktop" } composeHotReloadApi = { module = "org.jetbrains.compose.hot-reload:hot-reload-runtime-api", version.ref = "composeHotReload" } compose-materialIconsExtended = { module = "org.jetbrains.compose.material:material-icons-extended", version.ref = "materialIconsExtended" } # ============================================================================== # === FRONTEND: NETWORK (KTOR CLIENT) === # ============================================================================== ktor-client-core = { module = "io.ktor:ktor-client-core", version.ref = "ktor" } ktor-client-contentNegotiation = { module = "io.ktor:ktor-client-content-negotiation", version.ref = "ktor" } ktor-client-serialization-kotlinx-json = { module = "io.ktor:ktor-serialization-kotlinx-json", version.ref = "ktor" } ktor-client-auth = { module = "io.ktor:ktor-client-auth", version.ref = "ktor" } ktor-client-logging = { module = "io.ktor:ktor-client-logging", version.ref = "ktor" } ktor-client-mock = { module = "io.ktor:ktor-client-mock", version.ref = "ktor" } ktor-client-websockets = { module = "io.ktor:ktor-client-websockets-jvm", version.ref = "ktor" } ktor-client-websockets-common = { module = "io.ktor:ktor-client-websockets", version.ref = "ktor" } # Engines ktor-client-cio = { module = "io.ktor:ktor-client-cio-jvm", version.ref = "ktor" } # JVM/Desktop ktor-client-js = { module = "io.ktor:ktor-client-js", version.ref = "ktor" } # JS/Wasm # ktor-client-websockets-common = { module = "io.ktor:ktor-client-websockets", version.ref = "ktor" } # ============================================================================== # === FRONTEND: DEPENDENCY INJECTION (KOIN) === # ============================================================================== koin-core = { module = "io.insert-koin:koin-core", version.ref = "koin" } koin-compose = { module = "io.insert-koin:koin-compose", version.ref = "koinCompose" } koin-compose-viewmodel = { module = "io.insert-koin:koin-compose-viewmodel", version.ref = "koinCompose" } # ============================================================================== # === FRONTEND: LOCAL PERSISTENCE (SQLDelight) === # ============================================================================== sqldelight-gradle = { module = "app.cash.sqldelight:gradle-plugin", version.ref = "sqldelight" } sqldelight-runtime = { module = "app.cash.sqldelight:runtime", version.ref = "sqldelight" } sqldelight-coroutines = { module = "app.cash.sqldelight:coroutines-extensions", version.ref = "sqldelight" } sqldelight-driver-sqlite = { module = "app.cash.sqldelight:sqlite-driver", version.ref = "sqldelight" } # JVM sqldelight-driver-web = { module = "app.cash.sqldelight:web-worker-driver", version.ref = "sqldelight" } # JS/Wasm # ============================================================================== # === BACKEND: SPRING BOOT & CLOUD === # ============================================================================== spring-boot-dependencies = { module = "org.springframework.boot:spring-boot-dependencies", version.ref = "springBoot" } spring-cloud-dependencies = { module = "org.springframework.cloud:spring-cloud-dependencies", version.ref = "springCloud" } spring-boot-starter-web = { module = "org.springframework.boot:spring-boot-starter-web" } spring-boot-starter-validation = { module = "org.springframework.boot:spring-boot-starter-validation" } spring-boot-starter-actuator = { module = "org.springframework.boot:spring-boot-starter-actuator" } spring-boot-starter-data-jpa = { module = "org.springframework.boot:spring-boot-starter-data-jpa" } spring-boot-starter-jdbc = { module = "org.springframework.boot:spring-boot-starter-jdbc" } spring-boot-starter-data-redis = { module = "org.springframework.boot:spring-boot-starter-data-redis" } spring-boot-starter-test = { module = "org.springframework.boot:spring-boot-starter-test" } spring-boot-starter-oauth2-client = { module = "org.springframework.boot:spring-boot-starter-oauth2-client" } spring-boot-starter-oauth2-resource-server = { module = "org.springframework.boot:spring-boot-starter-oauth2-resource-server" } spring-boot-starter-security = { module = "org.springframework.boot:spring-boot-starter-security" } spring-security-test = { module = "org.springframework.security:spring-security-test" } spring-boot-starter-webflux = { module = "org.springframework.boot:spring-boot-starter-webflux" } spring-boot-starter-json = { module = "org.springframework.boot:spring-boot-starter-json" } spring-boot-starter-aop = { module = "org.springframework.boot:spring-boot-starter-aop" } spring-boot-starter-mail = { module = "org.springframework.boot:spring-boot-starter-mail" } spring-kafka = { module = "org.springframework.kafka:spring-kafka" } spring-security-oauth2-jose = { module = "org.springframework.security:spring-security-oauth2-jose" } spring-web = { module = "org.springframework:spring-web" } springdoc-openapi-starter-common = { module = "org.springdoc:springdoc-openapi-starter-common", version.ref = "springdoc" } springdoc-openapi-starter-webmvc-ui = { module = "org.springdoc:springdoc-openapi-starter-webmvc-ui", version.ref = "springdoc" } springdoc-openapi-starter-webflux-ui = { module = "org.springdoc:springdoc-openapi-starter-webflux-ui", version.ref = "springdoc" } spring-cloud-starter-gateway-server-webflux = { module = "org.springframework.cloud:spring-cloud-starter-gateway-server-webflux" } spring-cloud-starter-consul-discovery = { module = "org.springframework.cloud:spring-cloud-starter-consul-discovery" } spring-cloud-starter-circuitbreaker-resilience4j = { module = "org.springframework.cloud:spring-cloud-starter-circuitbreaker-resilience4j" } spring-cloud-starter-circuitbreaker-reactor-resilience4j = { module = "org.springframework.cloud:spring-cloud-starter-circuitbreaker-reactor-resilience4j" } # ============================================================================== # === BACKEND: KTOR SERVER === # ============================================================================== ktor-server-core = { module = "io.ktor:ktor-server-core-jvm", version.ref = "ktor" } ktor-server-netty = { module = "io.ktor:ktor-server-netty-jvm", version.ref = "ktor" } ktor-server-contentNegotiation = { module = "io.ktor:ktor-server-content-negotiation-jvm", version.ref = "ktor" } ktor-server-serialization-kotlinx-json = { module = "io.ktor:ktor-serialization-kotlinx-json-jvm", version.ref = "ktor" } ktor-server-statusPages = { module = "io.ktor:ktor-server-status-pages-jvm", version.ref = "ktor" } ktor-server-auth = { module = "io.ktor:ktor-server-auth-jvm", version.ref = "ktor" } ktor-server-authJwt = { module = "io.ktor:ktor-server-auth-jwt-jvm", version.ref = "ktor" } ktor-server-cors = { module = "io.ktor:ktor-server-cors-jvm", version.ref = "ktor" } ktor-server-callLogging = { module = "io.ktor:ktor-server-call-logging-jvm", version.ref = "ktor" } ktor-server-defaultHeaders = { module = "io.ktor:ktor-server-default-headers-jvm", version.ref = "ktor" } ktor-server-rateLimit = { module = "io.ktor:ktor-server-rate-limit-jvm", version.ref = "ktor" } ktor-server-metrics-micrometer = { module = "io.ktor:ktor-server-metrics-micrometer-jvm", version.ref = "ktor" } ktor-server-openapi = { module = "io.ktor:ktor-server-openapi", version.ref = "ktor" } ktor-server-swagger = { module = "io.ktor:ktor-server-swagger", version.ref = "ktor" } ktor-server-tests = { module = "io.ktor:ktor-server-tests-jvm", version.ref = "ktor" } ktor-server-testHost = { module = "io.ktor:ktor-server-test-host-jvm", version.ref = "ktor" } ktor-server-routing-openapi = { module = "io.ktor:ktor-server-routing-openapi", version.ref = "ktor" } ktor-server-websockets = { module = "io.ktor:ktor-server-websockets-jvm", version.ref = "ktor" } # ============================================================================== # === BACKEND: PERSISTENCE & INFRA === # ============================================================================== exposed-core = { module = "org.jetbrains.exposed:exposed-core", version.ref = "exposed" } exposed-dao = { module = "org.jetbrains.exposed:exposed-dao", version.ref = "exposed" } exposed-jdbc = { module = "org.jetbrains.exposed:exposed-jdbc", version.ref = "exposed" } exposed-kotlin-datetime = { module = "org.jetbrains.exposed:exposed-kotlin-datetime", version.ref = "exposed" } exposed-migration-jdbc = { module = "org.jetbrains.exposed:exposed-migration-jdbc", version.ref = "exposed" } exposed-java-time = { module = "org.jetbrains.exposed:exposed-java-time", version.ref = "exposed" } exposed-json = { module = "org.jetbrains.exposed:exposed-json", version.ref = "exposed" } exposed-money = { module = "org.jetbrains.exposed:exposed-money", version.ref = "exposed" } postgresql-driver = { module = "org.postgresql:postgresql", version.ref = "postgresql" } hikari-cp = { module = "com.zaxxer:HikariCP", version.ref = "hikari" } h2-driver = { module = "com.h2database:h2", version.ref = "h2" } flyway-core = { module = "org.flywaydb:flyway-core", version.ref = "flyway" } flyway-postgresql = { module = "org.flywaydb:flyway-database-postgresql", version.ref = "flyway" } redisson = { module = "org.redisson:redisson", version.ref = "redisson" } lettuce-core = { module = "io.lettuce:lettuce-core", version.ref = "lettuce" } spring-data-valkey = { module = "io.valkey.springframework.data:spring-data-valkey", version.ref = "springDataValkey" } micrometer-prometheus = { module = "io.micrometer:micrometer-registry-prometheus", version.ref = "micrometer" } micrometer-tracing-bridge-brave = { module = "io.micrometer:micrometer-tracing-bridge-brave", version.ref = "micrometerTracing" } zipkin-reporter-brave = { module = "io.zipkin.reporter2:zipkin-reporter-brave", version.ref = "zipkinReporter" } zipkin-sender-okhttp3 = { module = "io.zipkin.reporter2:zipkin-sender-okhttp3", version.ref = "zipkinReporter" } zipkin-server = { module = "io.zipkin:zipkin-server", version.ref = "zipkin" } resilience4j-spring-boot3 = { module = "io.github.resilience4j:resilience4j-spring-boot3", version.ref = "resilience4j" } resilience4j-reactor = { module = "io.github.resilience4j:resilience4j-reactor", version.ref = "resilience4j" } resilience4j-kotlin = { module = "io.github.resilience4j:resilience4j-kotlin", version.ref = "resilience4j" } auth0-java-jwt = { module = "com.auth0:java-jwt", version.ref = "auth0Jwt" } keycloak-admin-client = { module = "org.keycloak:keycloak-admin-client", version.ref = "keycloakAdminClient" } # ============================================================================== # === SHARED UTILITIES & TESTING === # ============================================================================== bignum = { module = "com.ionspin.kotlin:bignum", version.ref = "bignum" } slf4j-api = { module = "org.slf4j:slf4j-api", version.ref = "slf4j" } logback-classic = { module = "ch.qos.logback:logback-classic", version.ref = "logback" } logback-core = { module = "ch.qos.logback:logback-core", version.ref = "logback" } kotlin-logging-jvm = { module = "io.github.oshai:kotlin-logging-jvm", version.ref = "kotlin-logging" } caffeine = { module = "com.github.ben-manes.caffeine:caffeine", version.ref = "caffeine" } reactor-kafka = { module = "io.projectreactor.kafka:reactor-kafka", version.ref = "reactorKafka" } jackson-module-kotlin = { module = "com.fasterxml.jackson.module:jackson-module-kotlin" } jackson-datatype-jsr310 = { module = "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" } jakarta-annotation-api = { module = "jakarta.annotation:jakarta.annotation-api", version.ref = "jakartaAnnotation" } jmdns = { module = "org.jmdns:jmdns", version.ref = "jmdns" } openpdf = { module = "com.github.librepdf:openpdf", version.ref = "openpdf" } junit-jupiter-api = { module = "org.junit.jupiter:junit-jupiter-api", version.ref = "junitJupiter" } junit-jupiter-engine = { module = "org.junit.jupiter:junit-jupiter-engine", version.ref = "junitJupiter" } junit-jupiter-params = { module = "org.junit.jupiter:junit-jupiter-params", version.ref = "junitJupiter" } junit-platform-launcher = { module = "org.junit.platform:junit-platform-launcher", version.ref = "junitPlatform" } reactor-test = { module = "io.projectreactor:reactor-test" } mockk = { module = "io.mockk:mockk", version.ref = "mockk" } assertj-core = { module = "org.assertj:assertj-core", version.ref = "assertj" } testcontainers-core = { module = "org.testcontainers:testcontainers", version.ref = "testcontainers" } testcontainers-junit-jupiter = { module = "org.testcontainers:junit-jupiter", version.ref = "testcontainersJunitJupiter" } testcontainers-postgresql = { module = "org.testcontainers:postgresql", version.ref = "testcontainersPostgresql" } testcontainers-kafka = { module = "org.testcontainers:kafka", version.ref = "testcontainersKafka" } testcontainers-keycloak = { module = "com.github.dasniko:testcontainers-keycloak", version.ref = "testcontainersKeycloak" } archunit-junit5-api = { module = "com.tngtech.archunit:archunit-junit5-api", version.ref = "archunit" } archunit-junit5-engine = { module = "com.tngtech.archunit:archunit-junit5-engine", version.ref = "archunit" } # BOMs kotlin-bom = { module = "org.jetbrains.kotlin:kotlin-bom", version.ref = "kotlin" } kotlinx-coroutines-bom = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-bom", version.ref = "kotlinx-coroutines" } kotlinx-coroutines-reactor = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-reactor", version.ref = "kotlinx-coroutines" } firebase-database-ktx = { group = "com.google.firebase", name = "firebase-database-ktx", version.ref = "firebaseDatabaseKtx" } [bundles] # === FRONTEND BUNDLES === # Use these in commonMain to reduce boilerplate kmp-common = [ "kotlinx-coroutines-core", "kotlinx-serialization-json", "kotlinx-datetime" ] ktor-client-common = [ "ktor-client-core", "ktor-client-contentNegotiation", "ktor-client-serialization-kotlinx-json", "ktor-client-auth", "ktor-client-logging" ] compose-common = [ "androidx-lifecycle-viewmodelCompose", "androidx-lifecycle-runtimeCompose" ] # === BACKEND BUNDLES === testing-jvm = [ "junit-jupiter-api", "junit-jupiter-engine", "junit-jupiter-params", "junit-platform-launcher", "mockk", "assertj-core" ] test-spring = [ "spring-boot-starter-test", "spring-security-test" ] spring-boot-service-complete = [ "spring-boot-starter-web", "spring-boot-starter-validation", "spring-boot-starter-actuator", "spring-boot-starter-json", "spring-boot-starter-aop", "jackson-module-kotlin", "jackson-datatype-jsr310", "micrometer-prometheus", "micrometer-tracing-bridge-brave", "zipkin-reporter-brave", "zipkin-sender-okhttp3" ] # Standard dependencies for a "secure" Spring Boot microservice (architecture-approved baseline) spring-boot-secure-service = [ "spring-boot-starter-web", "spring-boot-starter-actuator", "spring-boot-starter-security", "spring-boot-starter-oauth2-resource-server", "spring-cloud-starter-consul-discovery" ] database-complete = [ "spring-boot-starter-data-jpa", "postgresql-driver", "hikari-cp", "flyway-core", "flyway-postgresql" ] valkey-cache = [ "spring-data-valkey", "jackson-module-kotlin", "jackson-datatype-jsr310" ] testcontainers = [ "testcontainers-core", "testcontainers-junit-jupiter", "testcontainers-postgresql", "testcontainers-kafka", "testcontainers-keycloak" ] kafka-config = [ "spring-kafka", "reactor-kafka", "jackson-module-kotlin", "jackson-datatype-jsr310" ] monitoring-client = [ "spring-boot-starter-actuator", "micrometer-prometheus", "micrometer-tracing-bridge-brave", "zipkin-reporter-brave", "zipkin-sender-okhttp3" ] jackson-kotlin = [ "jackson-module-kotlin", "jackson-datatype-jsr310" ] resilience = [ "resilience4j-spring-boot3", "resilience4j-reactor", "resilience4j-kotlin" ] [plugins] # --- Kotlin & Android --- kotlinJvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } kotlinMultiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" } kotlinSerialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } kotlinJpa = { id = "org.jetbrains.kotlin.plugin.jpa", version.ref = "kotlin" } kotlinSpring = { id = "org.jetbrains.kotlin.plugin.spring", version.ref = "kotlin" } ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } # --- Compose --- 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" } # --- Spring --- spring-boot = { id = "org.springframework.boot", version.ref = "springBoot" } spring-dependencyManagement = { id = "io.spring.dependency-management", version.ref = "springDependencyManagement" } # --- Ktor --- ktor = { id = "io.ktor.plugin", version.ref = "ktor" } # --- Persistence --- sqldelight = { id = "app.cash.sqldelight", version.ref = "sqldelight" } # --- Tools --- foojayResolver = { id = "org.gradle.toolchains.foojay-resolver-convention", version.ref = "foojayResolver" } dokka = { id = "org.jetbrains.dokka", version.ref = "dokka" } benManesVersions = { id = "com.github.ben-manes.versions", version.ref = "benManesVersions" } detekt = { id = "io.gitlab.arturbosch.detekt", version.ref = "detekt" } ktlint = { id = "org.jlleitschuh.gradle.ktlint", version.ref = "ktlint" }