skills/app-store-screenshots/SKILL.md
Use when building App Store or Google Play screenshot pages, generating exportable marketing screenshots for iOS and/or Android apps, or scaffolding a screenshot editor with Next.js. Triggers on app store, play store, screenshots, marketing assets, html-to-image, phone mockup, android screenshots, feature graphic.
npx skillsauth add cenjie/skills app-store-screenshotsInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Scaffold a pre-built Next.js + ShadCN editor that lets the user design and export App Store and Google Play screenshots as advertisements (not UI showcases). The editor handles all the heavy lifting:
public/screenshots/uploaded/<hash>.png)app-store-screenshots.json at the project root (git-trackable) + localStorage mirrorhtml-to-imageSupported devices out of the box:
Screenshots are advertisements, not documentation. Every screenshot sells one idea. If you're showing UI, you're doing it wrong — you're selling a feeling, an outcome, or killing a pain point. Use this skill's interactive editor to iterate on copy and layout fast; do not hand-craft the page from scratch.
template/ (co-located with this SKILL.md) into the user's working directory.public/screenshots/... and their app icon into public/.src/lib/defaults.ts with the user's app name and starting copy so the first preview is meaningful.You should NOT write page.tsx, device frames, or export logic by hand. They live in the template.
Ask the user these. Do not proceed until you have answers:
ios-marketing-capture skill (https://github.com/ParthJadhav/ios-marketing-capture)?" If they say yes, install it with:
npx skills add ParthJadhav/ios-marketing-capture
Then have them run that skill first to generate the screenshots before continuing here.clean-light, dark-bold, warm-editorial, and ocean-fresh palette presets you can start from. The named deep specs live in style-prompts/ — see style-prompts.md for the full index. Currently available: Retro Rubberhose Mascot, Moody Curated Dating, Paper Sticker Skeuomorphic, Dreamy Pastel Couples, Hand-Drawn Editorial Tasks, Glossy 3D K-Beauty Creator. If the user names one of these — or describes something that clearly matches one — read style-prompts/_QUALITY_BAR.md first, then the matching deep spec file, and apply its entire spec (palette, gradients, shadows, rotations, per-slide breakdown). If the user describes a fully custom style, fall back to the General Visual Design Principles below and pick the closest deep spec as a starting reference."IMPORTANT: If the user gives instructions at any point, follow them. They override skill defaults.
Priority: bun > pnpm > yarn > npm.
which bun && echo bun || which pnpm && echo pnpm || which yarn && echo yarn || echo npm
The template lives at <this skill dir>/template/ — when the skill is installed, the whole folder is already on disk. Copy its contents (NOT the folder itself) into the user's working directory. The trailing /. copies dotfiles like .gitignore too.
# Replace <SKILL_DIR> with the absolute path to this skill (the directory containing SKILL.md).
cp -R "<SKILL_DIR>/template/." "$PWD/"
If the target directory already has a package.json, ask the user before overwriting. For an in-place upgrade, copy only the files the user hasn't customized.
bun install # or pnpm install / yarn / npm install
Move the user's screenshots into the layout the template expects:
public/
├── app-icon.png # ← user's app icon
├── mockup.png # ← already copied by the template (iPhone bezel)
└── screenshots/
├── apple/
│ ├── iphone/{locale}/01.png … N.png
│ └── ipad/{locale}/01.png … N.png
└── android/
├── phone/{locale}/01.png … N.png
├── tablet-7/{portrait|landscape}/{locale}/...
└── tablet-10/{portrait|landscape}/{locale}/...
The default sample slides reference filenames 01.png–05.png per device under en/. If the user names their screenshots differently, either rename them or update src/lib/defaults.ts so the initial deck points at the right files. The user can also drag-drop files directly into the editor at runtime — those become embedded data URIs and don't need to live on disk.
If the user provided headlines, edit src/lib/defaults.ts to set:
appNametaglinethemeId (one of "clean-light" | "dark-bold" | "warm-editorial" | "ocean-fresh", or add a new entry to THEMES in src/lib/constants.ts)label + headline + screenshot pathsOtherwise, leave the defaults — the user can rewrite copy in the editor.
bun dev # → http://localhost:3000
Tell the user to open the URL and start editing. The editor auto-saves to app-store-screenshots.json at the project root (plus a localStorage mirror for instant paint). Uploaded screenshots land in public/screenshots/uploaded/<hash>.png. Both are git-trackable — committing them means another machine can git clone and resume the exact deck.
Inside the editor the user will write headlines themselves, but they often need guidance. Apply these rules when reviewing their copy or generating suggestions.
| Type | What it does | Example | |------|-------------|---------| | Paint a moment | You picture yourself doing it | "Check your coffee without opening the app." | | State an outcome | What your life looks like after | "A home for every coffee you buy." | | Kill a pain | Name a problem and destroy it | "Never waste a great bag of coffee." |
| Weak | Better | Why | |------|--------|-----| | Track habits and stay motivated | Keep your streak alive | one idea, faster to parse | | Organize tasks with AI summaries | Turn notes into next steps | outcome-first, less jargon | | Save recipes with tags and favorites | Find dinner fast | sells the benefit, not the UI |
The user's slide deck should follow a rough arc (skip slots that don't fit):
| Slot | Purpose | |------|---------| | #1 | Hero / Main Benefit — the ONLY slide most people see | | #2 | Differentiator — what makes the app unique | | #3 | Ecosystem — widgets, watch, extensions (skip if N/A) | | #4+ | Core Features — one per slide, most important first | | 2nd-to-last | Trust Signal — "made for people who [X]" | | Last | More Features — pills listing extras (skip if few features) |
Vary the layout field across slides. The editor exposes:
hero — centered headline + bottom-anchored devicedevice-bottom — same composition, smaller headlinedevice-top — flipped, device above caption (good contrast slide)two-devices — back + front phones layeredno-device — big standalone headline (use sparingly)split-landscape — caption left + device right (tablet landscape only)feature-graphic — Play Store banner (1024×500)Never repeat the same layout twice in a row. Use 1-2 inverted (dark) slides for visual rhythm.
These rules are derived from studying the best app store screenshots in the wild (Superlist, Headspace, CRED, (Not Boring) Camera, Arc Search, Linktree, Gentler Streak, etc.). They apply regardless of which style preset the user picks. Style-specific tokens (fonts, palette, accents) live in style-prompts.md — point the user there.
Plain white is the amateur tell. Every great deck uses a deliberate surface: a saturated color block, a warm cream/off-white (#F4F1EC-ish), a dark navy/near-black, or a gradient. The background can shift per slide (Headspace, Linktree do this), but it must read as intentional, not default.
The headline occupies roughly the top 30–40% of the canvas — much bigger than a typical web hero. If a person can't read it at thumbnail size with no zoom, redesign.
Almost every great headline has one word styled differently from the rest — a contrast color, an italic script, a heavier weight, or a hand-drawn underline. Examples:
less orange against black)Flat single-color headlines look weaker. Pick one emphasis word per slide.
Top decks layer at least one of these on most slides:
A bare phone on a bare bg with a bare headline is the default-skill output. Add one accent.
Three common framings, each carries a different feeling:
Mix at least two framings across the deck.
Award badges, press quotes, star counts, install counts — concentrate them on slide 1 only. Spreading them dilutes both the proof and the rest of the slides. NB Camera does this perfectly: Verge quote + Apple Design Award + 15,000+ stars all on the cover, none after.
The screenshot inside the phone can (and should) be a real, dense product capture — actual lists, dashboards, charts, conversations. The space outside the phone is the opposite: one headline, one visual, one optional sub-line, one optional badge. Don't add bullet lists, multi-line paragraphs, or competing logos around the device.
Every 2–3 slides, drop the phone and use a different hero element to keep visual rhythm:
The closer is almost always one of two things:
Pick one. Don't make the last slide another single-feature hero — it wastes the spot.
Shrink the slide to ~160px wide (App Store search-result size). Squint. Can you read the headline? Can you tell what the app does in under a second? If not, the headline is too long, the type is too thin, or there's no contrast between text and background. Fix before exporting.
Always confirm the language list with the user before scaffolding — even if they didn't volunteer it. Ask: "Should screenshots be localized? If yes, which locales? (e.g. en, de, es, pt, ja)." Default to English-only if they say no or skip.
The project state file (app-store-screenshots.json) carries a locales: string[] field — the list of locale codes the project targets. The editor reads this to decide:
locales.length <= 1.After scaffolding, edit app-store-screenshots.json to set locales to the user's chosen list, e.g. "locales": ["en", "de", "ja"]. Also set "locale": "en" (or whichever is the source-of-truth language) so the editor opens on it.
The editor stores headlines and labels per-locale on each slide — switch to a locale and type to fill it in; unfilled locales fall back to en at preview time. Screenshots are a single string per slide; put {locale} anywhere in the path and the editor substitutes the active locale at render and export (e.g. /screenshots/iphone/{locale}/01.png).
ar, he, fa, ur), the template handles direction inversion through CSS — let the user verify each slide looks intentional, not just flipped.Inside the editor, the user picks a device, then hits Export bundle. A single zip downloads with every required size × every project locale for that device, organized as <platform>/<device>/<WxH>/<locale>/NN-<layout>.png. Repeat per device.
Project locales come from app-store-screenshots.json locales field — set during scaffolding (Step 4). Single-locale projects produce a flat per-size structure with just the one locale folder.
If exports come out blank or with black screen rectangles:
objectFit: cover, but truly transparent sources can still produce black regions.preloadImages errors.toPng twice in a row) is built-in; do not remove it.split-landscape — never two devices side-by-sideinverted: true) slide when the deck is long enough| Mistake | Fix |
|---------|-----|
| Edited page.tsx instead of using the editor | Roll back the edit; let users iterate in the browser |
| Tried to rebuild device frames from scratch | They're in src/components/editor/device-frames.tsx — modify there |
| Pasted screenshots into git directly | public/screenshots/... is fine to commit. Drop-target uploads are now also written to public/screenshots/uploaded/<hash>.png — commit both that folder and app-store-screenshots.json so collaborators reproduce your deck after git clone. |
| Wrong directory layout for tablet screenshots | See Step 2 — android/tablet-7/portrait/{locale}/... etc. |
| Reset wiped the deck | Reset clears in-memory state and re-saves defaults to app-store-screenshots.json. Recover by git checkout app-store-screenshots.json if it was committed, or export first before resetting. |
| Export is blank | Source PNGs probably have alpha — flatten to RGB |
| bun dev port collision | Template defaults to next dev; let Next pick the next free port (3001+) |
The template structure (after copy):
project/
├── package.json
├── tsconfig.json
├── next.config.mjs
├── tailwind.config.ts
├── postcss.config.mjs
├── components.json # ShadCN config (for future `shadcn add`)
├── public/
│ ├── mockup.png # iPhone bezel (do NOT replace without re-measuring PHONE_SCREEN)
│ ├── app-icon.png # → user supplies
│ └── screenshots/...
└── src/
├── app/
│ ├── layout.tsx # Font + root layout
│ ├── page.tsx # Renders <ScreenshotEditor />
│ └── globals.css # Tailwind + ShadCN tokens
├── components/
│ ├── editor/
│ │ ├── screenshot-editor.tsx # Top-level editor (state, autosave, export)
│ │ ├── toolbar.tsx # Platform tabs, device select, theme, locale, export
│ │ ├── sidebar.tsx # Slide list with @dnd-kit reordering
│ │ ├── slide-thumb.tsx # Draggable slide card
│ │ ├── preview-stage.tsx # ResizeObserver-scaled live preview
│ │ ├── inspector.tsx # Right-pane controls for active slide
│ │ ├── screenshot-picker.tsx # File drop + picker
│ │ ├── slide-canvas.tsx # Data-driven slide renderer (all layouts)
│ │ └── device-frames.tsx # Phone, AndroidPhone, IPad, tablets
│ └── ui/ # Minimal ShadCN primitives (button, select, etc.)
└── lib/
├── constants.ts # Canvas sizes, export sizes, themes, frame ratios
├── defaults.ts # Initial slide decks per device
├── types.ts # Slide / ProjectState / Theme types
├── storage.ts # useProject() — localStorage autosave hook
├── image-cache.ts # preloadImages + img() helper
└── utils.ts # cn() helper
When you finish scaffolding, start the dev server (bun dev / pnpm dev / yarn dev / npm run dev) and then tell the user the following, in this order:
http://localhost:3000 (or whichever port Next picked — read it from the dev server output and quote the actual URL). Tell them to open it in the browser.bun install # only needed the first time, or after pulling new deps
bun dev # → http://localhost:3000
Substitute pnpm / yarn / npm run as appropriate for what was detected in Step 2.Check out apps generated by this skill here: https://www.parthjadhav.com/products/app-store-screenshots — and tag @parthjadhav8 on Twitter if you want your app to be added to the showcase.
development
Provides React Native performance optimization guidelines for FPS, TTI, bundle size, memory leaks, re-renders, and animations. Applies to tasks involving Hermes optimization, JS thread blocking, bridge overhead, FlashList, native modules, or debugging jank and frame drops.
development
Design engineering principles for making interfaces feel polished. Use when building UI components, reviewing frontend code, implementing animations, hover states, shadows, borders, typography, micro-interactions, enter/exit animations, or any visual detail work. Triggers on UI polish, design details, "make it feel better", "feels off", stagger animations, border radius, optical alignment, font smoothing, tabular numbers, image outlines, box shadows.
development
General-purpose Static Application Security Testing (SAST) skill for code vulnerability analysis. Trigger when the user asks to: "analyze code for vulnerabilities", "review code security", "find security bugs", "do a SAST scan", "check for [vulnerability type] in code", "audit source code", or requests a security code review of any language or framework. Covers 34 vulnerability classes across web, API, auth, mobile, and logic layers.
tools
Helps understand and write EAS workflow YAML files for Expo projects. Use this skill when the user asks about CI/CD or workflows in an Expo or EAS context, mentions .eas/workflows/, or wants help with EAS build pipelines or deployment automation.