Skip to content

Releases: hoobnn/fanfan

fanfan v1.1.1

10 Jun 13:39

Choose a tag to compare

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 F0Ac over 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)

  1. Download and open fanfan-v1.1.1-macos.dmg
  2. Drag fanfan.app to /Applications/
  3. 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 | bash

Requirements

  • 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

27 May 05:45

Choose a tag to compare

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 0x82 rejections for success, so mode writes silently failed while the fan stayed system-locked. It now performs the Ftst unlock (write Ftst=1, wait up to 12 s for thermalmonitord to yield, retry F<n>Md=1 until it sticks), probes mode-key casing (F%dMd vs F%dmd) at startup for M4/M5 portability, and clears Ftst=0 when 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. applicationWillTerminate now hands control back to firmware before monitoring stops.

Installation

Option 1: DMG (Recommended)

  1. Download and open fanfan-v1.1.0-macos.dmg
  2. Drag fanfan.app to /Applications/
  3. 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 | bash

Requirements

  • 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

21 May 08:03

Choose a tag to compare

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.0 to Kp × 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)

  1. Download and open fanfan-v1.0.9-macos.dmg
  2. Drag fanfan.app to /Applications/
  3. 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 | bash

Requirements

  • 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

21 May 06:46

Choose a tag to compare

Fixed

  • Automatic fan control could silently stop after the app sat in the background (e.g. lid closed or no foreground window). As an .accessory menu-bar app, macOS App Nap froze the monitoring and fan-control Timers, so scheduling never resumed on wake until the user reopened the menu bar. The app now holds a userInitiatedAllowingIdleSystemSleep activity 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)

  1. Download and open fanfan-v1.0.8-macos.dmg
  2. Drag fanfan.app to /Applications/
  3. 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 | bash

Requirements

  • 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

17 May 13:26

Choose a tag to compare

Fixed

  • Automatic mode could leave the fan stuck on firmware control after restoreAutomaticControl() handed it back (e.g. after screen sleep). lastAppliedSpeed stayed pinned at the previous saturated value, so when the next PID cycle saturated to the same ceiling the hysteresis check saw diff == 0 and skipped the write. Re-engagement now re-seeds lastAppliedSpeed from the fan's real RPM, matching startAutoControl()'s seeding strategy.

Performance

  • FanControlViewModel now publishes maxTemperature, ssdTemperature, and batterySensorTemperature as cached @Published properties driven by Combine, so the popover and status-bar icon stop running allSensors.first(where:) and max(cpu, gpu) on every render pass.
  • FanBladeView short-circuits the TimelineView(.animation) subtree when visualRps == 0, so an idle blade no longer redraws each vsync. The per-blade BladeShape was also collapsed into a single FanRotorShape, halving SwiftUI subview count.

Installation

Option 1: DMG (Recommended)

  1. Download and open fanfan-v1.0.7-macos.dmg
  2. Drag fanfan.app to /Applications/
  3. 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 | bash

Requirements

  • 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