app-store-screenshots-generator
Generate production-ready App Store screenshots for iOS apps using AI agents, Next.js, and html-to-image
What this skill does
# App Store Screenshots Generator
> Skill by [ara.so](https://ara.so) — Daily 2026 Skills collection.
A skill for AI coding agents (Claude Code, Cursor, Windsurf, Codex, etc.) that generates production-ready App Store screenshots for iOS apps. It scaffolds a Next.js project, designs advertisement-style slides, and exports PNGs at all required Apple resolutions.
## What This Skill Does
- Asks about your app's brand, features, and style preferences before building anything
- Scaffolds a minimal Next.js + TypeScript + Tailwind project
- Designs each screenshot as an **advertisement** (not a UI showcase)
- Writes compelling copy using proven App Store copywriting patterns
- Renders screenshots with a built-in iPhone mockup frame
- Exports PNGs at all 4 Apple-required sizes (6.9", 6.5", 6.3", 6.1")
- Supports multi-locale screenshot sets, RTL-aware layouts, and reusable theme presets
## Install
### Using npx skills (recommended)
```bash
# Install for current project
npx skills add ParthJadhav/app-store-screenshots
# Install globally (available across all projects)
npx skills add ParthJadhav/app-store-screenshots -g
# Install for a specific agent
npx skills add ParthJadhav/app-store-screenshots -a claude-code
```
### Manual install
```bash
git clone https://github.com/ParthJadhav/app-store-screenshots ~/.claude/skills/app-store-screenshots
```
## Usage
Once installed, just describe what you need:
```
> 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.
```
The agent will ask clarifying questions about brand colors, fonts, features, style direction, number of slides, and locales before generating anything.
## Project Structure
The skill scaffolds this layout:
```
project/
├── public/
│ ├── mockup.png # iPhone frame with transparent screen area
│ ├── app-icon.png # Your app icon
│ ├── screenshots/ # App screenshots (optionally nested by locale)
│ │ ├── en/
│ │ ├── de/
│ │ └── ar/
│ └── screenshots-ipad/ # Optional iPad screenshots
├── src/app/
│ ├── layout.tsx # Font setup
│ └── page.tsx # Entire screenshot generator (single file)
├── package.json
└── next.config.ts
```
**The entire generator lives in a single `page.tsx` file.** Run the dev server, open the browser, and click any screenshot to export it as a PNG.
## Core page.tsx Pattern
```tsx
// src/app/page.tsx — minimal scaffold pattern
"use client";
import { toPng } from "html-to-image";
import { useRef, useState } from "react";
// --- Design tokens / theme presets ---
const THEMES = {
"clean-light": {
bg: "#F6F1EA",
fg: "#171717",
accent: "#5B7CFA",
font: "Inter",
},
"dark-bold": {
bg: "#0B1020",
fg: "#F8FAFC",
accent: "#8B5CF6",
font: "Inter",
},
"warm-editorial": {
bg: "#F7E8DA",
fg: "#2B1D17",
accent: "#D97706",
font: "Playfair Display",
},
} as const;
type ThemeKey = keyof typeof THEMES;
// --- Export sizes (width x height in px) ---
const EXPORT_SIZES = {
"6.9": { w: 1320, h: 2868 },
"6.5": { w: 1284, h: 2778 },
"6.3": { w: 1206, h: 2622 },
"6.1": { w: 1125, h: 2436 },
} as const;
// --- Slide data ---
const SLIDES = [
{
id: 1,
headline: "Track Every Habit,\nEvery Day",
subheadline: "Build streaks that stick",
screenshot: "/screenshots/en/home.png",
layout: "phone-right", // varies per slide: phone-left | phone-right | phone-center
},
{
id: 2,
headline: "See Your Progress\nAt a Glance",
subheadline: "Beautiful weekly summaries",
screenshot: "/screenshots/en/stats.png",
layout: "phone-left",
},
// ... more slides
];
// --- Screenshot canvas (designed at 6.9" — 1320x2868) ---
function ScreenshotSlide({
slide,
theme,
slideRef,
}: {
slide: (typeof SLIDES)[0];
theme: (typeof THEMES)[ThemeKey];
slideRef: React.RefObject<HTMLDivElement>;
}) {
return (
<div
ref={slideRef}
style={{
width: 1320,
height: 2868,
background: theme.bg,
color: theme.fg,
fontFamily: theme.font,
position: "relative",
overflow: "hidden",
}}
>
{/* Headline */}
<div
style={{
position: "absolute",
top: 180,
left: 80,
right: 80,
fontSize: 96,
fontWeight: 800,
lineHeight: 1.1,
whiteSpace: "pre-line",
}}
>
{slide.headline}
</div>
{/* Subheadline */}
<div
style={{
position: "absolute",
top: 520,
left: 80,
fontSize: 48,
color: theme.accent,
fontWeight: 500,
}}
>
{slide.subheadline}
</div>
{/* iPhone mockup + app screenshot */}
<div
style={{
position: "absolute",
bottom: 0,
right: slide.layout === "phone-right" ? 0 : "auto",
left: slide.layout === "phone-left" ? 0 : "auto",
}}
>
{/* App screenshot inside mockup */}
<div style={{ position: "relative", width: 660, height: 1430 }}>
<img
src={slide.screenshot}
style={{
position: "absolute",
top: 28,
left: 24,
width: 612,
borderRadius: 52,
}}
alt=""
/>
{/* Mockup frame sits on top */}
<img
src="/mockup.png"
style={{ position: "absolute", inset: 0, width: "100%" }}
alt=""
/>
</div>
</div>
</div>
);
}
// --- Export helper ---
async function exportSlide(
ref: React.RefObject<HTMLDivElement>,
slideId: number,
size: keyof typeof EXPORT_SIZES,
locale: string,
themeName: string
) {
if (!ref.current) return;
const { w, h } = EXPORT_SIZES[size];
const scale = w / 1320; // designed at 1320px wide
const dataUrl = await toPng(ref.current, {
width: w,
height: h,
style: { transform: `scale(${scale})`, transformOrigin: "top left" },
});
const link = document.createElement("a");
link.download = `slide-${slideId}-${locale}-${themeName}-${size}in.png`;
link.href = dataUrl;
link.click();
}
// --- Main page ---
export default function ScreenshotGenerator() {
const [activeTheme, setActiveTheme] = useState<ThemeKey>("clean-light");
const [activeLocale, setActiveLocale] = useState("en");
const slideRefs = useRef<React.RefObject<HTMLDivElement>[]>(
SLIDES.map(() => ({ current: null } as React.RefObject<HTMLDivElement>))
);
const theme = THEMES[activeTheme];
return (
<div style={{ padding: 40, background: "#111", minHeight: "100vh" }}>
{/* Controls */}
<div style={{ display: "flex", gap: 16, marginBottom: 40 }}>
{(Object.keys(THEMES) as ThemeKey[]).map((t) => (
<button
key={t}
onClick={() => setActiveTheme(t)}
style={{
padding: "8px 16px",
background: activeTheme === t ? "#fff" : "#333",
color: activeTheme === t ? "#000" : "#fff",
border: "none",
borderRadius: 8,
cursor: "pointer",
}}
>
{t}
</button>
))}
{/* Bulk export all slides at all sizes */}
<button
onClick={async () => {
for (const [i, slide] of SLIDES.entries()) {
for (const size of Object.keys(EXPORT_SIZES) as (keyof typeof EXPORT_SIZES)[]) {
await exportSlide(
slideRefs.current[i],
slide.id,
size,
activeLocale,
activeTheme
);
}
}
}}
style={{
padding: "8pRelated in Image & Video
watch
IncludedWatch a video (URL or local path). Downloads with yt-dlp, extracts auto-scaled frames with ffmpeg, pulls the transcript from captions (or Whisper API fallback), and hands the result to Claude so it can answer questions about what's in the video.
physical-ai-defect-image-generation
IncludedUse when the user wants to orchestrate defect image generation, run associated setup, or handle outputs on OSMO. The Day 0 path handles cold-start with USD-to-ROI, image-edit augmentation, and AnomalyGen to create initial PCBA datasets. The Day 1 path performs inference and labeling on real images. This skill helps with first-time asset setup, creation of finetuning checkpoints, and configuring deployment. Trigger keywords: defect image generation, dig workflow, dig pipeline, defect image detection workflow, aoi pipeline, aoi anomalygen, usd2roi anomalygen, day 0 pcba, day 1 pcba, day 1 real-photo alignment, day 1 manual roi, metal surface anomaly, glass defect, anomalygen finetune, setup_pcb, setup_metal, setup_glass, setup_pretrained, dig setup, dig datasets, dig pretrained checkpoint, dig image-edit endpoint.
accelint-react-best-practices
IncludedReact performance optimization and best practices. ALWAYS use this skill when working with any React code - writing components, hooks, JSX; refactoring; optimizing re-renders, memoization, state management; reviewing for performance; fixing hydration mismatches; debugging infinite re-renders, stale closures, input focus loss, animations restarting; preventing remounting; implementing transitions, lazy initialization, effect dependencies. Even simple React tasks benefit from these patterns. Covers React 19+ (useEffectEvent, Activity, ref props). Triggers - useEffect, useState, useMemo, useCallback, memo, inline components, nested components, components inside components, re-render, performance, hydration, SSR, Next.js, useDeferredValue, combined hooks.
elevenlabs-agents
IncludedBuild conversational AI voice agents with ElevenLabs Platform using React, JavaScript, React Native, or Swift SDKs. Configure agents, tools (client/server/MCP), RAG knowledge bases, multi-voice, and Scribe real-time STT. Use when: building voice chat interfaces, implementing AI phone agents with Twilio, configuring agent workflows or tools, adding RAG knowledge bases, testing with CLI "agents as code", or troubleshooting deprecated @11labs packages, Android audio cutoff, CSP violations, dynamic variables, or WebRTC config. Keywords: ElevenLabs Agents, ElevenLabs voice agents, AI voice agents, conversational AI, @elevenlabs/react, @elevenlabs/client, @elevenlabs/react-native, @elevenlabs/elevenlabs-js, @elevenlabs/agents-cli, elevenlabs SDK, voice AI, TTS, text-to-speech, ASR, speech recognition, turn-taking model, WebRTC voice, WebSocket voice, ElevenLabs conversation, agent system prompt, agent tools, agent knowledge base, RAG voice agents, multi-voice agents, pronunciation dictionary, voice speed control, elevenlabs scribe, @11labs deprecated, Android audio cutoff, CSP violation elevenlabs, dynamic variables elevenlabs, case-sensitive tool names, webhook authentication
humanizer
IncludedHumanize AI-generated text by detecting and removing patterns typical of LLM output. Rewrites text to sound natural, specific, and human. Uses 28 pattern detectors, 560+ AI vocabulary terms across 3 tiers, and statistical analysis (burstiness, type-token ratio, readability) for comprehensive detection. Use when asked to humanize text, de-AI writing, make content sound more natural/human, review writing for AI patterns, score text for AI detection, or improve AI-generated drafts. Covers content, language, style, communication, and filler categories.
generating-mermaid-diagrams
IncludedSalesforce architecture diagrams using Mermaid with ASCII fallback. Use this skill when generating text-based diagrams for Salesforce architecture, OAuth flows, ERDs, integration sequences, or Agentforce structure. TRIGGER when: user says "diagram", "visualize", "ERD", or asks for sequence diagrams, flowcharts, class diagrams, or architecture visualizations in Mermaid. DO NOT TRIGGER when: user wants PNG/SVG image output (use generating-visual-diagrams), or asks about non-Salesforce systems.