Skip to main content
PlayMockUp
Guide8 min read

Automate App Store and Play Screenshots With fastlane

RVBy Rohit
A laptop with a terminal window open on a pale purple desktop, beside a small succulent in a white pot

The Short Answer

Quick answer: fastlane automates store screenshots in three steps. snapshot for iOS or screengrab for Android captures them from UI tests, in every language and device you list. frameit adds device frames, a background and titles. deliver uploads to App Store Connect, and supply uploads to Google Play. One lane can run all of it.

I read fastlane's docs on iOS screenshots, Android screenshots, frameit, deliver and supply on October 26, 2026. I checked the current release on GitHub too. It was version 2.241.1, published October 15, 2026.

Here's how each tool works, what it needs, and where it falls short.

The Five Tools at a Glance

fastlane is a free, open source tool under the MIT license. For screenshots, five of its tools work together.

ToolAction nameJob
snapshotcapture_screenshotsCaptures iOS and tvOS screenshots
screengrabcapture_android_screenshotsCaptures Android screenshots
frameitframe_screenshotsAdds device frames, text and a background
deliverupload_to_app_storeUploads to App Store Connect
supplyupload_to_play_storeUploads to Google Play

You can run each one alone from the command line. Or you can chain them in a lane, which is fastlane's word for a saved list of steps.

Why Automate Screenshots at All

fastlane's iOS screenshot guide lists the problems with taking screenshots by hand.

  1. 1Screenshots drift out of date as your app's design changes.
  2. 2A localized app needs a different set for every language.
  3. 3Loading indicators can slip into a capture.
  4. 4Each device size might show different content.

The biggest cost comes later. The guide says that a spelling mistake or a redesign means you'll have to create every screenshot again, for every language and device.

With automation, you fix the test or the text once. Then you run the same command again.

iOS: How snapshot Captures

snapshot uses Apple's UI Tests to drive your app. A UI test taps through your screens like a person would.

Between taps, you call snapshot with a name, such as 01LoginScreen. That marks the moment to capture.

You don't have to write every test by hand. Xcode's UI Test recorder writes test code for you while you use the app in the simulator.

One warning matters here. The guide says running the test inside Xcode doesn't create the screenshots, though no test will fail.

You must run fastlane snapshot from the command line. That command creates the folders, renames the files and builds an overview page.

Setting Up snapshot

The guide's setup has these steps.

  1. 1Create a new UI Test target in your Xcode project.
  2. 2Run fastlane snapshot init in your project folder.
  3. 3Add the SnapshotHelper.swift file to your UI Test target.
  4. 4Add a new Xcode scheme for that target, and mark it as Shared.
  5. 5Record your taps, and call snapshot between them.
  6. 6Call setupSnapshot on your app in the test's setUp method, before it launches.
  7. 7Run fastlane snapshot in the terminal.

Objective C projects need one more step, a bridging header in the test class.

When it's done, snapshot opens an HTML page that shows every screenshot on every device. The guide suggests sending it to QA, marketing or translators to check.

The Snapfile: Devices and Languages

Setup also creates a Snapfile. It's a small config file that fastlane loads every time you run snapshot.

It holds the list of simulators to use, and the list of languages. The sample file lists en-US and de-DE.

It can also name the scheme, the output folder, and whether to clear old screenshots first.

Since Xcode 9, snapshot runs several simulators at the same time by default. That cuts the total time. You can turn it off to run one device at a time.

If you list many languages, plan the text first. Our guide to localizing store listings covers which screens need to change by language.

Status Bar, Dark Mode and Test Data

A few snapshot options control what the screenshots show.

OptionWhat it does
override_status_barShows 9:41 AM, full battery and full reception
dark_modeSets the simulator to dark or light mode
localize_simulatorSets the simulator's system language
erase_simulatorErases the simulator before the app runs

Launch arguments help with test data. You can pass values, such as a first and last name, that your app reads when it starts.

snapshot also sets a flag called FASTLANE_SNAPSHOT. Your app can check it to show demo data only during a screenshot run.

Our guide to capturing clean app screenshots covers what that demo data should look like.

Android: How screengrab Captures

screengrab is the Android side. The Android screenshot guide says it uses Android's instrumented tests with Espresso to drive your app.

You add screengrab as a test dependency in Gradle. Then you add a few permissions to your debug manifest.

PermissionWhy it's needed
DISABLE_KEYGUARD and WAKE_LOCKUnlock the device and wake the screen
WRITE and READ_EXTERNAL_STORAGEStore and read the screenshots
CHANGE_CONFIGURATIONSwitch the device language

In your test class, a LocaleTestRule switches languages for you. You call Screengrab.screenshot with a name wherever you want a capture.

The guide prefers JUnit 4 over JUnit 3. With JUnit 4, the device changes language far fewer times.

Sharper Android Captures With UI Automator

screengrab can capture screenshots in two ways. Since version 0.5.0, you can switch to a strategy built on UI Automator.

The guide lists what it fixes.

  1. 1Shadows and elevation in Material UI show correctly.
  2. 2Dialogs and other multi window screens show correctly.
  3. 3It works on Android N.

There's a catch. UI Automator needs a device on API level 18 or higher, so it isn't the default. You turn it on with one call before your tests run.

