Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Generates an app icon for macOS or iOS — a fast CoreGraphics placeholder and/or flat layered source art to finish in Icon Composer (the Liquid Glass / iOS 26+ standard). Produces appearance variants (light/dark/tinted) and installs into the asset catalog. Use when the user wants to create, generate, iterate, or update an app icon.
.claude/skills/rshankras-app-icon-generator/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-05 | ✗→✓ | ▲ Improved | 228% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 208% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 175% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 353% | 0% |
| case-16 | ✗→✓ | ▲ Improved | 599% | 0% |
Generate an app icon programmatically with a CoreGraphics Swift script, resize it to every required size, and install it into the Xcode asset catalog — with appearance variants (light/dark/tinted).
> Apple icon standards verified as of July 2026 — Icon Composer, Xcode 26, macOS Tahoe 26.4+. This guidance is static (the skill does no per-run web lookup); if that date is well in the past or the OS has moved on, re-verify against the HIG · App icons before trusting the specifics below.
Apple's shippable icon format changed. On iOS 26 / macOS 26 the modern app icon is a layered, light-responsive Liquid Glass icon authored in Icon Composer (free; ships with Xcode 26, needs macOS Tahoe 26.4+). You supply flat artwork in up to four depth groups (background → foreground); the system renders the glass — specular highlights, refraction, translucency, shadows — and masks the rounded-rect shape. One .icon file adapts across iPhone, iPad, Mac, and Apple Watch and across Default / Dark / Mono (tinted) appearances.
So this skill does NOT produce the final iOS 26 icon. Icon Composer is GUI-first; no script can author a true layered .icon. Its two honest roles are:
.icon.What changed vs. the classic flow:
drawShine/drawShadow blocks below are legacy-only, off by default for iOS 26+ targets.)Detect the target first: read the deployment target (IPHONEOS_DEPLOYMENT_TARGET / MACOSX_DEPLOYMENT_TARGET in the pbxproj, or .planning/APP.md). iOS 26+ / macOS 26+ → lead with the Icon Composer handoff and treat the flat PNG as a placeholder. Older targets → the classic flat + appearances path is fine to ship. If the deployment target is newer than the "verified as of" date above, flag it to the user and re-verify the icon rules against the current HIG before generating — the skill won't know about anything Apple shipped after that date.
Use this skill when the user:
Glob: **/Assets.xcassets/AppIcon.appiconset/Contents.jsonContents.json to understand required sizesGather app information to customize the icon:
Read: .planning/APP.md (if exists — app definition)
Read: .planning/CODEBASE.md (if exists — app description)
Grep: "CFBundleName" or app name in project filesIf no planning files exist, ask the user.
Ask via AskUserQuestion:
"What category best describes your app?"
"What visual style do you prefer?"
"What color palette fits your app?"
"What accent color for the focal element?"
Read apple-hig-icons.md before generating.
Timeless rules (all eras):
Liquid Glass era rules (iOS 26 / macOS 26):
Design-layer guidance from Apple's icon sessions (WWDC25) plus evergreen craft tests. The numbered rules above are the hard constraints; this is how to make the artwork good.
Author three variants — default, dark, mono — and the system derives six renders: default, dark, clear light/dark, tinted light/dark. Preview all six before shipping.
.icon into Xcode.Based on the user's answers (or app context), select:
Create a self-contained Swift script at scripts/generate-icon.swift that:
import AppKit and CoreGraphics (no dependencies)icon-variants/ directoryScript structure:
swift#!/usr/bin/env swift import AppKit import CoreGraphics let size: CGFloat = 1024 // ... helper functions (gradients, glows, shapes) // ... variant generation functions // ... save and output
Design building blocks (combine these based on category/style):
| Building Block | Function | Use For | |---------------|----------|---------| | drawGradientBackground | Linear gradient fill | All icons | | drawRadialGlow | Soft colored glow behind focal element | Adding depth | | drawCircle | Filled/stroked circle | Record buttons, dots, orbs | | drawRoundedRect | Rounded rectangle | Screens, cards, containers | | drawRing | Circle outline | Borders, focus rings | | drawBrackets | Corner bracket marks | Viewfinders, capture | | drawMonitor | Screen + stand shape | Screen/display apps | | drawShield | Shield outline | Security/privacy apps | | drawGear | Gear/cog shape | Settings/utility apps | | drawWaveform | Audio waveform bars | Audio/music apps | | drawDocument | Page with fold corner | Document/writing apps | | drawShine | Elliptical specular highlight | ⚠️ Legacy only — off for iOS 26+ (system paints its own specular) | | drawShadow | Drop shadow beneath element | ⚠️ Legacy only — off for iOS 26+ (system casts its own shadow) |
bashswift scripts/generate-icon.swift
Show all 3 variants to the user using the Read tool (Claude can view images). Ask the user to pick one, or request adjustments.
Once the user picks a variant:
sips (built into macOS):For macOS (10 sizes):
bashsips -z 16 16 master.png --out icon_16x16.png sips -z 32 32 master.png --out icon_16x16@2x.png sips -z 32 32 master.png --out icon_32x32.png sips -z 64 64 master.png --out icon_32x32@2x.png sips -z 128 128 master.png --out icon_128x128.png sips -z 256 256 master.png --out icon_128x128@2x.png sips -z 256 256 master.png --out icon_256x256.png sips -z 512 512 master.png --out icon_256x256@2x.png sips -z 512 512 master.png --out icon_512x512.png sips -z 1024 1024 master.png --out icon_512x512@2x.png
For iOS (single 1024x1024):
bashcp master.png icon_1024x1024.png
For macOS:
json{ "images": [ { "filename": "icon_16x16.png", "idiom": "mac", "scale": "1x", "size": "16x16" }, { "filename": "icon_16x16@2x.png", "idiom": "mac", "scale": "2x", "size": "16x16" }, { "filename": "icon_32x32.png", "idiom": "mac", "scale": "1x", "size": "32x32" }, { "filename": "icon_32x32@2x.png", "idiom": "mac", "scale": "2x", "size": "32x32" }, { "filename": "icon_128x128.png", "idiom": "mac", "scale": "1x", "size": "128x128" }, { "filename": "icon_128x128@2x.png", "idiom": "mac", "scale": "2x", "size": "128x128" }, { "filename": "icon_256x256.png", "idiom": "mac", "scale": "1x", "size": "256x256" }, { "filename": "icon_256x256@2x.png", "idiom": "mac", "scale": "2x", "size": "256x256" }, { "filename": "icon_512x512.png", "idiom": "mac", "scale": "1x", "size": "512x512" }, { "filename": "icon_512x512@2x.png", "idiom": "mac", "scale": "2x", "size": "512x512" } ], "info": { "author": "xcode", "version": 1 } }
For iOS (single size, system generates others):
json{ "images": [ { "filename": "icon_1024x1024.png", "idiom": "universal", "platform": "ios", "size": "1024x1024" } ], "info": { "author": "xcode", "version": 1 } }
xcodebuild build -scheme <scheme> -destination 'platform=<platform>' -quietAppearance variants (iOS 18+, scriptable). For the flat path, generate three 1024 PNGs — light (default), dark, and a monochrome/tinted mark — and declare them so the icon adapts to the user's Home screen:
json{ "images": [ { "filename": "icon_light.png", "idiom": "universal", "platform": "ios", "size": "1024x1024" }, { "filename": "icon_dark.png", "idiom": "universal", "platform": "ios", "size": "1024x1024", "appearances": [ { "appearance": "luminosity", "value": "dark" } ] }, { "filename": "icon_tinted.png", "idiom": "universal", "platform": "ios", "size": "1024x1024", "appearances": [ { "appearance": "luminosity", "value": "tinted" } ] } ], "info": { "author": "xcode", "version": 1 } }
Icon Composer handoff (iOS 26+ / the shippable icon). The flat PNGs above are a placeholder. For the real Liquid Glass icon:
.icon and add it to the target (it replaces the AppIcon set). Icon Composer also exports a flattened 1024 PNG for App Store marketing.This is a manual GUI step by design — the skill prepares the layers and hands off; it does not author the .icon.
An icon that "looks fine" as a 1024px file on a neutral canvas can still fail on a real Home Screen. All three checks below caught real shipped bugs:
sips -Z 120 each variant and Read the small render — that's the size users see. Subtle contrast that survives at 1024 dies at 60.scripts/generate-icon.swift for future regenerationicon-variants/ directory (or add to .gitignore)>_, code braces {}, or gearAfter completion, report:
Icon installed!
Type: [placeholder flat icon | classic icon + appearances]
Master: scripts/generate-icon.swift (re-run to regenerate)
Sizes: [list] · appearances: [light/dark/tinted]
Location: [path to AppIcon.appiconset]
⚠️ For an iOS 26+ / macOS 26+ target this is a PLACEHOLDER. Finish the real
Liquid Glass icon in Icon Composer (see the handoff step) before submitting.
Build and run to see it: Home screen (iOS) · menu bar / Finder / Spotlight (macOS).If the user wants changes:
swift scripts/generate-icon.swiftCommon adjustment requests:
Other measured skills in the registry, with their headline benchmark lift.