Skip to content
Launch offer: Mac Manager £9.99 first year

Shotlist guide

iPhone Duo

Capturing both iPhone Duo displays, automatic and guided unfolding through Device Hub, the Accessibility permission, orientation, postures, composing and uploading Duo screenshots.

iPhone Duo

The iPhone Duo has two displays, and App Store Connect has a screenshot size for each. Apps built with the iOS 27.1 SDK or later need both from April 2027.

Slot Display Captured size
iphone-duo-outer The outer display, folded 1398 × 2034
iphone-duo-inner The inner display, unfolded 2853 × 2007 (landscape, the default) or 2007 × 2853 (portrait)

Add either or both to slots:

"slots": ["iphone-6.9", "iphone-6.3", "iphone-duo-outer", "iphone-duo-inner"]

The outer display captures as unattended as any other device. The inner display only shows your app once the Duo is unfolded, and there’s no command-line way to unfold it. This page explains how Shotlist does it, and what it needs from you.

Requirements

  • Xcode 27.1 or later, with the iOS 27.1 simulator runtime. The Duo simulator runs only on iOS 27.1.
  • Device Hub, which comes with Xcode. Shotlist presses its posture buttons.
  • For the inner display, the Mac unlocked, with either Accessibility permission for Shotlist or someone to click a button once per run.

Run shotlist doctor to check. With a Duo slot listed, it reports the posture mode, whether the screen is locked and whether Device Hub was found.

How a Duo run works

Both Duo slots share one simulator, Shotlist · iphone-duo · iOS-27-1. On it, Shotlist:

  1. captures every outer-display cell, folded, for every locale and appearance;
  2. unfolds the Duo once;
  3. captures every inner-display cell, for every locale and appearance;
  4. if you chose portrait, rotates it once, before the first inner capture;
  5. folds it back at the end.

Your app reports which screen it’s on whenever that changes, so Shotlist sees an unfold from inside the app, within about a tenth of a second of the move. It never waits a fixed time for the fold.

Automatic unfolding

simctl has no fold command, so Shotlist presses Device Hub’s own Open and Closed posture buttons through the macOS Accessibility API. Device Hub opens the Duo’s window to do this, so the window is visible during the inner-display part of a run.

This needs Accessibility permission for whatever runs Shotlist:

  1. Open System Settings › Privacy & Security › Accessibility.
  2. Turn on your terminal app (Terminal, iTerm or whichever runs the CLI), and Shotlist.app if you use the Mac app.
  3. Run shotlist doctor. The check should read: “iPhone Duo posture: automatic: this process may use Accessibility, so Shotlist presses Device Hub’s Open and Closed buttons”.

Device Hub’s buttons are found by their English names: Closed, Partially Open, Open and Rotate Right. On a Mac whose language isn’t English, they may not be found; Shotlist then fails the inner-display cells with “Device Hub’s ‘Open’ button wasn’t found; its labels may be localised or its layout changed”. Use the guided step instead (turn off Shotlist’s Accessibility permission for the run).

The guided step

Without Accessibility permission, or if Device Hub’s window can’t be driven, the unfold is a guided step. The run log shows a prompt, and the Mac app shows it as a banner above the Matrix:

PROMPT: In Device Hub, set 'Shotlist · iphone-duo · iOS-27-1' to Open: click the Open posture button in its window. Shotlist continues as soon as the app moves.

Shotlist opens the Duo’s Device Hub window for you. Click Open. The run continues within about 0.1 s of the app moving to the inner display.

  • You’re asked once per run, not once per locale.
  • Shotlist waits up to 15 minutes. If nobody unfolds the Duo by then, every inner-display cell fails with the same reason, and the rest of the run is unaffected.
  • With "duoInnerOrientation": "portrait", you’re also asked to rotate it: “In Device Hub, rotate ‘…’ to portrait (Rotate Right).”
  • At the end, you’re asked to set it back to Closed. The run doesn’t wait for that.

A locked screen

