Help us improve
Share bugs, ideas, or general feedback.
From chrisbanes-skills
Routes Jetpack Compose recomposition investigations to focused skills for stability, deferred reads, or back-writing.
npx claudepluginhub chrisbanes/skills --plugin chrisbanes-skillsHow this skill is triggered — by the user, by Claude, or both
Slash command
/chrisbanes-skills:compose-recomposition-performanceThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Router only — deep fixes live in focused skills below.
Analyzes Jetpack Compose parameter stability, compiler reports, skippability, and Kotlin 2.0+ strong skipping to diagnose unnecessary recompositions.
Guides building Android UIs with Jetpack Compose: project setup, MVVM state management with ViewModels/StateFlow, navigation, performance optimization, Material 3.
Provides Jetpack Compose patterns for state hoisting, remember variants, slot APIs, modifiers, side effects, theming, animations, and performance in Android UI development.
Share bugs, ideas, or general feedback.
Router only — deep fixes live in focused skills below.
State is read — is frame-rate State read during composition vs layout/draw?onSizeChanged (layout phase) writing state read by a sibling in composition.Axes 2 and 3 often overlap (a sibling reading measured size in composition is both a deferred-read violation and a layout → composition back-write). Axis 1 is independent.
| Primary suspicion | Next skill |
|---|---|
Skipping, unstable params, compiler/composables.txt churn | compose-stability-diagnostics |
Frame-rate State read phase (composition vs layout/draw) | compose-state-deferred-reads |
putAll / map rebuild / cross-row height(state) during composition | compose-state-deferred-reads — § back-writing |
| Focus-driven side work in composable body | compose-side-effects — snapshotFlow |
| Evidence for multiple axes | Apply matching skills in parallel |
These changes often do not reduce recomposition count:
| Attempt | Why it fails |
|---|---|
remember(index) { isFirstRow(index) } instead of inline when (index) | Same inputs; no skipping benefit |
| Identity cache for read-only derived maps | Can serve stale overlays; remember(keys) is enough |
mutableIntStateOf + layout modifier on both measured and sibling rows | Sibling still reads size in composition unless measure-only |
Forcing Exactly(1) on both rows in focus-move tests | One row often correctly recomposes 0 times |
| Hoisting without stabilizing lambda captures | New lambda instance each frame still defeats skipping |
compose-state-authoring — authoring mutableState* safely.