Jetpack Compose API guidelines
SkillDev toolsUSE THIS when writing or reviewing Jetpack Compose / Kotlin code in packages/cds-android or apps/android-app - @Composable APIs, Modifier parameters, CompositionLocal, state hoisting, or naming. Not for React or React Native work.
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the Jetpack Compose API guidelines skill
What this skill tells your AI
The instructions your AI receives, as published by coinbase/cds in .claude/skills/jetpack-best-practices/SKILL.md and read by ahel’s review.
references/compose-api-guidelines.md is the official AOSP Compose API guidelines document,
vendored verbatim. Read it before writing or reviewing a Compose API. It is the authority here;
do not invent house style that contradicts it, and do not paraphrase it from memory.
How the requirement levels apply to us
The document assigns different requirement levels to different audiences. CDS Android is
"Library development based on Jetpack Compose" — we publish @Composable functions and
supporting types for other teams to consume. Read the MUST/SHOULD/MAY markers for that audience,
not the app-development ones. In practice we hold close to the framework-development bar, because
anything we ship publicly is expensive to change later.
The rules that come up most in this codebase
These are the ones worth checking on every change. The document explains each in full.
- Every element accepts and respects a
Modifierparameter. It is the first optional parameter, defaults toModifier, is applied to the outermost layout node the element emits, and is used exactly once. Never accept aModifierand drop it. - Composables that emit UI return
Unitand are named as PascalCase nouns (Button,SlideButton) — they declare a piece of UI rather than performing an action. - Hoist state. Prefer stateless composables taking a value plus an
onValueChangecallback over ones that own their state internally. CompositionLocalis for cross-cutting context, not for passing parameters. In this codebase that means theme. A local should have a sensible default and should not be how a caller configures a specific component.- Parameter order: required parameters, then
modifier, then other optional parameters, then a trailing@Composablecontent lambda if there is one. - Default values belong in the signature, so callers can see them and override any one of them independently.
Boundary rules specific to CDS Android
Complementary to the guidelines, not covered by them. packages/cds-android/AGENTS.md is the full
version:
:cdscompiles with Kotlin explicit API mode. Everypublicdeclaration is a customer promise — make it a decision, not a compiler-satisfying reflex, and default tointernal.- Read tokens through
CdsTheme.colors/CdsTheme.space; author themes withcdsTheme { }.LocalCdsThemeis public only so customModifiernodes can read theme outside composition. - Never widen a declaration's visibility just to make
apps/android-appcompile.
Related reading
The separate component API guidelines go deeper on designing individual components (slots, state holders, styling). Not vendored here; consult it when designing a new component from scratch.
Signals
- GitHub stars
- 504
- Forks
- 105
- Last commit
- Sep 2026
Advanced
- Catalog kind
- skill
- Gateway key
jetpack-best-practices- Source
- github.com/coinbase/cds