Jetpack Compose 1.12 went stable on August 12. The headliners are mesh gradients, a full Wide Color Gamut rendering pipeline, Grid named areas, and native Credential Manager integration. Before you bump the BOM to 2026.08.00, there is one gate: this release requires compileSdk 37 and AGP 9.2.0. If your toolchain is not there yet, that upgrade comes first.
The Build Requirement That Blocks Everything
Compose 1.12 locks to compileSdk = 37 (Android 17) and a minimum of AGP 9.2.0, released in April. Any app or library that depends on Compose 1.12 inherits both requirements. AGP 9.2.0 also requires Android Studio Narwhal Feature Drop or later.
Check two places before upgrading:
// libs.versions.toml
agp = "9.2.0"
// app/build.gradle.kts
compileSdk = 37
If you are already on API 37 and AGP 9.2, the BOM bump is all you need. If not, sort the toolchain first. The AGP 9.2.0 release notes cover what changed in the plugin itself.
Mesh Gradients Are Finally Stable
Android developers have been waiting for this since SwiftUI shipped MeshGradient in iOS 18. The wait is over — and the Compose version has more control. MeshGradientPainter is now stable in core Compose. The old experimental Modifier.meshGradient is removed; do not look for it.
The API is concise. Specify rows and columns, then call setVertex to position each point and assign a color:
val gradientPainter = remember {
MeshGradientPainter(rows = 2, columns = 2) {
setVertex(0, 0, Offset(0f, 0f), Color.Blue)
setVertex(0, 1, Offset(1f, 0f), Color.Cyan)
setVertex(1, 0, Offset(0f, 1f), Color.White)
setVertex(1, 1, Offset(1f, 1f), Color.Blue)
}
}
Image(
painter = gradientPainter,
contentDescription = null,
modifier = Modifier.fillMaxWidth().aspectRatio(16f / 9f)
)
Each vertex also accepts rightControlPoint and bottomControlPoint offsets for Bezier curve shaping — something SwiftUI’s API does not expose. The lambda runs in a DrawScope, so it can observe mutable state: animate positions and colors over time without reallocating shaders. If you have been using a third-party mesh gradient library, you can drop it. See the official mesh gradient documentation for the full API reference.
Wide Color Gamut: Display P3 Stops Getting Clamped
Before 1.12, defining a color in Display P3 meant Compose’s pipeline quietly clamped it to sRGB. You got a less vibrant output with no warning. That is fixed.
Full pipeline support for Wide Color Gamut (P3) and HDR rendering is now enabled across Compose graphics, paint, and shaders. Colors in non-sRGB color spaces pass through to platform rendering intact. Safe fallbacks apply: apps on Android 9 (API 28) and below get automatic sRGB conversion. One edge case: Bt2020Hlg falls back to sRGB on Android 13 and below.
The practical impact is largest for photo editors, creative tools, and game UIs routing through a View layer to get real HDR colors. That workaround is no longer necessary.
Grid Named Areas: Layouts Without Index Arithmetic
Compose 1.12 ships named areas for the Grid component, still under @OptIn(ExperimentalGridApi::class). Define region names in GridConfigurationScope and position composables by name instead of tracking row and column indices:
@OptIn(ExperimentalGridApi::class)
Grid(
configuration = {
areas("header", row = 0, columns = 0..1)
areas("sidebar", row = 1, column = 0)
areas("content", row = 1, column = 1)
},
gap = 16.dp
) {
HeaderSection(modifier = Modifier.gridItem(areaId = "header"))
Sidebar(modifier = Modifier.gridItem(areaId = "sidebar"))
MainContent(modifier = Modifier.gridItem(areaId = "content"))
}
The API is still experimental — expect it to shift before GA, likely in Compose 1.13 around November 2026. For complex adaptive layouts today it is useful, but pin your expectations on the surface stabilizing before committing to it in production.
onFirstVisible Is Deprecated — Here Is the Fix
Modifier.onFirstVisible() is deprecated and its removal is now enforced in 1.12. The reason: inside lazy layouts, it fired every time an item scrolled out and back into view. The “first” semantics could not be guaranteed, and the name created false confidence.
Migration is one modifier swap plus a boolean in your ViewModel:
// Before
Modifier.onFirstVisible { trackImpression() }
// After
var wasVisible by remember { mutableStateOf(false) }
Modifier.onVisibilityChanged { isVisible ->
if (isVisible && !wasVisible) {
wasVisible = true
trackImpression()
}
}
Quick Wins in This Release
KeyboardType gains four new variants: Date, Time, DateTime, and SignedDecimal — long-overdue additions that remove the need for custom keyboard type workarounds. The testing library gains hasPendingWork, which passively checks pending UI work without advancing the clock, cutting flakiness from manual animation tests. SoundEffectOnInteraction enables automatic click and focus-navigation sounds in Compose components by default; wrap with the new composable to opt out if your app handles audio manually. Downloadable variable fonts from Google Fonts now work with zero-config font variation settings in FontFamily.
Verdict: Upgrade Now or Wait
If your project is on compileSdk 37 and AGP 9.2.0, bump the BOM to 2026.08.00 and run your tests. Mesh gradients and WCG support are material improvements with no behavior-change risk on existing screens. If you are not on API 37 yet, do not pull Compose 1.12 in isolation — do the toolchain upgrade properly first. Either way, onFirstVisible needs to go before the next release. Start with the official August 2026 release post and the full Compose UI release notes for the complete changelog.













