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.

Get New Tutorials by Email

No spam. Just clear, practical breakdowns you can apply right away.

Enjoy this tutorial?

Get new practical tech tutorials in your inbox.