README 补齐 0.3.0:IP 纯净度专区与截图,磁盘弹窗,英文界面与检查更新说明
- 弹窗截图行把过高的网络弹窗换成磁盘弹窗,网络弹窗里的 IP 地址与纯净度区块单独裁出浅色、深色两张 - 标语加上卸载应用与 IP 纯净度;界面语言、联网说明补上 English 界面、检查更新与可选账号,去掉已不存在的玻璃效果 - sync_changelog.py 保留缩进的子条目,README 与官网更新日志里不再把它们压成一行
This commit is contained in:
1 parent
486b94fdb1
commit
5de9f22221
8 files changed
+87
-37
No files matched your search
Binary file not shown.
|
After Width: | Height: | Size: 99 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 98 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 155 KiB |
@@ -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.
|
||||
|
||||
<p align="center">
|
||||
<img src="Assets/readme/popover-cpu-light.png" width="32%" alt="CPU popover">
|
||||
<img src="Assets/readme/popover-network-light.png" width="32%" alt="Network popover">
|
||||
<img src="Assets/readme/popover-disk-light.png" width="32%" alt="Disk popover">
|
||||
<img src="Assets/readme/popover-memory-dark.png" width="32%" alt="Memory popover, dark">
|
||||
</p>
|
||||
|
||||
**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.
|
||||
|
||||
<p align="center">
|
||||
<img src="Assets/readme/ip-purity-light.png" width="40%" alt="IP address and IP cleanliness, light">
|
||||
<img src="Assets/readme/ip-purity-dark.png" width="40%" alt="IP address and IP cleanliness, dark">
|
||||
</p>
|
||||
|
||||
**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
|
||||
|
||||
+24
-7
@@ -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 只显示蓝牙设备。
|
||||
|
||||
<p align="center">
|
||||
<img src="Assets/readme/popover-cpu-light.png" width="32%" alt="CPU 详情弹窗">
|
||||
<img src="Assets/readme/popover-network-light.png" width="32%" alt="网络详情弹窗">
|
||||
<img src="Assets/readme/popover-disk-light.png" width="32%" alt="磁盘详情弹窗">
|
||||
<img src="Assets/readme/popover-memory-dark.png" width="32%" alt="内存详情弹窗(深色)">
|
||||
</p>
|
||||
|
||||
**IP 纯净度检测**——网络详情里直接看出口 IP 干不干净:CleanIP.io 纯净度评分与 F 到 A+ 等级色带,风险评分与命中的
|
||||
风险标记(VPN、代理、Tor、机房、滥用记录等);IP 地址区块用徽章标出原生 / 广播、住宅 / 机房。IPv4 与 IPv6 分别检测,
|
||||
结果在本机缓存 7 天,换了 IP 或点刷新才重查。
|
||||
|
||||
<p align="center">
|
||||
<img src="Assets/readme/ip-purity-light.png" width="40%" alt="IP 地址与 IP 纯净度(浅色)">
|
||||
<img src="Assets/readme/ip-purity-dark.png" width="40%" alt="IP 地址与 IP 纯净度(深色)">
|
||||
</p>
|
||||
|
||||
**主窗口**——左侧边栏切换仪表盘、本机信息、历史、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`,更新上方的“最近更新”和活跃度图。
|
||||
|
||||
|
||||
@@ -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 += '<ul class="log__sub">' + "".join(f"<li>{inline_html(sub)}</li>" for sub in subs) + "</ul>"
|
||||
return out
|
||||
|
||||
|
||||
def web_day(release, day, lines):
|
||||
items = [(g["kind"], item) for g in day["groups"] for item in g["items"]]
|
||||
lines.append(' <article class="log__day">')
|
||||
@@ -177,7 +188,7 @@ def web_day(release, day, lines):
|
||||
lines.append(f' <p class="log__counts">{html.escape(counts(day, False))}</p>')
|
||||
|
||||
def item_lines(chunk, indent):
|
||||
return [f'{indent}<li><span class="log__kind">{html.escape(kind)}</span>{inline_html(item)}</li>'
|
||||
return [f'{indent}<li><span class="log__kind">{html.escape(kind)}</span>{item_html(item)}</li>'
|
||||
for kind, item in chunk]
|
||||
|
||||
lines.append(' <ul class="log__list">')
|
||||
|
||||
+20
-20
@@ -15,9 +15,9 @@
|
||||
<meta property="og:site_name" content="OpenStats">
|
||||
<meta property="og:locale" content="zh_CN">
|
||||
<meta property="og:image" content="https://getopenstats.com/assets/window-light.png">
|
||||
<link rel="icon" href="assets/favicon.ico?v=12fff597" sizes="48x48">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="assets/favicon-32.png?v=12fff597">
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="assets/apple-touch-icon.png?v=12fff597">
|
||||
<link rel="icon" href="assets/favicon.ico?v=de171dd3" sizes="48x48">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="assets/favicon-32.png?v=de171dd3">
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="assets/apple-touch-icon.png?v=de171dd3">
|
||||
<script>
|
||||
// 在样式生效前确定主题,避免深色模式下先闪一下白底
|
||||
try {
|
||||
@@ -25,8 +25,8 @@
|
||||
document.documentElement.dataset.theme = saved || (matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light");
|
||||
} catch { document.documentElement.dataset.theme = "light"; }
|
||||
</script>
|
||||
<link rel="stylesheet" href="styles.css?v=12fff597">
|
||||
<link rel="stylesheet" href="replica.css?v=12fff597">
|
||||
<link rel="stylesheet" href="styles.css?v=de171dd3">
|
||||
<link rel="stylesheet" href="replica.css?v=de171dd3">
|
||||
</head>
|
||||
<body>
|
||||
|
||||
@@ -104,7 +104,7 @@
|
||||
</span>
|
||||
<span class="island__expanded" aria-hidden="true">
|
||||
<span class="island__row">
|
||||
<span class="island__brand"><img src="assets/icon.png?v=12fff597" alt="" width="18" height="18">OpenStats</span>
|
||||
<span class="island__brand"><img src="assets/icon.png?v=de171dd3" alt="" width="18" height="18">OpenStats</span>
|
||||
<span class="island__health" data-bind="island-health">各项指标正常</span>
|
||||
</span>
|
||||
<span class="island__grid">
|
||||
@@ -124,7 +124,7 @@
|
||||
<!-- 左侧桌面图标 -->
|
||||
<nav class="desk-icons" aria-label="快捷入口">
|
||||
<a class="desk-icon" href="#download">
|
||||
<span class="desk-icon__art desk-icon__art--dmg" aria-hidden="true"><img src="assets/icon.png?v=12fff597" alt="" width="40" height="40"></span>
|
||||
<span class="desk-icon__art desk-icon__art--dmg" aria-hidden="true"><img src="assets/icon.png?v=de171dd3" alt="" width="40" height="40"></span>
|
||||
<span class="desk-icon__name">OpenStats.dmg</span>
|
||||
</a>
|
||||
<a class="desk-icon" href="#faq">
|
||||
@@ -148,7 +148,7 @@
|
||||
<span class="window__title">欢迎使用 OpenStats</span>
|
||||
</div>
|
||||
<div class="window__body hero__body">
|
||||
<img class="hero__icon" src="assets/icon.png?v=12fff597" alt="OpenStats 图标" width="72" height="72">
|
||||
<img class="hero__icon" src="assets/icon.png?v=de171dd3" alt="OpenStats 图标" width="72" height="72">
|
||||
<h1 class="hero__title" id="heroTitle">Mac 的状态,抬眼就看见</h1>
|
||||
<p class="hero__lead">CPU、GPU、内存、网络与温度常驻菜单栏,还能调风扇、防休眠、一键清理、卸载应用,检测 IP 纯净度。所有数据在本机读取,没有统计上报。</p>
|
||||
<div class="hero__actions">
|
||||
@@ -168,7 +168,7 @@
|
||||
<!-- 程序坞 -->
|
||||
<nav class="dock" aria-label="程序坞">
|
||||
<a class="dock__item" href="#features" title="访达"><span class="dock__art dock__art--finder" aria-hidden="true"></span></a>
|
||||
<button class="dock__item" id="dockOpenStats" type="button" title="打开 OpenStats"><img class="dock__art" src="assets/icon.png?v=12fff597" alt="OpenStats"></button>
|
||||
<button class="dock__item" id="dockOpenStats" type="button" title="打开 OpenStats"><img class="dock__art" src="assets/icon.png?v=de171dd3" alt="OpenStats"></button>
|
||||
<a class="dock__item" href="#thermal" title="风扇与防休眠"><span class="dock__art dock__art--fan" aria-hidden="true"></span></a>
|
||||
<a class="dock__item" href="#cleanup" title="清理"><span class="dock__art dock__art--clean" aria-hidden="true"></span></a>
|
||||
<a class="dock__item" href="#install" title="Homebrew 安装"><span class="dock__art dock__art--terminal" aria-hidden="true"></span></a>
|
||||
@@ -258,8 +258,8 @@
|
||||
<p class="note">公网 IP 查询与连接探测都可以在设置里关闭。修改 DNS 需要管理员权限。</p>
|
||||
</div>
|
||||
<figure class="shot shot--popover split__media">
|
||||
<img class="shot--light" src="assets/popover-network-light.png?v=12fff597" alt="OpenStats 网络详情弹窗" loading="lazy">
|
||||
<img class="shot--dark" src="assets/popover-network-dark.png?v=12fff597" alt="OpenStats 网络详情弹窗,深色" loading="lazy">
|
||||
<img class="shot--light" src="assets/popover-network-light.png?v=de171dd3" alt="OpenStats 网络详情弹窗" loading="lazy">
|
||||
<img class="shot--dark" src="assets/popover-network-dark.png?v=de171dd3" alt="OpenStats 网络详情弹窗,深色" loading="lazy">
|
||||
</figure>
|
||||
</div>
|
||||
</section>
|
||||
@@ -271,8 +271,8 @@
|
||||
<p>主窗口、设置和弹窗共用同一底色,侧边栏与标题栏不分栏着色;窗口宽高都能拖动调整。</p>
|
||||
</div>
|
||||
<div class="shots">
|
||||
<figure class="shot"><img src="assets/window-light.png?v=12fff597" alt="OpenStats 主窗口仪表盘,浅色" loading="lazy"><figcaption>浅色</figcaption></figure>
|
||||
<figure class="shot"><img src="assets/window-dark.png?v=12fff597" alt="OpenStats 主窗口仪表盘,深色" loading="lazy"><figcaption>深色</figcaption></figure>
|
||||
<figure class="shot"><img src="assets/window-light.png?v=de171dd3" alt="OpenStats 主窗口仪表盘,浅色" loading="lazy"><figcaption>浅色</figcaption></figure>
|
||||
<figure class="shot"><img src="assets/window-dark.png?v=de171dd3" alt="OpenStats 主窗口仪表盘,深色" loading="lazy"><figcaption>深色</figcaption></figure>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
@@ -293,7 +293,7 @@
|
||||
<p>合盖后继续运行适合下载、渲染和远程连接。使用电池且电量低于下限时会自动关闭,避免在包里过热。</p>
|
||||
<p class="note">风扇与合盖运行需要安装一次辅助工具。它只提供固定的几个操作,不执行任意命令,应用退出时自动恢复设置。</p>
|
||||
</div>
|
||||
<figure class="shot split__media"><img src="assets/thermal.png?v=12fff597" alt="OpenStats 散热页面" loading="lazy"></figure>
|
||||
<figure class="shot split__media"><img src="assets/thermal.png?v=de171dd3" alt="OpenStats 散热页面" loading="lazy"></figure>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
@@ -310,7 +310,7 @@
|
||||
</ul>
|
||||
<p>只处理白名单目录;正在运行的应用会跳过,浏览器需先退出;删除前每一项再校验一次,所有操作写入日志。</p>
|
||||
</div>
|
||||
<figure class="shot split__media"><img src="assets/cleaner.png?v=12fff597" alt="OpenStats 清理页面" loading="lazy"></figure>
|
||||
<figure class="shot split__media"><img src="assets/cleaner.png?v=de171dd3" alt="OpenStats 清理页面" loading="lazy"></figure>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
@@ -334,7 +334,7 @@
|
||||
|
||||
<section class="band band--alt" id="download">
|
||||
<div class="shell narrow download">
|
||||
<img src="assets/icon.png?v=12fff597" alt="" width="96" height="96">
|
||||
<img src="assets/icon.png?v=de171dd3" alt="" width="96" height="96">
|
||||
<h2>下载 OpenStats</h2>
|
||||
<p>使用 Developer ID 签名并经过 Apple 公证,打开时不会遇到安全拦截。</p>
|
||||
<div class="hero__actions">
|
||||
@@ -361,7 +361,7 @@
|
||||
<ul class="log__list">
|
||||
<li><span class="log__kind">新增</span>菜单栏新增“电池”项目:电量按九种风格显示(电量条、圆环、饼图、数字等),充电中带闪电,电量低于 20% 按“高负载时着色”变红。点击弹出电池详情:电量与剩余 / 充满时间、适配器功率、电池温度、最近 24 小时电量曲线、功耗、健康度与循环次数、已连接蓝牙设备的电量(AirPods 左右耳与充电盒、妙控键盘 / 鼠标 / 触控板),可跳到系统电池设置;主窗口也有对应的“电池”页,历史页多了电池电量曲线。没有电池的 Mac(mini、Studio、iMac)上这个项目改为显示电量最低的蓝牙设备,弹窗只列蓝牙设备。「设置 · 菜单栏」新增“蓝牙设备电量低时提示”:某个设备低于 20% 时在电池项目旁显示它的图标与电量。</li>
|
||||
<li><span class="log__kind">新增</span>网络详情“接口”区块右上角新增重置按钮:把开机后下载 / 上传归零、从现在起重新累计,标题旁标出起算时间,两行改叫“重置后下载 / 上传”;重启后自动回到开机后累计,右键按钮可随时改回。</li>
|
||||
<li><span class="log__kind">新增</span>磁盘页从展示页变成能动手的磁盘工具,新增四张卡片:- 空间占用:统计家目录里每个文件夹占多少,并列出最大的 20 个文件(应用、照片图库等按整体算一个);可在访达中显示,家目录里、Library 之外的文件可以直接移到废纸篓。只读扫描,文件多时需要几十秒,可随时停止。- 文件系统检查:调用系统的 diskutil 对启动盘做一次只读检查,相当于“磁盘工具”的急救但不修改任何东西;记住上次检查的时间与结果,发现问题时提示去磁盘工具修复。- 本地快照:列出 Time Machine 留在本机的快照(它们计入“可清除”空间),可一键全部删除;辅助工具够新时由它执行,否则请求一次管理员授权。辅助工具协议升到第 4 版,已安装的旧版会提示重新安装。- 其他磁盘:列出外置硬盘、U 盘、镜像与网络共享的容量,可在访达中显示或直接推出;接入、拔出时自动刷新。</li>
|
||||
<li><span class="log__kind">新增</span>磁盘页从展示页变成能动手的磁盘工具,新增四张卡片:<ul class="log__sub"><li>空间占用:统计家目录里每个文件夹占多少,并列出最大的 20 个文件(应用、照片图库等按整体算一个);可在访达中显示,家目录里、Library 之外的文件可以直接移到废纸篓。只读扫描,文件多时需要几十秒,可随时停止。</li><li>文件系统检查:调用系统的 diskutil 对启动盘做一次只读检查,相当于“磁盘工具”的急救但不修改任何东西;记住上次检查的时间与结果,发现问题时提示去磁盘工具修复。</li><li>本地快照:列出 Time Machine 留在本机的快照(它们计入“可清除”空间),可一键全部删除;辅助工具够新时由它执行,否则请求一次管理员授权。辅助工具协议升到第 4 版,已安装的旧版会提示重新安装。</li><li>其他磁盘:列出外置硬盘、U 盘、镜像与网络共享的容量,可在访达中显示或直接推出;接入、拔出时自动刷新。</li></ul></li>
|
||||
<li><span class="log__kind">新增</span>网络详情新增「IP 纯净度」区块:CleanIP.io 的纯净度评分与等级画成占满整行的 F 到 A+ 六段色带,分数在色带上方、得分处有标记,同一行右侧是 cleanip.io 字标,点了打开这个 IP 的完整报告;下面列出风险评分、命中的风险标记(VPN、代理、Tor、机房、滥用记录等)与一句评价。IP 地址区块用 cleanip.io 样式的徽章标出原生 / 广播、住宅 / 机房与运营商类型(ISP 等),徽章样式作为通用组件收进设计系统。</li>
|
||||
<li><span class="log__kind">新增</span>账号与设置同步(设置 · 账号与同步):用 GitHub、Google 或 Apple 登录后,菜单栏项目与风格、刷新频率、外观与语言、详情弹窗的区块、连接探测、通知、快捷键、风扇安全温度、合盖电量下限会保存到 getopenstats.com,换一台 Mac 登录即自动恢复。设置改动 2 秒后上传,启动、唤醒与每 15 分钟检查一次云端;第一次登录时本机与云端都有内容且不同,会让你选用哪一份,之后以最后写入为准。登录走系统的授权窗口,令牌存在钥匙串,云端只保存邮箱、姓名与设置文档,可随时退出或删除云端数据。不登录时应用行为不变。</li>
|
||||
<li><span class="log__kind">新增</span>CPU 走势时长可选 1 / 3 / 5 分钟:走势线上方一行小字切换,弹窗与主窗口共用;曲线按真实采样时间定位,最新一次采样固定在右边缘,睡眠等超过 10 秒没有采样的地方线条断开。</li>
|
||||
@@ -537,13 +537,13 @@
|
||||
|
||||
<footer class="footer">
|
||||
<div class="shell footer__inner">
|
||||
<span class="footer__brand"><img src="assets/icon.png?v=12fff597" alt="" width="20" height="20">OpenStats</span>
|
||||
<span class="footer__brand"><img src="assets/icon.png?v=de171dd3" alt="" width="20" height="20">OpenStats</span>
|
||||
<span class="footer__fine">© 2026 GiantAccel, LLC</span>
|
||||
<span class="footer__fine">OpenStats 是独立的第三方应用,与 Apple 没有隶属关系。</span>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<script src="app.js?v=12fff597" defer></script>
|
||||
<script src="replica.js?v=12fff597" defer></script>
|
||||
<script src="app.js?v=de171dd3" defer></script>
|
||||
<script src="replica.js?v=de171dd3" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -246,6 +246,7 @@ p { margin: 0; }
|
||||
.log__list { margin: var(--space-3) 0 0; padding-left: var(--space-4); font-size: var(--text-sm); color: var(--color-text-secondary); display: grid; gap: var(--space-2); }
|
||||
.log__kind { display: inline-block; margin-right: var(--space-2); font-size: var(--text-xs); font-weight: 600; color: var(--color-primary); }
|
||||
.log__list code { font-family: var(--font-mono); font-size: var(--text-xs); }
|
||||
.log__sub { margin-top: var(--space-1); padding-left: var(--space-4); display: grid; gap: var(--space-1); list-style: circle; }
|
||||
.log__rest { margin-top: var(--space-3); }
|
||||
.log__rest > summary, .log__older > summary { cursor: pointer; font-size: var(--text-sm); color: var(--color-primary); }
|
||||
.log__rest[open] > summary { margin-bottom: var(--space-1); }
|
||||
|
||||
Reference in new issue
Block a user