Skip to content

About

Virtual Mirror — AirPlay screen mirroring for your Mac. Mirror multiple iPhones or iPads into resizable macOS windows, no Apple TV needed.

Topics

Resources

Stars

5 stars

Watchers

0 watching

Forks

Repository files navigation

VirtualMirror

AirPlay screen mirroring receiver for macOS. Mirror your iPhone or iPad screen to your Mac — no Apple TV required.

macOS License Support on Ko-fi

Features

  • Screen Mirroring — Receive AirPlay mirroring from any iPhone or iPad
  • Audio — Full audio passthrough with adjustable volume control; follows you when you switch output devices
  • Rotation — Seamlessly handles device rotation and lock/unlock
  • Low Latency — Hardware-accelerated H.264 decoding via VideoToolbox
  • Menu Bar — Runs quietly in the menu bar with live connection status
  • Auto-Update — Built-in update checking via Sparkle
  • Private — Fresh pairing identity per receiver, generated in memory and never persisted; full AirPlay pairing and FairPlay DRM support

Download

Download the latest .dmg from GitHub Releases.

  1. Open the .dmg and drag VirtualMirror to your Applications folder
  2. Launch VirtualMirror — it will check for updates automatically

VirtualMirror is signed and notarized by Apple. If macOS asks to confirm, right-click the app and select Open.

Usage

  1. Launch VirtualMirror — it appears in the menu bar and Dock
  2. On your iPhone or iPad, open Control Center
  3. Tap Screen Mirroring
  4. Select VirtualMirror
  5. Your device screen appears in the VirtualMirror window

Volume Control

Hover over the mirroring window to reveal the volume slider. Click the speaker icon to mute/unmute.

Menu Bar

The menu bar icon lists your live receivers and their status. Click it for:

  • New Receiver (⌘N) — Open another receiver window (mirror multiple devices at once)
  • Command Palette… (⌘K) — Searchable, keyboard-driven access to every action
  • Check for Updates… — Manually check for a new version
  • VirtualMirror Help — Built-in guide: mirroring, audio, command palette, troubleshooting, privacy
  • Send Feedback… — Report a bug or request a feature (opens a pre-filled GitHub issue)
  • About VirtualMirror… — Version info, credits, and support links

Multiple receivers

Each window is its own AirPlay receiver with its own name. Open more with New Receiver (⌘N) to mirror several iPhones or iPads side by side — each shows up separately in the device's Screen Mirroring list. Rename a receiver from the Command Palette (⌘K → Rename This Receiver…).

Troubleshooting

The in-app VirtualMirror Help (menu bar → VirtualMirror Help) covers all of this with step-by-step guidance.

VirtualMirror doesn't appear in Screen Mirroring list

If the macOS built-in AirPlay Receiver is enabled, your iPhone may connect to it instead of VirtualMirror. To avoid confusion, you can disable it:

System Settings > General > AirDrop & Handoff > AirPlay Receiver — turn it off.

Connection drops or won't connect

  • Make sure your iPhone/iPad and Mac are on the same Wi-Fi network
  • If the window shows an error (port already in use, no Local Network access), fix the cause it names and click Retry
  • Use Restart This Receiver from the Command Palette (⌘K), or quit from the menu bar and relaunch
  • Check that no firewall is blocking VirtualMirror — the first receiver listens on port 47000, each additional one 1000 higher (48000, 49000, …)
  • A second device mirroring to the same receiver replaces the first; open another receiver (⌘N) to show both

Local network permission

The first time you run it, macOS asks VirtualMirror for permission to find devices on your local network. Allow it — AirPlay discovery needs it. If you declined, enable it in System Settings > Privacy & Security > Local Network, then click Retry in the receiver window. Each receiver generates a fresh pairing identity in memory; nothing is persisted.

Building from Source

Requires Xcode 26+ (Swift 6 language mode). The app runs on macOS 14.0+.

git clone https://github.com/souriscloud/VirtualMirror.git
cd VirtualMirror
open VirtualMirror.xcodeproj

Build and run from Xcode (Cmd+R), or from the command line:

xcodebuild build -project VirtualMirror.xcodeproj -scheme VirtualMirror -configuration Debug

Support & Feedback

VirtualMirror is free and open source, built by one person.

  • 🐛 Found a bug or have an idea? Use Send Feedback… in the menu bar (it opens a pre-filled GitHub issue), or file one directly at GitHub Issues.
  • ☕ Like the app? Support it on Ko-fi — it keeps the project going.

Acknowledgments

VirtualMirror builds on the work of several open-source projects:

  • playfair by EstebanKubata — FairPlay DRM reverse-engineering (GPL)
  • UxPlay by antimof — AirPlay mirror server for Unix (GPL-3.0)
  • shairplay by Juho Vaha-Herttua — AirPlay audio server (LGPL-2.1)
  • RPiPlay by FD- — AirPlay mirror server for Raspberry Pi (GPL-3.0)

See ACKNOWLEDGMENTS.md for full details.

License

VirtualMirror is licensed under the GNU General Public License v3.0.

Copyright 2026 Souris.CLOUD — Made by Souris

Common installer tooling

The unified Souris.CLOUD installer uses the shared kit in scripts/installer/. Set up its isolated build tools once:

python3 -m venv .local/dmg-tools
.local/dmg-tools/bin/pip install -r scripts/installer/requirements.txt

DMG assembly does not control Finder. It writes the layout directly and checks 1×/2× Retina artwork, icon positions, the Applications link and the bundled app signature. See installer kit.

Focus-safe local release preparation

./scripts/release.sh --local builds and packages the current version into .local/releases/<version>/, without Developer ID access, notarization, Git publication or launching a GUI app. It uses the approved icon generator and shared installer kit, checks the real DMG, and writes an installer preview and hash manifest. Artifacts use ad-hoc signatures and are local verification builds, not public distribution builds.

--local --reuse-build packages a release product already compiled from the current sources. Developer ID signing, notarization and Sparkle signing still go through the normal release pipeline before publication.

Regenerate approved icons with python3 scripts/icons/build.py. The original Souris logo is committed in the icon kit. All macOS sizes, Retina slots, transparency and sRGB colour are verified, and app branding uses the actual bundle icon.

About

Virtual Mirror — AirPlay screen mirroring for your Mac. Mirror multiple iPhones or iPads into resizable macOS windows, no Apple TV needed.

Topics

Resources

Stars

5 stars

Watchers

0 watching

Forks

Releases

Sponsor this project

Packages

Contributors

Languages