Important
PEGPU Installation and Documentation
To install and use PEGPU, refer directly to the official website:
The PEGPU website is the primary resource for:
- application descriptions
- latest release downloads
- installation manuals
- setup warnings and compatibility notes
- illustrative screenshots
- practical usage instructions
Warning
Important upfront warning
PEGPU requires installing an experimental kernel driver extension that has not yet been notarized by Apple. As a result, System Integrity Protection (SIP) must be disabled before PEGPU can be installed.
To disable SIP:
-
Shut down your Mac.
-
Press and hold the power button until startup options appear.
-
Select Options to enter Recovery Mode.
-
Open Terminal from the menu bar.
-
Run the following command:
csrutil disable
-
Restart your Mac normally.
Important: Understand and consider the security risks of disabling SIP before proceeding.
PEGPU is an experimental macOS application for running NVIDIA Thunderbolt eGPUs through a Linux VM on Apple Silicon Macs. It is built as two related applications with an explicit license and architecture boundary.
- PEGPU.app is the Swift/AppKit launcher, UTM-derived embedded SPICE GUI display side, ANGLE/CocoaSpice integration, AI/runtime router, file/port/terminal UI, sidecar metrics, and host-side orchestration layer.
- PEGPU Machine.app is the separate QEMU/VFIO/DriverKit runtime application. It owns the patched QEMU launcher, macOS DriverKit host extension, firmware/runtime payloads, Linux guest-driver packages, and its own notices/source bundles.
The combined installer may install both apps into /Applications, but the
repositories, notices, source archives, and runtime responsibilities stay
separate.
PEGPU.app's own application source code is distributed under the permissive Apache License, Version 2.0. PEGPU uses a split related to UTM's app/runtime separation, but goes a step further: the frontend, AI runtime control surface, display client, routing, and orchestration live in PEGPU.app, while the GPL-covered Machine/QEMU runtime lives in the separate PEGPU Machine.app. The app-side display runtime includes SPICE, GLib, GStreamer, ANGLE, CocoaSpice, UTM-derived GUI display work, and related support libraries. Release packages carry the installed PEGPU.app distribution legal bundle, including scoped license blocks and corresponding source/provenance archives, inside:
/Applications/PEGPU.app/Contents/Resources/PEGPURoot/legal/generated
PEGPU Machine.app is distributed from openresearchtools/PEGPU-machine. It contains the QEMU/VFIO/DriverKit side and carries its own notices and source bundles inside:
/Applications/PEGPU Machine.app/Contents/Resources
PEGPU Machine builds on Scott J. Goldman's
scottjg/qemu-vfio-apple, and also
uses/adapts upstream QEMU and UTM/QEMU-side work from
qemu-project/qemu,
utmapp/qemu and
utmapp/virglrenderer. The app-side
embedded GUI display integration is partially based on the main
utmapp/UTM app work and is generated from a
pinned UTM base plus the PEGPU patch stack in third_party/utm/patches.
GPL-covered QEMU-derived code stays on the Machine side. Apache-side
launcher/display/AI code stays in this repository. The generated PEGPU.app
LICENSES file is the app-visible distribution license bundle for installed
PEGPU.app runtime payloads, helper programs, framework dependencies, and
app-managed runtime archives. Source archives installed under
legal/generated/source/ have adjacent generated .NOTICES, .LICENSES, and
.manifest.json sidecars that cover the files inside those archives, including
source-only build tools, tests, examples, backend source trees, and provenance
inputs used to reproduce app-side artifacts. File-level and component license
notices remain authoritative.
PEGPU is not a single upstream project with a new skin. It combines several separate pieces, with notices and source/provenance kept in the app bundles:
- UTM app display work: utmapp/UTM is the main GUI foundation for the embedded SPICE display side. PEGPU carries its UTM/CocoaSpice app-side changes as patches, then CI applies them to the pinned UTM base and builds the SPICE/GLib/GStreamer/ANGLE frameworks from source. PEGPU does not bundle UTM.app as an app.
- QEMU/VFIO Machine runtime: scottjg/qemu-vfio-apple, qemu-project/qemu, utmapp/qemu, and utmapp/virglrenderer are part of the separate PEGPU Machine side, along with QEMU-derived GPL-covered source bundles and guest-driver packages.
- llama.cpp chat/runtime surface:
ggml-org/llama.cpp provides the
server conventions, OpenAI/llama.cpp-compatible APIs, web UI surface, and
runtime shape that PEGPU adapts for app-managed model discovery, downloads,
runtime launches, macOS/VM runtime pairs, and external GPU offload choices.
PEGPU release packages bundle the latest llama.cpp ARM64 build available at
PEGPU release time from
openresearchtools/llama-cpp-arm64-builds;
additional llama.cpp versions remain user-managed through
/core. - llama-swap-style model routing:
mostlygeek/llama-swap is the
basis for the routing idea. PEGPU modifies that model so multiple aliases and
sessions can route through configured macOS and VM runtimes rather than a
single fixed
llama-serverprocess. - GOST-style local networking: ginuerzh/gost is the provenance for the localhost TCP/UDP forwarding model. PEGPU keeps a trimmed local proxy for Mac-to-VM and VM-to-Mac routing; it is limited to the forwarding behavior the app needs.
- TurboQuant runtime option: TheTom/llama-cpp-turboquant is supported as an optional llama.cpp-family runtime source for Turbo KV cache quantization builds.
The release package installs PEGPU.app and, when needed, PEGPU Machine.app.
The Installation Type screen shows Machine.app files and DriverKit refresh as
separate choices. Machine.app is selected by default when it is missing or older
than the payload, or when the installer can confirm that the DriverKit extension
is missing. DriverKit detection uses both systemextensionsctl and the
registered /Library/SystemExtensions DriverKit bundle so the screen does not
report an installed extension as missing when Installer.app cannot scrape one
probe path. If DriverKit state cannot be read on that screen, the installer says
the status is unavailable and leaves the Machine/DriverKit choice available for a
manual refresh. If the installed Machine app is the same/newer and the driver is
already installed, both choices stay visible but are not selected by default.
When DriverKit refresh is selected, the installer first asks the existing
Machine app to deactivate the old macOS DriverKit extension when that app is
present. If graceful deactivation fails or the old app is missing while the
extension is still listed, it falls back to systemextensionsctl uninstall.
After package files are installed and permissions/quarantine are cleaned, it
calls the installed Machine app to submit a fresh activation request, logs
direct systemextensionsctl list status, and shows a final summary telling the
user to restart macOS before using eGPU passthrough. The installer can be closed
so the restart can happen later.
System Integrity Protection must be disabled before installation. PEGPU uses an ad-hoc DriverKit host extension for PCIe/eGPU passthrough, which is a serious security tradeoff.
GitHub Actions is the release build path. The workflow can build artifact-only packages, pre-releases, or releases while reusing cached display runtime, scaling helper, and Machine artifacts when their inputs have not changed.
The source repository stays clean: it does not store generated frameworks,
Machine app binaries, runtime download caches, model files, or VM disk images.
GitHub Actions builds or reuses the required display runtime, scaling helper,
Machine app, DriverKit host extension, guest tools, bundled default llama.cpp
runtime archives, notices, and source archives, then bundles the complete
installable payload into the release .pkg.
- Website: pegpu.com
- PEGPU app repository: openresearchtools/PEGPU
- PEGPU Machine repository: openresearchtools/PEGPU-machine
- Upstream breakthrough: scottjg/qemu-vfio-apple
- Upstream QEMU source: qemu-project/qemu
- UTM QEMU source: utmapp/qemu
- UTM virglrenderer source: utmapp/virglrenderer
- UTM app foundation: utmapp/UTM
- AI runtime: ggml-org/llama.cpp
- PEGPU llama.cpp ARM64 builds: openresearchtools/llama-cpp-arm64-builds
- Routing provenance: mostlygeek/llama-swap
- Local proxy provenance: ginuerzh/gost
- TurboQuant runtime option: TheTom/llama-cpp-turboquant
PEGPU is not endorsed by, sponsored by, or affiliated with Apple, NVIDIA, QEMU, UTM, llama.cpp, llama-swap, GOST, TurboQuant, Scott J. Goldman, or their maintainers.
