Shotlist guide
Verifying output
What shotlist verify checks before upload, raw-only and composed checks, unreviewed captions, content rules, the same-language check, options and exit codes.
Verifying output
shotlist verify
verify checks your output against Apple’s rules before anything is uploaded. It reads only local files: it doesn’t build, capture or contact App Store Connect, and it’s free.
publish --apply runs the same checks first and refuses to upload while any fail. Running verify yourself shows the problems sooner.
What it checks
verify works in one of two modes, depending on whether you’ve composed yet.
Before composing: the raw captures
If Shotlist/Output/composed/ doesn’t exist, verify checks the raw captures only, and says so:
✓ 32 files pass
Checked the raw captures only: nothing is composed yet. After `shotlist compose`, verify also checks captions and content rules.
For every cell in the matrix:
| Check | Problem it reports |
|---|---|
| The cell was captured | not captured; run `shotlist capture` |
| The capture didn’t fail | capture failed: <the cell's error> |
| The file exists and is a PNG | the file is missing, not a PNG |
| No alpha channel or transparency | has an alpha channel (PNG colour type 6); Apple rejects transparency |
| A size the slot accepts | 1179 × 2556 isn't an accepted iphone-6.9 size (…) |
| 1 to 10 screenshots per size, locale and appearance | 12 screenshots; App Store Connect takes 1 to 10 per size |
| Each language looks different | every capture is identical to en-GB's. The app probably doesn't declare fr (add it to a String Catalog or an .lproj), so iOS showed another language |
Cells skipped because the scene doesn’t list the slot’s posture (iPhone Duo) aren’t problems.
Transparency is judged from the PNG file’s own header (its colour type and any tRNS chunk), not from ImageIO, which reports an alpha channel for files that have none.
The same-language check
If a locale’s captures on a slot are all byte-identical to another locale’s, the app almost certainly doesn’t declare that language, and iOS showed another one instead. verify fails it. Only locales of different languages are compared: en-GB and en-US can legitimately match. See Declare every locale.
After composing: everything
Once composed/ exists, verify runs the raw checks above, then, for each locale:
| Check | Problem it reports |
|---|---|
| Each slot has composed screenshots | no composed screenshots; run `shotlist compose` |
| At most 10 per slot | 11 screenshots; App Store Connect takes 1 to 10 per size |
| Each composed file is a PNG at an accepted size, with no alpha | as for raw captures |
| Every scene has a caption | de-DE has no caption for scene 'library' (scene.library.caption) |
| No caption or subtitle is an unreviewed machine draft | de-DE 'library': “…” is a machine draft nobody has reviewed. Check it, then `shotlist captions review --locales de-DE`, or pass --allow-unreviewed |
| Captions, subtitles and creative titles follow Apple’s content rules | de-DE scene.shop.caption breaks Apple's content rules: price or currency: “€5” |
If creative is set in shotlist.json, it also checks every creative asset:
| File | Expected size |
|---|---|
creative/<locale>/header.png (or creative/shared/header.png when not localised) |
3840 × 1646 |
creative/<locale>/header-16x9.png |
5244 × 2950 |
creative/<locale>/search.png |
3840 × 2560 |
creative/<locale>/search-16x9.png |
5244 × 2950 |
Each must exist (missing; run `shotlist compose`), have the right size (3840 × 1600; Apple wants 3840 × 1646) and have no alpha channel. The 16:9 files are expected unless "universal": false.
Output
When everything passes:
✓ 64 files pass
Otherwise, one line per problem, then a count:
✗ Captions.xcstrings: de-DE 'library': “Dein ganzes Regal an einem Ort” is a machine draft nobody has reviewed. Check it, then `shotlist captions review --locales de-DE`, or pass --allow-unreviewed
✗ raw/fr-FR/iphone-6.3: every capture is identical to en-GB's. The app probably doesn't declare fr (add it to a String Catalog or an .lproj), so iOS showed another language
2 problems in 64 files
Each problem starts with the file or folder it’s about, relative to Shotlist/Output/ (or Captions.xcstrings for caption problems).
Options
| Option | Effect |
|---|---|
--raw-only |
Check only the raw captures, even after composing. |
--allow-unreviewed |
Accept machine-drafted captions nobody has reviewed. Useful for a preview build; don’t publish with it. |
--slots <list>, --locales <list> |
Check only these. |
--json |
Print checkedFiles and problems (each with file and message) as JSON. |
--project-dir <folder> |
The folder that holds Shotlist/. |
Exit codes
| Code | Meaning |
|---|---|
| 0 | No problems. |
| 1 | At least one problem, or shotlist.json isn’t valid. |
In the Mac app
Verify in the Publish screen runs the same checks and lists the problems in the inspector. The app never accepts unreviewed captions: Upload… refuses while verify has any problem.
A typical sequence
shotlist capture
shotlist verify --raw-only # sizes, failures and locales, before captions exist
shotlist captions draft
# … someone checks the drafts …
shotlist captions review --locales de-DE,fr-FR
shotlist compose
shotlist verify # everything, ready to publish