Generates an automated App Store screenshot pipeline with UI tests for screenshot capture, device framing, localized caption overlays, and multi-size batch export. Use when user wants automated screenshots, App Store screenshot generation, or a fastlane snapshot replacement.
npx skills add https://github.com/rshankras/claude-code-apple-skills --skill screenshot-automation
Generate an automated App Store screenshot pipeline that captures screenshots via UI tests, adds localized marketing captions, applies device frames, and exports all required sizes for App Store Connect. Saves hours of manual screenshot creation every release.
Use this skill when the user:
*UITests target)Fastfile, Snapfile)Search for existing screenshot infrastructure:
Glob: **/*Screenshot*.swift, **/*Snapshot*.swift, **/Snapfile, **/Fastfile
Grep: "XCTAttachment" or "screenshot" or "snapshot" in UI test files
If fastlane snapshot already configured:
Check for existing localization setup:
Glob: **/*.lproj/*.strings, **/*Localizable*, **/*.xcstrings
Determine which locales are already configured in the project.
Ask user via AskUserQuestion:
Read templates.md for production Swift code and scripts.
Generate:
ScreenshotModeController.swift -- Add to the app target (not tests). Detects --screenshot-mode launch argument and configures the app: suppresses onboarding, disables analytics/IAP, loads sample data, sizes windows (macOS). Also provides @Environment(\.isScreenshotMode) for views to hide promotional UI during capture.Tell the user to:
ScreenshotModeController.shared.configureIfNeeded() in their App's init()ScreenshotModeController.shared.configureWindow() in their root view's onAppearloadSampleData() to populate their data store with attractive contentGenerate:
ScreenshotPlan.swift -- Defines screens to capture, devices, locales, and output pathsGenerate:
ScreenshotUITests.swift -- XCUITest class that navigates and captures each screenScreenshotTestHelper.swift -- Helper utilities for locale setup, data seeding, alert dismissal, plus tapUnhittable() extension for custom controlsGenerate:
ScreenshotProcessor.swift -- Loads captured images, routes through framing and captioningCaptionOverlay.swift -- Renders localized marketing text onto screenshot imagesFor macOS-only or lightweight needs, offer sips-screenshot-process.sh as an alternative to the Swift processor. Uses macOS's built-in sips command — zero dependencies.
Generate:
ScreenshotExportScript.swift -- End-to-end pipeline script: build, test, process, organizeFor macOS apps, also generate:
macos-screenshot-env.sh -- Desktop preparation script (hides dock, desktop icons, simplifies clock) with trap-based cleanupIf the user needs realistic sample data for screenshots:
SampleContentGenerator.swift -- Provides text content, chart data, placeholder images, and PDF generation (macOS). Category-specific sample titles for productivity, fitness, finance, and notes apps.Generate:
10. ScreenshotTests.xctestplan -- Dedicated test plan that isolates screenshot tests from development tests. Prevents screenshot tests from running during Cmd+U.
Tell the user to:
xcodebuild test -testPlan "ScreenshotTests" ...Check project structure:
ScreenshotModeController.swift goes into the app target source directorySampleContentGenerator.swift goes into the app target source directory*UITests/ target directoryScreenshotAutomation/ group or Scripts/ directoryScripts/ directorySources/ exists -> Sources/ScreenshotAutomation/ScreenshotAutomation/After generation, provide:
App Target (source directory):
├── ScreenshotModeController.swift # App-side screenshot mode detection & config
└── SampleContentGenerator.swift # Realistic sample data for screenshots
UITests Target:
├── ScreenshotUITests.swift # XCUITest capture class
└── ScreenshotTestHelper.swift # Helper: locale, seeding, alerts, tapUnhittable()
ScreenshotAutomation/:
├── ScreenshotPlan.swift # Configuration: screens, devices, locales
├── ScreenshotProcessor.swift # Post-processing orchestrator
├── CaptionOverlay.swift # Localized text overlay renderer
└── ScreenshotExportScript.swift # Full pipeline script
Scripts/ (shell scripts):
├── sips-screenshot-process.sh # Lightweight sips-based image processing
└── macos-screenshot-env.sh # macOS desktop prep with trap cleanup
Project Root:
└── ScreenshotTests.xctestplan # Dedicated test plan for screenshots
Xcode Cloud:
# ci_scripts/ci_post_xcodebuild.sh
if [ "$CI_WORKFLOW" = "Screenshots" ]; then
swift ScreenshotAutomation/ScreenshotExportScript.swift
fi
GitHub Actions:
- name: Generate Screenshots
run: |
xcodebuild test \
-scheme "YourAppUITests" \
-destination "platform=iOS Simulator,name=iPhone 16 Pro Max" \
-testPlan ScreenshotPlan \
-resultBundlePath screenshots.xcresult
swift ScreenshotAutomation/ScreenshotExportScript.swift
fastlane (if selected):
lane :screenshots do
capture_screenshots(scheme: "YourAppUITests")
# Post-processing handled by ScreenshotProcessor
end
Run screenshot tests from Xcode:
xcodebuild test \
-project YourApp.xcodeproj \
-scheme "YourAppUITests" \
-destination "platform=iOS Simulator,name=iPhone 16 Pro Max" \
-only-testing "YourAppUITests/ScreenshotUITests"
Run the full pipeline:
swift ScreenshotAutomation/ScreenshotExportScript.swift
Verify output directory:
screenshots/
├── en-US/
│ ├── iPhone_6.7/
│ │ ├── 01_HomeScreen.png
│ │ ├── 02_DetailView.png
│ │ └── 03_Settings.png
│ └── iPad_12.9/
│ ├── 01_HomeScreen.png
│ └── ...
├── de-DE/
│ └── ...
└── ja-JP/
└── ...
Add to existing UI test target:
// In your UITest scheme, add ScreenshotUITests.swift
// The test class auto-discovers screens from ScreenshotPlan
Localized captions file (Localizable.strings):
// en-US
"screenshot.home" = "Track your goals effortlessly";
"screenshot.detail" = "Deep insights at a glance";
"screenshot.settings" = "Customize everything";
// de-DE
"screenshot.home" = "Verfolgen Sie Ihre Ziele muhelos";
"screenshot.detail" = "Tiefe Einblicke auf einen Blick";
"screenshot.settings" = "Alles anpassen";
@Test
func screenshotPlanLoadsAllScreens() throws {
let plan = ScreenshotPlan.default
#expect(!plan.screens.isEmpty)
#expect(plan.screens.allSatisfy { !$0.name.isEmpty })
}
@Test
func captionOverlayRendersText() throws {
let overlay = CaptionOverlay(
text: "Track your goals",
style: .top,
font: .systemFont(ofSize: 48, weight: .bold),
textColor: .white
)
let sourceImage = PlatformImage.testScreenshot(size: CGSize(width: 1290, height: 2796))
let result = try overlay.apply(to: sourceImage)
#expect(result.size.height > sourceImage.size.height)
}
@Test
func processorOrganizesOutputByLocaleAndDevice() async throws {
let processor = ScreenshotProcessor(outputDirectory: tempDir)
let screenshot = CapturedScreenshot(
name: "01_HomeScreen",
image: .testScreenshot(),
locale: "en-US",
device: .iPhone6_7
)
try await processor.process([screenshot])
let outputPath = tempDir
.appendingPathComponent("en-US")
.appendingPathComponent("iPhone_6.7")
.appendingPathComponent("01_HomeScreen.png")
#expect(FileManager.default.fileExists(atPath: outputPath.path))
}
Identify 6-10 screens that showcase the app's value proposition. Order them for maximum impact -- the first screenshot is the most important in App Store search results.
Marketing text should be short (3-6 words), benefit-focused, and localized. Use the app's brand fonts when possible.
Device frames add professionalism. Export at exact App Store Connect required resolutions to avoid rejection.
Run the full pipeline once to generate screenshots for every locale simultaneously. Each locale uses its own localized strings and sample data.
XCUIDevice.shared.appearance to set a consistent statesimctl status_barUITraitCollection.current or using launch arguments01_HomeScreen_light.png, 01_HomeScreen_dark.pngXCUIDevice.shared.orientation = .landscapeLeftScreenshotModeController accounts for this by adding bottomBorderPadding when sizing windowssips, crop from the bottom edge, not centeredmacos-screenshot-env.sh to hide dock, desktop icons, and simplify the clocktrap handlers to restore settings even on Ctrl+C or failureScreenshotModeController.configureWindow() sizes the window to fill the required dimensionstapUnhittable() extension from ScreenshotTestHelper.swift to tap by coordinate"pageStrip.page.1")Cmd+U test cyclesScreenshotTests.xctestplan and add it as a separate test plan in your schemexcodebuild test -testPlan "ScreenshotTests" ...ScreenshotModeController.swift -- App-side screenshot mode detectionScreenshotPlan.swift -- Screen/device/locale configurationScreenshotUITests.swift -- XCUITest capture classScreenshotTestHelper.swift -- Helpers + tapUnhittable() extensionScreenshotProcessor.swift -- Post-processing orchestratorCaptionOverlay.swift -- Localized text overlay rendererScreenshotExportScript.swift -- Full pipeline scriptsips-screenshot-process.sh -- Lightweight macOS image processingmacos-screenshot-env.sh -- Desktop preparation with trap cleanupSampleContentGenerator.swift -- Realistic sample data patternsScreenshotTests.xctestplan -- Dedicated Xcode test plangenerators/localization-setup -- Setting up localization infrastructureapp-store/screenshot-planner -- Planning screenshot content and marketing messagingUse when the user explicitly asks for a desktop or system screenshot (full screen, specific app or window, or a pixel region), or when tool-specific capture capabilities are unavailable and an OS-level capture is needed.
Mirror an iOS Simulator into the Codex in-app browser and render SwiftUI previews from importable Swift packages in that simulator with hot reload. Use when a user wants to watch or interact with an iOS app in the browser, see a SwiftUI preview outside Xcode Canvas, iterate live on a preview, or capture browser-visible simulator proof.
Annotate UI screenshots with documentation callouts in Fellyph's established visual style — uniform-width orange arrows with white halos, double-stroke target outlines, numbered callout cards, dim overlays and a framed canvas. Use this whenever the user asks to annotate a screenshot, add arrows or callouts to a screenshot, create documentation images, highlight UI controls in a capture, or produce docs/tutorial visuals for Playground, Studio or any web UI — even if they just say "add arrows to this" or "make a docs screenshot".
Render pixel-accurate iMessage screenshot mockups (DM or group) from a thread JSON. Supports minimal, with-keyboard, and full iPhone 15 Pro frame variants. Outputs HTML + PNG.
> End-to-end skill that turns a single reference image into a published Gooseworks style — analyzes the image, drafts the slim style spec, renders a hero example plus 2-3 additional formats via Playwright, writes the `gooseworks-style.json` manifest, and publishes via `npx gooseworks styles publish` so other agents can discover it. Mirrors goose-graphics-create-format but for styles.
Resize and validate App Store screenshots with current asc screenshot-size data and macOS sips. Use when preparing or fixing screenshots for App Store Connect submission.
Dependency checker and installer for agent-canvas, agent-eyes, and canvas-edit skills. Use BEFORE running any canvas skill for the first time, or when canvas skills fail with import/browser errors. Triggers on "setup agent canvas", "install canvas dependencies", "canvas not working", "playwright not found", or any setup/installation request for canvas skills.
Generate high-density editorial HTML info cards in a modern magazine and Swiss-international style, then capture them as ratio-specific screenshots. Use when the user provides text or core information and wants: (1) a complete responsive HTML info card, (2) the design to follow the stored editorial prompt, (3) output in fixed visual ratios such as 3:4, 4:3, 1:1, 16:9, 9:16, 2.35:1, 3:1, or 5:2, or (4) both HTML and a rendered PNG cover/card from the same content.
Take rshankras/screenshot-automation from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.