For a tidy status bar on Android, the guide points to a different tool, QuickDemo.

Running screengrab

screengrab needs two APK files, a debug build and a test build. You can build them with Gradle, or with a fastlane lane that does it for you.

Then you run fastlane screengrab in your app's folder.

If a required setting is missing, screengrab asks you for it. To skip the questions next time, store the settings in a Screengrabfile. It's written in Ruby, and it holds things like the list of locales.

The screenshots land in the fastlane/metadata/android folder. That's the same place supply reads from when it uploads.

So the capture step and the upload step already share one folder.

Adding Device Frames With frameit

frameit puts a device frame around your screenshots. Its docs page says it supports iPhone, iPad, Mac and a set of Android devices, in portrait and landscape.

Run fastlane frameit in a screenshot folder to frame every image. Add android for Android frames, or silver for silver frames.

The frames download the first time you run it. They first came from Facebook's device frame set, and fastlane keeps them in a separate GitHub repo. I checked that repo, and its latest change was on October 21, 2026.

frameit needs ImageMagick installed to edit images.

One limit is easy to miss. A frame alone keeps the full resolution, so the image can't go straight to the App Store. The docs say those are for websites, print and email.

Titles and Backgrounds With a Framefile

To make store ready images, you add a Framefile.json. It sets a background, a title and an optional keyword for your screenshots.

SettingWhat it controlsDefault
backgroundPath to the background imageRequired
titleTitle text, font, color and sizeRequired
keywordAn optional second line of textNone
paddingSpace around the edges, in pixels or percent50
title_below_imagePlaces the text under the framefalse
show_complete_frameShrinks the frame so none is cut offfalse

Each screenshot gets its own text through a filter, which matches part of the file name.

If you don't set a font size, frameit scales the text to fit. For translated titles, the docs say to use .strings files.

Uploading to the App Store With deliver

deliver uploads screenshots, app previews and metadata to App Store Connect. By default, it reads screenshots from the fastlane/screenshots folder, with one subfolder per language.

It works out the device type from each image's resolution. So the pixel size of every file matters.

Before it uploads, deliver shows a summary of your metadata. That's because the upload replaces what's already in App Store Connect.

An option called overwrite_screenshots clears all earlier screenshots before it uploads the new ones.

The docs suggest you store your metadata in git, but not the screenshots. If snapshot builds them, you can make them again at any time.

Uploading to Google Play With supply

supply uploads metadata, images and builds to Google Play. It reads from one folder per locale, with an images folder inside.

Screenshots go in subfolders with set names.

FolderDevice
phoneScreenshotsPhones
sevenInchScreenshots7 inch tablets
tenInchScreenshots10 inch tablets
tvScreenshotsTV
wearScreenshotsWear OS

Files can be PNG or JPEG, and you can name them anything. Google Play shows them in alphanumeric file name order, so a number at the start sets the order.

The same images folder takes your featureGraphic, icon, promoGraphic and tvBanner. For the sizes Google Play accepts, see our guide to Play Store screenshot sizes.

One Lane for the Whole Job

Both guides show a lane called screenshots. It lets anyone on your team run the full job with one command.

StepiOS laneAndroid lane
1. Capturecapture_screenshotscapture_android_screenshots
2. Frameframe_screenshotsNot in the guide's lane
3. Uploadupload_to_app_storeupload_to_play_store

The iOS guide's example frames the screenshots with white frames between capture and upload.

You add the lane to your project's Fastfile. After that, a redesign or a new language means one run, not a week of manual work.

Keep the lane under version control with your app. Then the setup survives when a team member leaves.

Where PlayMockUp Fits

fastlane suits apps that already have UI tests, or teams that ship many languages. The setup takes real work, from test targets to Framefiles.

For a small app with one or two languages, that setup may cost more time than it saves.

In that case, capture your screens by hand and build the set in our free mockup generator. It places screenshots in iPhone, Pixel, Samsung, iPad or MacBook frames. It adds a gradient background and text, then exports at Play Store and App Store sizes.

You can also mix the two. Let fastlane capture the raw screenshots, and design the framed set by hand.

Frequently asked questions

Do I need UI tests to use fastlane snapshot?

Yes. snapshot uses Apple's UI Tests to move through your app and capture each screen. Xcode's UI Test recorder can write that test code for you while you use the app in a simulator.

Why doesn't running my UI test in Xcode create screenshots?

fastlane's guide says running the test in Xcode doesn't create the snapshots. Run fastlane snapshot from the command line, which creates the folders, renames the files and builds the overview page.

Can fastlane take Android screenshots?

Yes. screengrab captures Android screenshots through instrumented tests with Espresso, in every locale you list. It saves them to the fastlane metadata folder, and supply uploads them to Google Play.

Can frameit screenshots go straight to the App Store?

Only with a Framefile that adds a title and background. A frame alone keeps the full resolution, which doesn't match App Store Connect's sizes. Those plain framed images suit websites and email.

Can I change App Store screenshots without an app update?

It depends on your version's status in App Store Connect, which allows uploads only in some states. Our guide on [changing screenshots without an update](/blog/change-app-store-screenshots-without-update-2026) lists each one.

Build the mockup in your browser.

Drop a screenshot into a real device frame and export at the exact store size — free, no signup.