Repository navigation
Releases
v1.1.5 — Wake stability
Fixed
- Prevented a crash after macOS wake when thermal or workspace notifications arrive off the main actor.
- Wake callbacks now reapply fan control on the main actor.
Added
- Regression tests for thermal and screen-wake notifications delivered from a background queue.
The DMG is ad-hoc signed. On first launch, macOS may require right-clicking Mystral.app and choosing Open.
v1.1.4 — MANUAL REINSTALL REQUIRED
⚠️ MANUAL REINSTALL REQUIRED
This release must be installed manually. Download Mystral-1.1.4.dmg, replace Mystral.app in /Applications, and launch it. Do not use the in-app updater for this first installation.
This bootstrap step is required for users coming from the affected 1.1.1 build. After 1.1.4 is installed, future updates use the strict updater validation again.
Fixed
- Restored strict validation for trusted Mystral GitHub release DMGs.
- Validate the bundle identifier,
APPLpackage type, newer version, and strict ad-hoc or Developer ID code signatures before replacement. - Keep asynchronous DMG mounting, cleanup, and timeout handling.
The DMG is ad-hoc signed. On first launch, macOS may require right-clicking Mystral.app and choosing Open.
v1.1.1
Quieter sleep (#2)
Fans no longer keep spinning at the last forced speed while the Mac is asleep. On system sleep the helper hands fan control back to macOS auto mode, so the firmware idles the fans during sleep; on wake your fan curve re-engages automatically.
No action needed — the in-app updater will offer this automatically.
Closes #2.
v1.1.0
⚡ Power monitoring
Mystral now reads and visualizes power draw — no extra permissions, no root.
Menu bar
- New display modes: Icon + Power and Power Only (total system watts).
Live dropdown
- Total system power plus a CPU / GPU breakdown.
Dashboard
- New Power section between the temperature cards and the chart:
- Total system watts with a stacked CPU / GPU / Other bar.
- A Power — Last 5 Minutes chart (Total / CPU / GPU).
Total power comes from the SMC (PSTR); CPU/GPU come from the IOReport
"Energy Model". Other = total − CPU − GPU (RAM, display, SSD, etc.), since
the two sources measure different things.
Install: open the DMG, drag Mystral.app to Applications. First launch:
right-click → Open to bypass Gatekeeper (unsigned build).
v1.0.15
The fan helper now never stops — and only asks for your password once
Previously the background SMC helper was periodically terminated by macOS (launchd housekeeping reaped it every ~20–40 minutes), causing it to relaunch and prompt for your password again each time.
What changed
- The helper is now installed as a launchd LaunchDaemon (
KeepAlive). macOS keeps it alive indefinitely, it survives reboot, and you are asked for your password only once — at first install, never again. - Manual restarts and post-update binary reloads are now prompt-free.
Install
- Drag Mystral.app to Applications.
- Right-click → Open the first time (unsigned build, bypasses Gatekeeper).
- Enter your password once to install the fan helper. That's it.
Uninstall the helper
sudo launchctl bootout system/com.fexxdev.Mystral.helper
sudo rm /Library/LaunchDaemons/com.fexxdev.Mystral.helper.plist
Verified: the helper ran for a full hour on the same process with zero deaths and zero password prompts.
v1.0.14
Fixes
- Fixed helper restart getting permanently stuck: Aligned staleness detection thresholds between the health check and restart logic (was 60s vs 120s, causing a dead zone where the app knew the helper was down but wouldn't restart it)
- Added 12-hour automatic retry: After exhausting 3 restart attempts, the app now retries every 12 hours instead of giving up permanently
- Added "Restart Helper" button: The error banner now includes a manual restart button instead of the misleading "Attempting to restart..." text
v1.0.13
What's Changed
Bug Fixes
- Fix helper crash on macOS Tahoe: The SMC helper was crashing before reaching Swift code because the LLVM profiling runtime tried to write
default.profrawto/(read-only root cwd). Fixed by settingLLVM_PROFILE_FILE=/dev/nulland changing cwd to/tmpin the launch script. - Fix missing Sensors empty state icon:
thermometer.slashdoesn't exist as an SF Symbol — replaced withexclamationmark.triangle.
Improvements
- Unified empty state styling: Dashboard, Sensors, and Fans views now use consistent vertical centering with
ContentUnavailableView. - Better helper launch diagnostics: Launch script now logs binary path, UID, cwd, PID, and alive/dead status to
/tmp/mystral-helper-launch.log.
Full Changelog: v1.0.12...v1.0.13
v1.0.12
In-App Auto-Updater
Updates can now be downloaded and installed directly from within the app — no more opening GitHub in the browser.
How it works
- Go to Settings → Updates → Check Now
- If an update is available, click Install Update
- The app downloads the DMG with a progress bar, installs, and relaunches automatically
Details
- Real-time download progress with cancel support
- Automatic DMG mount, version validation, and app replacement
- Rollback if installation fails
- Elevates via admin prompt only if the install directory requires it
- Removes macOS quarantine attributes for seamless launch
v1.0.11
Fix: Prevent unnecessary password prompts during sleep/wake
The SMC helper was being killed and relaunched (triggering a password prompt) whenever its data file became temporarily stale — e.g. during display sleep, power nap, or system wake transitions.
Changes
- Raise
checkHelperstaleness threshold from 10s to 120s for alive processes with matching version - Add PID liveness check in
SMCProxyServicebefore declaring helper dead - Tolerate up to 60s of stale data if helper process is still alive
- Ignore
SIGHUPin helper process to prevent unexpected termination - Launch helper with
nohupfor additional signal isolation - Observe
screensDidWakeNotificationfor display wake grace periods
1.0.10
What's New
Accurate Chip Detection
- Fixed wrong chip identification — Mystral now reads the chip name directly from the OS (
machdep.cpu.brand_stringsysctl) instead of guessing from SMC sensor counts. All Apple Silicon chips (M1, M1 Pro, M1 Max, M2, M3, M4, etc.) are now correctly identified. - Robust CPU core counting — CPU core sensor detection is now prefix-based, so new or unmapped sensor keys are always counted correctly.
- Improved diagnostic export — SMC export now includes
hw.modelidentifier and sysctl chip name, making it easier to debug hardware-specific issues.