Guide · iPhone Duo · for product people
How to make an iPhone Duo app, without writing Swift
The iPhone Duo is in people’s hands on October 23. An app for it is an ordinary iOS 27.1 app whose screens work in three layouts instead of one, built with Xcode 27.1, and submitted with one workaround that the current beta needs. Here are the six steps, what each one produces, and where an AI agent does the typing.
Verified
There is no separate “Duo app”. The phone ships with iOS 27.1, and an app built with the iOS 27.1 SDK runs on it like on any iPhone. What the Duo adds is a second screen and a hinge, so the same app has to look right closed, open, and in between. That is the whole difference, and it is a layout question before it is a coding question.
What you need before step one: a Mac with Apple silicon on macOS 26.6 or newer (the 27.1 beta requires it), the Xcode 27.1 beta from Apple’s developer site (the Duo platform download is about 16 GB), an Apple Developer Program membership at $99 a year so the app can be submitted under your name, and an idea written down in enough detail to become a screen list. If you also want the Android version, Google Play Console is $25 once. If you already own an app and want to know what changes for it, that is a different page: iPhone Duo apps: what changes.
Step 1. Write the PRD with one adaptive-layout line
A product requirements document is the artifact an agent builds from; the PRD prompt is the template. For the Duo, add one line that most PRDs do not have.
Apple’s “Prepare your app for iPhone Duo” talk names three layouts. Outer display, portrait: the layout every iPhone app already has. Outer display, landscape: a compact-by-compact layout that is new. Inner display, open: regular in both directions, which is the iPad layout. So the line reads: “Every screen works in the iPhone layout, the new compact landscape layout, and the iPad layout; list screens use a sidebar on the inner display; the app keeps its state when the phone is opened or closed.”
If the app should react to the hinge, say so in plain words: “closed, half-open or flat”, and which screens care. Most apps do not need this; a reading app or a camera app might. One more sentence covers Android, where foldables have existed since 2019 and Google’s guidance is the same idea: “Adaptive layouts provide an optimized user experience when a foldable device is folded or unfolded, in portrait or landscape orientation, or in tabletop or book posture.” One PRD line, two foldable families.
Produces: the PRD, with the screen list and the layout line.
Step 2. Choose Apple’s navigation parts, not custom ones
This is the decision that sets the size of the project. Apple’s own navigation containers adapt to the three layouts on their own: a split view becomes a sidebar on the inner display and a stack on the outer; a tab bar can move into the sidebar when there is room. Custom navigation, drawn by hand, adapts to nothing, and every layout becomes a separate piece of work.
Write it into the PRD: “Use the platform’s standard navigation and list components; no custom navigation.” An agent follows this when it is in the plan; left out, it will draw whatever the design shows.
Produces: one sentence in the PRD that removes most of the Duo-specific work.
Step 3. Build with Xcode 27.1
The Duo simulator and the SDK that knows about the hinge are in Xcode 27.1, which is in beta and installs alongside the shipping Xcode. Download it from Apple’s developer site, add the iOS 27.1 platform in Settings → Components, and make it the active Xcode (Set up Xcode → Set as active; it asks for your Mac password once).
With Modaal, Xcode is a menu choice: pick 27.1 and the agent builds with it; the first prompt takes the PRD and the agent writes a plan you approve before any screen exists, then builds feature by feature in SwiftUI. With Claude Code alone, point it at an empty project and give it the same PRD; the plan, the architecture and the test loop are yours to insist on, and the vibe coding workflow is the loop to run.
Produces: an Xcode project on your disk that builds with 27.1.
Step 4. Test in the Duo simulator: open, closed, half-folded, both orientations
Xcode 27.1 puts the Duo simulator next to the Run button. Run the app and put it through every state in the PRD line: closed in portrait, closed in landscape, open in both orientations, and, if the app reacts to the hinge, half-open. The things that break first are the ones Apple names: a list that should become a sidebar and does not, text that does not reach the edge on the inner display, a modal sized for the outer screen floating in the middle of the inner one.
Whether the agent can do this for you depends on the tooling: the default developer tools let an agent build and launch the app but not fold or rotate the device, so it tests one state and reports done. Modaal gives the agent those controls and it checks each state itself; how AI agents test iPhone apps is the detail. Either way, finish on a real phone once you have one; the simulator does not show you the hinge in your hand.
Produces: a screen-by-screen list of what passed in each pose, which becomes the next prompts.
Step 5. Submit: the first archive fails, and here is why
In the current 27.1 beta, the first attempt to archive for TestFlight or the App Store fails: the SDK on your Mac has Duo-specific pieces that the build service does not yet accept. The fix is a guard that compiles the Duo-only code only where the SDK has it, with a runtime check for 27.1 next to it. Do not click Xcode’s “Fix with agent” button on this error; it digs in the wrong place. Our docs guide has the exact prompt to give your agent and the full sequence: iPhone Duo App Store submission. Review the diff it produces, run the app once on an iOS 27.0 simulator to confirm nothing else changed, then Archive and Upload.
Processing takes ten to thirty minutes; release the new version manually and check it on a physical device before anyone else does. To be live on launch morning, the build has to be in review with time to spare; October 16 is the pre-order date and a sensible internal deadline. And from April 2027, every app or update uploaded to App Store Connect “must be built with the iOS 27 & iPadOS 27 SDK or later”, so nothing on this page is optional for long.
Produces: a build in TestFlight, then in review.
Step 6. Android, from the same project
The Galaxy Z Fold and its successors have had the same closed-open-tabletop problem since 2019, and the PRD line from step 1 already covers them. In Modaal, each feature’s logic is written once and rendered in SwiftUI on the iPhone and Jetpack Compose on Android from one project, so the Android app is the same screens against the same backend, with Google’s adaptive-layout parts in place of Apple’s. Building both platforms is on the Pro plan; the Free plan covers one project with unlimited prompts on one platform, Pro is €9 per user per month billed annually (€15 monthly) and adds both platforms, TestFlight distribution and Git collaboration (/pricing).
Produces: the Android project in Android Studio, on your disk, with the same screen list.
What to leave out of the first version
Hinge-angle effects nobody asked for. A separate design for the inner display when the iPad layout of your screens is already right. Any feature that exists to show off the fold rather than to do the app’s job. The reviewer and the user both judge the app by whether it works in every pose, not by how many poses it uses.
Frequently asked questions
No. An app built with the iOS 27.1 SDK runs on the Duo like on any iPhone. What the Duo adds is a second screen and a hinge, so the same app needs its screens to work in three layouts: the iPhone layout, a new compact landscape layout on the outer display, and the iPad layout on the inner display.
Not with Xcode, which is the build system, simulator and signing tool Apple provides and runs only on macOS. Services that build on their own servers do exist; the trade is that the Xcode project is not on your disk. Modaal builds locally with the Xcode you select and the project stays on your Mac.
Xcode 27.1, currently in beta, which installs alongside the shipping Xcode and requires macOS 26.6 or newer on Apple silicon. It contains the Duo simulator and the SDK that knows about the hinge. The iOS 27.1 platform download is about 16 GB.
The current beta SDK has Duo-specific pieces the build service does not yet accept, so the first archive fails. The fix is a guard that compiles the Duo-only code only where the SDK has it, plus a runtime check for 27.1. The exact prompt and sequence are in our docs guide; do not use Xcode’s “Fix with agent” on this error.
One line: every screen works in the iPhone layout, the new compact landscape layout and the iPad layout; list screens use a sidebar on the inner display; the app keeps its state when the phone is opened or closed. Add “closed, half-open or flat” only for screens that should react to the hinge, and use the platform’s standard navigation parts.
The same PRD line does, because Google’s guidance is the same idea: adaptive layouts for folded, unfolded, portrait, landscape, tabletop and book posture. In Modaal, each feature’s logic is written once and rendered in SwiftUI on iPhone and Jetpack Compose on Android from one project; building both platforms is a Pro feature.
Pre-orders open October 16, 2026 and the phone is available October 23, from $1,999. From April 2027, Apple’s requirement is that every iOS and iPadOS app or update uploaded to App Store Connect “must be built with the iOS 27 & iPadOS 27 SDK or later”.
Write the PRD line. Pick Xcode 27.1. Let the agent build and fold.
Modaal builds with the Xcode you select, writes a plan you approve, and tests your app in the Duo simulator in every pose. iPhone and Android from one project. Free for one project.
Keep reading
- iPhone Duo apps: what changes
If you already own an app: the seven updates, ranked by effort.
- How AI agents test iPhone apps in the simulator
Why the agent needs fold and rotate controls.
- The PRD prompt
The document the six steps start from.
- Vibe coding workflow for a mobile app
The weekly loop once the first build runs.