Today We Build a Screenshot Pipeline You Can Trust Before Release
When screenshot generation is a manual checklist item, it gets skipped under pressure. The result is broken App Store assets and delayed review cycles. Let’s convert this into a release gate.
Step 1: Define a screenshot manifest instead of ad-hoc scripts
{
"devices": ["iphone_6_7", "iphone_6_9"],
"locales": ["en", "ja", "zh-Hans"],
"scenes": ["onboarding", "pricing", "editor"]
}
Think of this like a test matrix. If it is in the manifest, it must be generated.
Step 2: Run deterministic rendering
struct ShotSpec {
let device: String
let locale: String
let scene: String
}
func render(_ spec: ShotSpec) async throws -> URL {
// launch simulator, inject locale + seed data, capture image
try await ScreenshotRunner.capture(spec)
}
Step 3: Fail the release if required assets are missing
python scripts/check_shots.py --manifest shots.json --folder build/screenshots
Pitfalls to avoid
- Using random seed data that changes visual layout between runs.
- Hard-coding one locale and forgetting text expansion in others.
- Generating screenshots but never validating dimensions.
Validation checklist
- Two consecutive runs produce identical file hashes for unchanged UI.
- Each required device/locale/scene combo exists.
- Release pipeline fails fast on any missing screenshot.