Local-first Mac viewing and control for iPhone/iPad.
Mirador is a private, LAN-only Apple remote viewing app: a macOS host and an iPhone/iPad client that connect through Bonjour and Network.framework QUIC. It is built for smooth local streaming, trusted pairing, full-screen control, keyboard entry, and client-controlled system audio, without a cloud relay.
The latest stable release is v1.1.0. Cloud relay, VPN mode, Android, Windows,
Linux, and internet mode are intentionally out of scope.
- Host: macOS on Apple Silicon, advertised as
Mirador Hostover_mirador._udp. - Client: iPhone/iPad SwiftUI app with Bonjour browsing, pairing, trusted reconnects, listener-off states, and full-screen control.
- Protocol: QUIC with protocol version
7and ALPNmirador/7. - Video: ScreenCaptureKit frames encoded with VideoToolbox H.264/HEVC, sent over QUIC datagrams when usable and reliable QUIC streams when datagrams are not available.
- Audio: host system audio starts after the first video frame, streams as PCM Float32 over local QUIC, and plays on the iPhone/iPad client.
- Pairing: new clients show a 6-digit code; the host approves it once and persists the trusted device for future local reconnects.
- Control: pointer, click, drag, scroll, display switching, zoom crop, keyboard, and audio mute are active only in the full-screen viewer and remain gated by host Accessibility permission where remote input requires it.
- Viewing: fitted full-source mode preserves aspect ratio; manual zoom fills the iPhone/iPad surface and previews pinch/pan locally before committing stream crop updates.
- Keyboard: the viewer keeps the latest remote pointer/click anchor visible above the iOS keyboard with local presentation offsets, without changing the remote crop.
- Full-screen chrome: controls can collapse into a compact persistent keyboard/audio handle with haptic feedback when hiding the expanded bar.
Download the macOS host DMG from the GitHub release, open it, and drag
Mirador Host.app to Applications. The host stays idle until a compatible
local client connects.
The iPhone/iPad client is currently built and installed through Xcode or the local device script:
./scripts/install_ios_device.shThe script auto-detects a connected iPhone/iPad and the local Apple Development
team when possible. Use DEVICE_ID, MIRADOR_SIGN_IDENTITY, or
MIRADOR_DEVELOPMENT_TEAM only when auto-detection is not enough.
Run the macOS host for development:
./scripts/build_and_run.shInstall the stable host app path used for real iPhone/iPad testing:
./scripts/install_host_app.sh --launch --auto-start-listenerRecommended checks before publishing:
swift build
swift test
xcodebuild -project Mirador.xcodeproj -scheme MiradorHostApp -destination 'platform=macOS' -derivedDataPath .build/xcode-macos-app build
xcodebuild -project Mirador.xcodeproj -scheme MiradorClientApp -destination 'generic/platform=iOS' -derivedDataPath .build/xcode-ios-app CODE_SIGNING_ALLOWED=NO build
git status --short --ignoredUseful live diagnostics:
./scripts/stream_live_logs.sh --client-console
./scripts/stream_zoom_logs.sh
./scripts/stream_keyboard_logs.sh
./scripts/smoke_connectivity_zoom.shCreate the release DMG:
./scripts/package_host_dmg.shThe DMG is written to ~/Downloads/Mirador-<version>.dmg by default. It contains
only the signed macOS host app and the Applications drop link. Build products,
device logs, smoke logs, DerivedData, local notes, and signing data stay ignored
and are not packaged.
MiradorCore: shared protocol, stream settings, transport metadata, diagnostics, datagram codecs, and remote input contracts.MiradorHost: Bonjour advertising, QUIC sessions, ScreenCaptureKit capture, VideoToolbox encoding, system audio, remote input, and host dashboard.MiradorClient: Bonjour browser, pairing, QUIC client session, video rendering, stream controls, retry flow, keyboard handling, and full-screen control surface.Apps/: installable macOS and iOS app wrappers.Tests/: protocol, transport, remote input, settings, viewport, and local QUIC identity coverage.
Do not commit private LAN IPs, Wi-Fi names, real device names, screenshots, signing team IDs, UDIDs, pairing secrets, logs, or local planning notes.
Docs/, AGENTS.md, .codex/, CLAUDE.md, cloud.md, clavo.md,
xcuserdata/, build products, DMGs, archives, and logs are intentionally
ignored.
MIT