Turn a first-generation iPad Air into a wired Retina second display for a Mac. Free, open source, native, and cable-only.
LegacyPad Display creates a real extended macOS desktop, not a mirrored screen or browser stream. The Mac creates an independent HiDPI virtual monitor, captures it with ScreenCaptureKit, encodes it as low-latency H.264, and sends it through the Lightning cable. A native iOS 12 app decodes and displays the video using Apple hardware acceleration.
No Wi-Fi, subscription, jailbreak, custom operating system, touch input, or changes to the iPad firmware are required.
Warning
This is an experimental prototype that uses an undocumented macOS API. Build it from source and read the limitations before relying on it.
| Component | Tested configuration |
|---|---|
| iPad | iPad Air (1st generation), Wi-Fi, model A1474 |
| Apple part number | MD785LL/B |
| Storage and color | 16 GB, Space Gray |
| iPad system | iOS 12.5.8 |
| Connector | Lightning to USB |
| Mac | Apple Silicon Mac, tested on Apple M3 |
| macOS | Tested on macOS 26.5.1 |
| Xcode | Tested with Xcode 26.6 |
Other 64-bit iPads capable of running the client may work, but they have not yet been validated. Intel Macs are also untested.
The native 2048×1536 stream has been validated on the exact A1474/iOS 12.5.8 device above. Apple's published playback specification lists H.264 up to 1080p, so compatibility with other old iPad models must be tested separately.
- A genuine extended desktop recognized by macOS as a separate monitor.
- Selectable Maximum Sharpness mode: 1024×768 logical, Retina 2× and pixel-for-pixel 2048×1536 capture.
- Selectable More Space mode: 1366×1024 logical, rendered by macOS at 2732×2048 and downsampled once to the panel's native 2048×1536.
- Native 2048×1536 video output in both modes, with no enlargement on the iPad.
- 30 FPS H.264 Constrained High Profile at approximately 18 Mbps.
- Hardware-accelerated VideoToolbox encoding and iOS decoding.
- Direct USB transport through Apple's local
usbmuxdservice. - Visible macOS cursor.
- A Mac host that lives only in the menu bar and creates no windows.
- Automatic placement of the iPad display to the right of the main display.
- Touch, Apple Pencil, keyboard, or audio forwarding.
- Wi-Fi or Internet streaming.
- Display mirroring in place of an extended desktop.
- App Store installation or permanent free provisioning.
- Official Apple Sidecar compatibility.
macOS virtual HiDPI display
│
▼
ScreenCaptureKit (YUV 4:2:0)
│
▼
VideoToolbox H.264 hardware encoder
│
▼
usbmuxd over Lightning/USB, TCP port 49152
│
▼
Native iOS 12 receiver + AVSampleBufferDisplayLayer
The virtual monitor is created using the undocumented CGVirtualDisplay
runtime classes. It exists only while the Mac host is running.
- A Mac running macOS 13 or newer.
- Xcode with an Apple ID configured for code signing.
- XcodeGen.
- A 64-bit iPad on iOS 12 or newer, paired with and trusted by the Mac.
- A data-capable Lightning cable.
- One free USB-connected iOS device during setup.
Install XcodeGen with Homebrew if needed:
brew install xcodegengit clone https://github.com/pedroaqs/legacypad-display.git
cd legacypad-display
xcodegen generate
open iPadDisplay.xcodeprojproject.yml is the source of truth. The generated Xcode project is included
for convenience, but regenerate it after changing build settings.
In Xcode, select both targets and choose your own team under Signing & Capabilities:
iPadDisplayHostiPadDisplayClient
If Xcode reports a bundle identifier conflict, replace com.pedroaqs in
project.yml with your own reverse-domain prefix, regenerate the project, and
try again. Never commit your Development Team ID or provisioning profile.
- Connect and unlock the iPad.
- Tap Trust if the iPad asks whether to trust the Mac.
- Select the physical iPad as the run destination.
- Build and run
iPadDisplayClient. - On iOS 12, trust the developer certificate under Settings → General → Device Management or Profiles & Device Management if prompted.
Recent Xcode versions may no longer ship the iOS 12 Developer Disk Image. If device installation fails for that reason, use a compatible older Xcode device support image or install the signed app with libimobiledevice. Apple device-support images are not included in this repository.
- Build and run
iPadDisplayHostfrom Xcode. - Grant Screen & System Audio Recording permission when macOS requests it.
- Quit and relaunch the host once after granting permission.
- Open iPad Display on the iPad and keep the cable connected.
The host appears as a display icon in the macOS menu bar. Use that menu to switch between Maximum Sharpness and More Space, start or stop the virtual display, and quit the host. The selected mode is remembered.
A free Apple Personal Team normally signs the iPad app for only seven days. When it expires, rebuild and reinstall the client. A paid Apple Developer membership provides longer-lived development provisioning, but is not required to test the project.
Open Settings → General → Device Management, select your Apple ID, and tap Trust. The menu may appear only after the first signed app is installed.
Always launch the same signed copy of the Mac host from the same path. Rebuilding or copying differently signed bundles can make macOS treat them as new apps.
- Confirm the iPad client is open in the foreground.
- Unlock the iPad and reconnect the cable.
- Confirm that the iPad trusts the Mac.
- Keep only one iOS device connected while diagnosing.
- Check that Screen Recording is enabled for the exact host bundle being run.
Open System Settings → Displays → Arrange and confirm that the iPad display touches an edge of the main display. The host normally places it immediately to the right.
- The iPad stays on stock iOS; no jailbreak or firmware modification occurs.
- Removing the client returns the iPad to its previous state.
- Video travels through the local USB multiplexing service, not the Internet.
- The host captures only the virtual display it creates.
- No analytics, accounts, cloud services, or telemetry are included.
CGVirtualDisplay is undocumented and unsupported by Apple. A macOS update can
change or remove it without notice. This project is not affiliated with or
endorsed by Apple Inc. Apple, iPad, iPad Air, macOS, Sidecar, and Lightning are
trademarks of Apple Inc.
Issues and pull requests are welcome, especially hardware reports for other iPad and Mac models. Read AGENTS.md before making automated or agent-assisted changes.
Useful contribution areas include:
- Resolution and frame-rate profiles.
- Robust reconnection and backpressure.
- Compatibility testing on Intel Macs and other legacy iPads.
- Reproducible signing and installation documentation for old iOS versions.
- Performance measurements for latency, CPU, GPU, and power use.
- Pedro AQS — creator, product direction, hardware testing, and maintainer.
- OpenAI Codex — architecture, implementation, debugging, optimization, and documentation collaboration.
- SamuelRioTz / SimpleDisplay — reference declarations for the undocumented
CGVirtualDisplayAPI. See the attribution inVirtualDisplayBridge.h.
More detail is available in AUTHORS.md.
LegacyPad Display is licensed under the GNU General Public License v3.0 only.
See LICENSE. The CGVirtualDisplay declarations were adapted from
the GPL-3.0 SimpleDisplay
project, so derivative distributions must preserve the applicable GPL terms
and attribution.
iPad Air 1 second display, iPad Air A1474 monitor, MD785LL/B,
iOS 12 second monitor, old iPad external display, wired iPad display Mac,
open source Sidecar alternative, free Duet Display alternative,
Lightning USB second screen, legacy iPad Retina monitor, macOS virtual display, CGVirtualDisplay, ScreenCaptureKit, usbmuxd.