English | 한국어 | 日本語 | 简体中文 | Español
Native, open-source ARM64 virtual machine manager for Apple Silicon Macs. Windows 11 ARM64 and Linux ARM64 run on QEMU with Apple's HVF acceleration; macOS runs on Apple's Virtualization framework. Each VM is stored as a
.macdowvmpackage.
- Overview
- Features
- Requirements
- Quick Start
- Usage
- Architecture
- Building and Running
- Release Packaging
- Status
- Alpha Distribution
- Troubleshooting
- Contributing
- Security
- Changelog
- License and Third-Party Notices
MacDow is a native macOS application that lets you create and run ARM64 virtual
machines on Apple Silicon. It is a single SwiftUI app built with Swift 6 and the
Apple Virtualization framework. Windows 11 ARM64 and Linux ARM64 guests are
powered by QEMU with Apple's Hypervisor.framework (accel=hvf) acceleration,
while macOS guests use Apple's native VZVirtualMachine directly.
Every virtual machine is stored as a .macdowvm package directory containing
its disk, UEFI/EFI variables, TPM state, and metadata. Windows and Linux
packages reference the original installer ISO with a symbolic link, so the ISO
is not embedded in exports. Installed VMs can be cloned, imported, and exported,
but compatibility on another Mac still depends on the guest and host hardware.
MacDow is alpha software under active development.
- Three guest families from one app
- Windows 11 ARM64 (
.isovia QEMU + HVF) - Linux ARM64 (
.isovia QEMU + HVF) - macOS ARM64 (
.ipswrestore image via Apple Virtualization)
- Windows 11 ARM64 (
- ARM64 ISO/IPSW validation — verifies
bootaa64.efipresence, distinguishes Windows from Linux by checkingsources/boot.wim, and validates macOS restore images throughVZMacOSRestoreImage. - EFI startup disk — a bundled
startup.nshboot helper is exposed to the guest and the Windows installation-media boot prompt is acknowledged automatically. - Secure Boot and TPM 2.0 — each VM persists its own UEFI variable flash and
TPM 2.0 state (
swtpm) so Windows 11 Secure Boot / TPM requirements stay satisfied across reboots. - Automatic Windows networking — Windows ISO detection downloads a pinned,
integrity-checked Microsoft-attested ARM64 NetKVM driver and exposes it via
Windows Setup's native
$WinPEDriver$discovery layout before OOBE. - Embedded localhost-only noVNC display — guest installation runs through an
embedded WebKit view using
ramfb; no remote VNC surface is exposed. - Full lifecycle — start / pause / resume / shut down / force stop.
- Saved state — pause-and-resume across app launches for macOS guests via
VZVirtualMachinesaved state. - Clone, import, export — duplicate VMs, import
.macdowvmpackages, and export them for sharing or backup. - Settings inspector — adjust CPU and NAT networking while a VM is stopped; memory and disk size are selected when the VM is created.
- Diagnostics export — produce a support bundle with system info and VM summaries. Virtual disks and personal files are never included.
- English and Korean localization.
- No analytics — MacDow does not collect analytics or upload diagnostics.
- Apple Silicon Mac
- macOS 15 or newer
- Swift 6 / Xcode 16 or newer (for building from source)
- A supported ARM64 ISO (Windows 11 ARM64 or Linux ARM64) or a macOS restore IPSW
- QEMU 11 and swtpm for Windows/Linux guests (
brew install qemu swtpm). The current alpha DMG does not bundle these runtimes.
Important
The current alpha is not notarized by Apple. After copying MacDow to Applications, try to open it once. If macOS blocks it, open Apple menu ▸ System Settings ▸ Privacy & Security, scroll down to Security, and click Open Anyway next to MacDow. Click Open Anyway again, enter your Mac login password, and click OK. This button is available for about one hour after the blocked launch attempt.
git clone https://github.com/flyingsquirrel0419/MacDow.git
cd MacDow
brew install qemu swtpm # required for Windows/Linux guests
./script/build_and_run.sh --verifyThe --verify flag launches the app and confirms the process is running. VM
execution requires the com.apple.security.virtualization entitlement, which
the bundle script applies automatically.
- Launch MacDow. The VM library lives at
~/Library/Application Support/MacDow/Virtual Machines. - Click New VM (or File ▸ New Virtual Machine…,
⌘N). - Enter a name and choose an ARM64
.isoor macOS.ipswinstallation image. Direct download links for Windows 11 ARM64, Ubuntu, and macOS IPSW are provided in the creator sheet. - Optionally expand Advanced Hardware to set CPU, memory, disk, and NAT networking. Defaults are derived from your Mac: 2–8 CPU cores, 4–8 GiB RAM, 64 GiB disk, NAT network enabled.
- Click Create. The installer ISO is validated and the
.macdowvmpackage is created. - Select the VM in the sidebar and click Start Virtual Machine.
- For Windows/Linux, the guest installer appears in the embedded noVNC display and the boot prompt is acknowledged automatically. For macOS, the restore runs through Apple's installer and the native display opens.
See docs/USAGE.md for the full end-user guide including
hardware, networking, saved state, import/export, and diagnostics.
flowchart LR
UI["SwiftUI Views\n(Sidebar / Detail / Creator / Inspector)"] --> Store["VMStore\n(Observation)"]
Store --> Backend{"Guest kind?"}
Backend -- "Windows / Linux" --> QEMU["QEMUBackend\n(QEMU + HVF + swtpm + noVNC)"]
Backend -- "macOS" --> Apple["AppleVirtualizationBackend\n(VZVirtualMachine)"]
QEMU --> Pkg["VMPackage (.macdowvm)\nDisk.img · UEFI_VARS.fd · TPM · metadata.json"]
Apple --> Pkg
Pkg --> Lib[("~/Library/Application Support/MacDow/Virtual Machines")]
Key source layout under Sources/MacDow/:
| Path | Responsibility |
|---|---|
App/MacDowApp.swift |
App entry point, scene, menu commands |
Models/VMModels.swift |
VirtualMachineRecord, VMHardwareConfiguration, guest/backend/capability enums |
Models/VMError.swift |
Typed errors and byte-size formatting |
Services/VMBackend.swift |
VMBackend protocol both backends implement |
Services/QEMUBackend.swift |
QEMU + HVF + swtpm + noVNC orchestration |
Services/AppleVirtualizationBackend.swift |
VZVirtualMachine-based backend for macOS |
Services/ISOValidator.swift |
ARM64 ISO validation via hdiutil/bsdtar |
Services/VMPackage.swift |
.macdowvm package layout and metadata I/O |
Stores/VMStore.swift |
@Observable store: create/start/stop/clone/import/export/settings |
Views/ |
SwiftUI: ContentView, SidebarView, VMDetailView, VMCreationView, VMSettingsInspector, AppSettingsView, VirtualMachineDisplay, QEMUDisplayView |
Resources/Bootstrap/startup.nsh |
EFI boot helper for installers |
Resources/SecureBoot/ |
AAVMF firmware and variable template |
Resources/NoVNC/ |
Embedded noVNC client (localhost-only) |
Guest selection is automatic: the ISO validator detects the guest kind, and macOS restore images are routed to the Apple Virtualization backend. Windows and Linux always use QEMU; saved state currently works only with the Apple backend.
Build, sign with the bundled entitlement, and launch:
./script/build_and_run.sh --verifyOther modes supported by the script:
./script/build_and_run.sh # build and open
./script/build_and_run.sh --debug # build and launch under lldb
./script/build_and_run.sh --logs # stream macOS unified logs for MacDow
./script/build_and_run.sh --telemetry # stream logs for org.macdow.MacDow subsystemThe app is staged at ~/Library/Developer/MacDow/Build/MacDow.app and symlinked
into dist/MacDow.app.
To run the test suite:
swift testTests cover VirtualMachineRecord round-trip encoding, recommended-hardware
bounds, package-version rejection, and ISO-extension validation.
Production DMGs are signed, notarized, and stapled by
script/package_release.sh. It requires two
environment variables:
export DEVELOPER_ID_APPLICATION="Developer ID Application: Your Name (TEAMID)"
export NOTARY_PROFILE="your-notarytool-keychain-profile"
./script/package_release.shThe script builds and verifies, re-signs with the hardened runtime and
timestamp, packs a UDZO DMG, submits it to notarytool, and staples the
ticket. Windows/Linux guests in a production DMG require QEMU and swtpm to be
bundled inside the app's qemu/ resource directory.
The alpha foundation includes Windows, Linux, and macOS VM creation, ARM64 ISO/IPSW validation, EFI/disk/NAT configuration, start/stop/pause/resume, cloning, import/export, settings, diagnostics export, and English/Korean localization. Guest integration such as shared folders and clipboard remains experimental because it requires compatible guest drivers.
Guest installation runs through an embedded localhost-only noVNC display using
ramfb; MacDow supplies a small EFI startup disk and automatically acknowledges
the installation-media boot prompt. Each VM also persists its own UEFI variable
flash and TPM 2.0 state so Secure Boot and TPM requirements remain satisfied.
Operating-system licensing and activation are the user's responsibility.
The v0.1.0-alpha.1 GitHub release is ad-hoc signed and not notarized. On
first launch, macOS may require the Open Anyway procedure below.
Windows and Linux guests require Homebrew QEMU and swtpm
(brew install qemu swtpm).
If macOS still prevents MacDow from opening:
- Choose Apple menu ▸ System Settings.
- Click Privacy & Security in the sidebar. You may need to scroll down.
- Scroll to the Security section and click Open Anyway next to MacDow.
- Click Open Anyway again in the confirmation dialog.
- Enter your Mac login password, then click OK.
The Open Anyway button is available for about one hour after you try to open MacDow. If it is not visible, try opening MacDow again and return to Privacy & Security.
QEMU is missing / "QEMU is missing. Install QEMU or use a MacDow build that bundles it."
Install via Homebrew during development:
brew install qemu swtpmQEMU is resolved in this order: bundled qemu/bin/qemu-system-aarch64,
/opt/homebrew/bin/qemu-system-aarch64, then /usr/local/bin/qemu-system-aarch64.
The ARM64 UEFI firmware / secure UEFI variable template is missing
The bundled AAVMF firmware ships in Resources/SecureBoot/. If you are running
from a custom QEMU install, MacDow also probes share/qemu/edk2-aarch64-code.fd
and edk2-arm-vars.fd under Homebrew and /usr/local. Reinstall QEMU or use a
MacDow DMG that bundles the firmware.
"The file path is too long" when starting a VM
Current builds place QEMU monitor and TPM sockets under /tmp using the VM UUID,
so VM names do not affect the socket-length limit. If an older build shows this
error, update to the latest MacDow build and start the VM again.
The selected ISO is not a valid ARM64 installation image
MacDow verifies the ISO contains efi/boot/bootaa64.efi. Ensure you downloaded
an ARM64 (aarch64) image, not an x86_64 build. Linux ISOs that cannot be
mounted are validated via bsdtar.
Saved state is not available with the QEMU backend
Saved state (pause/resume across app restarts) currently works only with the Apple Virtualization backend (macOS guests). Windows/Linux QEMU guests can be paused/resumed within a session but not saved to disk yet.
Contributions are welcome. Please read CONTRIBUTING.md for
development setup, code style, testing requirements, and the pull-request
workflow, and CODE_OF_CONDUCT.md for community
standards. Issues should use the provided GitHub issue templates.
Report vulnerabilities privately via the repository's Security tab — do not
open a public issue. See SECURITY.md for the full policy,
supported versions, and scope.
See CHANGELOG.md for release history. The project follows
Keep a Changelog and
Semantic Versioning.
MacDow is licensed under the GNU General Public License v3.0.
Bundled third-party components — noVNC (MPL-2.0 / BSD-2-Clause), pako (MIT),
and EDK2/AAVMF firmware (BSD-2-Clause-Patent and others) — are covered in
THIRD_PARTY_NOTICES.md. Their licenses apply
independently of MacDow's GPL-3.0 license.
Windows installation media, QEMU, swtpm, and operating-system licenses are not included in this source repository. Users must obtain them separately under their respective licenses.