Repository navigation
Releases: askender/fansctl
Release list
v1.8.1
- 修复 v1.8.0 引入的
smart stop/hold stop误判: pid 核验原要求进程可执行
路径与自身完全一致, 但守护进程由 setuid 助手 (fansctl-root) 拉起时路径
必然不同 —— 一律拒绝发信号, 停止失败。改按文件名核验 (fansctl /
fansctl-root), 既防 pid 复用误杀, 又兼容三种拉起入口 (CLI/助手/仓库二进制)
下载 / Download
fansctl-v1.8.1-macos-arm64.zip — Apple Silicon (arm64),ad-hoc 签名,零依赖单二进制 / single dependency-free binary, ad-hoc signed.
首次运行如被 Gatekeeper 拦截:右键 → 打开,或 xattr -d com.apple.quarantine fansctl /
If Gatekeeper blocks it: right-click → Open, or run xattr -d com.apple.quarantine fansctl.
安装 / Install: brew tap askender/tap && brew install fansctl
🤖 Generated with Claude Code
v1.8.0
- 智能模式功耗前馈: 热量还没到风扇先动。PSTR 秒级整机功耗经"快慢 EMA 差"
检测负载上坡 (编译/加载大模型), 转速立刻抬升而不是等芯片热了才反应,
实测可提前约 6 秒 (参考 TomEageer/fanctl 的思路)。稳态时前馈自然归零,
不长期多转; 充电时自动扣除充电分量 (那部分能量入电池不发热);
电池供电/无 PSTR 键的机器自动退回纯温度曲线 - 健壮性: SMC 写入被楔住 (温控器占用 0x82 等) 时智能/恒温模式不再直接退出,
改为指数退避 (5s→60s 封顶) 持续监测温度, 写入恢复即自动回到控制 - 健壮性:
smart stop/hold stop先用 proc_pidpath 核验 pidfile 里的 pid
还是本程序再发信号, pid 复用时拒绝误杀无辜进程 - 健壮性: 菜单栏同文不重设标题/菜单行, 消除全天 2 秒一拍的空重绘
(setTitle 即使内容相同也会标脏整个半透明菜单栏背景) __selftest新增功耗前馈闭环仿真 (合成热惯性模型驱动纯函数控制律,
断言阶跃响应/限幅/温度有界/稳态归零), 40 项断言
下载 / Download
fansctl-v1.8.0-macos-arm64.zip — Apple Silicon (arm64),ad-hoc 签名,零依赖单二进制 / single dependency-free binary, ad-hoc signed.
首次运行如被 Gatekeeper 拦截:右键 → 打开,或 xattr -d com.apple.quarantine fansctl /
If Gatekeeper blocks it: right-click → Open, or run xattr -d com.apple.quarantine fansctl.
安装 / Install: brew tap askender/tap && brew install fansctl
🤖 Generated with Claude Code
v1.7.1
- 修复
bar install/uninstall与make restart对"launchd 之外实例"无效:
菜单栏进程 setsid 后 launchd 只认自己拉起的那一代, 手动启动的旧实例
会顶住单实例守卫让新实例静默退出, 栏上一直跑旧版。现在 install/uninstall
会按 pidfile 显式清存活实例, restart 同理
下载 / Download
fansctl-v1.7.1-macos-arm64.zip — Apple Silicon (arm64),ad-hoc 签名,零依赖单二进制 / single dependency-free binary, ad-hoc signed.
首次运行如被 Gatekeeper 拦截:右键 → 打开,或 xattr -d com.apple.quarantine fansctl /
If Gatekeeper blocks it: right-click → Open, or run xattr -d com.apple.quarantine fansctl.
安装 / Install: brew tap askender/tap && brew install fansctl
🤖 Generated with Claude Code
v1.7.0
fansctl temps --sort [--above N]: 按温度降序、下限过滤 (237 行温度墙三行看清)fansctl __selftest: 内置纯逻辑自测 (命名表/JSON 转义/plist 解析/pidfile 往返,
34 项), 无需 SMC, CI 虚拟机可跑; 顺手修了命名表匹配器短键越界隐患与
JSON 数值 "-0" 输出fansctl doctor增加未命名传感器计数 (欢迎提 issue 众包命名表)- .github issue 模板 (bug 报告直接附 doctor 输出)
- 修复 v1.6.0 引入的
power --watch参数解析 off-by-one —— flag 被静默忽略
只输出一次; 冒烟测试新增真循环断言 (3 秒必须 3 行)
下载 / Download
fansctl-v1.7.0-macos-arm64.zip — Apple Silicon (arm64),ad-hoc 签名,零依赖单二进制 / single dependency-free binary, ad-hoc signed.
首次运行如被 Gatekeeper 拦截:右键 → 打开,或 xattr -d com.apple.quarantine fansctl /
If Gatekeeper blocks it: right-click → Open, or run xattr -d com.apple.quarantine fansctl.
安装 / Install: brew tap askender/tap && brew install fansctl
🤖 Generated with Claude Code
v1.6.0
- 温度传感器人类可读名:
temps第三列与doctor最热行显示
TCMz (SoC)这样的名字;--json增加name字段 (未知为null)。
映射依据 exelban/stats 传感器表 + Intel SMC 命名惯例 - 高温告警通知: 智能模式达到高阈值 (风扇满速) 或恒温模式压不住目标
(持续高于目标 3°C) 时发一次系统通知 (osascript 横幅, 回落后解除) fansctl power --watch [秒]: 持续功率监测 (默认 5 秒一拍),
--json时为 JSONL, 可直接接jq/记录管道
下载 / Download
fansctl-v1.6.0-macos-arm64.zip — Apple Silicon (arm64),ad-hoc 签名,零依赖单二进制 / single dependency-free binary, ad-hoc signed.
首次运行如被 Gatekeeper 拦截:右键 → 打开,或 xattr -d com.apple.quarantine fansctl /
If Gatekeeper blocks it: right-click → Open, or run xattr -d com.apple.quarantine fansctl.
安装 / Install: brew tap askender/tap && brew install fansctl
🤖 Generated with Claude Code
v1.5.0
--json 机器可读输出 / Machine-readable JSON output
- 只读命令
fans/status/temps/power支持--json;watch --json每行一个
JSON 对象(JSONL),适合jq/ 脚本 / 监控管道 /
the read-only commands accept--json;watch --jsonemits one JSON
object per line (JSONL) — ready forjq, scripts and monitoring pipes - 键名恒为英文(不受界面语言影响),未知值为
null/
keys are always English regardless of interface language; unknown values
arenull - 修掉了
power --jsonUSB 数组漏闭合括号导致非法 JSON 的 bug(已入冒烟
测试回归) / fixed a real bug where the USB array inpower --jsonwas
never closed (now a smoke-test regression)
fansctl status --json
fansctl watch --json 5 | jq -c '.fans[0].actual_rpm'bar 开机自启一键管理 / One-command auto-start management
fansctl bar install # 写 LaunchAgent + 立即启动 + 登录自启
fansctl bar status # 是否安装/加载/运行中
fansctl bar uninstall # 停止并移除-
自动定位自身真实路径(解析 Homebrew 符号链接),无需手改 plist、无需
sudo;重载时先 bootout 等待退出再 bootstrap /
the agent is generated pointing at the real binary path (resolves
Homebrew symlinks) — no hand-edited plist, no sudo; reload does a clean
bootout-then-bootstrap -
兼容 macOS 15 的 launchctl 怪癖:两参数
bootout gui/501 label恒报
EIO,必须用连写 service-target 形式 /
works around a macOS 15 launchctl quirk: the two-argument
bootout gui/501 labelform always fails with EIO — the slash-joined
service-target form is used instead -
在 sudo/setuid 上下文拒绝执行 /
refuses to run under sudo/setuid
fansctl doctor 诊断 / Diagnostics
一页收集机型 / SMC 键数 / 风扇 / 最热传感器 / 供电 / setuid 助手 /
自启与守护状态 / 电池循环数。报 issue 请附上输出。无 AppleSMC 环境
(CI 虚拟机)容错通过、退出码恒 0 /
one page: machine, SMC key count, fans, hottest sensor, power, setuid
helper, auto-start & daemon state, battery cycle count — attach the output
when filing issues. Tolerates machines without AppleSMC (exit code always
0, CI-friendly).
man 手册页 + zsh/bash 补全 / Man page + shell completions
make install与 Homebrew 包现在一并安装man fansctl手册页、
zsh_fansctl与 bash 补全(无需额外配置) /
make installand the Homebrew package now ship a man page
(man fansctl), zsh_fansctland bash completions- Makefile 路径由
PREFIX派生,Homebrew keg 自动落位,formula 零改动 /
paths derive fromPREFIX, so they land in the Homebrew keg with no
formula changes
其他 / Misc
- 修复 9 处
-Wformat-security警告(无参printf(L(...))统一为
printf("%s", L(...))) / fixed 9-Wformat-securitywarnings - CI(GitHub Actions macos-14)持续跑构建 + 冒烟测试 /
CI (GitHub Actions macos-14) runs build + smoke tests
下载 / Download
fansctl-v1.5.0-macos-arm64.zip — Apple Silicon (arm64),ad-hoc 签名,
零依赖单二进制 / single dependency-free binary, ad-hoc signed.
首次运行如被 Gatekeeper 拦截:右键 → 打开,或
xattr -d com.apple.quarantine fansctl /
If Gatekeeper blocks it: right-click → Open, or run
xattr -d com.apple.quarantine fansctl.
安装 / Install: brew tap askender/tap && brew install fansctl
🤖 Generated with Claude Code
v1.4.0
CLI 双语:跟随系统语言 / Bilingual CLI: follows your locale
- CLI 输出按
FANSCTL_LANG>LC_ALL>LC_MESSAGES>LANG选择中文/英文,
zh*前缀=中文,其余=英文;FANSCTL_LANG=zh|en可强制 /
CLI output now picks 中文/English fromFANSCTL_LANG>LC_ALL>
LC_MESSAGES>LANG(zh*= Chinese, anything else = English);
override withFANSCTL_LANG=zh|en - 全部未设置时默认中文 —— GUI 上下文无 LANG,守护进程日志
(/tmp/fansctl.smart.log等) 由此恒为中文,保持可 grep /
with none of them set it defaults to Chinese — daemon logs started from
the menu bar (which has no LANG) stay Chinese and grep-stable - 覆盖帮助、status/fans/temps/dump/watch、power 全部表格(表头 CJK
宽度对齐宽窄通吃)与全部错误提示 /
covers help, status/fans/temps/dump/watch, all power tables
(CJK-aware column alignment) and every error message - 菜单栏双语(v1.3.0)不受影响,两套语言状态各自独立 /
the menu-bar language toggle (v1.3.0) is unaffected — separate state
下载 / Download
fansctl-v1.4.0-macos-arm64.zip — Apple Silicon (arm64),ad-hoc 签名,
零依赖单二进制 / single dependency-free binary, ad-hoc signed.
首次运行如被 Gatekeeper 拦截:右键 → 打开,或
xattr -d com.apple.quarantine fansctl /
If Gatekeeper blocks it: right-click → Open, or run
xattr -d com.apple.quarantine fansctl.
🤖 Generated with Claude Code
v1.3.0 — bilingual menu bar UI
菜单栏界面中英双语 / Bilingual menu bar UI
- 默认跟随系统语言,菜单内 语言 Language 子菜单即时切换、偏好持久化 /
Follows your system language by default; the Language submenu switches
instantly and the choice persists - CLI 输出与日志保持中文 / CLI output and logs remain Chinese
- 顺手修复菜单构建的引用泄漏 / Also fixes reference leaks in menu construction
文档 / Docs
- 英文主 README + 中文
README.zh-CN.md,顶部互链加徽章 /
English-primary README with a linked Chinese translation and badges
下载 / Download
fansctl-v1.3.0-macos-arm64.zip — Apple Silicon (arm64),ad-hoc 签名,
零依赖单二进制 / single dependency-free binary, ad-hoc signed.
首次运行如被 Gatekeeper 拦截:右键 → 打开,或
xattr -d com.apple.quarantine fansctl /
If Gatekeeper blocks it: right-click → Open, or run
xattr -d com.apple.quarantine fansctl.
🤖 Generated with Claude Code