Repository navigation
macOS Installation
ZenTune operates on macOS for AMD Ryzen Hackintosh environments (APUs and desktop processors). Because macOS lacks a /sys virtual filesystem and forbids unauthenticated userland PCI configuration access, ZenTune communicates with the processor SMU via kernel extensions or authorized IOKit bridge drivers.
Verify host compatibility before proceeding:
- Platform: macOS 11 Big Sur through macOS 26 Tahoe running on an AMD Ryzen processor (Zen 1 through Zen 5 architectures). Apple Silicon and Intel systems are unsupported.
-
Privilege elevation: Administrator credentials via
sudo. Systemdrun0is Linux-specific; macOS unconditionally usessudo. -
Python runtime: Python 3.10 or newer (
python3 --version). - Terminal emulator: Minimum terminal window dimensions of 50 columns by 25 rows.
-
SMU access layer: One of two supported hardware access paths must be active:
-
DirectHW (Priority 1, Recommended):
DirectHW.kextloaded with System Integrity Protection (SIP) configured to permit third-party kernel extensions (csr-active-config=03080000). Enables SMU mailbox tuning and physical memory mapping for raw PM table inspection viazenmaster --sensors/zenmaster --tableCLI. Note that Home tab sensor plots in the TUI are Linux-only (active = []on macOS inhomeView.py); the Home tab displays only the navigation menu on macOS. -
IOPCIBridge Kext-Free Fallback (Priority 2, Tuning Only): Runs
zenmaster.iopcirequiring thedebug=0x144kernel boot argument. Functions without kernel extensions. Supports full frequency, power, and curve tuning, but cannot map physical memory.
-
DirectHW (Priority 1, Recommended):
Adaptive Mode and Linux-specific platform controls (ASUS WMI, power-profiles-daemon, CCD affinity) are unavailable on macOS. Preset application, Custom Preset editing, Automations, and periodic reapply loops operate identically to Linux.
ZenTune inspects available SMU backends on startup in Assets/core/hardware.py:
1. zenmaster.directhw.is_loaded() --> If active, use DirectHW (tuning + CLI telemetry)
2. zenmaster.iopci.is_available() --> If debug=0x144 in boot-args, use IOPCIBridge (tuning only)
3. Neither found --> Refuse launch with "No SMU access path is available"
DirectHW maps physical memory ranges, allowing zenmaster to poll the SMU Power Management (PM) table via CLI (zenmaster --sensors) for raw clock, wattage, and temperature readouts. Note that Home tab sensor plots in the TUI are Linux-only (active = [] on macOS in homeView.py).
- Download and deploy
DirectHW.kextinto your OpenCoreEFI/OC/Kexts/directory and register it inconfig.plistunderKernel -> Add. - Configure System Integrity Protection (SIP) to permit third-party kexts:
- In OpenCore
config.plist, navigate toNVRAM -> Add -> 7C436110-AB2A-4BBB-A880-FE41995C9F82. - Set
csr-active-configto<03080000>(Data).
- In OpenCore
- Reboot the machine.
- Verify that the extension is active:
The output should list
kextstat | grep -i directhwcom.coresystems.DirectHWor equivalent identifier.
If you prefer not to lower SIP or run non-Apple kernel extensions, ZenTune can access PCI configuration registers through the IOKit IOPCIBridge user client using zenmaster.iopci.
- Append
debug=0x144to your kernel boot arguments:- In OpenCore
config.plist, navigate toNVRAM -> Add -> 7C436110-AB2A-4BBB-A880-FE41995C9F82 -> boot-args. - Add
debug=0x144alongside existing flags (e.g.,keepsyms=1 alcid=1 debug=0x144).
- In OpenCore
- Reboot the system.
- Confirm the kernel argument registered:
Verify that
sysctl kern.bootargs
debug=0x144appears in the output string.
Note
When using zenmaster.iopci, hardware tuning (applying limits, curve optimizer offsets, and Premade presets) functions completely. However, because physical memory mapping is restricted, CLI PM table inspection (zenmaster --sensors) is unavailable. Note that in the ZenTune TUI, Home tab live sensor graphs are Linux-only on all backends.
Run the installation script in a standard user terminal session:
curl -fsSL https://raw.githubusercontent.com/HorizonUnix/ZenTune/main/install.sh | bashDo not execute the installer under root. The script requests sudo credentials only when configuring system paths.
- Detects
Darwinkernel architecture. - Checks for prerequisites (
curl,unzip, Python 3.10+). - Extracts application code to
/opt/zentune/src/. - Creates an isolated virtual environment at
/opt/zentune/venv/with dependencies (pyzmq,textual,textual-plotext,zenmaster). - Generates the executable launcher script at
/usr/local/bin/zentune. - Assigns ownership of
/opt/zentuneto your user account to facilitate unprivileged config management.
To install from a local repository checkout instead of downloading a release archive:
git clone https://github.com/HorizonUnix/ZenTune.git
cd ZenTune
./install.sh --localStart ZenTune:
zentuneThe initial launch opens the three-step configuration wizard:
- Welcome: Verifies terminal capabilities and dimensions. Select Begin setup.
-
Background daemon: Select Install / enable daemon. ZenTune requests your administrator password via
sudoand provisions the system launchd service unit:- Service label:
com.horizonunix.zentune - Property list file:
/Library/LaunchDaemons/com.horizonunix.zentune.plist - Standard output and error logs:
/var/log/zentune.log - IPC socket address:
ipc:///var/run/zentune.sock(mode0o666) - Auto-restart:
KeepAlive: SuccessfulExit = false
- Service label:
-
Hardware detection: Probes processor family, stepping, and SMU architecture via
zenmaster. Once verified, select Finish.
On macOS, platform-incompatible features are hidden automatically:
- The Adaptive Mode tab and its settings are suppressed.
- The System controls (power-profiles-daemon, ASUS WMI, CCD core affinity) are suppressed.
- All core tuning functions remain active: Premade (
1), Custom (2), Auto (4), Info (5), Status (6), and Settings (7).
When updates are published, ZenTune flags them during startup.
- In-app update: Select About (
?) -> Check updates -> Update now. - Command-line update: Re-execute the installer:
curl -fsSL https://raw.githubusercontent.com/HorizonUnix/ZenTune/main/install.sh | bash
Your custom presets (/opt/zentune/src/Assets/custom.json) and configuration values (config.ini) persist across updates.
To remove ZenTune completely:
curl -fsSL https://raw.githubusercontent.com/HorizonUnix/ZenTune/main/install.sh | bash -s -- --uninstallTo run without confirmation prompts in automated deployment scripts:
ZENTUNE_ASSUME_YES=1 bash install.sh --uninstallThe uninstaller purges:
- LaunchDaemon definition:
/Library/LaunchDaemons/com.horizonunix.zentune.plist - Binary wrapper:
/usr/local/bin/zentune - Application files and venv:
/opt/zentune - Runtime socket and daemon lock:
/var/run/zentune.sock,/var/run/zentune_daemon.lock - Client lock:
/tmp/zentune_tui.lock
Getting started
Using the app
Internals