[versions] buildkonfig = "0.21.2" kmpProductFlavors = "2.8.3" # ── Fork Identity — edit ONLY these 5 lines, then run ./gradlew syncForkConfig ────────────────── # NOTE: module Android namespaces are no longer a fork property — they derive from the fixed # build-logic constant org.convention.BASE_MODULE_NAMESPACE ("kpt"), so `baseNamespace` was removed. appId = "org.mifospay" # Android applicationId + iOS bundle ID appDisplayName = "Mifos Pay" # Android app_name, iOS CFBundleDisplayName desktopAppName = "Mifos Pay" # JVM package name, dock name projectName = "mifos-pay" # rootProject.name, Fastlane PROJECT_NAME iosTeamId = "L432S2FZP5" # Apple Developer Team ID # ───────────────────────────────────────────────────────────────────────────────────────────────── # Android androidDesugarJdkLibs = "2.1.5" androidGradlePlugin = "9.3.1" androidTools = "32.3.1" compileSdk = "37" minSdk = "26" targetSdk = "37" javaVersion = "17" jvmToolchain = "21" commonsCodec = "1.22.0" firebaseBom = "34.15.0" firebaseCrashlyticsPlugin = "3.0.7" firebasePerfPlugin = "2.0.2" androidxMacroBenchmark = "1.5.0-alpha06" githubApi = "1.330" gmsPlugin = "4.4.4" # AndroidX Dependencies androidx-test-ext-junit = "1.3.0" androidxActivity = "1.13.0" androidxBrowser = "1.10.0" androidxComposeBom = "2026.06.01" androidxComposeCompiler = "1.5.15" androidxComposeRuntimeTracing = "1.11.0" androidxCoreSplashscreen = "1.2.0" androidxWork = "2.11.2" androidxMetrics = "1.0.0" androidxNavigation = "2.9.2" cmpPdfGenerator = "3.5.10" kotlinxHtml = "0.12.0" navigationevent = "1.0.1" androidxProfileinstaller = "1.4.1" androidxTracing = "1.3.0" appcompatVersion = "1.7.1" calfPermissions = "0.12.0" coreKtxVersion = "1.19.0" jacksonCore = "2.22.0" junitJupiterApi = "5.14.4" junitPlatformLauncherVersion = "1.14.4" okhttp = "5.4.0" robolectric = "4.16.1" roborazzi = "1.67.0" # Testing Dependencies junitVersion = "4.13.2" truth = "1.4.5" espresso-core = "3.7.0" # Security Dependencies androidxSecurityCrypto = "1.1.0" bouncycastle = "1.84" # Utility Dependencies dependencyGuard = "0.5.0" googleOss = "17.5.1" googleOssPlugin = "0.12.0" review = "2.0.2" appUpdate = "2.1.0" integrity = "1.6.0" # Static Analysis & Code Formatting ktlint = "14.2.0" detekt = "1.23.8" spotlessVersion = "8.8.0" turbine = "1.2.1" twitter-detekt-compose = "0.0.26" moduleGraph = "2.9.0" versionCatalogLinterVersion = "1.1.0" # Google secrets Gradle plugin (fork-only, referenced from root build.gradle.kts plugin block) secrets = "2.0.1" # AGP 9 migration (agp9-migration-build-logic epic T2/T3): # Type-safe libs.* accessors in convention plugin source files. # Verify latest on plugins.gradle.org before bumping. typesafeConventions = "0.5.0" # Kotlin KMP Dependencies kotlin = "2.4.0" kover = "0.9.8" kotlinInject = "0.9.0" kotlinxBrowser = "0.5.0" kotlinxCoroutines = "1.11.0" kotlinxDatetime = "0.8.0" kotlinxImmutable = "0.5.1" kotlinxSerializationJson = "1.11.0" ksp = "2.3.11" # Ktor & Ktorfit ktorVersion = "3.5.1" ktorfit = "2.7.5" # Supabase supabase = "3.6.0" # Koin CMP Dependencies koin = "4.2.2" koinAnnotationsVersion = "4.2.2" # Mokkery — fork uses two version keys because the plugin id lookup and the # runtime library lookup are historically separate refs in this catalog. mokkeryVersion = "3.4.2" mokkery = "3.4.2" # KMP Toolkit Libraries # 3.5.9: cmp-network-monitor accuracy overhaul (seed fix incl. no-plan/captive-portal, HTTP-204 # validation, injectable ConnectivityProvider) — MobileByteLabs/KmpToolkit#150. Replaces the # mifos-pay-local jordond experiment. kmptoolkit = "3.5.11" # CMP Libraries compose-plugin = "1.11.1" coil = "3.5.0" backHandlerVersion = "2.5.0" constraintLayout = "0.8.0" multiplatformSettings = "1.3.0" mokoPermission = "0.20.1" qroseVersion = "1.1.2" okioVersion = "3.17.0" kermit = "2.1.0" fileKit = "0.14.2" uiBackhandler = "1.11.1" wire = "6.2.0" compottie = "2.2.4" composeSignature = "1.0.1" webviewMultiplatform = "2.0.3" # Jetbrains CMP composeJB = "1.11.1" # NOT composeJB: org.jetbrains.compose.material:material-icons-extended is frozen upstream at # 1.7.3, which is the version the `compose.materialIconsExtended` plugin accessor resolves. Pinning # it to composeJB silently changes the resolved version (caught by the module-deps seam graph diff). composeMaterialIconsExtended = "1.7.3" composeLifecycle = "2.11.0-beta01" composeNavigation = "2.9.2" jbCoreBundle = "1.0.1" jbSavedState = "1.4.0" material3adaptive = "1.2.0" gitLive = "2.4.0" aboutLibraries = "15.0.3" windowsSizeClass = "0.5.0" # Desktop Version desktopPackageVersion = "1.0.0" # Legacy desktop package identifiers still consumed by cmp-desktop/build.gradle.kts # (libs.versions.packageName/.packageNamespace/.packageVersion). Preserved during # the template migration so no cmp-desktop rewrite is required in this pass; a # follow-up pass can migrate cmp-desktop to appDisplayName / appId / desktopPackageVersion. packageName = "Mifos Pay" packageNamespace = "org.mifospay" packageVersion = "1.0.0" # Store 5 store = "5.1.0-alpha08" #Room 3 room = "3.0.0" sqliteBundled = "2.7.0" sqliteWeb = "2.7.0" # worker-kmp — single-API background + foreground worker scheduling across # Android / iOS / Desktop / Web. See https://github.com/MobileByteLabs/worker-kmp. # Pin tracks last published release on Maven Central. worker-version = "4.0.6" # KMPNotifier — Kotlin Multiplatform local + push notifications (Android/iOS/Desktop/Web). kmpnotifier = "2.0.0" # ── Fork-only versions ────────────────────────────────────────────────────────────────────────── # Kept because feature/**, core/**, libs/** modules still reference these directly; not all are # in the template catalog (mifos-pay added them for wallet-specific surfaces). accompanist = "0.36.0" cameraLifecycleVersion = "1.4.2" cameraViewVersion = "1.4.2" credentialsVersion = "1.5.0" fluentui-icons = "1.0.0" googleidVersion = "1.1.1" guavaVersion = "33.4.8-android" mlkit = "17.3.0" mifosAuthenticatorPasscode = "2.3.0-beta" mifosAuthenticatorBiometrics = "2.3.0-beta" playServicesAuthVersion = "21.3.0" playServicesCodeScanner = "16.1.0" zxingVersion = "3.5.3" composablePreviewScanner = "0.9.1" skie = "0.10.4" [libraries] kmp-product-flavors-plugin = { group = "io.github.mobilebytelabs.kmpflavors", name = "flavor-plugin", version.ref = "kmpProductFlavors" } android-desugarJdkLibs = { group = "com.android.tools", name = "desugar_jdk_libs", version.ref = "androidDesugarJdkLibs" } android-gradlePlugin = { group = "com.android.tools.build", name = "gradle", version.ref = "androidGradlePlugin" } android-tools-common = { group = "com.android.tools", name = "common", version.ref = "androidTools" } androidx-activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "androidxActivity" } androidx-activity-ktx = { group = "androidx.activity", name = "activity-ktx", version.ref = "androidxActivity" } androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompatVersion" } androidx-browser = { group = "androidx.browser", name = "browser", version.ref = "androidxBrowser" } cmp-pdf-generator = { module = "io.github.mobilebytelabs:cmp-pdf-generator", version.ref = "cmpPdfGenerator" } androidx-compose-animation = { group = "androidx.compose.animation", name = "animation" } androidx-compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "androidxComposeBom" } androidx-compose-compiler = { group = "androidx.compose.compiler", name = "compiler", version.ref = "androidxComposeCompiler" } androidx-compose-foundation = { group = "androidx.compose.foundation", name = "foundation" } androidx-compose-foundation-layout = { group = "androidx.compose.foundation", name = "foundation-layout" } androidx-compose-material-iconsExtended = { group = "androidx.compose.material", name = "material-icons-extended" } androidx-compose-material3 = { group = "androidx.compose.material3", name = "material3" } androidx-compose-material3-windowSizeClass = { group = "androidx.compose.material3", name = "material3-window-size-class" } androidx-work-ktx = { group = "androidx.work", name = "work-runtime-ktx", version.ref = "androidxWork" } androidx-work-testing = { group = "androidx.work", name = "work-testing", version.ref = "androidxWork" } androidx-compose-runtime = { group = "androidx.compose.runtime", name = "runtime" } androidx-compose-runtime-tracing = { group = "androidx.compose.runtime", name = "runtime-tracing", version.ref = "androidxComposeRuntimeTracing" } androidx-compose-ui = { group = "androidx.compose.ui", name = "ui" } androidx-compose-ui-test = { group = "androidx.compose.ui", name = "ui-test-junit4" } androidx-compose-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" } androidx-compose-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling" } androidx-compose-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" } androidx-compose-ui-util = { group = "androidx.compose.ui", name = "ui-util" } androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtxVersion" } androidx-core-splashscreen = { group = "androidx.core", name = "core-splashscreen", version.ref = "androidxCoreSplashscreen" } androidx-security-crypto = { group = "androidx.security", name = "security-crypto", version.ref = "androidxSecurityCrypto" } androidx-metrics = { group = "androidx.metrics", name = "metrics-performance", version.ref = "androidxMetrics" } androidx-profileinstaller = { group = "androidx.profileinstaller", name = "profileinstaller", version.ref = "androidxProfileinstaller" } androidx-room-gradle-plugin = { module = "androidx.room3:room3-gradle-plugin", version.ref = "room" } commons-codec = { module = "commons-codec:commons-codec", version.ref = "commonsCodec" } firebase-crashlytics-gradlePlugin = { group = "com.google.firebase", name = "firebase-crashlytics-gradle", version.ref = "firebaseCrashlyticsPlugin" } firebase-performance-gradlePlugin = { group = "com.google.firebase", name = "perf-plugin", version.ref = "firebasePerfPlugin" } androidx-room-compiler = { module = "androidx.room3:room3-compiler", version.ref = "room" } androidx-room-runtime = { module = "androidx.room3:room3-runtime", version.ref = "room" } androidx-sqlite-bundled = { module = "androidx.sqlite:sqlite-bundled", version.ref = "sqliteBundled" } androidx-sqlite-web = { module = "androidx.sqlite:sqlite-web", version.ref = "sqliteWeb" } androidx-test-ext-junit = { group = "androidx.test.ext", name = "junit", version.ref = "androidx-test-ext-junit" } androidx-tracing-ktx = { group = "androidx.tracing", name = "tracing-ktx", version.ref = "androidxTracing" } calf-permissions = { module = "com.mohamedrejeb.calf:calf-permissions", version.ref = "calfPermissions" } kotlinx-html = { module = "org.jetbrains.kotlinx:kotlinx-html", version.ref = "kotlinxHtml" } github-api = { module = "org.kohsuke:github-api", version.ref = "githubApi" } jackson-core = { module = "com.fasterxml.jackson.core:jackson-core", version.ref = "jacksonCore" } jackson-databind = { module = "com.fasterxml.jackson.core:jackson-databind", version.ref = "jacksonCore" } jackson-module-kotlin = { module = "com.fasterxml.jackson.module:jackson-module-kotlin", version.ref = "jacksonCore" } junit-jupiter-params = { module = "org.junit.jupiter:junit-jupiter-params", version.ref = "junitJupiterApi" } junit-jupiter-engine = { module = "org.junit.jupiter:junit-jupiter-engine", version.ref = "junitJupiterApi" } junit-jupiter-api = { module = "org.junit.jupiter:junit-jupiter-api", version.ref = "junitJupiterApi" } ktlint-gradlePlugin = { group = "org.jlleitschuh.gradle", name = "ktlint-gradle", version.ref = "ktlint" } detekt-formatting = { group = "io.gitlab.arturbosch.detekt", name = "detekt-formatting", version.ref = "detekt" } okhttp = { module = "com.squareup.okhttp3:okhttp", version.ref = "okhttp" } platform-junit-platform-launcher = { module = "org.junit.platform:junit-platform-launcher", version.ref = "junitPlatformLauncherVersion" } spotless-gradle = { group = "com.diffplug.spotless", name = "spotless-plugin-gradle", version.ref = "spotlessVersion" } detekt-gradlePlugin = { group = "io.gitlab.arturbosch.detekt", name = "detekt-gradle-plugin", version.ref = "detekt" } kover-gradlePlugin = { group = "org.jetbrains.kotlinx", name = "kover-gradle-plugin", version.ref = "kover" } turbine = { module = "app.cash.turbine:turbine", version.ref = "turbine" } twitter-detekt-compose = { group = "com.twitter.compose.rules", name = "detekt", version.ref = "twitter-detekt-compose" } google-oss-licenses = { group = "com.google.android.gms", name = "play-services-oss-licenses", version.ref = "googleOss" } google-oss-licenses-plugin = { group = "com.google.android.gms", name = "oss-licenses-plugin", version.ref = "googleOssPlugin" } junit = { group = "junit", name = "junit", version.ref = "junitVersion" } espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espresso-core" } lint-api = { group = "com.android.tools.lint", name = "lint-api", version.ref = "androidTools" } lint-checks = { group = "com.android.tools.lint", name = "lint-checks", version.ref = "androidTools" } lint-tests = { group = "com.android.tools.lint", name = "lint-tests", version.ref = "androidTools" } truth = { group = "com.google.truth", name = "truth", version.ref = "truth" } app-update = { module = "com.google.android.play:app-update", version.ref = "appUpdate" } app-update-ktx = { module = "com.google.android.play:app-update-ktx", version.ref = "appUpdate" } integrity = { module = "com.google.android.play:integrity", version.ref = "integrity" } bouncycastle = { module = "org.bouncycastle:bcprov-jdk18on", version.ref = "bouncycastle" } review = { module = "com.google.android.play:review", version.ref = "review" } review-ktx = { module = "com.google.android.play:review-ktx", version.ref = "review" } # jb Compose jb-kotlin-stdlib = { group = "org.jetbrains.kotlin", name = "kotlin-stdlib", version.ref = "kotlin" } jb-kotlin-stdlib-js = { group = "org.jetbrains.kotlin", name = "kotlin-stdlib-js", version.ref = "kotlin" } jb-kotlin-dom = { group = "org.jetbrains.kotlin", name = "kotlin-dom-api-compat", version.ref = "kotlin" } jb-composeRuntime = { module = "org.jetbrains.compose.runtime:runtime", version.ref = "composeJB" } jb-composeMaterialIconsExtended = { module = "org.jetbrains.compose.material:material-icons-extended", version.ref = "composeMaterialIconsExtended" } jb-composeComponentsResources = { module = "org.jetbrains.compose.components:components-resources", version.ref = "composeJB" } jb-lifecycle-compose = { group = "org.jetbrains.androidx.lifecycle", name = "lifecycle-runtime-compose", version.ref = "composeLifecycle" } jb-composeViewmodel = { module = "org.jetbrains.androidx.lifecycle:lifecycle-viewmodel-compose", version.ref = "composeLifecycle" } jb-lifecycleViewmodel = { module = "org.jetbrains.androidx.lifecycle:lifecycle-viewmodel", version.ref = "composeLifecycle" } jb-lifecycleViewmodelSavedState = { module = "org.jetbrains.androidx.lifecycle:lifecycle-viewmodel-savedstate", version.ref = "composeLifecycle" } jb-bundle = { module = "org.jetbrains.androidx.core:core-bundle", version.ref = "jbCoreBundle" } jb-savedstate = { module = "org.jetbrains.androidx.savedstate:savedstate", version.ref = "jbSavedState" } jb-composeNavigation = { module = "org.jetbrains.androidx.navigation:navigation-compose", version.ref = "composeNavigation" } jb-navigation = { module = "org.jetbrains.androidx.navigation:navigation-common", version.ref = "composeNavigation" } jetbrains-compose-material3-adaptive = { group = "org.jetbrains.compose.material3.adaptive", name = "adaptive", version.ref = "material3adaptive" } jetbrains-compose-material3-adaptive-layout = { group = "org.jetbrains.compose.material3.adaptive", name = "adaptive-layout", version.ref = "material3adaptive" } jetbrains-compose-material3-adaptive-navigation = { group = "org.jetbrains.compose.material3.adaptive", name = "adaptive-navigation", version.ref = "material3adaptive" } koin-android = { group = "io.insert-koin", name = "koin-android", version.ref = "koin" } koin-androidx-compose = { group = "io.insert-koin", name = "koin-androidx-compose", version.ref = "koin" } koin-androidx-navigation = { group = "io.insert-koin", name = "koin-androidx-navigation", version.ref = "koin" } koin-annotations = { group = "io.insert-koin", name = "koin-annotations", version.ref = "koinAnnotationsVersion" } koin-bom = { group = "io.insert-koin", name = "koin-bom", version.ref = "koin" } koin-compose = { group = "io.insert-koin", name = "koin-compose", version.ref = "koin" } koin-compose-viewmodel = { group = "io.insert-koin", name = "koin-compose-viewmodel", version.ref = "koin" } koin-compose-navigation = { group = "io.insert-koin", name = "koin-compose-viewmodel-navigation", version.ref = "koin" } koin-core = { group = "io.insert-koin", name = "koin-core", version.ref = "koin" } koin-core-viewmodel = { group = "io.insert-koin", name = "koin-core-viewmodel", version.ref = "koin" } koin-ksp-compiler = { group = "io.insert-koin", name = "koin-ksp-compiler", version.ref = "koinAnnotationsVersion" } koin-test = { group = "io.insert-koin", name = "koin-test", version.ref = "koin" } koin-test-junit4 = { group = "io.insert-koin", name = "koin-test-junit4", version.ref = "koin" } koin-test-junit5 = { group = "io.insert-koin", name = "koin-test-junit5", version.ref = "koin" } kotlin-gradlePlugin = { group = "org.jetbrains.kotlin", name = "kotlin-gradle-plugin", version.ref = "kotlin" } kotlin-inject-compiler-ksp = { group = "me.tatarka.inject", name = "kotlin-inject-compiler-ksp", version.ref = "kotlinInject" } kotlin-inject-runtime = { group = "me.tatarka.inject", name = "kotlin-inject-runtime", version.ref = "kotlinInject" } kotlin-inject-runtime-kmp = { group = "me.tatarka.inject", name = "kotlin-inject-runtime-kmp", version.ref = "kotlinInject" } kotlin-stdlib = { group = "org.jetbrains.kotlin", name = "kotlin-stdlib-jdk8", version.ref = "kotlin" } kotlin-reflect = { group = "org.jetbrains.kotlin", name = "kotlin-reflect", version.ref = "kotlin" } kotlin-test = { group = "org.jetbrains.kotlin", name = "kotlin-test", version.ref = "kotlin" } kotlinx-browser = { group = "org.jetbrains.kotlinx", name = "kotlinx-browser", version.ref = "kotlinxBrowser" } kotlinx-collections-immutable = { group = "org.jetbrains.kotlinx", name = "kotlinx-collections-immutable", version.ref = "kotlinxImmutable" } kotlinx-coroutines-android = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-android", version.ref = "kotlinxCoroutines" } kotlinx-coroutines-core = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-core", version.ref = "kotlinxCoroutines" } kotlinx-coroutines-js = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-core-js", version.ref = "kotlinxCoroutines" } kotlinx-coroutines-play-services = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-play-services", version.ref = "kotlinxCoroutines" } kotlinx-coroutines-swing = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-swing", version.ref = "kotlinxCoroutines" } kotlinx-coroutines-test = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-test", version.ref = "kotlinxCoroutines" } kotlinx-datetime = { group = "org.jetbrains.kotlinx", name = "kotlinx-datetime", version.ref = "kotlinxDatetime" } kotlinx-serialization-core = { group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-core", version.ref = "kotlinxSerializationJson" } kotlinx-serialization-json = { group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-json", version.ref = "kotlinxSerializationJson" } ksp-gradlePlugin = { group = "com.google.devtools.ksp", name = "com.google.devtools.ksp.gradle.plugin", version.ref = "ksp" } ktor-client-android = { group = "io.ktor", name = "ktor-client-android", version.ref = "ktorVersion" } ktor-client-auth = { group = "io.ktor", name = "ktor-client-auth", version.ref = "ktorVersion" } ktor-client-cio = { group = "io.ktor", name = "ktor-client-cio", version.ref = "ktorVersion" } ktor-client-content-negotiation = { group = "io.ktor", name = "ktor-client-content-negotiation", version.ref = "ktorVersion" } ktor-client-core = { group = "io.ktor", name = "ktor-client-core", version.ref = "ktorVersion" } ktor-client-darwin = { group = "io.ktor", name = "ktor-client-darwin", version.ref = "ktorVersion" } ktor-client-okhttp = { group = "io.ktor", name = "ktor-client-okhttp", version.ref = "ktorVersion" } ktor-client-js = { group = "io.ktor", name = "ktor-client-js", version.ref = "ktorVersion" } ktor-client-json = { group = "io.ktor", name = "ktor-client-json", version.ref = "ktorVersion" } ktor-client-logging = { group = "io.ktor", name = "ktor-client-logging", version.ref = "ktorVersion" } ktor-client-mock = { group = "io.ktor", name = "ktor-client-mock", version.ref = "ktorVersion" } ktor-client-serialization = { group = "io.ktor", name = "ktor-client-serialization", version.ref = "ktorVersion" } ktor-client-websockets = { group = "io.ktor", name = "ktor-client-websockets", version.ref = "ktorVersion" } ktor-client-winhttp = { group = "io.ktor", name = "ktor-client-winhttp", version.ref = "ktorVersion" } ktor-serialization-kotlinx-json = { group = "io.ktor", name = "ktor-serialization-kotlinx-json", version.ref = "ktorVersion" } ktor-server-auth = { group = "io.ktor", name = "ktor-server-auth", version.ref = "ktorVersion" } ktorfit-ksp = { group = "de.jensklingenberg.ktorfit", name = "ktorfit-ksp", version.ref = "ktorfit" } ktorfit-converters-flow = { group = "de.jensklingenberg.ktorfit", name = "ktorfit-converters-flow", version.ref = "ktorfit" } ktorfit-lib = { group = "de.jensklingenberg.ktorfit", name = "ktorfit-lib", version.ref = "ktorfit" } supabase-postgrest = { group = "io.github.jan-tennert.supabase", name = "postgrest-kt", version.ref = "supabase" } coil-core = { group = "io.coil-kt.coil3", name = "coil-core", version.ref = "coil" } coil-kt = { group = "io.coil-kt.coil3", name = "coil", version.ref = "coil" } coil-kt-compose = { group = "io.coil-kt.coil3", name = "coil-compose-core", version.ref = "coil" } coil-network-ktor = { group = "io.coil-kt.coil3", name = "coil-network-ktor3", version.ref = "coil" } coil-svg = { group = "io.coil-kt.coil3", name = "coil-svg", version.ref = "coil" } # Compottie — Lottie renderer for Compose Multiplatform (alexzhirkevich/compottie). # Used by core-base/ui:ScreenStateVisual.Lottie. Optional sub-modules (dot-lottie, network) # can be added later if .lottie/zip support or URL loading is needed. compottie = { module = "io.github.alexzhirkevich:compottie", version.ref = "compottie" } compottie-resources = { module = "io.github.alexzhirkevich:compottie-resources", version.ref = "compottie" } compottie-dot-lottie = { module = "io.github.alexzhirkevich:compottie-dot-lottie", version.ref = "compottie" } compottie-dot = { module = "io.github.alexzhirkevich:compottie-dot", version.ref = "compottie" } compottie-network = { module = "io.github.alexzhirkevich:compottie-network", version.ref = "compottie" } # Fork-only lite renderer (core/ui:ScreenStateVisual uses this). compottie-lite = { module = "io.github.alexzhirkevich:compottie-lite", version.ref = "compottie" } compose-gradlePlugin = { group = "org.jetbrains.kotlin", name = "compose-compiler-gradle-plugin", version.ref = "kotlin" } squareup-okio = { group = "com.squareup.okio", name = "okio", version.ref = "okioVersion" } back-handler = { group = "com.arkivanov.essenty", name = "back-handler", version.ref = "backHandlerVersion" } constraint-layout = { group = "tech.annexflow.compose", name = "constraintlayout-compose-multiplatform", version.ref = "constraintLayout" } qrose = { group = "io.github.alexzhirkevich", name = "qrose", version.ref = "qroseVersion" } filekit-core = { group = "io.github.vinceglb", name = "filekit-core", version.ref = "fileKit" } filekit-compose = { module = "io.github.vinceglb:filekit-dialogs-compose", version.ref = "fileKit" } # Template's canonical (singular) alias — consumed by cmp-android. filekit-dialog-compose = { module = "io.github.vinceglb:filekit-dialogs", version.ref = "fileKit" } # Fork-only plural forms — consumed by libs/mifos-loans, feature/kyc, feature/profile. filekit-dialogs = { module = "io.github.vinceglb:filekit-dialogs", version.ref = "fileKit" } filekit-dialogs-compose = { module = "io.github.vinceglb:filekit-dialogs-compose", version.ref = "fileKit" } filekit-coil = { module = "io.github.vinceglb:filekit-coil", version.ref = "fileKit" } kermit-logging = { group = "co.touchlab", name = "kermit", version.ref = "kermit" } kermit-simple = { group = "co.touchlab", name = "kermit-simple", version.ref = "kermit" } kermit-koin = { group = "co.touchlab", name = "kermit-koin", version.ref = "kermit" } multiplatform-settings = { group = "com.russhwolf", name = "multiplatform-settings-no-arg", version.ref = "multiplatformSettings" } multiplatform-settings-coroutines = { group = "com.russhwolf", name = "multiplatform-settings-coroutines", version.ref = "multiplatformSettings" } multiplatform-settings-serialization = { group = "com.russhwolf", name = "multiplatform-settings-serialization", version.ref = "multiplatformSettings" } multiplatform-settings-test = { group = "com.russhwolf", name = "multiplatform-settings-test", version.ref = "multiplatformSettings" } moko-permission = { group = "dev.icerock.moko", name = "permissions", version.ref = "mokoPermission" } moko-permission-compose = { group = "dev.icerock.moko", name = "permissions-compose", version.ref = "mokoPermission" } ui-backhandler = { module = "org.jetbrains.compose.ui:ui-backhandler", version.ref = "uiBackhandler" } cmp-intent-launcher = { module = "io.github.mobilebytelabs:cmp-intent-launcher", version.ref = "kmptoolkit" } cmp-share = { module = "io.github.mobilebytelabs:cmp-share", version.ref = "kmptoolkit" } cmp-network-monitor = { module = "io.github.mobilebytelabs:cmp-network-monitor", version.ref = "kmptoolkit" } cmp-network-monitor-compose = { module = "io.github.mobilebytelabs:cmp-network-monitor-compose", version.ref = "kmptoolkit" } firebase-analytics = { group = "com.google.firebase", name = "firebase-analytics" } firebase-bom = { group = "com.google.firebase", name = "firebase-bom", version.ref = "firebaseBom" } firebase-cloud-messaging = { group = "com.google.firebase", name = "firebase-messaging" } firebase-crashlytics = { group = "com.google.firebase", name = "firebase-crashlytics" } firebase-performance = { group = "com.google.firebase", name = "firebase-perf" } gitlive-firebase-analytics = { module = "dev.gitlive:firebase-analytics", version.ref = "gitLive" } gitlive-firebase-crashlytics = { module = "dev.gitlive:firebase-crashlytics", version.ref = "gitLive" } gitlive-firebase-performance = { module = "dev.gitlive:firebase-performance", version.ref = "gitLive" } robolectric = { group = "org.robolectric", name = "robolectric", version.ref = "robolectric" } roborazzi = { group = "io.github.takahirom.roborazzi", name = "roborazzi", version.ref = "roborazzi" } roborazzi-accessibility-check = { group = "io.github.takahirom.roborazzi", name = "roborazzi-accessibility-check", version.ref = "roborazzi" } store5 = { group = "org.mobilenativefoundation.store", name = "store5", version.ref = "store" } store5-cache = { group = "org.mobilenativefoundation.store", name = "cache5", version.ref = "store" } aboutlibraries-core = { module = "com.mikepenz:aboutlibraries-core", version.ref = "aboutLibraries" } aboutlibraries-compose-core = { module = "com.mikepenz:aboutlibraries-compose", version.ref = "aboutLibraries" } aboutlibraries-compose-m3 = { module = "com.mikepenz:aboutlibraries-compose-m3", version.ref = "aboutLibraries" } # worker-kmp worker-kmp = { module = "io.github.mobilebytelabs:worker-kmp", version.ref = "worker-version" } worker-compose-all = { module = "io.github.mobilebytelabs:worker-compose-all", version.ref = "worker-version" } worker-app-plugin = { module = "io.github.mobilebytelabs:worker-app-plugin", version.ref = "worker-version" } worker-android = { module = "io.github.mobilebytelabs:worker-android", version.ref = "worker-version" } worker-koin = { module = "io.github.mobilebytelabs:worker-koin", version.ref = "worker-version" } worker-sync = { module = "io.github.mobilebytelabs:worker-sync", version.ref = "worker-version" } worker-app-annotations = { module = "io.github.mobilebytelabs:worker-app-annotations", version.ref = "worker-version" } kmpnotifier-local = { module = "io.github.mirzemehdi:kmpnotifier-local", version.ref = "kmpnotifier" } # ── Fork-only libraries ───────────────────────────────────────────────────────────────────────── accompanist-pager = { group = "com.google.accompanist", name = "accompanist-pager", version.ref = "accompanist" } accompanist-permissions = { module = "com.google.accompanist:accompanist-permissions", version.ref = "accompanist" } androidx-camera-camera2 = { module = "androidx.camera:camera-camera2", version.ref = "cameraViewVersion" } androidx-camera-lifecycle = { group = "androidx.camera", name = "camera-lifecycle", version.ref = "cameraLifecycleVersion" } androidx-camera-view = { group = "androidx.camera", name = "camera-view", version.ref = "cameraViewVersion" } androidx-credentials = { group = "androidx.credentials", name = "credentials", version.ref = "credentialsVersion" } androidx-credentials-play-services-auth = { group = "androidx.credentials", name = "credentials-play-services-auth", version.ref = "credentialsVersion" } compose-signature = { module = "io.github.niyajali:compose-signature", version.ref = "composeSignature" } compose-webview-multiplatform = { module = "io.github.kevinnzou:compose-webview-multiplatform", version.ref = "webviewMultiplatform" } fluentui-system-icons = { module = "io.github.niyajali:fluentui-system-icons", version.ref = "fluentui-icons" } google-play-services-code-scanner = { group = "com.google.android.gms", name = "play-services-code-scanner", version.ref = "playServicesCodeScanner" } googleid = { group = "com.google.android.libraries.identity.googleid", name = "googleid", version.ref = "googleidVersion" } guava = { module = "com.google.guava:guava", version.ref = "guavaVersion" } mifos-authenticator-biometrics = { group = "io.github.openmf", name = "mifos-authenticator-biometrics", version.ref = "mifosAuthenticatorBiometrics" } mifos-authenticator-passcode = { group = "io.github.openmf", name = "mifos-authenticator-passcode", version.ref = "mifosAuthenticatorPasscode" } # AndroidX NavigationEvent — KMP back-handling API used by fork feature/passcode # (BiometricsSetupScreen.kt + MifosPasscode.kt use NavigationBackHandler + # rememberNavigationEventState). Distinct from arkivanov Essenty BackCallback # (used by BottomSheet.kt) — the passcode files were migrated to AndroidX's # newer navigationevent-compose API. Coordinate: androidx.navigationevent:navigationevent-compose. androidx-navigationevent-compose = { group = "androidx.navigationevent", name = "navigationevent-compose", version = "1.1.1" } mlkit-barcode-scanning = { module = "com.google.mlkit:barcode-scanning", version.ref = "mlkit" } play-services-auth = { group = "com.google.android.gms", name = "play-services-auth", version.ref = "playServicesAuthVersion" } window-size = { group = "dev.chrisbanes.material3", name = "material3-window-size-class-multiplatform", version.ref = "windowsSizeClass" } zxing = { group = "com.google.zxing", name = "core", version.ref = "zxingVersion" } zxing-javase = { group = "com.google.zxing", name = "javase", version.ref = "zxingVersion" } cmp-firebase = { module = "io.github.mobilebytelabs:cmp-firebase", version.ref = "kmptoolkit" } cmp-firebase-compose = { module = "io.github.mobilebytelabs:cmp-firebase-compose", version.ref = "kmptoolkit" } roborazzi-composeDesktop = { group = "io.github.takahirom.roborazzi", name = "roborazzi-compose-desktop", version.ref = "roborazzi" } composablePreviewScanner-common = { group = "io.github.sergio-sastre.ComposablePreviewScanner", name = "common", version.ref = "composablePreviewScanner" } composablePreviewScanner-jvm = { group = "io.github.sergio-sastre.ComposablePreviewScanner", name = "jvm", version.ref = "composablePreviewScanner" } roborazzi-gradlePlugin = { group = "io.github.takahirom.roborazzi", name = "roborazzi-gradle-plugin", version.ref = "roborazzi" } [bundles] androidx-compose-ui-test = [ "androidx-compose-ui-test", "androidx-compose-ui-test-manifest" ] [plugins] buildkonfig = { id = "com.codingfeline.buildkonfig", version.ref = "buildkonfig" } kmp-product-flavors = { id = "io.github.mobilebytelabs.kmp-product-flavors", version.ref = "kmpProductFlavors" } kmp-flavors-convention = { id = "org.convention.kmp.flavors" } # Android & Kotlin Plugins android-application = { id = "com.android.application", version.ref = "androidGradlePlugin" } android-library = { id = "com.android.library", version.ref = "androidGradlePlugin" } android-test = { id = "com.android.test", version.ref = "androidGradlePlugin" } # AGP 9 unified KMP+Android plugin — used by KMPLibraryConventionPlugin + KMPCoreBaseLibraryConventionPlugin android-kmp-library = { id = "com.android.kotlin.multiplatform.library", version.ref = "androidGradlePlugin" } # AGP 9 migration (T3): type-safe libs.* accessors in convention plugin source files. # When activated, convention plugins switch from libs.findVersion("compileSdk").get().requiredVersion # to the type-safe libs.versions.compileSdk.get() form. typesafe-conventions = { id = "dev.panuszewski.typesafe-conventions", version.ref = "typesafeConventions" } kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } kotlin-allopen = { id = "org.jetbrains.kotlin.plugin.allopen", version.ref = "kotlin" } kotlinCocoapods = { id = "org.jetbrains.kotlin.native.cocoapods", version.ref = "kotlin" } android-application-convention = { id = "org.convention.android.application" } android-application-compose-convention = { id = "org.convention.android.application.compose" } # KMP & CMP Plugins compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } jetbrainsCompose = { id = "org.jetbrains.compose", version.ref = "compose-plugin" } kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } kotlin-parcelize = { id = "org.jetbrains.kotlin.plugin.parcelize", version.ref = "kotlin" } kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } kotlinMultiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" } kover = { id = "org.jetbrains.kotlinx.kover", version.ref = "kover" } kover-convention = { id = "org.convention.kover.plugin" } ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } # ktorfit plugin — the template registers this under `ktrofit` (historical typo). # Both aliases resolve to the same plugin id so fork consumers using either accessor work. ktrofit = { id = "de.jensklingenberg.ktorfit", version.ref = "ktorfit" } ktorfit = { id = "de.jensklingenberg.ktorfit", version.ref = "ktorfit" } wire = { id = "com.squareup.wire", version.ref = "wire" } firebase-crashlytics = { id = "com.google.firebase.crashlytics", version.ref = "firebaseCrashlyticsPlugin" } firebase-perf = { id = "com.google.firebase.firebase-perf", version.ref = "firebasePerfPlugin" } gms = { id = "com.google.gms.google-services", version.ref = "gmsPlugin" } roborazzi = { id = "io.github.takahirom.roborazzi", version.ref = "roborazzi" } baselineprofile = { id = "androidx.baselineprofile", version.ref = "androidxMacroBenchmark" } aboutLibraries = { id = "com.mikepenz.aboutlibraries.plugin", version.ref = "aboutLibraries" } cmp-feature-convention = { id = "org.convention.cmp.feature" } kmp-koin-convention = { id = "org.convention.kmp.koin" } kmp-library-convention = { id = "org.convention.kmp.library" } kmp-core-base-library-convention = { id = "org.convention.kmp.core.base.library" } android-application-firebase = { id = "org.convention.android.application.firebase" } android-lint = { id = "org.convention.android.application.lint" } # Utility Plugins detekt-convention = { id = "org.convention.detekt.plugin" } git-hooks-convention = { id = "org.convention.git.hooks" } ktlint-convention = { id = "org.convention.ktlint.plugin" } spotless-convention = { id = "org.convention.spotless.plugin" } keystore-management = { id = "org.convention.keystore.management" } dependencyGuard = { id = "com.dropbox.dependency-guard", version.ref = "dependencyGuard" } detekt = { id = "io.gitlab.arturbosch.detekt", version.ref = "detekt" } ktlint = { id = "org.jlleitschuh.gradle.ktlint", version.ref = "ktlint" } spotless = { id = "com.diffplug.spotless", version.ref = "spotlessVersion" } #Room 3 Plugin room = { id = "androidx.room3", version.ref = "room" } mifos-kmp-room = { id = "mifos.kmp.room" } # worker-kmp — apply `id("io.github.mobilebytelabs.worker-app")` to a CMP module # to codegen per-platform launchers (Android Application/Activity, iOS # MainViewController + xcodegen, JVM main, wasmJs main + index.html). worker-app = { id = "io.github.mobilebytelabs.worker-app", version.ref = "worker-version" } # Supabase Config Plugin kmp-supabase-config = { id = "org.convention.kmp.supabase.config" } # ── Fork-only plugins ─────────────────────────────────────────────────────────────────────────── # Mokkery — kotlin-multiplatform mocking. Applied by feature/auth to mock repositories in tests. # The runtime library uses `mokkeryVersion`; the plugin id here re-uses the same ref so the # apply-side and dependency-side stay in lock-step. mokkery = { id = "dev.mokkery", version.ref = "mokkery" } mokkery-plugin = { id = "dev.mokkery", version.ref = "mokkeryVersion" } # Google Maps Secrets plugin — declared apply-false in root build.gradle.kts so consumer # modules can opt-in later. secrets = { id = "com.google.android.libraries.mapsplatform.secrets-gradle-plugin", version.ref = "secrets" } # Version-catalog linter — applied at root; validates libs.versions.toml formatting/ordering. version-catalog-linter = { id = "io.github.pemistahl.version-catalog-linter", version.ref = "versionCatalogLinterVersion" } skie = { id = "co.touchlab.skie", version.ref = "skie" } moduleGraph = { id = "com.jraska.module.graph.assertion", version.ref = "moduleGraph" }