Repository navigation
Description
TL;DR
Bring the toolchain to the Compose 1.12 baseline in one coordinated change: BOM 2026.09.00, Kotlin 2.4.20, AGP 9.x (at least 9.1.0), Gradle 9.x, compileSdk 37 / targetSdk 36, landing the six open Dependabot PRs plus follow-on bumps. This is the foundation for every other roadmap issue: the APIs they demonstrate do not exist in Compose 1.7.6.
Background
Compose 1.12 shipped with BOM 2026.09.00 (August 2026): MeshGradientPainter, keyed SideEffect, DeferredAnimatedContent, Credential Manager integration, grid named areas, LayerOutsets, wide color gamut / HDR. Material 3 1.4.0 adds the state-based TextField and SecureTextField. The BOM raises minimum requirements to AGP 9.1.0 and compileSdk 37.
The Dependabot PRs have sat open since September 2026; the dependency ones cannot merge individually: Compose 1.12 requires AGP >= 9.1.0 and compileSdk 37; AGP 9 requires Gradle 9 and removes deprecated DSL; Kotlin 2.4 needs the matching Compose Compiler Gradle plugin and a current KSP2 release (KSP is now versioned independently of Kotlin; the newest is 2.3.x).
Current state (verified 2026-11-01):
gradle/libs.versions.toml: compose-bom 2024.12.01 (Compose 1.7.6 / M3 1.3.1), agp 8.7.3, kotlin 2.1.20, ksp 2.1.20-1.0.31, navigation-compose 2.8.9, kotlinx-serialization-json 1.8.0, logging-interceptor 4.12.0, robolectric 4.14.1, roborazzi 1.46.1, activity-compose 1.10.1, lifecycle 2.8.7, paging 3.3.6, coil 3.1.0, media3 1.5.1, room 2.7.1.buildSrc/src/main/kotlin/com/guru/composecookbook/build/configurations/ProjectConfigs.kt: compileSdk 35, targetSdk 35, minSdk 25, applicationIdcom.guru.composecookbook(app/build.gradle.kts reads all SDK values from here).gradle/wrapper/gradle-wrapper.properties: Gradle 8.9.- CI:
.github/workflows/android.yml(JDK 17) plus sibling workflowsbuild.yml,master-apk-create.yml,wrapper-validation.yml, all pinning JDK 17. - Open Dependabot PRs: chore(deps): bump androidx.compose:compose-bom from 2024.12.01 to 2026.09.00 in the compose group across 1 directory #226 (BOM -> 2026.09.00), chore(deps): bump kotlin from 2.1.20 to 2.4.20 #230 (Kotlin -> 2.4.20), chore(deps): bump androidx.navigation:navigation-compose from 2.8.9 to 2.10.1 #234 (navigation-compose -> 2.10.1), chore(deps): bump org.jetbrains.kotlinx:kotlinx-serialization-json from 1.8.0 to 1.11.0 #227 (serialization -> 1.11.0), chore(deps): bump com.squareup.okhttp3:logging-interceptor from 4.12.0 to 5.5.0 #233 (okhttp -> 5.5.0), chore(deps): bump the actions group with 2 updates #235 (Gradle actions).
- README badge (line 22) cites BOM 2024.12.01; "How to get started" (line 91) points at Android Studio Bumblebee / JDK 11.
Target catalog values: agp latest stable 9.x (the Compose UI 1.12.1 artifact declares minAndroidGradlePluginVersion=9.1.0 and minCompileSdk=37), kotlin 2.4.20 or newer 2.4.x (Compose Compiler plugin follows kotlin), ksp latest 2.3.x, compose-bom 2026.09.00, navigation-compose 2.10.1, kotlinx-serialization-json 1.11.0, logging-interceptor 5.5.0, latest stable for activity-compose, lifecycle, paging, coil, media3, room; robolectric to an SDK 37-capable release; roborazzi to latest; Gradle wrapper 9.x; targetSdk 36; compileSdk 37. The adaptive artifacts are BOM-managed and move to 1.3.0 automatically.
Expected outcome
gradle/libs.versions.tomlshows agp 9.x (at least 9.1.0), kotlin 2.4.20, compose-bom 2026.09.00 (Compose 1.12 / M3 1.4.0); Gradle wrapper is 9.x.ProjectConfigs.ktshows compileSdk 37, targetSdk 36; minSdk stays 25.- CI green on the new toolchain; every existing preview renders; Roborazzi baselines re-recorded and passing.
- Dependabot PRs chore(deps): bump androidx.compose:compose-bom from 2024.12.01 to 2026.09.00 in the compose group across 1 directory #226, chore(deps): bump kotlin from 2.1.20 to 2.4.20 #230, chore(deps): bump androidx.navigation:navigation-compose from 2.8.9 to 2.10.1 #234, chore(deps): bump org.jetbrains.kotlinx:kotlinx-serialization-json from 1.8.0 to 1.11.0 #227, chore(deps): bump com.squareup.okhttp3:logging-interceptor from 4.12.0 to 5.5.0 #233, chore(deps): bump the actions group with 2 updates #235 landed and closed as superseded.
- README badge shows BOM 2026.09.00; "How to get started" names the current Android Studio stable and JDK 17+.
- Smoke test passes on an API 36 emulator across Home, Widgets, Animations, Templates, and every Demo UI app.
Diagram
flowchart LR
A["Toolchain: AGP 9.x (at least 9.1.0), Gradle 9.x, Kotlin 2.4.20 + KSP + Compose Compiler"] --> B["BOM 2026.09.00 (Compose 1.12, M3 1.4.0)"]
B --> C["SDKs: compileSdk 37, targetSdk 36 (ProjectConfigs.kt)"]
C --> D["Follow-on bumps: navigation-compose, serialization, okhttp, lifecycle, paging, coil, media3, room, Robolectric, Roborazzi"]
D --> E["Compile fixes, baselines, README, CI green"]
E --> F["Unblocks #237 through #244"]
Tasks
PR 1: Toolchain only (AGP / Gradle / Kotlin / KSP)
- Bump
agp,kotlin,kspingradle/libs.versions.tomland the Compose Compiler plugin version wherever applied (rootbuild.gradle.kts,buildSrc/).- Done when:
./gradlew buildis green while the old BOM is still in place.
- Done when:
- Update
gradle/wrapper/gradle-wrapper.propertiesto a 9.x distribution. - Fix AGP 9 DSL removals in the root and buildSrc build scripts.
PR 2: BOM and SDKs
- Land Dependabot PRs chore(deps): bump androidx.compose:compose-bom from 2024.12.01 to 2026.09.00 in the compose group across 1 directory #226, chore(deps): bump kotlin from 2.1.20 to 2.4.20 #230, chore(deps): bump androidx.navigation:navigation-compose from 2.8.9 to 2.10.1 #234, chore(deps): bump org.jetbrains.kotlinx:kotlinx-serialization-json from 1.8.0 to 1.11.0 #227, chore(deps): bump com.squareup.okhttp3:logging-interceptor from 4.12.0 to 5.5.0 #233, chore(deps): bump the actions group with 2 updates #235 on a single branch; close as superseded after merge.
- Bump
compose-bomto 2026.09.00 and the remaining catalog keys to latest stable (navigation-compose 2.10.1, kotlinx-serialization-json 1.11.0, logging-interceptor 5.5.0, activity-compose, lifecycle, paging, coil, media3, room, robolectric to the SDK 37 release, roborazzi to latest) ingradle/libs.versions.toml. - Set
compileSdkVersionto 37 andtargetSdkVersionto 36 inbuildSrc/src/main/kotlin/com/guru/composecookbook/build/configurations/ProjectConfigs.kt. - Fix compile breakages: new
@OptInrequirements, removed/deprecated M2 and M3 1.3 signatures. - Update Robolectric / Roborazzi for SDK 37; re-record the
:components:tagsbaselines.- Done when:
./gradlew :components:tags:verifyRoborazziDebugis green against the new baselines.
- Done when:
PR 3: Housekeeping and smoke test
- Update the README badge to BOM 2026.09.00 and rewrite "How to get started" (current Android Studio stable, JDK 17+).
- Update the JDK pin in
.github/workflows/android.yml(andbuild.yml,master-apk-create.yml,wrapper-validation.yml) only if AGP 9 requires a newer JDK. - Drop the
google-materialcatalog entry if the only MDC consumers remain DialogsActivity (View-based pickers,app/.../ui/home/dialogs/DialogsActivity.kt:44) and betty's Snackbar (demos/betty/app/src/main/java/com/adwi/betty/util/Extensions.kt:13). - Smoke-test every Home entry, all Widgets sections, Animations (canvas + lottie), every template, and every Demo UI app (see
app/.../ui/demoapps/DemoUIList.kt) on an API 36 emulator, light and dark.- Done when: no crash or blank screen; regressions filed as follow-up issues.
Out of scope
- M2-to-M3 import migration -- covered under "Enhancement: Complete the Material 2 to Material 3 migration".
- Material 3 Expressive demos -- covered under "Feature: Material 3 Expressive showcase".
- R8/minify, multidex removal, LiveData to StateFlow -- covered under "Enhancement: State and performance modernization".
Acceptance criteria
./gradlew buildpasses green on CI.- App launches on API 35 and API 36 emulators; smoke test passes across Home, Widgets, Animations, Templates, and Demo UI apps.
- All existing previews render without crashes.
./gradlew :components:tags:verifyRoborazziDebugpasses with re-recorded baselines.- README badge reflects BOM 2026.09.00.
- Dependabot PRs chore(deps): bump androidx.compose:compose-bom from 2024.12.01 to 2026.09.00 in the compose group across 1 directory #226, chore(deps): bump kotlin from 2.1.20 to 2.4.20 #230, chore(deps): bump androidx.navigation:navigation-compose from 2.8.9 to 2.10.1 #234, chore(deps): bump org.jetbrains.kotlinx:kotlinx-serialization-json from 1.8.0 to 1.11.0 #227, chore(deps): bump com.squareup.okhttp3:logging-interceptor from 4.12.0 to 5.5.0 #233 closed as superseded.
Verification steps
-
Build:
./gradlew build-- expect BUILD SUCCESSFUL. -
./gradlew :app:assembleDebug-- expect the debug APK. -
Confirm catalog versions:
grep -E "^agp = |^kotlin = |^ksp = |^compose-bom = " gradle/libs.versions.tomlExpect agp 9.x (at least 9.1.0; 9.5.0 is the newest stable today), kotlin 2.4.x, ksp 2.3.x, compose-bom 2026.09.00.
-
cat gradle/wrapper/gradle-wrapper.properties-- distributionUrl shows a 9.x distribution. -
./gradlew ktfmtCheckand./gradlew testDebugUnitTest-- green. -
./gradlew :components:tags:verifyRoborazziDebug-- green against re-recorded baselines. -
Manual smoke test on an API 36 emulator (
./gradlew :app:installDebug), light then dark mode: open every Home entry, scroll every Widgets section, open both Animations tabs, open each template from the Templates screen, and launch every app in the Demo UI list. Expect no crashes or blank screens; file follow-up issues for any regression found.
Getting started
- Read first:
gradle/libs.versions.toml,build.gradle.kts,app/build.gradle.kts,gradle/wrapper/gradle-wrapper.properties,buildSrc/src/main/kotlin/com/guru/composecookbook/build/configurations/ProjectConfigs.kt,.github/workflows/android.yml. - Conventions:
./gradlew buildis the only CI job today; ktfmt (googleStyle, maxWidth 100) is applied to all projects -- run./gradlew ktfmtCheckbefore pushing; all Compose versions flow from thecompose-bombundle in the version catalog. - Suggested first PR: toolchain only (AGP 9.x / Gradle 9.x / Kotlin 2.4.20 / KSP / Compose Compiler) with the old BOM kept, building green before the BOM jump -- the two riskiest variable sets stay separable in review.
- Pitfalls: BOM-managed artifacts (adaptive, material-icons) move with the BOM -- do not pin them explicitly; Robolectric must know SDK 37 or unit tests fail; the SDK package is named
platforms;android-37.0in sdkmanager; Roborazzi baselines need re-recording (:components:tags:recordRoborazziDebug) and committing; KSP no longer has Kotlin-prefixed versions, so do not look for2.4.20-1.0.x; AGP 9 ships built-in Kotlin support, so check thekotlin-androidplugin is not applied twice.
Dependencies
Roadmap overview (all ten issues; arrows mean "must land first"):
flowchart LR
P1["Platform upgrade: BOM 2026.09.00, Kotlin 2.4, AGP 9"]
P3["Material 2 to Material 3 migration"]
P10["Testing and CI quality gate"]
subgraph Features["Feature demos, need Compose 1.12"]
P2["Material 3 Expressive showcase"]
P4["Navigation 3 demo"]
P5["Modern text input and forms"]
P6["Advanced graphics and motion"]
P7["Drag and drop and gestures"]
end
subgraph Quality["Cross-cutting passes"]
P8["Edge-to-edge and accessibility"]
P9["State and performance modernization"]
end
P1 --> P2
P1 --> P4
P1 --> P5
P1 --> P6
P1 --> P7
P1 --> P8
P1 --> P9
P3 -.-> P2
P10 -.-> P3
Solid arrows are hard blockers. Dotted arrows are "works best after". #238 and #245 can start immediately in parallel with this issue.
Unblocks #237 (Material 3 Expressive showcase), #239, #240, #241, #242, #243, #244 (state and performance modernization). Parallel with #238 (M2 to M3 migration) and #245 (testing and CI gate).
References
- https://developer.android.com/blog/posts/what-s-new-in-the-jetpack-compose-august-26-release
- https://developer.android.com/develop/ui/compose/bom/bom-mapping
- https://kotlinlang.org/docs/releases.html
- https://developer.android.com/build/releases/gradle-plugin
- https://developer.android.com/jetpack/androidx/releases/compose-material3-adaptive
Activity