compose-multiplatform-patterns
Compose Multiplatform and Jetpack Compose patterns for KMP projects — state management, navigation, theming, performance, and platform-specific UI.
Skill by unrealandychan
Install
Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.
npx agentmarket install skill/unrealandychan-compose-multiplatform-patterns
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Use cases: design
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.
- Tools
- No tools found
- Secrets
- None asked for
- Install scripts
- None found
Network hosts it talks to 1
codeload.github.com· found in install command
Files it touches
~/.claude/skills/compose-multiplatform-patterns
What's inside
- Skill name
compose-multiplatform-patterns- Description
- Compose Multiplatform and Jetpack Compose patterns for KMP projects — state management, navigation, theming, performance, and platform-specific UI. Use when building Compose or Jetpack Compose UI, state, navigation, or theming in a KMP project.
- License
- MIT
- Metadata
- origin: ECC
- Instructions
- 295 lines in SKILL.md · view on GitHub
Files (1)
- SKILL.md
SKILL.md (first lines)
# Compose Multiplatform Patterns
Patterns for building shared UI across Android, iOS, Desktop, and Web using Compose Multiplatform and Jetpack Compose. Covers state management, navigation, theming, and performance.
## When to Activate
- Building Compose UI (Jetpack Compose or Compose Multiplatform)
- Managing UI state with ViewModels and Compose state
- Implementing navigation in KMP or Android projects
- Designing reusable composables and design systems
- Optimizing recomposition and rendering performance
## State Management
### ViewModel + Single State Object
Use a single data class for screen state. Expose it as `StateFlow` and collect in Compose:
```kotlin
data class ItemListState(
val items: List<Item> = emptyList(),
val isLoading: Boolean = false,
val error: String? = null,
val searchQuery: String = ""
)
class ItemListViewModel(
private val getItems: GetItemsUseCase
) : ViewModel() {
private val _state = MutableStateFlow(ItemListState())
val state: StateFlow<ItemListState> = _state.asStateFlow()
fun onSearch(query: String) {
_state.update { it.copy(searchQuery = query) }
loadItems(query)
}
private fun loadItems(query: String) {
viewModelScope.launch {
_state.update { it.copy(isLoading = true) }
getItems(query).fold(
onSuccess = { items -> _state.update { it.copy(items = items, isLoading = false) } },
onFailure = { e -> _state.update { it.copy(error = e.message, isLoading = false) } }
)
}
}
}
```
### Collecting State in Compose
```kotlin
@Composable
fun ItemListScreen(viewModel: ItemListViewModel = koinViewModel()) {
val state by viewModel.state.collectAsStateWithLifecycle()
ItemListContent(
state = state,
onSearch = viewModel::onSearch
)
}
@Composable
private fun ItemListContent(
state: ItemListState,
onSearch: (String) -> Unit
) {
// Stateless composable — easy to preview and test
}
```
### Event Sink Pattern
For complex screens, use a sealed interface for events instead of multiple callback lambdas:
```kotlin
sealed interface ItemListEvent {
data class Search(val query: String) : ItemListEvent
data class Delete(val itemId: String) : ItemListEvent
data object Refresh : ItemListEvent
}
// In ViewModel
fun onEvent(event: ItemListEvent) {
when (event) {
is ItemListEvent.Search -> onSearch(event.query)
is ItemListEvent.Delete -> deleteItem(event.itemId)
is ItemListEvent.Refresh -> loadItems(_state.value.searchQuery)
}
}
// In Composable — single lambda instead of many
ItemListContent(
state = state,
onEvent = viewModel::onEvent
)
```
## Navigation
### Type-Safe Navigation (Compose Navigation 2.8+)
Define routes as `@Serializable` objects:
```kotlin
@Serializable data object HomeRoute
@Serializable data class DetailRoute(val id: String)
@Serializable data object SettingsRoute
@Composable
fun AppNavHost(navController: NavHostController = rememberNavController()) {
NavHost(navController, startDestination = HomeRoute) {
composable<HomeRoute> {
HomeScreen(onNavigateToDetail = { id -> navController.navigate(DetailRoute(id)) })
}
composable<DetailRoute> { backStackEntry ->
val route = backStackEntry.toRoute<DetailRoute>()
DetailScreen(id = route.id)
}From unrealandychan/clean-code-skill, MIT.
More from unrealandychan/clean-code-skill
- 0.594score
codehealth-mcp
unrealandychan
Real-time structural Code Health via CodeScene MCP — review before edits, verify score deltas after changes, gate commits and PRs.
SkillBFreshness: B★ 12Claude Code +9 - 0.594score
code-tour
unrealandychan
Create CodeTour `.tour` files — persona-targeted, step-by-step walkthroughs with real file and line anchors.
SkillBFreshness: B★ 12Claude Code +9 - 0.594score
codebase-onboarding
unrealandychan
Analyze an unfamiliar codebase and generate a structured onboarding guide with architecture map, key entry points, conventions, and a starter CLAUDE.md.
SkillBFreshness: B★ 12Claude Code +9 - 0.594score
code-review
unrealandychan
Performs rigorous 5-axis code reviews across Correctness, Readability, Architecture, Security, and Performance.
SkillBFreshness: B★ 12Claude Code +9 - 0.594score
config-gc
unrealandychan
Garbage collection for your Claude Code configuration.
SkillBFreshness: B★ 12Claude Code +9 - 0.587score
configure-ecc
unrealandychan
Guide ECC installation, update, or reconfiguration from inside Claude Code, Codex, or Kimi while respecting each harness's real plugin, scope, and hook…
SkillBFreshness: B★ 12Claude Code +9 - 0.585score
coding-standards
unrealandychan
Baseline cross-project coding conventions for naming, readability, immutability, and code-quality review.
SkillBFreshness: B★ 12Claude Code +9
Signals
- Stars
- 12
- Forks
- 1
- Open issues
- 0
- Last commit (this folder)
- Sep 8, 2026 (1 month ago)
- Last release
- Apr 17, 2026 (6 months ago)
From GitHub (fetched Oct 24, 2026).
Details
- License
- MIT
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
- Source
- GitHubgithub-graphql
More from unrealandychan
- 0.594score
codehealth-mcp
unrealandychan
Real-time structural Code Health via CodeScene MCP — review before edits, verify score deltas after changes, gate commits and PRs.
SkillBFreshness: B★ 12Claude Code +9 - 0.594score
code-tour
unrealandychan
Create CodeTour `.tour` files — persona-targeted, step-by-step walkthroughs with real file and line anchors.
SkillBFreshness: B★ 12Claude Code +9 - 0.594score
codebase-onboarding
unrealandychan
Analyze an unfamiliar codebase and generate a structured onboarding guide with architecture map, key entry points, conventions, and a starter CLAUDE.md.
SkillBFreshness: B★ 12Claude Code +9 - 0.594score
code-review
unrealandychan
Performs rigorous 5-axis code reviews across Correctness, Readability, Architecture, Security, and Performance.
SkillBFreshness: B★ 12Claude Code +9 - 0.594score
config-gc
unrealandychan
Garbage collection for your Claude Code configuration.
SkillBFreshness: B★ 12Claude Code +9 - 0.587score
configure-ecc
unrealandychan
Guide ECC installation, update, or reconfiguration from inside Claude Code, Codex, or Kimi while respecting each harness's real plugin, scope, and hook…
SkillBFreshness: B★ 12Claude Code +9
Cite this page
compose-multiplatform-patterns skill. Agent Mart. https://agentmart.dev/skills/unrealandychan-compose-multiplatform-patterns (last updated 2026-10-24)