Install
$ agentstack add skill-barkleesanders-claude-code-starter-app-store-screenshots ✓ scanned · ✓ verified — works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ● Network access Used
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
About
App Store & Google Play Screenshots Generator
Overview
Build a Next.js page that renders App Store and Google Play screenshots as advertisements (not UI showcases) and exports them via html-to-image at Apple's and Google's required resolutions. Screenshots are the single most important conversion asset on both stores.
Supported devices out of the box:
- iPhone (portrait) — Apple App Store
- iPad (portrait) — Apple App Store
- Android Phone (portrait) — Google Play
- Android Tablet 7" (portrait + landscape) — Google Play
- Android Tablet 10" (portrait + landscape) — Google Play
- Feature Graphic (landscape banner, 1024×500) — Google Play store listing header
Core Principle
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.
Step 1: Ask the User These Questions
Before writing ANY code, ask the user all of these. Do not proceed until you have answers:
Required
- App screenshots — "Where are your app screenshots? (PNG files of actual device captures)"
- App icon — "Where is your app icon PNG?"
- Brand colors — "What are your brand colors? (accent color, text color, background preference)"
- Font — "What font does your app use? (or what font do you want for the screenshots?)"
- Feature list — "List your app's features in priority order. What's the #1 thing your app does?"
- Number of slides — "How many screenshots do you want? (Apple allows up to 10, Google Play up to 8)"
- Style direction — "What style do you want? Examples: warm/organic, dark/moody, clean/minimal, bold/colorful, gradient-heavy, flat. Share App Store screenshot references if you have any."
Optional
- Target stores — "Are you targeting Apple App Store only, Google Play only, or both? This determines which devices we generate screenshots for."
- iPad screenshots — "Do you also have iPad screenshots? If so, we'll generate iPad App Store screenshots too (recommended for universal apps)."
- Android tablet screenshots — "Do you have Android tablet screenshots? If yes, what tablet sizes — 7" and/or 10"? Do you have them in portrait, landscape, or both orientations?"
- Feature Graphic — "Do you want a Google Play Feature Graphic (1024×500 banner shown at the top of your Play Store listing)? This is separate from phone screenshots."
- Component assets — "Do you have any UI element PNGs (cards, widgets, etc.) you want as floating decorations? If not, that's fine — we'll skip them."
- Localized screenshots — "Do you want screenshots in multiple languages? This helps your listing rank in regional App Stores even if your app is English-only. If yes: which languages? (e.g. en, de, es, pt, ja, ar, he)"
- Theme preset system — "Do you want one art direction, or reusable visual themes (for example: clean-light, dark-bold, warm-editorial) so you can swap screenshot looks quickly?"
- Additional instructions — "Any specific requirements, constraints, or preferences?"
Derived from answers (do NOT ask — decide yourself)
Based on the user's style direction, brand colors, and app aesthetic, decide:
- Background style: gradient direction, colors, whether light or dark base
- Decorative elements: blobs, glows, geometric shapes, or none — match the style
- Dark vs light slides: how many of each, which features suit dark treatment
- Typography treatment: weight, tracking, line height — match the brand personality
- Color palette: derive text colors, secondary colors, shadow tints from the brand colors
- Theme preset names: turn vague style requests into reusable theme ids the user can switch between
- RTL behavior: if any locale is RTL (
ar,he,fa,ur), mirror layout intentionally instead of just translating the text - Landscape slide layouts: for tablet landscape slides, use caption-left + device-right composition (never try to fit two tablets side-by-side in landscape — there's not enough horizontal room)
IMPORTANT: If the user gives additional instructions at any point during the process, follow them. User instructions always override skill defaults.
Step 2: Set Up the Project
Detect Package Manager
Check what's available, use this priority: bun > pnpm > yarn > npm
# Check in order
which bun && echo "use bun" || which pnpm && echo "use pnpm" || which yarn && echo "use yarn" || echo "use npm"
Scaffold (if no existing Next.js project)
# With bun:
bunx create-next-app@latest . --typescript --tailwind --app --src-dir --no-eslint --import-alias "@/*"
bun add html-to-image
# With pnpm:
pnpx create-next-app@latest . --typescript --tailwind --app --src-dir --no-eslint --import-alias "@/*"
pnpm add html-to-image
# With yarn:
yarn create next-app . --typescript --tailwind --app --src-dir --no-eslint --import-alias "@/*"
yarn add html-to-image
# With npm:
npx create-next-app@latest . --typescript --tailwind --app --src-dir --no-eslint --import-alias "@/*"
npm install html-to-image
Copy the Phone Mockup
The skill includes a pre-measured iPhone mockup at mockup.png (co-located with this SKILL.md). Copy it to the project's public/ directory. All other device frames (Android Phone, Android Tablets, iPad) are rendered with CSS — no additional mockup PNGs needed.
File Structure
iPhone-only app (default)
project/
├── public/
│ ├── mockup.png # iPhone frame (included with skill)
│ ├── app-icon.png # User's app icon
│ └── screenshots/
│ ├── en/
│ │ ├── home.png
│ │ ├── feature-1.png
│ │ └── ...
│ ├── de/
│ └── {locale}/
├── src/app/
│ ├── layout.tsx # Font setup
│ └── page.tsx # The screenshot generator (single file)
└── package.json
If iPad screenshots are localized too, mirror the same locale structure:
└── screenshots-ipad/
├── en/
├── de/
└── {locale}/
Single-language apps can omit the locale folder entirely — paths become screenshots/home.png.
Multi-platform app (iOS + Android)
When the user needs both Apple and Android screenshots, use a platform-based structure so every device's images are clearly separated:
└── screenshots/
├── apple/
│ ├── iphone/
│ │ ├── en/
│ │ └── {locale}/
│ └── ipad/
│ ├── en/
│ └── {locale}/
└── android/
├── phone/
│ ├── en/
│ └── {locale}/
├── tablet-7/
│ ├── portrait/
│ │ └── {locale}/
│ └── landscape/
│ └── {locale}/
└── tablet-10/
├── portrait/
│ └── {locale}/
└── landscape/
└── {locale}/
Only create subdirectories for devices the user actually has screenshots for. An empty directory will cause broken image placeholders in the generator.
Use the iPhone-only structure by default. Switch to the platform-based structure only when the user confirms they're targeting Android as well.
The entire generator is a single page.tsx file. No routing, no extra layouts, no API routes.
Multi-language: Locale Select
Add a LOCALES array and a ` locale picker to the toolbar. Every slide src uses a base` variable — no hardcoded locale paths:
const LOCALES = ["en", "de", "es", "tr"] as const; // use whatever langs were defined
type Locale = typeof LOCALES[number];
// In ScreenshotsPage:
const [locale, setLocale] = useState("en");
// base is derived per-device from locale:
const base = (platform: string) => `/screenshots/${platform}/${locale}`;
// Toolbar:
setLocale(e.target.value as Locale)}>
{LOCALES.map(l => {l.toUpperCase()})}
// In every slide — unchanged between single and multi-language:
Use a `` rather than inline tabs for locale — it scales cleanly to many languages without overflowing the toolbar.
Theme Presets
const THEMES = {
"clean-light": { bg: "#F6F1EA", fg: "#171717", accent: "#5B7CFA", muted: "#6B7280" },
"dark-bold": { bg: "#0B1020", fg: "#F8FAFC", accent: "#8B5CF6", muted: "#94A3B8" },
"warm-editorial": { bg: "#F7E8DA", fg: "#2B1D17", accent: "#D97706", muted: "#7C5A47" },
} as const;
type ThemeId = keyof typeof THEMES;
const [themeId, setThemeId] = useState("clean-light");
const theme = THEMES[themeId];
Use theme tokens everywhere instead of hardcoded colors.
Font Setup
// src/app/layout.tsx
import { YourFont } from "next/font/google";
const font = YourFont({ subsets: ["latin"] });
export default function Layout({ children }: { children: React.ReactNode }) {
return {children};
}
Step 3: Plan the Slides
Screenshot Framework (Narrative Arc)
Adapt this framework to the user's requested slide count. Not all slots are required — pick what fits:
| Slot | Purpose | Notes | |------|---------|-------| | #1 | Hero / Main Benefit | App icon + tagline + home screen. This is the ONLY one most people see. | | #2 | Differentiator | What makes this app unique vs competitors | | #3 | Ecosystem | Widgets, extensions, watch — beyond the main app. Skip if N/A. | | #4+ | Core Features | One feature per slide, most important first | | 2nd to last | Trust Signal | Identity/craft — "made for people who [X]" | | Last | More Features | Pills listing extras + coming soon. Skip if few features. |
Rules:
- Each slide sells ONE idea. Never two features on one slide.
- Vary layouts across slides — never repeat the same template structure.
- Include 1-2 contrast slides (inverted bg) for visual rhythm.
- Landscape tablets: use caption-left + device-right layout. The wide canvas rewards asymmetric composition. Never try two devices side-by-side in landscape — there's not enough room.
Step 4: Write Copy FIRST
Get all headlines approved before building layouts. Bad copy ruins good design.
The Iron Rules
- One idea per headline. Never join two things with "and."
- Short, common words. 1-2 syllables. No jargon unless it's domain-specific.
- 3-5 words per line. Must be readable at thumbnail size in the App Store.
- Line breaks are intentional. Control where lines break with ``.
Three Approaches (pick one per slide)
| 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." |
What NEVER Works
- Feature lists as headlines: "Log every item with tags, categories, and notes"
- Two ideas joined by "and": "Track X and never miss Y"
- Vague aspirational: "Every item, tracked"
- Marketing buzzwords: "AI-powered tips" (unless it's actually AI)
Bad-to-Better Headline Examples
| Weak | Better | Why it wins | |------|--------|-------------| | 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 | | Manage budgets and never miss payments | See where money goes | cleaner promise, no dual claim |
Copy Process
- Write 3 options per slide using the three approaches
- Read each at arm's length — if you can't parse it in 1 second, it's too complex
- Check: does each line have 3-5 words? If not, adjust line breaks
- Present options to the user with reasoning for each
Example Prompt Shapes
If the user gives a weak or underspecified request, reshape it internally into something like:
Build App Store screenshots for my habit tracker.
The app helps people stay consistent with simple daily routines.
I want 6 slides, clean/minimal style, warm neutrals, and a calm premium feel.
Generate App Store screenshots for my personal finance app.
The app's main strengths are fast expense capture, clear monthly trends, and shared budgets.
I want a sharp, modern style with high contrast and 7 slides.
Create exportable App Store screenshots for my AI note-taking app.
The core value is turning messy voice notes into clean summaries and action items.
I want bold copy, dark backgrounds, and a polished tech-forward look.
The pattern is:
- app category + core outcome
- top features in priority order
- desired slide count
- style direction
Localization Rules
- Do not literally translate headlines if the result becomes long or awkward — re-write for the target market.
- Re-check line breaks per locale; German, French, and Portuguese often need shorter claims.
- For RTL languages (
ar,he,fa,ur), setdir="rtl"on the canvas and mirror asymmetric layouts intentionally.
Reference Apps for Copy Style
- Raycast — specific, descriptive, one concrete value per slide
- Turf — ultra-simple action verbs, conversational
- Mela / Notion — warm, minimal, elegant
Step 5: Build the Page
Architecture
page.tsx
├── Constants (canvas dimensions, export sizes, frame ratios)
├── Width formula functions (phoneW, tabletPW, tabletLW, ipadW)
├── LOCALES / RTL_LOCALES / THEMES / COPY_BY_LOCALE
├── Image preload cache (preloadAllImages + img() helper)
├── Device frame components:
│ ├── Phone — iPhone (mockup.png + pre-measured overlay)
│ ├── AndroidPhone — Android phone (CSS-only)
│ ├── AndroidTabletP — Android tablet portrait (CSS-only)
│ ├── AndroidTabletL — Android tablet landscape (CSS-only)
│ └── IPad — iPad (CSS-only)
├── Caption component (label + headline, scales from canvasW)
├── Decorative components (blobs, glows — based on style direction)
├── Slide components (makeSlide1..N factories for portrait,
│ makeTabLSlide1..N factories for landscape)
├── Slide registries (IPHONE_SLIDES, ANDROID_SLIDES, ANDROID_7P_SLIDES,
│ ANDROID_7L_SLIDES, ANDROID_10P_SLIDES, ANDROID_10L_SLIDES, IPAD_SLIDES)
├── ScreenshotPreview — ResizeObserver scaling + hover export
└── ScreenshotsPage — grid + toolbar + export logic
Canvas Dimensions
Design at the largest required resolution for each device category. Smaller sizes are achieved by re-rendering at the target resolution on export.
// Apple
const W = 1320; const H = 2868; // iPhone (6.9" — largest required)
const IPAD_W = 2064; const IPAD_H = 2752; // iPad 13" — largest required
// Android phone
const AW = 1080; const AH = 1920; // Android phone
// Android tablet — portrait
const AT7P_W = 1200; const AT7P_H = 1920; // 7" portrait
const AT10P_W = 1600; const AT10P_H = 2560; // 10" portrait
// Android tablet — landscape
const AT7L_W = 1920; const AT7L_H = 1200; // 7" landscape
const AT10L_W = 2560; const AT10L_H = 1600; // 10" landscape
// Feature Graphic
const FGW = 1024; const FGH = 500;
Export Sizes
iPhone (Apple required, portrait)
const IPHONE_SIZES = [
{ label: '6.9"', w: 1320, h: 2868 },
{ label: '6.5"', w: 1284, h: 2778 },
{ label: '6.3"', w: 1206, h: 2622 },
{ label: '6.1"', w: 1125, h: 2436 },
] as const;
iPad (Apple required, portrait)
const IPAD_SIZES = [
{ label: '13" iPad', w: 2064, h: 2752 },
{ label: '12.9" iPad Pro', w: 2048, h: 2732 },
] as const;
Android (Google Play recommended)
const ANDROID_SIZES = [{ label: "Phone", w: 1080, h: 1920 }] as const;
const ANDROID_7P_SIZES = [{ label: '7" Portrait', w: 1200, h: 1920 }] as const;
const ANDROID_7L_SIZES = [{ label: '7" Landscape', w: 1920, h: 1200 }] as co
…
## Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- **Author:** [barkleesanders](https://github.com/barkleesanders)
- **Source:** [barkleesanders/claude-code-starter](https://github.com/barkleesanders/claude-code-starter)
- **License:** MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet — be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.