Find Compose stability and recomposition issues
org.openrewrite.kotlin.compose.Compose$KtRecipeio.moderne.recipe:recipes-kotlinSearch-only recipes that surface Jetpack Compose anti-patterns the Android docs and Compose stability guide call out: unstable parameter types, mutable classes annotated @Stable/@Immutable, inline Modifier allocations, missing remember keys, effect-handler misuse, navigation inside composable bodies, single-child layout wrappers, lazy-list items without keys, and API-shape violations. Each match is a SearchResult for human review — Compose remedies are judgement calls (hoist? wrap? annotate? split?) that depend on context outside any one expression. For diff-only output on the small autofix set, use ImproveKotlinCompose.
Usage
This recipe has no required configuration options. You’ll need the Moderne CLI configured before running the command below.
mod run . --recipe org.openrewrite.kotlin.compose.Compose$KtRecipeIf the recipe isn’t available locally, install it with:
mod config recipes jar install io.moderne.recipe:recipes-kotlin:0.2.0Definition
This recipe runs the following recipes in order.
- Find Compose stability issues
org.openrewrite.kotlin.compose.FindComposeStabilityIssues$KtRecipe - Find Compose
Modifiersmellsorg.openrewrite.kotlin.compose.FindComposeModifierIssues$KtRecipe - Find Compose layout hierarchy smells
org.openrewrite.kotlin.compose.FindComposeLayoutIssues$KtRecipe - Find Compose state read/write issues
org.openrewrite.kotlin.compose.FindComposeStateReadIssues$KtRecipe - Find Compose
rememberkey issuesorg.openrewrite.kotlin.compose.FindComposeRememberIssues$KtRecipe - Find Compose effect handler issues
org.openrewrite.kotlin.compose.FindComposeEffectIssues$KtRecipe - Find Compose navigation / coroutine misuse
org.openrewrite.kotlin.compose.FindComposeNavigationIssues$KtRecipe - Find Compose API design issues
org.openrewrite.kotlin.compose.FindComposeApiDesignIssues$KtRecipe - Find Compose ViewModel wiring issues
org.openrewrite.kotlin.compose.FindComposeViewModelIssues$KtRecipe - Find Compose
Modifierordering smellsorg.openrewrite.kotlin.compose.FindModifierOrderingSmells$KtRecipe - Find
Modifier.padding(...)shorthand opportunitiesorg.openrewrite.kotlin.compose.FindModifierShorthands$KtRecipe - Find Compose state + remember misuse
org.openrewrite.kotlin.compose.FindStateAndRememberSmells$KtRecipe - Find Compose effect-handler misuse
org.openrewrite.kotlin.compose.FindSideEffectSmells$KtRecipe - Find Compose recomposition smells
org.openrewrite.kotlin.compose.FindRecompositionSmells$KtRecipe - Find lifecycle-naive flow / LiveData collection in Composables
org.openrewrite.kotlin.compose.FindLifecycleAwareFlowSmells$KtRecipe - Find Compose function-naming conventions
org.openrewrite.kotlin.compose.FindComposableConventionSmells$KtRecipe - Find hardcoded color literals inside
@Composableorg.openrewrite.kotlin.compose.FindHardcodedDesignTokens$KtRecipe - Find
remember { mutableStateOf(emptyList/Map()) }candidates for snapshot-aware containersorg.openrewrite.kotlin.compose.UseSpecializedComposeStateContainers$KtRecipe - Find single-child wrapper composables (Material 3)
org.openrewrite.kotlin.compose.FindUnnecessaryComposeWrappers$KtRecipe
Data tables
Structured output this recipe can produce.
- Source files that had resultsSource files that were modified by the recipe run.
org.openrewrite.table.SourcesFileResults - Source files that had search resultsSearch results that were found during the recipe run.
org.openrewrite.table.SearchResults - Source files that errored on a recipeThe details of all errors produced by a recipe run.
org.openrewrite.table.SourcesFileErrors - Recipe performanceStatistics used in analyzing the performance of recipes.
org.openrewrite.table.RecipeRunStats