CLI to generate App Store-ready screenshots and resize in-app artwork.
npm install -g storeshotOr use it directly:
npx storeshot -i ./screenshots -p appstore_ready# Generate App Store-ready screenshots
storeshot -i ./screenshots -p appstore_ready
# Resize for in-app paywalls
storeshot -i ./screenshots -p paywall -m fit
# Preview without writing files
storeshot -i ./screenshots -p appstore_ready --dry-runstoreshot [options]| Option | Short | Description | Default |
|---|---|---|---|
--input <dir> |
-i |
Input directory containing images | ./screenshots |
--output <dir> |
-o |
Output directory for generated screenshots | ./output |
--preset <name> |
-p |
Preset to use | appstore_all |
--mode <mode> |
-m |
Resize mode: fill, fit, fit-blur, or fit-edge |
fill |
--format <format> |
-f |
Output format: png or jpg |
png |
--background <color> |
-b |
Background for fit mode and alpha flattening |
#ffffff |
--dry-run |
- | Preview without saving files | false |
Orientation-aware App Store phone outputs:
- Portrait input: 1242 × 2688 px, 1284 × 2778 px
- Landscape input: 2688 × 1242 px, 2778 × 1284 px
storeshot -i ./screenshots -p appstoreAccepted App Store Connect sizes:
- Portrait input: 1242 × 2688 px (iPhone 6.5"), 1284 × 2778 px (iPhone 6.7")
- Landscape input: 2688 × 1242 px (iPhone 6.5"), 2778 × 1284 px (iPhone 6.7")
storeshot -i ./screenshots -p appstore_allAlias for appstore_all when you want the intent to be explicit:
storeshot -i ./screenshots -p appstore_readyGeneric paywall or onboarding size:
- 640 × 1136 px
storeshot -i ./screenshots -p paywall -m fitSingle iPhone 6.5" output:
- 1242 × 2688 px
storeshot -i ./screenshots -p iphone_6_5Single iPhone 6.7" output:
- 1284 × 2778 px
storeshot -i ./screenshots -p iphone_6_7Paywall plus portrait App Store phone outputs:
- 640 × 1136 px
- 1242 × 2688 px
- 1284 × 2778 px
storeshot -i ./screenshots -p allBest for App Store submission. It crops to exact dimensions, fills the frame, and avoids borders.
storeshot -i ./screenshots -p appstore_ready -m fillBest for in-app assets. It preserves aspect ratio and pads to the target size using a solid background color.
storeshot -i ./screenshots -p paywall -m fit -b '#ffffff'Best when you need exact App Store dimensions without cropping, but a solid-color border looks wrong. It preserves the full screenshot and fills extra space with a blurred version of the artwork.
storeshot -i ./screenshots -p appstore_ready -m fit-blurBest when you need exact App Store dimensions without cropping and without blur. It preserves the full screenshot and fills extra space by extending the outermost pixels of the artwork.
storeshot -i ./screenshots -p appstore_ready -m fit-edgeOutput filenames follow this pattern:
{original_name}_{preset}_{width}x{height}.{extension}
Example for home.png with appstore_ready:
home_iphone_6_5_portrait_1242x2688.png
home_iphone_6_7_portrait_1284x2778.png
The generated files are flattened to a solid background, converted to sRGB, and written as exact-size PNG or JPEG outputs.
# App Store screenshots to a dedicated folder
storeshot -i ./screenshots -p appstore_ready -o ./appstore_output
# Paywall assets with preserved aspect ratio
storeshot -i ./screenshots -p paywall -m fit -o ./paywall_assets
# JPEG output when needed
storeshot -i ./screenshots -p appstore_ready -f jpg# Run from source
npx ts-node src/index.ts -i ./screenshots -p appstore_ready
# Build
npm run build
# Run compiled output
node dist/index.js -i ./screenshots -p appstore_ready- Input: PNG, JPG, JPEG
- Output: PNG or JPG
- Use
fillfor App Store screenshots unless you intentionally want padded artwork. - Use
fitfor paywalls and onboarding flows where preserving the full composition matters. - Use
fit-blurwhen you need full composition preservation at App Store sizes with a softened background. - Use
fit-edgewhen you need full composition preservation at App Store sizes without hard white bars or blur. - If the source image has transparency, keep the default white background or pass
--backgroundexplicitly.
Permission denied on output folder
chmod -R 755 ./outputImages look stretched
- Use
fitinstead offillwhen preserving the full composition matters. - Check that the source image is large enough for the target preset.
Output dimensions look wrong
- Run
storeshot --helpto confirm the selected preset. - Check the generated filename to confirm the exact output size.
MIT