Iphone Duo Camera logo

Iphone Duo Camera

Community
mirzaaghazadeh
iphone-duo-camera

Build camera capture for iPhone Duo's two front cameras — the virtual front camera, the inner under-display and outer ultra-wide devices, AVCaptureDeviceDirectionCoordinator, preview mirroring and video gravity, and dual-display capture. Use when an app captures photo or video and must handle the device opening, closing or flipping.

Overview

Publishermirzaaghazadeh
Repositoryiphone-duo-skills
Skill nameiphone-duo-camera
Stars
188
Forks
9
Bundled files
Instructions only
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • Self-contained

    Everything the model needs lives in the instructions — no extra files to sync.

  • Open source

    Published by mirzaaghazadeh on GitHub. Read the source before you install it.

Installation

Install the Iphone Duo Camera AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/mirzaaghazadeh/iphone-duo-skills/tree/main/skills/iphone-duo-camera
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/mirzaaghazadeh/iphone-duo-skills.git /tmp/iphone-duo-skills
mkdir -p .claude/skills
cp -r /tmp/iphone-duo-skills/skills/iphone-duo-camera .claude/skills/iphone-duo-camera
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Iphone Duo Camera in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Iphone Duo Camera on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Iphone Duo Camera is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

Camera on iPhone Duo

iPhone Duo is the first iPhone with two front cameras. Both are square sensors with an ultra-wide field of view: one on the outer display, and one beneath the inner display — the first under-display camera on iPhone.

That creates a problem no previous iPhone had. "Front" no longer means "pointing at the user."

Pick a strategy first

Everything downstream follows from this choice.

The virtual front camera — automatic, limited

Discover a front camera the ordinary way — an AVCaptureDevice.DiscoverySession requesting position .front with a Wide or Ultra Wide device type — and on iPhone Duo you resolve to a new virtual front camera. It switches between the two physical cameras by itself: inner camera when open, outer camera when closed.

It always uses the most relevant camera, and you write no switching code.

The cost is that it exposes only what both physical cameras can do:

  • max 1080p, 60 fps
  • no depth

If the app needs 4K, high frame rates, or any depth-based feature, this is not enough.

The individual cameras — full capability, your responsibility

Address each physically, via the built-in outer ultra-wide and built-in inner ultra-wide device types:

Inner (under-display)Outer
Max video1080p @ 60 fps4K @ 120 fps
Depthsupportedsupported

Full capabilities, but now you must switch cameras when the user opens or closes the device. Which brings us to the hard part.

Which way is a camera actually facing?

AVCaptureDevice has always had a fixed position — on iPhone, .back or .front. Both of iPhone Duo's front cameras report .front. That property describes where a camera sits on the hardware, and on a device whose displays can face opposite directions it no longer tells you where the camera points relative to the person looking at your UI.

Three situations make this concrete:

  • The user is looking at the inner display while the app streams the outer front camera — a "front" camera facing away from them.
  • The device closes while that camera is streaming, and the same camera swings around to face them directly.
  • The device is open and flipped, so a rear camera is now the selfie camera.

AVCaptureDeviceDirectionCoordinator

AVCaptureDeviceDirectionCoordinator (in AVKit) answers the real question: which cameras are forward-facing right now, relative to a given view. Build one from three things — your app's UIView, the device types to monitor, and a change handler — and it keeps you current as the device moves.

Because it is anchored to a view, it reports facing relative to the display that view is on. When the view is on the outer display, the outer front cameras are forward-facing and the rear cameras are backward-facing. Open the device, the view moves to the inner display, your handler fires, and now the inner front camera is forward-facing while the outer front and rear cameras are backward-facing.

Driving both displays at once? Create one coordinator per view. Each reports relative to its own display, so the same rear camera is forward-facing to the outer view's coordinator and backward-facing to the inner view's. That is correct, not contradictory — it is the whole point. (Dual-display camera UI comes from the scene accessories API; see ../iphone-duo-hinge-and-scenes/SKILL.md.)

Concurrency

The coordinator is tied to a view, so it is isolated to the main actor. Your change handler must not call AVFoundation APIs directly.

