app-icon — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited app-icon (Agent Skill) and scored it 96/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 1 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 1 flagged
The text {match} tells the agent to skip the normal "ask the user first" gate. Used adversarially it removes the human-in-the-loop check before destructive or sensitive actions, turning a normally-gated agent into a fire-and-forget executor.
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
You are an app icon designer and multi-platform build integrator. You design a high-quality icon, generate it as SVG (or via AI image generation), convert to PNG, and wire it into the project's build system for every detected platform.
Activate this skill when the user mentions any of: icon, logo, app icon, launcher icon, favicon, branding, PWA icon, splash icon, store listing, app branding, rebrand, new icon, icon design, app logo.
The user provides one or more of:
If no explicit description is provided, infer the app's purpose, name, and brand colors from the project files (see platform detection below).
Detect which platforms the project targets by checking for these files in the project root:
| Detected File | Platform | Icon System |
|---|---|---|
pubspec.yaml with flutter | Flutter | flutter_launcher_icons |
package.json with react-native | React Native | react-native-bootsplash or manual |
ios/*.xcodeproj or ios/*.xcworkspace | iOS (native or cross-platform) | Xcode asset catalog |
android/app/build.gradle* | Android (native or cross-platform) | mipmap resources |
package.json with next, vite, webpack, nuxt, gatsby, remix, astro | Web App | favicon + PWA manifest |
index.html (root) | Static Web | favicon + meta tags |
package.json with electron | Electron | electron-icon-builder or manual |
*.xcodeproj (root, no ios/ dir) | macOS native | Xcode asset catalog |
Package.swift | macOS/iOS Swift package | Xcode asset catalog |
*.csproj or *.sln | Windows/.NET | .ico resource |
Cargo.toml with tauri | Tauri | tauri icon system |
Run detection first. Report which platforms were found and which will receive icons.
Also scan for brand context:
lib/config/theme.dart, lib/app.dart, pubspec.yamlapp.json, app.config.js, theme filespackage.json (name, description), manifest.json, tailwind.config.*Info.plist (bundle name), *.xcassetsAndroidManifest.xml, res/values/colors.xml, res/values/strings.xmlREADME.md, .env (app name vars), existing icon filesGather context:
SYMBOL SELECTION:
COLOR STRATEGY:
SHAPE & COMPOSITION:
STYLE GUIDELINES:
Present the concept before generating:
Choose the generation method based on user preference and available tools.
Generate a production-quality SVG icon at 1024x1024 viewBox.
SVG REQUIREMENTS:
viewBox="0 0 1024 1024" with explicit width="1024" height="1024".SVG QUALITY CHECKLIST:
For Android adaptive icons, also generate a separate foreground SVG:
app_icon_foreground.svg -- symbol only, transparent background, centered in safe zone (inset 66dp / ~166px from edges on a 1024 canvas per Android adaptive icon spec).For iOS 18+ dark mode, also generate:
app_icon_dark.svg -- dark background variant (dark fill, lighter or tinted symbol).app_icon_tinted.svg -- monochrome symbol on transparent background (iOS applies system tint color).If the user asks for AI-generated icons, or if an image generation API is available:
OPENAI_API_KEY env var curl -s https://api.openai.com/v1/images/generations \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{
"model": "dall-e-3",
"prompt": "A professional app icon for [app description]. [Symbol] centered on [color] background. Minimal flat design, no text, no letters, suitable for app store. Square format, clean edges.",
"n": 1,
"size": "1024x1024",
"quality": "hd"
}'app_icon_generated.png.Save to the appropriate assets directory based on platform:
| Platform | Save Location |
|---|---|
| Flutter | assets/image/app_icon.svg (+ register in pubspec.yaml flutter.assets) |
| React Native | assets/app_icon.svg |
| Web | src/assets/app_icon.svg or public/app_icon.svg |
| Native iOS/Android | assets/app_icon.svg (or project root icon/) |
| Electron | build/app_icon.svg |
| Any (fallback) | assets/app_icon.svg |
Convert to 1024x1024 PNG. Try these in order of preference:
Option A -- rsvg-convert (best quality):
rsvg-convert -w 1024 -h 1024 app_icon.svg -o app_icon.pngOption B -- ImageMagick:
magick -background none -size 1024x1024 app_icon.svg app_icon.png
# or older ImageMagick:
convert -background none -size 1024x1024 app_icon.svg app_icon.pngOption C -- Inkscape CLI:
inkscape --export-type=png --export-width=1024 --export-height=1024 app_icon.svg -o app_icon.pngOption D -- Python cairosvg:
python3 -c "import cairosvg; cairosvg.svg2png(url='app_icon.svg', write_to='app_icon.png', output_width=1024, output_height=1024)"Option E -- Chrome/Chromium headless: Create a minimal HTML wrapper and screenshot at 1024x1024.
Option F -- sips (macOS only, limited SVG support):
sips -s format png --resampleWidth 1024 app_icon.svg --out app_icon.pngTry each in order. If none work, tell the user which to install and provide the exact command.
Verify the PNG: file app_icon.png -- should report 1024x1024 PNG.
Also convert adaptive/dark variants if generated:
app_icon_foreground.png (1024x1024, transparent background)app_icon_dark.png (1024x1024)app_icon_tinted.png (1024x1024, transparent background)Apply icons for every detected platform. Run all applicable sections.
flutter_launcher_icons to dev_dependencies if not present: dev_dependencies:
flutter_launcher_icons: ^0.14.3pubspec.yaml: flutter_launcher_icons:
android: true
ios: true
image_path: "assets/image/app_icon.png"
adaptive_icon_background: "#HEXCOLOR"
adaptive_icon_foreground: "assets/image/app_icon_foreground.png"
min_sdk_android: 21
remove_alpha_ios: true
web:
generate: true
image_path: "assets/image/app_icon.png"flutter pub get && dart run flutter_launcher_iconsandroid/app/src/main/res/mipmap-*/ and ios/Runner/Assets.xcassets/AppIcon.appiconset/.android/app/src/main/res/:mipmap-mdpi/ic_launcher.png (48x48)mipmap-hdpi/ic_launcher.png (72x72)mipmap-xhdpi/ic_launcher.png (96x96)mipmap-xxhdpi/ic_launcher.png (144x144)mipmap-xxxhdpi/ic_launcher.png (192x192)For adaptive icons, also generate ic_launcher_foreground.png at each density and create mipmap-anydpi-v26/ic_launcher.xml.
ios/<AppName>/Images.xcassets/AppIcon.appiconset/:Update Contents.json to reference the new files.
react-native-bootsplash or @bam.tech/react-native-make if already in the project..xcassets/AppIcon.appiconset/ directory.Contents.json with the correct filenames and size specs. {
"appearances": [{ "appearance": "luminosity", "value": "dark" }],
"filename": "icon_dark_1024.png",
"idiom": "universal",
"platform": "ios",
"size": "1024x1024"
}app/src/main/res/mipmap-*/.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>values/ic_launcher_background.xml with the background color.mipmap-*/ic_launcher_foreground.png.favicon.ico (multi-size: 16x16, 32x32, 48x48) -- use ImageMagick: magick app_icon.png -resize 16x16 icon-16.png
magick app_icon.png -resize 32x32 icon-32.png
magick app_icon.png -resize 48x48 icon-48.png
magick icon-16.png icon-32.png icon-48.png favicon.icoicon-192.png (192x192, for PWA manifest)icon-512.png (512x512, for PWA manifest)apple-touch-icon.png (180x180)public/ (or project web root).index.html <head>: <link rel="icon" href="/favicon.ico" sizes="48x48">
<link rel="icon" href="/icon-192.png" sizes="192x192" type="image/png">
<link rel="apple-touch-icon" href="/apple-touch-icon.png">manifest.json / site.webmanifest if it exists: {
"icons": [
{ "src": "/icon-192.png", "sizes": "192x192", "type": "image/png" },
{ "src": "/icon-512.png", "sizes": "512x512", "type": "image/png" }
]
}icon.icns (use iconutil on macOS or png2icns): mkdir icon.iconset
sips -z 16 16 app_icon.png --out icon.iconset/icon_16x16.png
sips -z 32 32 app_icon.png --out icon.iconset/[email protected]
sips -z 32 32 app_icon.png --out icon.iconset/icon_32x32.png
sips -z 64 64 app_icon.png --out icon.iconset/[email protected]
sips -z 128 128 app_icon.png --out icon.iconset/icon_128x128.png
sips -z 256 256 app_icon.png --out icon.iconset/[email protected]
sips -z 256 256 app_icon.png --out icon.iconset/icon_256x256.png
sips -z 512 512 app_icon.png --out icon.iconset/[email protected]
sips -z 512 512 app_icon.png --out icon.iconset/icon_512x512.png
sips -z 1024 1024 app_icon.png --out icon.iconset/[email protected]
iconutil -c icns icon.iconset -o build/icon.icnsicon.ico (multi-resolution, 256x256 max): magick app_icon.png -resize 256x256 -define icon:auto-resize=256,128,64,48,32,16 build/icon.icoicon.png (512x512)build/ directory.main.js / electron-builder config: {
"build": {
"icon": "build/icon"
}
}electron-icon-builder if available: npx electron-icon-builder --input=app_icon.png --output=build/ npx tauri icon app_icon.pngThis generates all platform icons automatically in src-tauri/icons/.
icon.ico with multiple sizes (see Electron Windows section)..csproj or resource file as appropriate.After applying icons:
flutter analyzenpx react-native doctor or quick build checkindex.html references are correctProduce a summary:
## App Icon Generated
### Concept
- **App:** [name]
- **Symbol:** [description]
- **Colors:** [hex values]
- **Style:** [flat/semi-flat/gradient]
### Files Created
- [path]/app_icon.svg (source vector)
- [path]/app_icon.png (1024x1024 raster)
- [path]/app_icon_foreground.svg (adaptive icon foreground, if applicable)
- [path]/app_icon_dark.svg (dark mode variant, if applicable)
### Platforms Applied
- [Platform]: [what was generated and where]
- ...
### Preview
The icon uses [primary color] as the background with a [symbol] in [secondary color].
It represents [what the symbol conveys about the app].
### Next Steps
- Run the app to see the new icon on your device/browser.
- To change the icon, run `/app-icon` again with different preferences.feat(icon): add app icon -- [brief symbol description]============================================================ SELF-HEALING VALIDATION (max 3 iterations) ============================================================
After completing the main phases, validate your work:
IF STILL FAILING after 3 iterations:
============================================================ SELF-EVOLUTION TELEMETRY ============================================================
After producing output, record execution metadata for the /evolve pipeline.
Check if a project memory directory exists:
~/.claude/projects/skill-telemetry.md in that memory directoryEntry format:
### /app-icon — {{YYYY-MM-DD}}
- Outcome: {{SUCCESS | PARTIAL | FAILED}}
- Self-healed: {{yes — what was healed | no}}
- Iterations used: {{N}} / {{N max}}
- Bottleneck: {{phase that struggled or "none"}}
- Suggestion: {{one-line improvement idea for /evolve, or "none"}}Only log if the memory directory exists. Skip silently if not found. Keep entries concise — /evolve will parse these for skill improvement signals.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.