Releases: idevtim/chillmac
v1.7.0
Highlights
Performance Mode is much smarter. Low is now genuinely quiet — fans stay on at minimum instead of bouncing between manual and auto every few seconds (the audible "on / off / on / off" cycling is gone). Max is no longer a one-note constant blast — it sits at a high baseline and ramps to 100% before throttling, with real headroom in between. Medium and High get smoother, less twitchy curves to match.
Changed
- No more auto/manual cycling — while Performance Mode is on, fans now stay in manual mode at all times. Previously, when temperatures dropped below the curve's threshold, the app would hand control back to macOS auto, then re-take control on the next poll a moment later. That mode-switch is what you heard as the abrupt "on / off / on / off" — fixed by holding fans at a per-level floor RPM instead of bouncing to auto
- Smart Max curve — Max used to be a constant 100%. It now sits at a 50% baseline and ramps to 100% by ~68°C peak temp. Cooling is preemptive (no cold-spin-up under load) but quieter when there's thermal headroom, and easier on fan bearings
- Per-level fan floors — Low: minRPM (inaudible). Medium: 10%. High: 25%. Max: 50%. Fans never drop below the floor while Performance Mode is engaged
- Per-level ramp rates — Low ramps slowly (400 RPM/cycle up, 150 down) so it's never twitchy; Max ramps fast (2000 up / 500 down) for genuine responsiveness. Previously every level shared the same ramp rate
- Per-level temperature smoothing — Low uses heavy EMA smoothing (factor 0.15) so brief spikes don't audibly spin fans up; Max uses lighter smoothing (0.50) to react quickly. Replaces the single 0.3 factor that applied to every level
- Continuous curves — eliminated the zero-thresholds in Low/Medium/High that produced audible "click on" moments when a sensor crossed a single degree (e.g. 64.9 → 65.0°C jumping fans from 0% to 15%). Curves now flow smoothly from the level's floor up to its ceiling
Improvements
- The Performance Mode card now shows "Min" instead of "Auto" at 0% — fans aren't auto, they're held at minRPM under manual control
- Updated mode descriptions in the UI to reflect the new behavior
v1.6.3
Highlights
Fixes click-to-open lag that built up over days of continuous uptime. After 2-3 days, opening the menu bar popover became visibly laggy and required a relaunch to fix. The popover now opens instantly regardless of how long ChillMac has been running.
Fixed
- Click-to-open lag after days of uptime — the SwiftUI hosting controller for the popover was created once and kept alive for the app's lifetime, so its view graph stayed subscribed to every monitor's
@Publishedproperties even while the popover was hidden.FanMonitor's background polls fed continuous invalidations into AttributeGraph, accumulating tracked-value dictionaries and shredding the small-object heap into 50%+ fragmentation. The hosting controller is now built fresh when the popover opens and dropped when it closes — no live SwiftUI subgraph exists between opens, so nothing accumulates.
Diagnostic findings (for the curious)
In a 2.7-day-old running instance:
- RSS: 189 MB (should be ~30-50 MB), peak physical footprint 424 MB
- 127,775 live heap allocations, 56% fragmentation in MALLOC_SMALL
- 284 SwiftUI AttributeGraph tracking dictionaries (~312 KB) accumulated from the persistent view graph
- 2,178 KVO dependency entries from the same source
v1.6.2
Highlights
Fixes gradual UI slowdown after long periods of continuous operation (days), plus latent thread-safety and peak-memory issues in the monitoring subsystem. ChillMac should now stay fast indefinitely without needing a restart.
Fixed
- UI slowdown over time — peak temperature
@Publishedproperties were firing SwiftUI invalidations every 2s on hundredths-of-a-degree EMA noise, keeping the retained popover view tree busy even when hidden; updates now threshold at 0.1°C - Main-thread stalls from diagnostic sampling — IOKit and sysctl reads (GPU utilization, battery state, memory stats, pressure level) now run on the diagnostics background queue instead of the main runloop every 60s
- Thread-safety in top process lookups — CPU and Memory detail panels were resolving app icons via
NSWorkspace.runningApplicationsfrom a background queue; icons are now snapshotted on the main thread before dispatch - Off-main reads in FanMonitor poll —
AppSettings, helper state, and fan overrides were being read from the SMC background queue; all state is now snapshotted on the main thread before dispatch, and the in-flight flag is managed entirely on the main thread
Improvements
- Less disk I/O — diagnostic history is now persisted every 15 minutes (was every 5), cutting ~1 MB JSON writes by 3×
- Lower peak memory during disk analysis — the Disk detail panel's filesystem walk now drains autoreleased resource values per-file instead of at the end of the walk, dramatically reducing peak memory with large Documents/Downloads folders
- Fewer disk category walks — the Disk detail panel's expensive filesystem walk now runs at most every 5 minutes (was every 30s on the general refresh tick) with a single-flight guard, and kicks off immediately when the panel opens
- Single-flight monitor refreshes — CPU top-process, Memory refresh, and Disk category walks can no longer start a new run while a previous one is still in progress
v1.6.1
Highlights
Reduces ChillMac's CPU footprint — especially when the popover is closed, where unnecessary IOKit calls are eliminated on most poll cycles and secondary monitors no longer run at all.
Improvements
- Idle polling slowed — FanMonitor polls every 10s (was 5s) when performance mode is off and the popover is closed
- Secondary monitors paused at launch — CPU, Memory, Battery, and System monitors no longer start and immediately stop on app launch; they now only run while the popover is open
- Fewer SMC reads when hidden — fan target speed and fan mode reads (2 IOKit calls per fan per cycle) are skipped on most background cycles, with a periodic full read every ~30s to keep diagnostic samples accurate
- Longer secondary monitor intervals — CPU monitor polls every 4s (was 2s), Memory every 5s (was 3s), Battery every 15s (was 5s)
Fixed
- Performance curve oscillation — added 5°C hysteresis to the fan activation threshold so fans no longer rapidly toggle between auto and manual mode when temperatures hover near the curve's zero-crossing (e.g. ~65°C on Low)
v1.6.0
Highlights
A big upgrade to diagnostics for users running ChillMac long-term: history now survives app restarts, sleep gaps are tracked so charts are honest, and each sample captures GPU load, thermal state, real memory pressure, and per-zone peak temperatures.
New
- Persistent history — the 24-hour sample buffer is now saved to
~/Library/Application Support/ChillMac/history.jsonevery few minutes and reloaded on launch, so a restart, crash, or force-quit no longer wipes your metrics - Sleep interval tracking — ChillMac listens for system sleep/wake and records real sleep windows in the diagnostic export, so gaps in the timeline are labelled instead of looking like app freezes
- GPU usage per sample — diagnostic history now captures GPU utilization alongside CPU usage
- Thermal state per sample — records the system's thermal pressure level (nominal / fair / serious / critical) so throttling events are visible in exports
- Real memory pressure — diagnostic samples now include the actual macOS memory pressure level from
kern.memorystatus_vm_pressure_level(1 normal, 2 warning, 4 critical), in addition to the existing "memory used %" - Per-zone peak temperatures — each sample now records the hottest CPU, GPU, and SSD temperatures separately, plus the label of whichever sensor held the overall peak, making thermal triage possible without scrolling through the full sensor list
Improvements
- Smaller diagnostic exports — reports are no longer pretty-printed, shrinking typical exports by roughly 3×
- No more duplicated state in exports — the redundant
currentStateblock was removed; the latest history sample is the live snapshot - CPU delta re-anchored after wake — the CPU usage calculation resets its baseline when the system wakes, so the first post-sleep sample is no longer a bogus spike
- Race fix in CPU sampling — CPU delta state is now only touched on the diagnostics queue, removing a subtle main/background race
- Misleading field renamed — the diagnostic sample field previously named
memoryPressurewas really "memory used %"; it's nowmemoryUsedPercent, with the actual pressure level in a separate field
Notes
Diagnostic JSON schema has changed in this release — old exports remain readable, but the new fields will only appear in samples collected on 1.6.0+.
v1.5.2
Highlights
Fixes a bug where diagnostic logs recorded a frozen peak temperature value.
Fixed
- Peak temperature logging — peak temperature now updates continuously, even when the popover is closed; previously it froze at the last value seen while the popover was open, causing diagnostic exports to contain a single unchanging temperature across all samples
v1.5.1
Highlights
Adds diagnostic log export for troubleshooting performance issues during long-term use.
New
- Export Diagnostics — new option in Settings to save a detailed JSON report of system metrics, fan speeds, temperatures, CPU/memory/battery state, and up to 24 hours of sampled history for tracking down memory leaks and performance regressions
v1.5.0
Highlights
Performance and reliability improvements — fixes a memory issue that caused sluggishness after extended use, and adds automatic update checking when opening settings.
Fixes
- Long-running performance degradation — fan and sensor data no longer triggers unnecessary SwiftUI view updates while the popover is closed, preventing memory fragmentation over extended sessions (24+ hours)
- Detail panel click-outside detection — the event monitor now reads the popover's window frame live instead of capturing a stale snapshot, fixing cases where panels could fail to close after display changes
Improvements
- Auto update check — opening the settings panel now automatically checks for updates so you always see the latest status
- System observer guard — sleep/wake notification observers are protected against duplicate registration
v1.4.1
Highlights
A small maintenance release with improved update checker feedback and project housekeeping.
Changes
- Update checker — settings view now shows clearer status messages when checking for updates (e.g., "You're up to date" vs. "Update available")
- README — rewritten for clarity with improved installation instructions
- Contributing guide — added
CONTRIBUTING.mdwith guidelines for contributors - Security policy — added
SECURITY.mdfor responsible vulnerability disclosure - Issue & PR templates — standardized templates for bug reports, feature requests, and pull requests
.env.example— addedGITHUB_TOKENentry for release automation
v1.4.0
Highlights
v1.4.0 is a major feature release introducing intelligent thermal zone management, performance modes, and an automatic update checker.
New Features
Zone-Aware Fan Control
- Intelligent fan speed management based on thermal zones (CPU, GPU, DRAM, SSD)
- Fans respond to the hottest active zone rather than a single sensor
Performance Modes
- Normal — balanced cooling with smooth RPM ramping
- Performance — aggressive fan curve for sustained heavy workloads
- Configurable via the new Settings panel
Update Checker
- Automatic check for new versions on launch
- Manual check available in Settings
FPS Monitoring
- Real-time frames-per-second display
- Toggle on/off in Settings
Launch at Login
- Option to start ChillMac automatically when you log in
Battery Saver
- Reduces fan activity when running on battery power
- Respects screen lock and sleep events to pause/resume monitoring
Fan Speed Smoothing
- Gradual RPM ramping prevents abrupt fan speed jumps
- Smoother acoustic experience during load transitions
Improvements
- Smart polling — monitoring pauses when the popover is closed and suspends during screen lock/sleep
- Detail panels — animated open/close with themed close button overlay
- Appearance — temperature colors adapt to light/dark mode preference
- Fan thresholds — refined speed curves for better cooling response
- Helper installation — improved install flow with better UI feedback during startup
- Fan reset — fans reliably return to automatic mode on app quit
Infrastructure
- Automated GitHub release creation with version tagging in the build script
- DMG build pipeline with code signing, notarization, and stapling
- MIT License added