diff --git a/Assets/readme/ip-purity-dark.png b/Assets/readme/ip-purity-dark.png
new file mode 100644
index 0000000..09f88e5
Binary files /dev/null and b/Assets/readme/ip-purity-dark.png differ
diff --git a/Assets/readme/ip-purity-light.png b/Assets/readme/ip-purity-light.png
new file mode 100644
index 0000000..cea76dd
Binary files /dev/null and b/Assets/readme/ip-purity-light.png differ
diff --git a/Assets/readme/popover-disk-light.png b/Assets/readme/popover-disk-light.png
new file mode 100644
index 0000000..3665cbc
Binary files /dev/null and b/Assets/readme/popover-disk-light.png differ
diff --git a/README.md b/README.md
index 1dbf8fa..d23835d 100644
--- a/README.md
+++ b/README.md
@@ -4,7 +4,7 @@
# OpenStats
-**Your Mac at a glance — CPU, GPU, memory, network and temperatures in the menu bar, with fan control, keep-awake and one-click cleanup.**
+**Your Mac at a glance — CPU, GPU, memory, network and temperatures in the menu bar, with fan control, keep-awake, one-click cleanup, an app uninstaller and an IP cleanliness check.**
[](https://getopenstats.com/#download)
[](https://github.com/gentpan/OpenStats/stargazers)
@@ -19,7 +19,7 @@ CPU load, GPU, memory pressure, network speed, disk, battery, temperatures and f
lets you act on it: spin the fans up, keep the Mac awake with the lid closed, clear caches, fully
uninstall apps and disable startup items. Network details also check how clean your public IP is —
whether it is flagged as a VPN, proxy, data center or for abuse.
-Everything is read on your own Mac, and there is no telemetry. An account is optional: sign in with GitHub, Google or Apple to sync your preferences to other Macs; the cloud keeps only your email, name and the settings document. Beyond that, the only network traffic is optional and on demand: a public-IP lookup when you open network details, and a ping probe to a target you choose.
+Everything is read on your own Mac, and there is no telemetry. An account is optional: sign in with GitHub, Google or Apple to sync your preferences to other Macs; the cloud keeps only your email, name and the settings document. Beyond that, the only network traffic comes from features you can turn off: a public-IP and cleanliness lookup when you open network details, a ping probe to a target you choose, and a daily check for a new version.
[Download](https://getopenstats.com/#download) ·
[Website](https://getopenstats.com) ·
@@ -42,7 +42,8 @@ brew install --cask gentpan/tap/openstats
```
Requires macOS 14 (Sonoma) or later.
-Developed and tested on Apple Silicon. The interface is in Simplified Chinese.
+Developed and tested on Apple Silicon. The interface is in English and Simplified Chinese, following the
+system language by default; switch it in Settings → General → Language.
## Recent updates
@@ -58,7 +59,11 @@ Latest release **0.3.0** (2026-09-15) · [full changelog](CHANGELOG.md) (kept in
- 菜单栏新增“电池”项目:电量按九种风格显示(电量条、圆环、饼图、数字等),充电中带闪电,电量低于 20% 按“高负载时着色”变红。点击弹出电池详情:电量与剩余 / 充满时间、适配器功率、电池温度、最近 24 小时电量曲线、功耗、健康度与循环次数、已连接蓝牙设备的电量(AirPods 左右耳与充电盒、妙控键盘 / 鼠标 / 触控板),可跳到系统电池设置;主窗口也有对应的“电池”页,历史页多了电池电量曲线。没有电池的 Mac(mini、Studio、iMac)上这个项目改为显示电量最低的蓝牙设备,弹窗只列蓝牙设备。「设置 · 菜单栏」新增“蓝牙设备电量低时提示”:某个设备低于 20% 时在电池项目旁显示它的图标与电量。
- 网络详情“接口”区块右上角新增重置按钮:把开机后下载 / 上传归零、从现在起重新累计,标题旁标出起算时间,两行改叫“重置后下载 / 上传”;重启后自动回到开机后累计,右键按钮可随时改回。
-- 磁盘页从展示页变成能动手的磁盘工具,新增四张卡片:- 空间占用:统计家目录里每个文件夹占多少,并列出最大的 20 个文件(应用、照片图库等按整体算一个);可在访达中显示,家目录里、Library 之外的文件可以直接移到废纸篓。只读扫描,文件多时需要几十秒,可随时停止。- 文件系统检查:调用系统的 diskutil 对启动盘做一次只读检查,相当于“磁盘工具”的急救但不修改任何东西;记住上次检查的时间与结果,发现问题时提示去磁盘工具修复。- 本地快照:列出 Time Machine 留在本机的快照(它们计入“可清除”空间),可一键全部删除;辅助工具够新时由它执行,否则请求一次管理员授权。辅助工具协议升到第 4 版,已安装的旧版会提示重新安装。- 其他磁盘:列出外置硬盘、U 盘、镜像与网络共享的容量,可在访达中显示或直接推出;接入、拔出时自动刷新。
+- 磁盘页从展示页变成能动手的磁盘工具,新增四张卡片:
+ - 空间占用:统计家目录里每个文件夹占多少,并列出最大的 20 个文件(应用、照片图库等按整体算一个);可在访达中显示,家目录里、Library 之外的文件可以直接移到废纸篓。只读扫描,文件多时需要几十秒,可随时停止。
+ - 文件系统检查:调用系统的 diskutil 对启动盘做一次只读检查,相当于“磁盘工具”的急救但不修改任何东西;记住上次检查的时间与结果,发现问题时提示去磁盘工具修复。
+ - 本地快照:列出 Time Machine 留在本机的快照(它们计入“可清除”空间),可一键全部删除;辅助工具够新时由它执行,否则请求一次管理员授权。辅助工具协议升到第 4 版,已安装的旧版会提示重新安装。
+ - 其他磁盘:列出外置硬盘、U 盘、镜像与网络共享的容量,可在访达中显示或直接推出;接入、拔出时自动刷新。
- 网络详情新增「IP 纯净度」区块:CleanIP.io 的纯净度评分与等级画成占满整行的 F 到 A+ 六段色带,分数在色带上方、得分处有标记,同一行右侧是 cleanip.io 字标,点了打开这个 IP 的完整报告;下面列出风险评分、命中的风险标记(VPN、代理、Tor、机房、滥用记录等)与一句评价。IP 地址区块用 cleanip.io 样式的徽章标出原生 / 广播、住宅 / 机房与运营商类型(ISP 等),徽章样式作为通用组件收进设计系统。
- 账号与设置同步(设置 · 账号与同步):用 GitHub、Google 或 Apple 登录后,菜单栏项目与风格、刷新频率、外观与语言、详情弹窗的区块、连接探测、通知、快捷键、风扇安全温度、合盖电量下限会保存到 getopenstats.com,换一台 Mac 登录即自动恢复。设置改动 2 秒后上传,启动、唤醒与每 15 分钟检查一次云端;第一次登录时本机与云端都有内容且不同,会让你选用哪一份,之后以最后写入为准。登录走系统的授权窗口,令牌存在钥匙串,云端只保存邮箱、姓名与设置文档,可随时退出或删除云端数据。不登录时应用行为不变。
- CPU 走势时长可选 1 / 3 / 5 分钟:走势线上方一行小字切换,弹窗与主窗口共用;曲线按真实采样时间定位,最新一次采样固定在右边缘,睡眠等超过 10 秒没有采样的地方线条断开。
@@ -181,15 +186,27 @@ Choose which sections each popover shows in Settings. `Esc` closes it.
grade and risk flags (VPN, proxy, Tor, data center, abuse); DNS flush
and one-click switching to Cloudflare, Google, Tencent, Alibaba Cloud or manual servers;
per-process traffic.
+- **Disk.** Startup disk capacity as a segmented bar (used, purgeable, available); read / write speed with a
+ 60-second history; SSD health; the apps reading and writing the most.
- **GPU**, **Temperature & fans.** History, sensor groups, fan speeds and quick modes.
- **Battery.** Charge level, time remaining, adapter wattage and battery temperature; a 24-hour charge curve; power draw; health and cycle count; the batteries of connected Bluetooth devices (AirPods, Magic Keyboard / Mouse / Trackpad). Macs without a battery show the Bluetooth devices only.
-
+
+**IP cleanliness check** — see at a glance whether your public IP is clean: the CleanIP.io score with an F to A+ grade
+band, a risk score and the risk flags it hits (VPN, proxy, Tor, data center, abuse history and more); the IP address
+block marks native vs. broadcast and residential vs. data center with badges. IPv4 and IPv6 are checked separately,
+and results are cached on the Mac for 7 days unless the address changes or you refresh.
+
+
+
+
+
+
**Main window** — a sidebar with Dashboard, This Mac, History, CPU, GPU, Memory, Disk, Network, Temperature & fans,
Battery, plus the Processes, Startup items, Keep awake, Clean and Uninstall tools; resizable in both directions. See [Cleanup](#cleanup).
@@ -262,8 +279,8 @@ Metrics come from the kernel (`host_processor_info`, `host_statistics64`, `sysct
SMC on your own Mac. Preferences live in the app's user defaults and contain nothing personal.
There is no analytics and no telemetry.
-OpenStats only touches the network for two optional features, both of which can be turned off in
-Settings → Network:
+Every feature that touches the network can be turned off — the first two in Settings → Network, the update
+check in Settings → About:
- **Public IP**: when you open network details, one request to Cloudflare `1.1.1.1` (ipify as fallback)
for your public address, cached for 10 minutes. Location, ASN, network type and the cleanliness score
@@ -272,6 +289,10 @@ Settings → Network:
- **Connection probe**: an ICMP ping to the target you pick (Cloudflare, Google, Alibaba Cloud,
Tencent or your router) every 1, 2 or 5 seconds, only while the network item is in the menu bar
or network details are open.
+- **Update check**: at launch and once a day, the app reads a version manifest from getopenstats.com — the
+ manifest only. When a new version is out it asks; nothing installs without your click.
+
+An account is optional and only syncs preferences after you sign in; it never carries monitoring data.
Process explanations run entirely on device through Apple Intelligence; process details never leave the Mac.
@@ -295,7 +316,7 @@ live data instead:
build/DerivedData/Build/Products/Debug/OpenStats.app/Contents/MacOS/OpenStats --snapshot ./snapshots
```
-Glass and vibrancy exist only on screen. To measure the panel while it is open, launch with
+To measure the panel while it is open, launch with
`--show-panel`, which opens the panel and pins it.
After editing `CHANGELOG.md`, run `python3 Scripts/sync_changelog.py` to refresh the recent
diff --git a/README.zh-CN.md b/README.zh-CN.md
index 3fdd18b..9308db5 100644
--- a/README.zh-CN.md
+++ b/README.zh-CN.md
@@ -4,7 +4,7 @@
# OpenStats
-**Mac 的状态,抬眼就看见——CPU、GPU、内存、网络与温度常驻菜单栏,还能调风扇、防休眠、一键清理。**
+**Mac 的状态,抬眼就看见——CPU、GPU、内存、网络与温度常驻菜单栏,还能调风扇、防休眠、一键清理、卸载应用,检测 IP 纯净度。**
[](https://getopenstats.com/#download)
[](https://github.com/gentpan/OpenStats/stargazers)
@@ -17,7 +17,7 @@
OpenStats 是一款 macOS 菜单栏应用,实时显示 Mac 正在做什么:各核心 CPU 负载、GPU、内存压力、
网速、磁盘、电池、温度和风扇,并且可以直接处理:给风扇提速、合盖后继续运行、清理缓存、彻底卸载应用、停用启动项;
网络详情还能检测公网 IP 的纯净度,看出出口是否被标记为 VPN、代理、机房或有滥用记录。
-所有数据都在你自己的 Mac 上读取,没有统计上报。账号是可选的:用 GitHub、Google 或 Apple 登录后可以把偏好设置同步到其他 Mac,云端只保存邮箱、姓名与设置文档。此外只有两项可关闭的网络功能会联网:打开网络详情时查询公网 IP,以及定时 ping 你选择的探测目标。
+所有数据都在你自己的 Mac 上读取,没有统计上报。账号是可选的:用 GitHub、Google 或 Apple 登录后可以把偏好设置同步到其他 Mac,云端只保存邮箱、姓名与设置文档。此外会联网的只有几项可关闭的功能:打开网络详情时查询公网 IP 与纯净度、定时 ping 你选择的探测目标,以及每天检查一次新版本。
[下载](https://getopenstats.com/#download) ·
[官网](https://getopenstats.com) ·
@@ -40,7 +40,7 @@ brew install --cask gentpan/tap/openstats
```
需要 macOS 14(Sonoma)或更高版本。在 Apple Silicon 上开发和测试。
-界面为简体中文。
+界面支持简体中文与 English,默认跟随系统语言,可在“设置 · 通用 · 语言”中切换。
## 最近更新
@@ -56,7 +56,11 @@ brew install --cask gentpan/tap/openstats
- 菜单栏新增“电池”项目:电量按九种风格显示(电量条、圆环、饼图、数字等),充电中带闪电,电量低于 20% 按“高负载时着色”变红。点击弹出电池详情:电量与剩余 / 充满时间、适配器功率、电池温度、最近 24 小时电量曲线、功耗、健康度与循环次数、已连接蓝牙设备的电量(AirPods 左右耳与充电盒、妙控键盘 / 鼠标 / 触控板),可跳到系统电池设置;主窗口也有对应的“电池”页,历史页多了电池电量曲线。没有电池的 Mac(mini、Studio、iMac)上这个项目改为显示电量最低的蓝牙设备,弹窗只列蓝牙设备。「设置 · 菜单栏」新增“蓝牙设备电量低时提示”:某个设备低于 20% 时在电池项目旁显示它的图标与电量。
- 网络详情“接口”区块右上角新增重置按钮:把开机后下载 / 上传归零、从现在起重新累计,标题旁标出起算时间,两行改叫“重置后下载 / 上传”;重启后自动回到开机后累计,右键按钮可随时改回。
-- 磁盘页从展示页变成能动手的磁盘工具,新增四张卡片:- 空间占用:统计家目录里每个文件夹占多少,并列出最大的 20 个文件(应用、照片图库等按整体算一个);可在访达中显示,家目录里、Library 之外的文件可以直接移到废纸篓。只读扫描,文件多时需要几十秒,可随时停止。- 文件系统检查:调用系统的 diskutil 对启动盘做一次只读检查,相当于“磁盘工具”的急救但不修改任何东西;记住上次检查的时间与结果,发现问题时提示去磁盘工具修复。- 本地快照:列出 Time Machine 留在本机的快照(它们计入“可清除”空间),可一键全部删除;辅助工具够新时由它执行,否则请求一次管理员授权。辅助工具协议升到第 4 版,已安装的旧版会提示重新安装。- 其他磁盘:列出外置硬盘、U 盘、镜像与网络共享的容量,可在访达中显示或直接推出;接入、拔出时自动刷新。
+- 磁盘页从展示页变成能动手的磁盘工具,新增四张卡片:
+ - 空间占用:统计家目录里每个文件夹占多少,并列出最大的 20 个文件(应用、照片图库等按整体算一个);可在访达中显示,家目录里、Library 之外的文件可以直接移到废纸篓。只读扫描,文件多时需要几十秒,可随时停止。
+ - 文件系统检查:调用系统的 diskutil 对启动盘做一次只读检查,相当于“磁盘工具”的急救但不修改任何东西;记住上次检查的时间与结果,发现问题时提示去磁盘工具修复。
+ - 本地快照:列出 Time Machine 留在本机的快照(它们计入“可清除”空间),可一键全部删除;辅助工具够新时由它执行,否则请求一次管理员授权。辅助工具协议升到第 4 版,已安装的旧版会提示重新安装。
+ - 其他磁盘:列出外置硬盘、U 盘、镜像与网络共享的容量,可在访达中显示或直接推出;接入、拔出时自动刷新。
- 网络详情新增「IP 纯净度」区块:CleanIP.io 的纯净度评分与等级画成占满整行的 F 到 A+ 六段色带,分数在色带上方、得分处有标记,同一行右侧是 cleanip.io 字标,点了打开这个 IP 的完整报告;下面列出风险评分、命中的风险标记(VPN、代理、Tor、机房、滥用记录等)与一句评价。IP 地址区块用 cleanip.io 样式的徽章标出原生 / 广播、住宅 / 机房与运营商类型(ISP 等),徽章样式作为通用组件收进设计系统。
- 账号与设置同步(设置 · 账号与同步):用 GitHub、Google 或 Apple 登录后,菜单栏项目与风格、刷新频率、外观与语言、详情弹窗的区块、连接探测、通知、快捷键、风扇安全温度、合盖电量下限会保存到 getopenstats.com,换一台 Mac 登录即自动恢复。设置改动 2 秒后上传,启动、唤醒与每 15 分钟检查一次云端;第一次登录时本机与云端都有内容且不同,会让你选用哪一份,之后以最后写入为准。登录走系统的授权窗口,令牌存在钥匙串,云端只保存邮箱、姓名与设置文档,可随时退出或删除云端数据。不登录时应用行为不变。
- CPU 走势时长可选 1 / 3 / 5 分钟:走势线上方一行小字切换,弹窗与主窗口共用;曲线按真实采样时间定位,最新一次采样固定在右边缘,睡眠等超过 10 秒没有采样的地方线条断开。
@@ -171,15 +175,25 @@ brew install --cask gentpan/tap/openstats
- **内存**:还可用多少与压力走势;内存水位条;压缩省下的内存与交换区读写;按应用汇总。
- **网络**:流量历史;连接探测格子(延迟、抖动、丢包);接口、Wi-Fi 信号、VPN / 代理;本地与公网 IPv4 / IPv6,
归属地国旗、ASN;IP 纯净度评分与 F 到 A+ 等级、风险标记(VPN、代理、Tor、机房、滥用记录);DNS 一键刷新,一键切换 Cloudflare、Google、腾讯、阿里云或手动填写;各进程流量。
+- **磁盘**:启动磁盘容量分段条(已用、可清除、可用);读写速度与 60 秒走势;SSD 健康;读写最多的应用。
- **GPU**、**温度与风扇**:使用历史、各组温度、风扇转速与快捷模式。
- **电池**:电量与剩余 / 充满时间、适配器功率与电池温度;最近 24 小时电量曲线;功耗;健康度与循环次数;已连接蓝牙设备的电量(AirPods、妙控键盘 / 鼠标 / 触控板)。没有电池的 Mac 只显示蓝牙设备。
-
+
+**IP 纯净度检测**——网络详情里直接看出口 IP 干不干净:CleanIP.io 纯净度评分与 F 到 A+ 等级色带,风险评分与命中的
+风险标记(VPN、代理、Tor、机房、滥用记录等);IP 地址区块用徽章标出原生 / 广播、住宅 / 机房。IPv4 与 IPv6 分别检测,
+结果在本机缓存 7 天,换了 IP 或点刷新才重查。
+
+
+
+
+
+
**主窗口**——左侧边栏切换仪表盘、本机信息、历史、CPU、GPU、内存、磁盘、网络、温度与风扇、电池,以及进程、启动项、防休眠、清理、卸载应用几个工具,宽高都可调整。
仪表盘有健康评分、芯片与系统徽章、三列指标卡片、核心负载、电池、高占用进程和快捷开关;清理见[清理](#清理)。
@@ -238,10 +252,13 @@ brew install --cask gentpan/tap/openstats
指标来自本机的内核接口(`host_processor_info`、`host_statistics64`、`sysctl`)、IOKit 与 SMC。
偏好设置保存在应用自己的 user defaults 中,不含个人信息。没有任何统计与上报。
-只有两项可选功能会联网,都可以在“设置 → 网络”中关闭:
+会联网的功能都可以关闭。前两项在“设置 → 网络”中,检查更新在“设置 · 关于”中:
- **公网 IP**:打开网络详情时向 Cloudflare `1.1.1.1`(回退 ipify)请求一次公网地址,10 分钟内不重复请求。归属地、ASN、网络类型与纯净度评分由这台 Mac 直接向 `cleanip.io` 查询,只发送公网地址、不经过我们的服务器;地址没变、不满 7 天就沿用上次结果,点刷新才重查。
- **连接探测**:每 1、2 或 5 秒向你选择的目标(Cloudflare、Google、阿里云、腾讯或路由器)发送一次 ICMP ping,只在菜单栏显示网络项或打开网络详情时运行。
+- **检查更新**:启动时与之后每天向 getopenstats.com 读取一次版本清单,只下载清单本身;发现新版本时提示,由你决定是否安装。
+
+账号是可选的,只在登录后同步偏好设置,不含任何监控数据。
用 Apple 智能解释进程完全在本机完成,进程信息不会离开这台 Mac。
@@ -264,7 +281,7 @@ make open # 生成工程并用 Xcode 打开
build/DerivedData/Build/Products/Debug/OpenStats.app/Contents/MacOS/OpenStats --snapshot ./snapshots
```
-玻璃与半透明效果只在屏幕上存在。需要测量面板打开时的资源占用,用 `--show-panel` 启动,面板会自动展开并固定。
+需要测量面板打开时的资源占用,用 `--show-panel` 启动,面板会自动展开并固定。
修改 `CHANGELOG.md` 后运行 `python3 Scripts/sync_changelog.py`,更新上方的“最近更新”和活跃度图。
diff --git a/Scripts/sync_changelog.py b/Scripts/sync_changelog.py
index efcc3c5..420356c 100644
--- a/Scripts/sync_changelog.py
+++ b/Scripts/sync_changelog.py
@@ -71,7 +71,9 @@ def parse(text):
elif line.startswith("- ") and group is not None:
group["items"].append(line[2:].strip())
elif line.startswith(" ") and line.strip() and group is not None and group["items"]:
- group["items"][-1] += line.strip()
+ text = line.strip()
+ # 缩进的 “- ” 是子条目,保留成嵌套列表;其余是折行,直接接上(中文折行不加空格)
+ group["items"][-1] += f"\n - {text[2:].strip()}" if text.startswith("- ") else text
for release in releases:
release["days"] = [d for d in release["days"] if any(g["items"] for g in d["groups"])]
return [r for r in releases if r["days"]]
@@ -169,6 +171,15 @@ def inline_html(text):
return out
+def item_html(item):
+ """条目正文,子条目画成嵌套列表。"""
+ head, *subs = item.split("\n - ")
+ out = inline_html(head)
+ if subs:
+ out += '
' + "".join(f"
{inline_html(sub)}
" for sub in subs) + "
"
+ return out
+
+
def web_day(release, day, lines):
items = [(g["kind"], item) for g in day["groups"] for item in g["items"]]
lines.append(' ')
@@ -177,7 +188,7 @@ def web_day(release, day, lines):
lines.append(f'