It never hands you an AVCaptureDevice. The handler receives an AVCaptureDeviceDirectionMap, which sorts the tracked cameras into two arrays:

swift
var forwardFacingDeviceDescriptors: [AVCaptureDeviceDescriptor]
var backwardFacingDeviceDescriptors: [AVCaptureDeviceDescriptor]

The same map is also readable at any time from the coordinator's deviceDirections property, so you aren't limited to reacting inside the handler.

An AVCaptureDeviceDescriptor is a sendable stand-in for a capture device, carrying uniqueID, localizedName, deviceType, mediaTypes and position. Pass a descriptor to your camera actor and construct the AVCaptureDevice there. That is the intended path; don't try to smuggle a device across the boundary.

Note that both of these types live in AVKit, alongside the coordinator — not in AVFoundation, where you might reasonably go looking first.

Because you get arrays rather than a single device, your handler has to choose: typically the first forward-facing descriptor whose deviceType matches what you're streaming. Don't assume exactly one camera faces forward.

What the handler should do

  1. Reconfigure the AVCaptureSession to keep streaming from whichever camera is now forward-facing.
  2. Re-evaluate mirroring. Mirroring should follow the direction, not the position: when a rear camera has become the forward-facing one, mirror the preview so it feels like a normal selfie view.
  3. Apply any UI updates the camera change implies.

Preview polish

Streaming the rear camera's full field of view on the inner display leaves extra room around the preview. Two reasonable choices: offset the preview and group controls in the space left over, or let the preview fill the display. Control this with videoGravity on AVCaptureVideoPreviewLayer.

Streaming an ultra-wide front camera, exploit the square sensor — set dynamicAspectRatio on the AVCaptureDevice to pick a landscape aspect ratio that fills the inner display.

Rotation. Adopt AVCaptureDeviceRotationCoordinator so previews and captures stay upright. On iPhone Duo it updates when the app moves between displays, which is what keeps rotation consistent across both. Once you have adopted it, turn off camera-sensor-orientation compensation — it is enabled on all of iPhone Duo's front cameras and is redundant work once the rotation coordinator is doing the job.

Note that direction and rotation are separate coordinators solving separate problems. Which camera to stream is direction; which way its output is oriented is rotation. Most camera apps on this device want both.

Checklist

  1. Build against the iOS 27.1 SDK.
  2. Decide: virtual front camera (automatic, 1080p60, no depth) or individual cameras (full capability, manual switching).
  3. If individual, adopt AVCaptureDeviceDirectionCoordinator — one per view.
  4. In the change handler, read the AVCaptureDeviceDirectionMap, pick a forward-facing descriptor, reconfigure the session, re-decide mirroring, and update UI. Move devices across actors as AVCaptureDeviceDescriptor.
  5. Set videoGravity, and dynamicAspectRatio for front-camera capture.
  6. Adopt AVCaptureDeviceRotationCoordinator, then disable sensor-orientation compensation.
  7. Consider a CameraCaptureAccessory so the subject sees something on the outer display.
  8. Test opening, closing and flipping the device mid-session in Device Hub.

Apple's related articles: Choosing a Camera by the Direction it Faces and Supporting Device Rotation in Your Camera App. For the square sensor generally, see Support the Center Stage front camera in your iOS app from WWDC26.

Frequently asked questions

What does the Iphone Duo Camera AI skill do?

Build camera capture for iPhone Duo's two front cameras — the virtual front camera, the inner under-display and outer ultra-wide devices, AVCaptureDeviceDirectionCoordinator, preview mirroring and video gravity, and dual-display capture. Use when an app captures photo or video and must handle the device opening, closing or flipping.

Why use Iphone Duo Camera on TypingMind?

Because you install it once and use it with any model. Iphone Duo Camera is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Iphone Duo Camera in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/mirzaaghazadeh/iphone-duo-skills/tree/main/skills/iphone-duo-camera. TypingMind reads its SKILL.md and installs it as a skill you can enable per chat.

Which AI models can use Iphone Duo Camera?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Iphone Duo Camera?

As many as you like. As long as a model supports skills, you can use Iphone Duo Camera with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Iphone Duo Camera AI skill free?

It is published on GitHub by mirzaaghazadeh. Check the repository for licensing terms. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