app-iconlisted
Install: claude install-skill MohamedAbdallah-14/prompt-to-asset
# App icon generation
## Platform requirements (non-negotiable)
| Platform | Size/format | Transparency | Safe zone |
|---|---|---|---|
| **iOS App Store** | 1024×1024 PNG, **no alpha** | **opaque** | squircle mask applied by OS; keep subject in 824px center |
| iOS device | 180, 167, 152, 120, 87, 80, 76, 60, 58, 40, 29, 20 (@1x, @2x, @3x) | opaque | same |
| iOS 18 dark / tinted | Icon Composer layered source | per-layer | same |
| **Android adaptive** | 108 dp foreground + 108 dp background; 72 dp visible safe zone | FG yes / BG no | 72 dp of 108 dp |
| Android 13 monochrome | themed drawable | yes | same |
| Google Play | 512×512 PNG, no alpha | opaque | — |
| **PWA** | 192, 512 `any`; 512 `maskable` | `maskable`: opaque + 80% safe zone | 80% of 512 for maskable |
| **visionOS** | 3× 1024² PNGs (parallax layers) | per-layer | — |
## Generation — mark, then pack
**Never generate per-platform. Always: one 1024² RGBA master → deterministic fan-out.**
1. Route the *mark* generation (see `skills/logo/SKILL.md`) — no text; subject-only.
2. Matte with BiRefNet if the chosen provider returned opaque.
3. Deterministic export via `pipeline/export.ts::exportAppIconBundle` (pure `sharp` — no external CLI dependency):
- **iOS:** `AppIcon.appiconset/Contents.json` + every required PNG (iPhone/iPad/Mac/Watch/marketing). 1024 marketing variant flattened onto brand primary color (App Store rejects alpha). iOS 18 dark/tinted `appearances` emitted when `ios_18_appearances: true`.