Releases: hoobnn/fanfan
Releases · hoobnn/fanfan
fanfan v1.1.1
Fixed
- The high-temperature notification never fired. It observed the alert-threshold setting instead of the live temperature, so it could only trigger if the user dragged the threshold slider while already over temperature. It now follows the live CPU temperature, edge-triggered with a 5 °C re-arm hysteresis so a reading hovering at the alert line doesn't notify on every sample.
Performance
- All six repeating timers (monitoring, auto control loop, battery, icon refresh, temperature history, fallback animation) now declare a timer tolerance, letting the kernel coalesce wakeups and cut idle CPU/power draw. Control loops measure real elapsed time, so the added jitter has no behavioral effect.
- Fanless Macs (e.g. MacBook Air) no longer re-probe
F0Acover IOKit on every 2 s tick; the zero-fan probe is throttled to once per 30 s and still self-heals after transient SMC failures. - The status-bar title is deduplicated by rendered text — battery-power jitter no longer forces a status-item relayout when the displayed string is unchanged.
- The popover fan-blade animation is capped at 60 fps; on 120 Hz ProMotion panels this halves rotor redraw cost with no perceptible difference.
Installation
Option 1: DMG (Recommended)
- Download and open
fanfan-v1.1.1-macos.dmg - Drag fanfan.app to /Applications/
- Launch — it will prompt once to install the helper tool
Option 2: One-liner
curl -fsSL https://raw.githubusercontent.com/hoobnn/fanfan/main/scripts/install.sh | bashRequirements
- macOS 26.0 or later · Apple Silicon or Intel
SHA256 Checksums
24beac0a82f79692cc83a2b7f0805ca7209527bc087316f49787e89acdb0655e fanfan-v1.1.1-macos.zip
d4a0e59bd7b9d3065aa6767af91ab82e6b316874dabf761432082ef7a498cbbf fanfan-v1.1.1-macos.dmg
fanfan v1.1.0
Added
- Power-strategy presets. A segmented picker above the automatic sliders offers Power Saving / Balanced / Performance / Custom; each preset carries its own target temperature, response notch, and RPM-span fraction. Power Saving suppresses the load-aware feedforward entirely. Hand-tuning any slider flips to Custom so no segment appears selected, and the choice persists across launches. SMC writes now dispatch on a serial background queue and coalesce pending targets, so the 2 s auto timer can no longer pile up requests during the ~8 s Ftst unlock window.
Fixed
- Apple Silicon (M3/M4) fan control now actually engages. The daemon previously mistook firmware
0x82rejections for success, so mode writes silently failed while the fan stayed system-locked. It now performs the Ftst unlock (writeFtst=1, wait up to 12 s forthermalmonitordto yield, retryF<n>Md=1until it sticks), probes mode-key casing (F%dMdvsF%dmd) at startup for M4/M5 portability, and clearsFtst=0when the last manual fan reverts to AUTO so firmware can idle fans back to 0 RPM. The socket receive timeout was raised from 250 ms to 15 s to cover the unlock window. - Fans could stay stuck at their last manual RPM after quitting the app.
applicationWillTerminatenow hands control back to firmware before monitoring stops.
Installation
Option 1: DMG (Recommended)
- Download and open
fanfan-v1.1.0-macos.dmg - Drag fanfan.app to /Applications/
- Launch — it will prompt once to install the helper tool
Option 2: One-liner
curl -fsSL https://raw.githubusercontent.com/hoobnn/fanfan/main/scripts/install.sh | bashRequirements
- macOS 26.0 or later · Apple Silicon or Intel
SHA256 Checksums
548ff23546cf3e24de2dfe383fcee78116dff4e94997cb353a9adf373acb1773 fanfan-v1.1.0-macos.zip
9401a36eb180550445a632f15d62cbcf6c729b61e8edd4fa4903ac1c47a2b9b1 fanfan-v1.1.0-macos.dmg
fanfan v1.0.9
Changed
- Automatic fan control no longer "pumps" (audible loud→soft→loud cycling). Three compounding causes were addressed: the raw SMC temperature, which jitters several °C between samples, is now smoothed through an EMA before it reaches the PID loop, the trend label, and the load-aware boost; the RPM dead-band and slew rate are now asymmetric (spin up readily at 200 RPM / 800 RPM-per-cycle, glide down reluctantly at 450 RPM / 250 RPM-per-cycle) and the minimum hold grew from 3 s to 8 s, with only large spin-ups allowed to break it; and the default derivative gain dropped from
Kp × 3.0toKp × 2.0, since the filtered input no longer needs a large gain to fight sensor noise (a large one was amplifying it). Net effect: fans hold a steady speed instead of chasing temperature transients, at the cost of slightly slower, gentler spin-down after load drops.
Installation
Option 1: DMG (Recommended)
- Download and open
fanfan-v1.0.9-macos.dmg - Drag fanfan.app to /Applications/
- Launch — it will prompt once to install the helper tool
Option 2: One-liner
curl -fsSL https://raw.githubusercontent.com/hoobnn/fanfan/main/scripts/install.sh | bashRequirements
- macOS 26.0 or later · Apple Silicon or Intel
SHA256 Checksums
0c15fead0b98d9cce695a23f65fecfdbc198c1ea9728bc72c362934a1fe81bab fanfan-v1.0.9-macos.zip
243e8ba711c934bf364b220df8104b317accfdd9c89fa8751f599320cab5f527 fanfan-v1.0.9-macos.dmg
fanfan v1.0.8
Fixed
- Automatic fan control could silently stop after the app sat in the background (e.g. lid closed or no foreground window). As an
.accessorymenu-bar app, macOS App Nap froze the monitoring and fan-controlTimers, so scheduling never resumed on wake until the user reopened the menu bar. The app now holds auserInitiatedAllowingIdleSystemSleepactivity token for the lifetime of the process, keeping the timers alive while still letting the system sleep normally (closing the lid still saves power).
Installation
Option 1: DMG (Recommended)
- Download and open
fanfan-v1.0.8-macos.dmg - Drag fanfan.app to /Applications/
- Launch — it will prompt once to install the helper tool
Option 2: One-liner
curl -fsSL https://raw.githubusercontent.com/hoobnn/fanfan/main/scripts/install.sh | bashRequirements
- macOS 26.0 or later · Apple Silicon or Intel
SHA256 Checksums
9f9aab0d907ae975aeb5497e81f8079fde37cb852ed7f252dcf8a9272ff2d417 fanfan-v1.0.8-macos.zip
cbe85c2682f9b34113d455ab86af6189c087e6a65bb0305fdf4b044eedbe0922 fanfan-v1.0.8-macos.dmg
fanfan v1.0.7
Fixed
- Automatic mode could leave the fan stuck on firmware control after
restoreAutomaticControl()handed it back (e.g. after screen sleep).lastAppliedSpeedstayed pinned at the previous saturated value, so when the next PID cycle saturated to the same ceiling the hysteresis check sawdiff == 0and skipped the write. Re-engagement now re-seedslastAppliedSpeedfrom the fan's real RPM, matchingstartAutoControl()'s seeding strategy.
Performance
FanControlViewModelnow publishesmaxTemperature,ssdTemperature, andbatterySensorTemperatureas cached@Publishedproperties driven by Combine, so the popover and status-bar icon stop runningallSensors.first(where:)andmax(cpu, gpu)on every render pass.FanBladeViewshort-circuits theTimelineView(.animation)subtree whenvisualRps == 0, so an idle blade no longer redraws each vsync. The per-bladeBladeShapewas also collapsed into a singleFanRotorShape, halving SwiftUI subview count.
Installation
Option 1: DMG (Recommended)
- Download and open
fanfan-v1.0.7-macos.dmg - Drag fanfan.app to /Applications/
- Launch — it will prompt once to install the helper tool
Option 2: One-liner
curl -fsSL https://raw.githubusercontent.com/hoobnn/fanfan/main/scripts/install.sh | bashRequirements
- macOS 26.0 or later · Apple Silicon or Intel
SHA256 Checksums
fefb4cd8bbf7bd01e38896dc30e90b55f9711382184a7d95d104068d99b1d7fa fanfan-v1.0.7-macos.zip
0eddaf601168451b0d6e1ddc269bb7778ef48d283afc3cde8c9eed4412d4712b fanfan-v1.0.7-macos.dmg