Claude-skill-registry app-icon-generator
Generates app icons in all required sizes for iOS, Android, and PWA from a single source image. Use when user asks to "generate app icons", "create ios icons", "android app icons", "favicon", or "pwa icons".
git clone https://github.com/majiayu000/claude-skill-registry
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/app-icon-generator" ~/.claude/skills/majiayu000-claude-skill-registry-app-icon-generator && rm -rf "$T"
skills/data/app-icon-generator/SKILL.md- uses sudo
- global npm install
App Icon Generator
Generates app icons in all required sizes for iOS, Android, PWA, and web from a single source image.
When to Use
- "Generate app icons for iOS"
- "Create Android app icons"
- "Generate all icon sizes"
- "Create favicon"
- "PWA icons"
- "App icon set"
Instructions
1. Verify Source Image
Check for source icon file:
# Look for icon source find . -name "*icon*.png" -o -name "*logo*.png"
Source image requirements:
- Minimum 1024x1024 pixels (recommended)
- Square (1:1 aspect ratio)
- PNG format with transparency (if needed)
- High quality, not compressed
- No text too close to edges (safe area: center 70%)
Present findings and ask for source if not found.
2. Check for Image Processing Tools
Verify available tools:
# Check for ImageMagick which convert || echo "ImageMagick not found" # Check for sharp-cli which sharp || echo "sharp-cli not found" # Check for sips (macOS) which sips || echo "sips not found (macOS only)"
Installation guide if needed:
# macOS brew install imagemagick # Ubuntu/Debian sudo apt-get install imagemagick # Node.js (cross-platform, recommended) npm install -g sharp-cli
3. Generate iOS Icons
iOS requires multiple sizes:
# iOS App Icons (all required sizes) declare -a ios_sizes=( "20" # iPhone Notification (2x, 3x) "29" # iPhone Settings (2x, 3x) "40" # iPhone Spotlight (2x, 3x) "60" # iPhone App (2x, 3x) "76" # iPad App (1x, 2x) "83.5" # iPad Pro App (2x) "1024" # App Store ) # Generate using ImageMagick for size in "${ios_sizes[@]}"; do convert icon-source.png -resize ${size}x${size} "ios/icon-${size}.png" # Generate 2x size2x=$((size * 2)) convert icon-source.png -resize ${size2x}x${size2x} "ios/icon-${size}@2x.png" # Generate 3x (for relevant sizes) if [[ $size -eq 20 || $size -eq 29 || $size -eq 40 || $size -eq 60 ]]; then size3x=$((size * 3)) convert icon-source.png -resize ${size3x}x${size3x} "ios/icon-${size}@3x.png" fi done
Or using sharp-cli:
# Generate all iOS sizes sharp -i icon-source.png -o ios/icon-{size}.png \ resize 20 40 60 58 80 87 120 180 76 152 167 1024
Contents.json for Xcode:
{ "images": [ { "size": "20x20", "idiom": "iphone", "filename": "icon-40.png", "scale": "2x" }, { "size": "20x20", "idiom": "iphone", "filename": "icon-60.png", "scale": "3x" }, { "size": "29x29", "idiom": "iphone", "filename": "icon-58.png", "scale": "2x" }, { "size": "29x29", "idiom": "iphone", "filename": "icon-87.png", "scale": "3x" }, { "size": "40x40", "idiom": "iphone", "filename": "icon-80.png", "scale": "2x" }, { "size": "40x40", "idiom": "iphone", "filename": "icon-120.png", "scale": "3x" }, { "size": "60x60", "idiom": "iphone", "filename": "icon-120.png", "scale": "2x" }, { "size": "60x60", "idiom": "iphone", "filename": "icon-180.png", "scale": "3x" }, { "size": "1024x1024", "idiom": "ios-marketing", "filename": "icon-1024.png", "scale": "1x" } ], "info": { "version": 1, "author": "xcode" } }
4. Generate Android Icons
Android adaptive icons:
Android uses adaptive icons with separate foreground and background layers.
# Android icon sizes (in dp) # mdpi = 1x, hdpi = 1.5x, xhdpi = 2x, xxhdpi = 3x, xxxhdpi = 4x # mipmap-mdpi (48x48) convert icon-source.png -resize 48x48 android/mipmap-mdpi/ic_launcher.png # mipmap-hdpi (72x72) convert icon-source.png -resize 72x72 android/mipmap-hdpi/ic_launcher.png # mipmap-xhdpi (96x96) convert icon-source.png -resize 96x96 android/mipmap-xhdpi/ic_launcher.png # mipmap-xxhdpi (144x144) convert icon-source.png -resize 144x144 android/mipmap-xxhdpi/ic_launcher.png # mipmap-xxxhdpi (192x192) convert icon-source.png -resize 192x192 android/mipmap-xxxhdpi/ic_launcher.png # Play Store (512x512) convert icon-source.png -resize 512x512 android/playstore-icon.png
Adaptive icon XML:
<!-- res/mipmap-anydpi-v26/ic_launcher.xml --> <?xml version="1.0" encoding="utf-8"?> <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> <background android:drawable="@color/ic_launcher_background"/> <foreground android:drawable="@mipmap/ic_launcher_foreground"/> </adaptive-icon>
Round icon variant:
# Generate round icons (same sizes) for size in 48 72 96 144 192; do density=$(get_density $size) # mdpi, hdpi, etc. convert icon-source.png -resize ${size}x${size} \ \( +clone -threshold -1 -negate -fill white -draw "circle $((size/2)),$((size/2)) $((size/2)),0" \) \ -alpha off -compose copy_opacity -composite \ "android/mipmap-${density}/ic_launcher_round.png" done
5. Generate PWA Icons
Progressive Web App icons:
# PWA icon sizes sharp -i icon-source.png -o pwa/icon-{size}.png \ resize 72 96 128 144 152 192 384 512 # Also generate maskable icons (with safe area) # Maskable icons need 40% safe area sharp -i icon-source.png -o pwa/icon-{size}-maskable.png \ resize 72 96 128 144 152 192 384 512 \ --extend top=10 bottom=10 left=10 right=10
manifest.json:
{ "name": "My App", "short_name": "App", "icons": [ { "src": "/icons/icon-72.png", "sizes": "72x72", "type": "image/png" }, { "src": "/icons/icon-96.png", "sizes": "96x96", "type": "image/png" }, { "src": "/icons/icon-128.png", "sizes": "128x128", "type": "image/png" }, { "src": "/icons/icon-144.png", "sizes": "144x144", "type": "image/png" }, { "src": "/icons/icon-152.png", "sizes": "152x152", "type": "image/png" }, { "src": "/icons/icon-192.png", "sizes": "192x192", "type": "image/png" }, { "src": "/icons/icon-384.png", "sizes": "384x384", "type": "image/png" }, { "src": "/icons/icon-512.png", "sizes": "512x512", "type": "image/png" }, { "src": "/icons/icon-192-maskable.png", "sizes": "192x192", "type": "image/png", "purpose": "maskable" }, { "src": "/icons/icon-512-maskable.png", "sizes": "512x512", "type": "image/png", "purpose": "maskable" } ] }
6. Generate Favicons
Web favicons (multiple sizes):
# Standard sizes convert icon-source.png -resize 16x16 favicon-16.png convert icon-source.png -resize 32x32 favicon-32.png convert icon-source.png -resize 48x48 favicon-48.png # Create multi-size .ico file convert favicon-16.png favicon-32.png favicon-48.png favicon.ico # Apple touch icon convert icon-source.png -resize 180x180 apple-touch-icon.png # Microsoft tile convert icon-source.png -resize 144x144 mstile-144.png
HTML head tags:
<!-- Favicons --> <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16.png"> <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32.png"> <link rel="icon" type="image/png" sizes="48x48" href="/favicon-48.png"> <link rel="shortcut icon" href="/favicon.ico"> <!-- Apple touch icon --> <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png"> <!-- Android --> <link rel="icon" type="image/png" sizes="192x192" href="/android-chrome-192.png"> <link rel="icon" type="image/png" sizes="512x512" href="/android-chrome-512.png"> <!-- Microsoft --> <meta name="msapplication-TileColor" content="#ffffff"> <meta name="msapplication-TileImage" content="/mstile-144.png">
7. Generate React Native Icons
For React Native apps:
# iOS (place in ios/AppName/Images.xcassets/AppIcon.appiconset/) # Same as iOS native above # Android (place in android/app/src/main/res/) # Same as Android native above
Or use react-native-make:
npx react-native set-icon --path icon-source.png
8. Generate Flutter Icons
Using flutter_launcher_icons:
# pubspec.yaml dev_dependencies: flutter_launcher_icons: ^0.13.1 flutter_launcher_icons: android: "launcher_icon" ios: true image_path: "assets/icon.png" adaptive_icon_background: "#ffffff" adaptive_icon_foreground: "assets/icon-foreground.png"
# Generate icons flutter pub get flutter pub run flutter_launcher_icons
9. Create Automated Script
Complete icon generation script:
#!/bin/bash # generate-icons.sh SOURCE_ICON="icon-source.png" OUTPUT_DIR="generated-icons" # Check if source exists if [ ! -f "$SOURCE_ICON" ]; then echo "Error: Source icon not found: $SOURCE_ICON" exit 1 fi # Create directories mkdir -p "$OUTPUT_DIR"/{ios,android,pwa,web} echo "🎨 Generating app icons..." # iOS icons echo "📱 iOS icons..." for size in 40 60 58 87 80 120 180 76 152 167 1024; do convert "$SOURCE_ICON" -resize ${size}x${size} \ "$OUTPUT_DIR/ios/icon-${size}.png" echo " ✓ ${size}x${size}" done # Android icons echo "🤖 Android icons..." convert "$SOURCE_ICON" -resize 48x48 "$OUTPUT_DIR/android/mdpi.png" convert "$SOURCE_ICON" -resize 72x72 "$OUTPUT_DIR/android/hdpi.png" convert "$SOURCE_ICON" -resize 96x96 "$OUTPUT_DIR/android/xhdpi.png" convert "$SOURCE_ICON" -resize 144x144 "$OUTPUT_DIR/android/xxhdpi.png" convert "$SOURCE_ICON" -resize 192x192 "$OUTPUT_DIR/android/xxxhdpi.png" convert "$SOURCE_ICON" -resize 512x512 "$OUTPUT_DIR/android/playstore.png" echo " ✓ All densities generated" # PWA icons echo "🌐 PWA icons..." for size in 72 96 128 144 152 192 384 512; do convert "$SOURCE_ICON" -resize ${size}x${size} \ "$OUTPUT_DIR/pwa/icon-${size}.png" echo " ✓ ${size}x${size}" done # Favicons echo "🔖 Favicons..." convert "$SOURCE_ICON" -resize 16x16 "$OUTPUT_DIR/web/favicon-16.png" convert "$SOURCE_ICON" -resize 32x32 "$OUTPUT_DIR/web/favicon-32.png" convert "$SOURCE_ICON" -resize 48x48 "$OUTPUT_DIR/web/favicon-48.png" convert "$OUTPUT_DIR/web/favicon-"{16,32,48}.png "$OUTPUT_DIR/web/favicon.ico" convert "$SOURCE_ICON" -resize 180x180 "$OUTPUT_DIR/web/apple-touch-icon.png" echo " ✓ All favicons generated" echo "✅ Icon generation complete!" echo "📁 Icons saved to: $OUTPUT_DIR"
10. Provide Integration Instructions
iOS (Xcode):
- Open Xcode project
- Navigate to Assets.xcassets
- Right-click → New App Icon
- Drag generated icons to appropriate slots
Android (Android Studio):
- Right-click res folder
- New → Image Asset
- Select generated icons
- Configure adaptive icon layers
Web:
- Copy icons to public/icons/ folder
- Update manifest.json with icon paths
- Add favicon links to index.html
React Native:
- Copy iOS icons to
ios/AppName/Images.xcassets/AppIcon.appiconset/ - Copy Android icons to
android/app/src/main/res/mipmap-*/ - Update Contents.json for iOS
Best Practices
Design Guidelines:
- Keep important content in center 80%
- Avoid thin lines (minimum 2px)
- Test on dark and light backgrounds
- Use simple, recognizable shapes
- Avoid text (too small on icons)
- Use bold colors for visibility
Technical Guidelines:
- Source: 1024x1024 minimum
- Format: PNG with transparency
- Color space: sRGB
- No compression on source
- Square aspect ratio
- Safe area for maskable: 40% padding
Testing:
- Test on actual devices
- Check all sizes render correctly
- Verify transparency works
- Test dark mode appearance
- Check adaptive icon animations (Android)
Size Reference
iOS:
- 20pt (40x40, 60x60)
- 29pt (58x58, 87x87)
- 40pt (80x80, 120x120)
- 60pt (120x120, 180x180)
- 76pt (76x76, 152x152)
- 83.5pt (167x167)
- 1024x1024 (App Store)
Android:
- mdpi: 48x48
- hdpi: 72x72
- xhdpi: 96x96
- xxhdpi: 144x144
- xxxhdpi: 192x192
- Play Store: 512x512
PWA:
- 72x72, 96x96, 128x128
- 144x144, 152x152, 192x192
- 384x384, 512x512
Web:
- 16x16, 32x32 (favicon)
- 180x180 (Apple touch)
- 192x192, 512x512 (Android)