While the Mac’s screen is locked, Device Hub’s controls are out of reach and there’s nobody to do the guided step. Shotlist checks at the start of the Duo’s part of the run:

  • outer-display cells capture as usual;
  • every inner-display cell fails at once with “the Mac’s screen was locked, so the iPhone Duo couldn’t be unfolded; run shotlist capture --slots iphone-duo-inner while you’re at the Mac”.

Everything else in the run captures normally. When you’re back, capture the gap:

shotlist capture --slots iphone-duo-inner

Orientation

Unfolded, the inner display shows your app in landscape: 2853 × 2007. App Store Connect accepts that size, so it’s the default.

For portrait (2007 × 2853), set:

"capture": { "duoInnerOrientation": "portrait" }

Shotlist then presses Device Hub’s Rotate Right once after unfolding, and waits for the app to report a portrait orientation before capturing.

Device Hub

  • Never quit Device Hub during a run. Quitting it shuts down every booted simulator on the Mac, yours and Shotlist’s alike.
  • If Device Hub isn’t running, Shotlist launches it and opens the Duo’s window, which can take most of a minute on a cold start. It waits up to 60 s for the window.
  • Its window must stay open while the inner display is captured.

Scenes and postures

Every scene runs on both displays by default. Scenes have two postures:

Posture Means
.closed Any single-display device, and the Duo folded (outer display).
.open The Duo unfolded (inner display).

To keep a scene to one display:

SwiftUIScene("planner", postures: [.open]) { context in
    PlannerView()
}

A scene that doesn’t list a slot’s posture is skipped there and takes no place in that slot’s screenshots. Because every iPhone and iPad is .closed, postures: [.open] also skips those slots.

To adapt a scene to the display instead, read context.posture (or context.slot):

SwiftUIScene("library") { context in
    RootView(router: Router(tab: .library), layout: context.posture == .open ? .twoColumn : .compact)
}

The outer display’s capture includes the system column down its right-hand edge (the camera, clock and Wi-Fi). It’s part of Apple’s 1398 × 2034 size, so it stays in the screenshot.

Composing

Both Duo sizes are close to 2:3, much squarer than a tall iPhone. Captions and devices are sized as fractions of the canvas’s shorter side, so templates adapt.

The split template, two scenes side by side, works on the inner display and iPad. On every other slot it falls back to caption-top. See Captions and composing.

Uploading

App Store Connect’s documented API has no display type for either Duo display.

Slot What publish does
iphone-duo-outer Skips it, unless you pass --experimental-duo. Then it uploads as APP_IPHONE_DUO, a display type that works for the outer display but isn’t in Apple’s documentation.
iphone-duo-inner Plans it as export: upload the composed files by hand in App Store Connect.

The files to upload by hand are Shotlist/Output/composed/<locale>/iphone-duo-inner-NN.png, in order. See App Store Connect.

In CI

Accessibility and the guided step both need someone at an unlocked Mac. On an unattended runner, leave the inner display out and capture it separately at a desk:

shotlist capture --slots iphone-6.9,iphone-6.3,iphone-duo-outer

If the runner’s screen is locked, inner cells fail at once rather than waiting.

Troubleshooting

Problem Fix
“no installed iOS runtime supports com.apple.CoreSimulator.SimDeviceType.iPhone-Duo” Install Xcode 27.1 or later and its iOS 27.1 runtime (Xcode › Settings › Components).
doctor says “guided” Grant Accessibility to your terminal or Shotlist.app, or click Open when asked.
“the Mac’s screen was locked…” Unlock the Mac and run shotlist capture --slots iphone-duo-inner.
“Device Hub didn’t show a window for ‘…’ within 60 s” Open Device Hub yourself (it’s inside Xcode.app), then capture again.
“Device Hub’s ‘Open’ button wasn’t found…” Device Hub’s labels are localised or its layout changed. Use the guided step.
“timed out after 900 s waiting for the app to move to the inner display” Nobody unfolded the Duo in the guided step. Capture the inner display again while you’re at the Mac.
“timed out after 20 s waiting for the app to move to the inner display” The press didn’t unfold the Duo. Check the Duo’s window in Device Hub, then try again.
Every other simulator shut down mid-run Device Hub was quit. Capture the failed cells again; don’t quit Device Hub during a run.