Loading...
Loading...
App Store screenshot generation skill with two workflows: (A) AI-powered: fetches app metadata via `asc` CLI, analyzes screenshots with Claude vision, writes a ScreenPlan JSON, then generates final marketing screenshots via Gemini (`asc app-shots generate`), and optionally translates them (`asc app-shots translate`). (B) HTML-based (deterministic): writes a CompositionPlan JSON with precise device placement, text overlays, and backgrounds, then runs `asc app-shots html` to produce a self-contained HTML page with real device mockup frames and client-side PNG export — no AI needed. Use this skill when: (1) User asks to "create App Store screenshots" or "generate screenshot plan" (2) User asks to "make an HTML screenshot page" or "compose screenshots with mockups" (3) User mentions "asc-app-shots", "app-shots html", "composition plan", or screenshot marketing (4) User wants deterministic, reproducible screenshot layouts with device mockups (5) User wants AI-generated screenshots via Gemini
npx skill4agent add tddworks/asc-cli-skills asc-app-shots| Workflow A: AI (Gemini) | Workflow B: HTML (Deterministic) | |
|---|---|---|
| Plan format | | |
| Command | | |
| Output | PNG files via Gemini | Self-contained HTML with export |
| Mockup | AI-rendered device frame | Real PNG mockup frame (bundled) |
| Reproducible | No (AI varies each run) | Yes (same plan = same output) |
| Requires API key | Yes (Gemini) | No |
| Multi-device | One per screen | Multiple per screen |
references/composition-plan-schema.md{
"appName": "MyApp",
"canvas": { "width": 1320, "height": 2868, "displayType": "APP_IPHONE_69" },
"defaults": {
"background": { "type": "gradient", "from": "#2A1B5E", "to": "#000000", "angle": 180 },
"textColor": "#FFFFFF",
"subtextColor": "#A8B8D0",
"accentColor": "#4A7CFF",
"font": "Inter"
},
"screens": [
{
"texts": [
{ "content": "APP MANAGEMENT", "x": 0.065, "y": 0.028, "fontSize": 0.028, "fontWeight": 700, "color": "#B8A0FF" },
{ "content": "All your apps,\none dashboard.", "x": 0.065, "y": 0.055, "fontSize": 0.075, "fontWeight": 800, "color": "#FFFFFF" }
],
"devices": [
{ "screenshotFile": "screenshot-1.png", "mockup": "iPhone 17 Pro Max", "x": 0.5, "y": 0.65, "scale": 0.88 }
]
}
]
}y: 0.028fontSize: 0.028y: 0.055fontSize: 0.075fontWeight: 800scale: 0.88y: 0.65x: 0.5textAlign: "center"x: 0.34y: 0.58scale: 0.50x: 0.66y: 0.64scale: 0.50devices{ "from": "#2A1B5E", "to": "#000000" }#B8A0FF{ "from": "#1B3A5E", "to": "#000000" }#7BC4FF{ "from": "#1A4A3E", "to": "#000000" }#7BFFC4# Auto-discover screenshots from plan directory
asc app-shots html --plan composition-plan.json --output-dir output
# Explicit screenshot paths
asc app-shots html --plan composition-plan.json --output-dir output screenshot-1.png screenshot-2.png
# Disable mockup frame (screenshots only, no device frame)
asc app-shots html --plan composition-plan.json --output-dir output --mockup noneapp-shots.htmlmockups.json--mockup--mockup none--mockup /path/to/frame.png --screen-inset-x 80 --screen-inset-y 70mockups.json~/.asc/mockups/mockupmockups.json{
"iPhone 17 Pro Max - Deep Blue": {
"category": "iPhone",
"model": "iPhone 17 Pro Max",
"displayType": "APP_IPHONE_67",
"outputWidth": 1470, "outputHeight": 3000,
"screenInsetX": 75, "screenInsetY": 66,
"file": "iPhone 17 Pro Max - Deep Blue - Portrait.png",
"default": true
}
}| Flag | Default | Description |
|---|---|---|
| | Path to plan JSON |
| | Output directory |
| | Canvas width (overridden by plan's |
| | Canvas height (overridden by plan's |
| — | Named device type, overrides width/height |
| (bundled default) | Device name, file path, or |
| — | Override screen inset X from mockups.json |
| — | Override screen inset Y from mockups.json |
app-shots-plan.jsonasc app-shots generatescreen-{n}.pngasc app-shots translatewhich ascascswift run asc.asc/project.jsonasc apps listasc versions list --app-id <APP_ID>en-US.asc/app-shots/references/commands.mdAPP_INFO_ID=$(asc app-infos list --app-id <APP_ID> | jq -r '.data[0].id')
asc app-info-localizations list --app-info-id "$APP_INFO_ID" \
| jq '.data[] | select(.locale == "<LOCALE>") | {name, subtitle}'
VERSION_ID=$(asc versions list --app-id <APP_ID> | jq -r '.data[0].id')
asc version-localizations list --version-id "$VERSION_ID" \
| jq '.data[] | select(.locale == "<LOCALE>") | {description, keywords}'descriptionappDescriptionreferences/plan-schema.md.asc/app-shots/app-shots-plan.jsonasc app-shots generate--gemini-api-key$GEMINI_API_KEY~/.asc/app-shots-config.jsonasc app-shots translate --to zh --to jareferences/commands.mdasc app-shots config --gemini-api-key AIzaSy... # save key
asc app-shots config # show current key (masked) + source
asc app-shots config --remove # delete saved key