Home Articles Tools & Indie Devs Automate App Store Screenshots With fastlane: snapshot, frameit and deliver Step by Step

Table of contents

  • Quick nav

Was this helpful?

Share it with someone who needs it.

Automate App Store Screenshots With fastlane: snapshot, frameit and deliver Step by Step

A
AppShot Maker
10/24/2026
Automate App Store Screenshots With fastlane: snapshot, frameit and deliver Step by Step

When automation pays off

If your app ships in one language and you refresh screenshots twice a year, manual capture is fine. The iOS Simulator export guide covers that. Automation starts paying for itself as soon as any of these is true:

  • You support three or more languages and need native UI captures in each.
  • The UI changes most releases, so screenshots have to be redone.
  • You need several iPhone display classes plus iPad.

fastlane is an open-source toolchain for mobile releases. These are the actions that handle screenshots:

ActionWhat it doesPlatform
snapshot (capture_screenshots)Runs your UI tests across simulators and languages and captures screenshotsiOS
frameit (frame_screenshots)Wraps screenshots in device frames, with optional background and captionsiOS / Android
deliver (upload_to_app_store)Uploads screenshots and metadata to App Store ConnectiOS
screengrab / supplyAndroid equivalents for capture and uploadAndroid

Step 1: Initialize snapshot

From the project root, run:

fastlane snapshot init

This creates two files:

  • Snapfile holds your devices, languages and output folder.
  • SnapshotHelper.swift must be added to your UI test target.

Then call it from a UI test:

let app = XCUIApplication()
setupSnapshot(app)
app.launch()

// Navigate to each screen you want to capture
snapshot("01Home")
app.buttons["Search"].tap()
snapshot("02Search")

Start each name with a number. Files then sort in the order you want them on the store.

Step 2: Write the Snapfile

devices([
  "iPhone 17 Pro Max",
  "iPhone 17",
  "iPad Pro 13-inch (M4)"
])

languages(["en-US", "zh-Hans", "ja"])

scheme("YourAppUITests")
output_directory("./fastlane/screenshots")
clear_previous_screenshots(true)
override_status_bar(true)

A few notes:

  • Device names must match an installed simulator exactly. Run xcrun simctl list devices to check. Pick devices that cover the display classes you need. The required screenshots FAQ lists the mandatory ones.
  • override_status_bar(true) gives you a clean time, full battery and full signal. To do it by hand, see the status bar cleanup guide.
  • Prepare demo data. A common pattern is a launch argument that puts the app into a demo mode with fixed sample content, so no real user data ends up in a screenshot.

Run it:

fastlane snapshot

Screenshots are saved to fastlane/screenshots/<language>/, and fastlane writes an HTML summary page you can review.

Step 3: Add frames and captions with frameit

frameit needs ImageMagick (brew install imagemagick on macOS). Then run:

fastlane frameit

The first run downloads the device frame assets. For backgrounds and captions, put a Framefile.json in fastlane/screenshots/:

{
  "default": {
    "keyword": { "color": "#FFD60A" },
    "title": { "color": "#FFFFFF" },
    "background": "./background.png",
    "padding": 50,
    "show_complete_frame": true
  },
  "data": [
    { "filter": "01Home", "keyword": { "color": "#FFD60A" } }
  ]
}

Caption text for each language goes in title.strings and keyword.strings inside that language's folder, keyed by screenshot name.

Know frameit's limits before you depend on it:

LimitationImpactWorkaround
New device frames can arrive lateThe latest models may have no frame yetUse a close model or frame elsewhere
Limited layout optionsYou get "caption + framed screenshot + background"Build complex layouts in a design tool
Framing changes output sizeFinal images may not match an accepted store sizeCheck dimensions before uploading

That last row matters most. A framed image must still be an exact accepted pixel size, or App Store Connect rejects it with a dimensions error. Many teams use snapshot only for raw captures, then produce the final marketing images in a design tool or a browser framing tool such as AppShot Maker.

Step 4: Upload in bulk with deliver

fastlane deliver --skip_binary_upload --skip_metadata --overwrite_screenshots
  • --skip_binary_upload uploads assets only, with no build.
  • --skip_metadata leaves your name, description and other text alone.
  • --overwrite_screenshots deletes the existing screenshots in App Store Connect before uploading.

deliver gets the locale from the fastlane/screenshots/<language>/ folder name and the display class from each image's pixel size. Any image at the wrong size fails. Set up an App Store Connect API key or your login before you run it.

Android equivalents: screengrab and supply

iOSAndroid equivalentNotes
snapshotscreengrabCaptures via instrumentation tests; add the tools.fastlane:screengrab dependency
snapshot("name")Screengrab.screenshot("name")Called from test code
deliversupplyUploads to Google Play from metadata/android/<locale>/images/

For Play size rules, see Google Play screenshot requirements.

Common pitfalls

SymptomCauseFix
"Device not found"Snapfile name doesn't match the simulatorCopy the exact name from xcrun simctl list devices
Loading spinners in shotsCaptured before the UI finished renderingWait for the target element before calling snapshot
Every locale shows EnglishApp ignores the launch languageCheck your localization files and confirm setupSnapshot is called
Dimensions error on uploadframeit changed the output sizeCheck pixels, or upload unframed originals
Fails on CISimulator missing or slow on first bootCreate the simulator and boot it once before the run

Summary

  • When you have many languages and devices and frequent UI changes, snapshot saves the most time on native captures.
  • frameit handles simple "frame + caption" layouts. Use a design tool for anything richer.
  • Before uploading with deliver, confirm every image is an exact accepted pixel size.

Ready to design your store screenshots?

Try AppShotMaker and turn raw captures into store-ready screenshots in minutes.