Skip to content

Releases: askender/fansctl

v1.8.1

Choose a tag to compare

@github-actions github-actions released this 02 Oct 08:25
  • 修复 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

Choose a tag to compare

@github-actions github-actions released this 02 Oct 08:11
  • 智能模式功耗前馈: 热量还没到风扇先动。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

Choose a tag to compare

@github-actions github-actions released this 02 Oct 05:57
  • 修复 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

Choose a tag to compare

@github-actions github-actions released this 02 Oct 05:51
  • 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

Choose a tag to compare

@github-actions github-actions released this 02 Oct 04:21
  • 温度传感器人类可读名: 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

Choose a tag to compare

@askender askender released this 02 Oct 02:59

--json 机器可读输出 / Machine-readable JSON output

  • 只读命令 fans/status/temps/power 支持 --json;watch --json 每行一个
    JSON 对象(JSONL),适合 jq / 脚本 / 监控管道 /
    the read-only commands accept --json; watch --json emits one JSON
    object per line (JSONL) — ready for jq, scripts and monitoring pipes
  • 键名恒为英文(不受界面语言影响),未知值为 null /
    keys are always English regardless of interface language; unknown values
    are null
  • 修掉了 power --json USB 数组漏闭合括号导致非法 JSON 的 bug(已入冒烟
    测试回归) / fixed a real bug where the USB array in power --json was
    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 label form 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 install and the Homebrew package now ship a man page
    (man fansctl), zsh _fansctl and bash completions
  • Makefile 路径由 PREFIX 派生,Homebrew keg 自动落位,formula 零改动 /
    paths derive from PREFIX, so they land in the Homebrew keg with no
    formula changes

其他 / Misc

  • 修复 9 处 -Wformat-security 警告(无参 printf(L(...)) 统一为
    printf("%s", L(...))) / fixed 9 -Wformat-security warnings
  • 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

Choose a tag to compare

@askender askender released this 02 Oct 01:55

CLI 双语:跟随系统语言 / Bilingual CLI: follows your locale

  • CLI 输出按 FANSCTL_LANG > LC_ALL > LC_MESSAGES > LANG 选择中文/英文,
    zh* 前缀=中文,其余=英文;FANSCTL_LANG=zh|en 可强制 /
    CLI output now picks 中文/English from FANSCTL_LANG > LC_ALL >
    LC_MESSAGES > LANG (zh* = Chinese, anything else = English);
    override with FANSCTL_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

Choose a tag to compare

@askender askender released this 02 Oct 01:07

菜单栏界面中英双语 / 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