Imported from krutikjain/android-agent-skills (
skills/android-coil-compose/SKILL.md). Install upstream withnpx skills add krutikjain/android-agent-skills --skill android-coil-compose. Copyright stays with the author.
Android Coil Compose
When To Use
- Use this skill when the request is about: coil compose image loading, asyncimage android compose, rememberasyncimagepainter android.
- Primary outcome: Use Coil in Jetpack Compose with
AsyncImage, painter variants, sizing, and accessible image loading patterns. - Reach for this skill when the work is specifically about image loading, placeholders, error states, sizing, or list performance in Compose.
- Read
references/patterns.mdfor theAsyncImagevs painter vs subcomposition decision guide. - Read
references/scenarios.mdfor list-performance and screenshot-stable validation paths. - Handoff skills when the scope expands:
android-compose-foundationsandroid-compose-performance
Workflow
- Identify whether the UI needs a simple image surface, low-level painter access, or custom slot-based loading states.
- Prefer
AsyncImagefirst, then drop down to painter APIs only when the component truly needs them. - Constrain size, placeholders, and content description so the image behavior is both performant and accessible; for painter APIs, supply an explicit size resolver when needed.
- Check list rendering, state churn, and visual fallbacks before considering the implementation done, and confirm that remote data or decoder modules are actually present when the source type needs them.
- Hand off general Compose layout or broader performance issues to the neighboring skills after the image pipeline is stable.
Guardrails
- Prefer
AsyncImagefor most Compose surfaces. - Keep image requests sized to the rendered UI surface when possible.
- Provide meaningful accessibility behavior: descriptive
contentDescriptionfor informative images,nullfor decorative ones. - Avoid subcomposition-heavy image patterns in scroll-heavy lists unless the UX truly needs them.
- If you need painter state directly, remember that
rememberAsyncImagePainterdoes not infer on-screen size by itself.
Anti-Patterns
- Loading full-size remote assets into tiny list items.
- Using
SubcomposeAsyncImageeverywhere when a simple placeholder is enough. - Treating image loading failures as silent no-ops with no error fallback.
- Forgetting accessibility semantics on actionable or informative images.
Review Focus
- API choice:
AsyncImage,rememberAsyncImagePainter, orSubcomposeAsyncImage. - Correct sizing and request construction for the rendered surface.
- Remote-loading prerequisites such as the right Coil network modules.
- Stable placeholders and error states for lists, tests, and screenshots.
Examples
Happy path
- Scenario: Build the Compose fixture and verify a stable
AsyncImagesurface renders in the task board. - Command:
bash skills/android-coil-compose/scripts/run_examples.sh
Edge case
- Scenario: Review a list cell where placeholders, sizing, and lazy-list performance all matter.
- Command:
cd examples/orbittasks-compose && ./gradlew :app:testDebugUnitTest
Failure recovery
- Scenario: Re-check the image surface after a placeholder or error-state change using screenshot-friendly validation.
- Command:
cd examples/orbittasks-compose && ./gradlew verifyRoborazziDebug
Done Checklist
AsyncImageis the default unless a lower-level painter API is justified.- Sizing, placeholders, and error states are explicit.
- Accessibility behavior is intentional.
- List and screenshot behavior has been validated on the Compose fixture.