Skills for Kotlin, Jetpack Compose, and Android development
Skills
A set of skills for Kotlin, Jetpack Compose, and Android development.
Install
With the skills CLI:
npx skills add chrisbanes/skills
Or install as a Claude Code plugin:
/plugin marketplace add chrisbanes/skills
/plugin install chrisbanes-skills@chrisbanes-skills
Or install as a Codex plugin:
codex plugin marketplace add chrisbanes/skills --ref main
codex plugin add chrisbanes-skills@chrisbanes-skills
Or install as an OpenCode plugin:
{
"plugin": ["chrisbanes-skills@git+https://github.com/chrisbanes/skills.git"]
}
See .opencode/INSTALL.md for details.
Skills
Start here
- Working on Compose state or effects? Start with
compose-state-authoring,compose-state-hoisting,compose-state-holder-ui-split, orcompose-side-effects. - Investigating recomposition, stability, or jank? Start with
compose-recomposition-performance. - Reviewing Flow or coroutine architecture? Start with
kotlin-flow-state-event-modelingorkotlin-coroutines-structured-concurrency.
Routing
using-chrisbanes-skillsโ route broad Kotlin, Android, and Jetpack Compose tasks to the focused skills.
Jetpack Compose
State and side effects
compose-state-authoringโ author Compose local mutable state and read-only composable accessors correctly.compose-state-hoistingโ decide whether Compose UI element state belongs in local remember state, hoisted parameters, a plain state holder class, or a screen-level state holder.compose-state-holder-ui-splitโ split Compose state-holder wiring from plain-state UI for previewable and testable screens.compose-side-effectsโ choose and key Compose effect APIs for event Flow collection, callbacks, cleanup, navigation, snackbar, analytics, and other side effects.
Performance
compose-recomposition-performanceโ route stability, deferred reads, and cross-phase back-writing.compose-stability-diagnosticsโ diagnose Compose compiler reports, strong skipping behavior, unstable parameters, and stability fixes.compose-state-deferred-readsโ move frame-rate reads out of composition; avoid back-writing snapshot state across phases and cross-row measurement reads in composition.
UI API design and layout
compose-modifier-and-layout-styleโ keep Compose layout APIs caller-placeable and modifier chains readable.compose-slot-api-patternโ design reusable Compose components whose variable visual regions are caller-provided slots.compose-animationsโ choose Compose animation APIs for visibility, value targets, coordinated transitions, and content swaps; align with official quick guide and decision tree.compose-focus-navigationโ design and test keyboard, TV, D-pad, and focus-first Compose navigation behavior.
Testing
compose-ui-testing-patternsโ choose between plain UI tests, semantics assertions, key/focus tests, interaction state tests with MutableInteractionSource, screenshot tests, and integration tests.
Kotlin
kotlin-coroutines-structured-concurrencyโ review coroutine scope ownership, init and fire-and-forget boundaries, cancellation handling, and blocking boundaries.kotlin-control-flowโ write and review Kotlin branching with subjectwhen, guard conditions, sealed exhaustiveness, smart casts, nullable branching, and early returns.kotlin-flow-state-event-modelingโ modelStateFlow,SharedFlow,Channel,stateIn, sharing policy, and one-shot events without lossy defaults.kotlin-multiplatform-expect-actualโ design semantic expect/actual and interface boundaries for Kotlin Multiplatform platform interop.kotlin-types-value-classโ choose@JvmInline value classover data class for single-field domain types, including Compose stability implications.
Workflows
shepherdโ autonomously poll open PRs and MRs, triage review comments, detect and fix CI failures, and keep PRs moving forward.
Contributing
Skills live at skills/<skill-name>/SKILL.md, flat (no language nesting). The name: in the SKILL.md frontmatter must match the directory name.
Frontmatter is validated against skills.schema.json โ name and description are required, name must be kebab-case.
Releases
Release versions use SemVer-compatible CalVer: YYYY.M.D without zero-padded month or day values, for example 2026.6.17.
Keep .claude-plugin/plugin.json, .codex-plugin/plugin.json, and new Git release tags on the same version. Existing zero-padded tags from before this policy map to the non-padded manifest version, so 2026.06.16 maps to 2026.6.16. Only bump versions when publishing an installable release.
To publish a release, run the Release workflow from GitHub Actions. Leave the version input empty to use today's UTC YYYY.M.D version, or provide a specific non-zero-padded CalVer value. Use the dry-run option to validate without creating a commit, tag, or GitHub release.
Before pushing, lint skills (frontmatter schema + markdown):
npm install
npm run lint
This also runs on CI for all PRs.
License
[plugins]: https://docs.claude.com/en/docs/claude-code/plugins