{"id":"1025430d-e3b6-410c-889d-e4f616dfa838","shortId":"R4MeKS","kind":"skill","title":"android-coil-compose","tagline":"Use Coil in Jetpack Compose with AsyncImage, painter variants, sizing, and accessible image loading patterns.","description":"# Android Coil Compose\n\n## When To Use\n- Use this skill when the request is about: coil compose image loading, asyncimage android compose, rememberasyncimagepainter android.\n- Primary outcome: Use Coil in Jetpack Compose with `AsyncImage`, painter variants, sizing, and accessible image loading patterns.\n- Reach for this skill when the work is specifically about image loading, placeholders, error states, sizing, or list performance in Compose.\n- Read `references/patterns.md` for the `AsyncImage` vs painter vs subcomposition decision guide.\n- Read `references/scenarios.md` for list-performance and screenshot-stable validation paths.\n- Handoff skills when the scope expands:\n- `android-compose-foundations`\n- `android-compose-performance`\n\n## Workflow\n1. Identify whether the UI needs a simple image surface, low-level painter access, or custom slot-based loading states.\n2. Prefer `AsyncImage` first, then drop down to painter APIs only when the component truly needs them.\n3. 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.\n4. 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.\n5. Hand off general Compose layout or broader performance issues to the neighboring skills after the image pipeline is stable.\n\n## Guardrails\n- Prefer `AsyncImage` for most Compose surfaces.\n- Keep image requests sized to the rendered UI surface when possible.\n- Provide meaningful accessibility behavior: descriptive `contentDescription` for informative images, `null` for decorative ones.\n- Avoid subcomposition-heavy image patterns in scroll-heavy lists unless the UX truly needs them.\n- If you need painter state directly, remember that `rememberAsyncImagePainter` does not infer on-screen size by itself.\n\n## Anti-Patterns\n- Loading full-size remote assets into tiny list items.\n- Using `SubcomposeAsyncImage` everywhere when a simple placeholder is enough.\n- Treating image loading failures as silent no-ops with no error fallback.\n- Forgetting accessibility semantics on actionable or informative images.\n\n## Review Focus\n- API choice: `AsyncImage`, `rememberAsyncImagePainter`, or `SubcomposeAsyncImage`.\n- Correct sizing and request construction for the rendered surface.\n- Remote-loading prerequisites such as the right Coil network modules.\n- Stable placeholders and error states for lists, tests, and screenshots.\n\n## Examples\n### Happy path\n- Scenario: Build the Compose fixture and verify a stable `AsyncImage` surface renders in the task board.\n- Command: `bash skills/android-coil-compose/scripts/run_examples.sh`\n\n### Edge case\n- Scenario: Review a list cell where placeholders, sizing, and lazy-list performance all matter.\n- Command: `cd examples/orbittasks-compose && ./gradlew :app:testDebugUnitTest`\n\n### Failure recovery\n- Scenario: Re-check the image surface after a placeholder or error-state change using screenshot-friendly validation.\n- Command: `cd examples/orbittasks-compose && ./gradlew verifyRoborazziDebug`\n\n## Done Checklist\n- `AsyncImage` is the default unless a lower-level painter API is justified.\n- Sizing, placeholders, and error states are explicit.\n- Accessibility behavior is intentional.\n- List and screenshot behavior has been validated on the Compose fixture.\n\n## Official References\n- [https://coil-kt.github.io/coil/compose/](https://coil-kt.github.io/coil/compose/)\n- [https://coil-kt.github.io/coil/image_requests/](https://coil-kt.github.io/coil/image_requests/)\n- [https://coil-kt.github.io/coil/network/](https://coil-kt.github.io/coil/network/)\n- [https://developer.android.com/develop/ui/compose/graphics/images/loading](https://developer.android.com/develop/ui/compose/graphics/images/loading)\n- [https://developer.android.com/develop/ui/compose/accessibility](https://developer.android.com/develop/ui/compose/accessibility)","tags":["android","coil","compose","agent","skills","krutikjain","agent-skills","android-development","android-skills","androidx","claude-code","codex"],"capabilities":["skill","source-krutikjain","skill-android-coil-compose","topic-agent-skills","topic-android","topic-android-development","topic-android-skills","topic-androidx","topic-claude-code","topic-codex","topic-cursor","topic-jetpack-compose","topic-kotlin","topic-skills"],"categories":["android-agent-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/krutikJain/android-agent-skills/android-coil-compose","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add krutikJain/android-agent-skills","source_repo":"https://github.com/krutikJain/android-agent-skills","install_from":"skills.sh"}},"qualityScore":"0.454","qualityRationale":"deterministic score 0.45 from registry signals: · indexed on github topic:agent-skills · 8 github stars · SKILL.md body (4,044 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T19:13:26.622Z","embedding":null,"createdAt":"2026-05-18T13:20:48.419Z","updatedAt":"2026-05-18T19:13:26.622Z","lastSeenAt":"2026-05-18T19:13:26.622Z","tsv":"'/coil/compose/](https://coil-kt.github.io/coil/compose/)':495 '/coil/image_requests/](https://coil-kt.github.io/coil/image_requests/)':498 '/coil/network/](https://coil-kt.github.io/coil/network/)':501 '/develop/ui/compose/accessibility](https://developer.android.com/develop/ui/compose/accessibility)':507 '/develop/ui/compose/graphics/images/loading](https://developer.android.com/develop/ui/compose/graphics/images/loading)':504 '/gradlew':424,452 '1':119 '2':141 '3':158 '4':184 '5':215 'access':16,56,133,173,255,337,476 'action':340 'actual':207 'android':2,20,39,42,111,115 'android-coil-compos':1 'android-compose-found':110 'android-compose-perform':114 'anti':302 'anti-pattern':301 'api':150,176,346,466 'app':425 'asset':309 'asyncimag':11,38,51,85,143,237,348,394,456 'avoid':266 'base':138 'bash':402 'behavior':168,256,477,483 'board':400 'broader':222 'build':386 'case':405 'cd':422,450 'cell':410 'chang':443 'check':185,432 'checklist':455 'choic':347 'churn':189 'coil':3,6,21,34,46,369 'coil-kt.github.io':494,497,500 'coil-kt.github.io/coil/compose/](https://coil-kt.github.io/coil/compose/)':493 'coil-kt.github.io/coil/image_requests/](https://coil-kt.github.io/coil/image_requests/)':496 'coil-kt.github.io/coil/network/](https://coil-kt.github.io/coil/network/)':499 'command':401,421,449 'compon':154 'compos':4,9,22,35,40,49,80,112,116,219,240,388,489 'confirm':199 'consid':194 'constrain':159 'construct':356 'content':163 'contentdescript':258 'correct':352 'custom':135 'data':202 'decis':90 'decod':204 'decor':264 'default':459 'descript':164,257 'developer.android.com':503,506 'developer.android.com/develop/ui/compose/accessibility](https://developer.android.com/develop/ui/compose/accessibility)':505 'developer.android.com/develop/ui/compose/graphics/images/loading](https://developer.android.com/develop/ui/compose/graphics/images/loading)':502 'direct':288 'done':197,454 'drop':146 'edg':404 'enough':322 'error':73,334,375,441,472 'error-st':440 'everywher':316 'exampl':382 'examples/orbittasks-compose':423,451 'expand':109 'explicit':179,475 'failur':326,427 'fallback':192,335 'first':144 'fixtur':389,490 'focus':345 'forget':336 'foundat':113 'friend':447 'full':306 'full-siz':305 'general':218 'guardrail':235 'guid':91 'hand':216 'handoff':104 'happi':383 'heavi':269,275 'identifi':120 'imag':17,36,57,70,127,167,231,243,261,270,324,343,434 'implement':196 'infer':294 'inform':260,342 'intent':479 'issu':224 'item':313 'jetpack':8,48 'justifi':468 'keep':242 'layout':220 'lazi':416 'lazy-list':415 'level':131,464 'list':77,96,186,276,312,378,409,417,480 'list-perform':95 'load':18,37,58,71,139,304,325,363 'low':130 'low-level':129 'lower':463 'lower-level':462 'matter':420 'meaning':254 'modul':205,371 'need':124,156,183,213,281,285 'neighbor':227 'network':370 'no-op':329 'null':262 'offici':491 'on-screen':295 'one':265 'op':331 'outcom':44 'painter':12,52,87,132,149,175,286,465 'path':103,384 'pattern':19,59,271,303 'perform':78,97,117,171,223,418 'pipelin':232 'placehold':72,161,320,373,412,438,470 'possibl':252 'prefer':142,236 'prerequisit':364 'present':208 'primari':43 'provid':253 're':431 're-check':430 'reach':60 'read':81,92 'recoveri':428 'refer':492 'references/patterns.md':82 'references/scenarios.md':93 'rememb':289 'rememberasyncimagepaint':41,291,349 'remot':201,308,362 'remote-load':361 'render':187,248,359,396 'request':31,244,355 'resolv':181 'review':344,407 'right':368 'scenario':385,406,429 'scope':108 'screen':297 'screenshot':100,381,446,482 'screenshot-friend':445 'screenshot-st':99 'scroll':274 'scroll-heavi':273 'semant':338 'silent':328 'simpl':126,319 'size':14,54,75,160,180,245,298,307,353,413,469 'skill':28,63,105,228 'skill-android-coil-compose' 'skills/android-coil-compose/scripts/run_examples.sh':403 'slot':137 'slot-bas':136 'sourc':211 'source-krutikjain' 'specif':68 'stabl':101,234,372,393 'state':74,140,188,287,376,442,473 'subcomposeasyncimag':315,351 'subcomposit':89,268 'subcomposition-heavi':267 'suppli':177 'surfac':128,241,250,360,395,435 'task':399 'test':379 'testdebugunittest':426 'tini':311 'topic-agent-skills' 'topic-android' 'topic-android-development' 'topic-android-skills' 'topic-androidx' 'topic-claude-code' 'topic-codex' 'topic-cursor' 'topic-jetpack-compose' 'topic-kotlin' 'topic-skills' 'treat':323 'truli':155,280 'type':212 'ui':123,249 'unless':277,460 'use':5,25,26,45,314,444 'ux':279 'valid':102,448,486 'variant':13,53 'verifi':391 'verifyroborazzidebug':453 'visual':191 'vs':86,88 'whether':121 'work':66 'workflow':118","prices":[{"id":"0913d84b-54a7-40f2-b580-5ba4ff7da3a4","listingId":"1025430d-e3b6-410c-889d-e4f616dfa838","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"krutikJain","category":"android-agent-skills","install_from":"skills.sh"},"createdAt":"2026-05-18T13:20:48.419Z"}],"sources":[{"listingId":"1025430d-e3b6-410c-889d-e4f616dfa838","source":"github","sourceId":"krutikJain/android-agent-skills/android-coil-compose","sourceUrl":"https://github.com/krutikJain/android-agent-skills/tree/main/skills/android-coil-compose","isPrimary":false,"firstSeenAt":"2026-05-18T13:20:48.419Z","lastSeenAt":"2026-05-18T19:13:26.622Z"}],"details":{"listingId":"1025430d-e3b6-410c-889d-e4f616dfa838","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"krutikJain","slug":"android-coil-compose","github":{"repo":"krutikJain/android-agent-skills","stars":8,"topics":["agent-skills","android","android-development","android-skills","androidx","claude-code","codex","cursor","jetpack-compose","kotlin","skills"],"license":"mit","html_url":"https://github.com/krutikJain/android-agent-skills","pushed_at":"2026-03-25T05:47:20Z","description":"Android skills repository for Kotlin, Compose, XML, testing, CI, release work, and legacy upgrades","skill_md_sha":"7428622eee1e95aef7c368d3aa19d45eb5284659","skill_md_path":"skills/android-coil-compose/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/krutikJain/android-agent-skills/tree/main/skills/android-coil-compose"},"layout":"multi","source":"github","category":"android-agent-skills","frontmatter":{"name":"android-coil-compose","description":"Use Coil in Jetpack Compose with AsyncImage, painter variants, sizing, and accessible image loading patterns."},"skills_sh_url":"https://skills.sh/krutikJain/android-agent-skills/android-coil-compose"},"updatedAt":"2026-05-18T19:13:26.622Z"}}