Skip to content

Releases: lingcang728/ZeppBridge

ZeppBridge 1.1.5

Choose a tag to compare

@github-actions github-actions released this 31 Aug 16:23
e735125

ZeppBridge 1.1.5 — sign-in is possible again / 修好登录:窗口不再在你登录到一半时自己跳走

On 1.1.4 the sign-in window navigated itself away 40 seconds after opening — to Zepp's privacy page, the one offering "clear data" and "delete account" — no matter what you were doing. Typing an email and password, waiting for a Xiaomi one-time code to arrive by mail, or completing a Google sign-in all take longer than that, so the page was replaced mid-flow and the attempt had to be started over. 1.1.4's isolated sign-in sessions removed the one path that used to skip the timer, which is why this became unavoidable rather than occasional. That switch now happens only when the window is still on the page ZeppBridge opened and nothing has been typed or clicked in it for 90 seconds — the case it was written for: a primary page that never rendered.

Two more things on the same path. A network hiccup during region verification used to close the sign-in window and end the attempt; because each attempt runs in an isolated session, that discarded it and meant retyping the password and waiting for a fresh code. It now keeps the window open and retries in place, and only a credential Zepp actually rejected ends the attempt. And a value too long for the system credential store is no longer mistaken for an App Token: candidates were accepted up to 16 KB, six times what Windows Credential Manager can hold, so an oversized value scraped from page storage failed at save time as an unexplained "could not write to Windows Credential Manager". When the store does refuse a write, the underlying reason now comes through instead of being discarded.

1.1.4 上,登录窗口在打开 40 秒后会自己跳到 Zepp 的隐私页——就是那个只有「清除数据」「注销账号」的页面——无论你当时在做什么。输邮箱密码、等小米发到邮箱的验证码、走完 Google 授权,本来都不止 40 秒,于是页面在流程中间被换掉,整次登录只能从头再来。1.1.4 的隔离登录会话取消了唯一一条能绕过这个计时器的快路,这个问题因此从偶发变成必然。现在只有当窗口还停在应用打开的那一页、并且 90 秒内没有任何输入或点击时才会跳转——那才是这条兜底当初要处理的情况:主登录页压根没渲染出来。

同一条路径上还有两件事。区域验证时网络抖一下,此前会直接关掉登录窗口结束这次尝试;而每次连接用的是隔离会话,窗口一关就得重新输密码、重新等验证码。现在会保住窗口原地重试,只有 Zepp 真正拒绝了凭据才结束。另外,存不进系统凭据管理器的值不会再被当成 App Token:此前令牌候选放行到 16 KB,是 Windows 凭据管理器实际容量的六倍,从页面存储里捞到的超长值会一路走到保存那步才失败,报出来的却是一句指不到原因的「无法写入 Windows 凭据管理器」。凭据管理器真的拒绝写入时,底层原因现在也会带出来。

Verified before release: a real email sign-in completed on this build, and a sign-in left half-finished for 125 seconds — well past the 90-second mark — kept its page and its typed input untouched.
发布前已验证:本机用真实邮箱完整登录成功;另有一次停在登录表单 125 秒(远超 90 秒计时点),页面和已输入内容全程未被动过。

Overlay-install. Local data, backups and settings are untouched. No schema change.
覆盖安装即可。本地数据、备份和设置不会改动,数据库结构没有变化。

ZeppBridge 1.1.4

Choose a tag to compare

@github-actions github-actions released this 31 Aug 12:24
875209a

ZeppBridge 1.1.4 — reliable third-party sign-in / 第三方登录不再串号或误判区域

Each sign-in attempt now uses an isolated WebView session and only accepts credentials from the current login flow. ZeppBridge prefers the current userid/apptoken pair, follows the region host returned by Zepp, and no longer lets stale Xiaomi, WeChat, Google, Facebook or email sessions contaminate another account. Region verification now distinguishes rejected credentials from a network outage. Email and WeChat sign-in were verified locally before release.

The native sign-in window also follows the interface language: English displays “Sign in to Zepp” instead of the previous hard-coded Chinese title. OAuth callback diagnostics no longer expose query strings or fragments.

每次登录现在都会使用隔离的 WebView 会话,只接受本次登录流程产生的凭据。ZeppBridge 会优先采用当前 userid/apptoken,并使用 Zepp 返回的区域地址;旧的小米、微信、Google、Facebook 或邮箱会话不会再污染另一个账号。区域验证也会区分凭据被拒和网络不可达。发布前已在本机验证邮箱和微信登录。

原生登录窗口标题现在跟随界面语言;英文界面显示 “Sign in to Zepp”,不再出现写死的中文标题。OAuth 回调诊断也不再暴露 query 或 fragment。

Overlay-install. Local data, backups and settings are untouched. No schema change.
覆盖安装即可。本地数据、备份和设置不会改动,数据库结构没有变化。

ZeppBridge 1.1.3

Choose a tag to compare

@github-actions github-actions released this 31 Aug 09:19
1dbe8eb

ZeppBridge 1.1.3 — your library now says how far back it actually goes / 本机到底有多少历史,界面现在会说

The first sync no longer leaves you with 30 days and no way to know it. It still fetches 30 days first, so there is something on screen within a minute, then keeps going in the background until 180 days are in — with visible progress, and cancellable at any point. Later syncs stay incremental.

Every "last N days" selector — training status, body status, and the export page — reads your local library, not the cloud. Picking 6 months with only 30 days stored used to stretch the axis and leave five months blank, with nothing to explain why. The screens now state the covered range and offer to fetch the rest, and they say plainly that a blank stretch means not fetched yet, never that you recorded nothing then.

Also: the history backfill dropdown is no longer empty on a fresh install, range options are consistent across the charts and the export page, and the Zepp food log is now probed so the capability overview can report whether your account has one.

首次同步不再只给 30 天、而且不告诉你。它仍然先取 30 天,让一分钟内屏幕上就有东西,随后在后台继续补到 180 天——进度可见,随时可以取消。之后的同步仍是增量。

界面上每一个「最近 N 天」——训练状态、身体状态、导出页——读的都是本机库,不是云端。此前库里只有 30 天却选 6 个月,只会把坐标轴拉长、留下五个月空白,而没有任何一处解释原因。现在会写明覆盖范围并给出补拉入口,并明确空白的含义是「还没取回来」,不是「你那段时间没有记录」。

另外:全新安装时历史补拉的下拉框不再是空的;图表页与导出页的范围选项统一;新增对 Zepp 饮食记录的能力探测,设备能力总览会报告你的账号有没有这项数据。

ZeppBridge 1.1.2

Choose a tag to compare

@github-actions github-actions released this 31 Aug 06:50
26163d9

ZeppBridge 1.1.2 — backfill, date picker, and complete English error paths / 补拉、日期选择器与英文错误链路

Two reported bugs that blocked real use are fixed: one failed history chunk no longer stalls the whole backfill queue, and the Hand to AI date picker no longer falls outside the window.

English UI now renders stable localized codes for backend errors and user-facing status text, with a fail-closed fallback that never leaks Chinese backend prose. Sign-in can also read credentials from local/session storage and reports credential-read failures directly.

两个卡住真实使用的问题已修复:一个失败的历史块不再卡死整个补拉队列;交给 AI 的日期选择器不再掉到窗口之外。英文界面的错误与状态文案现在按稳定码本地化,兜底也不会泄漏中文后端原文;登录还能读取 local/session storage 中的凭据,并直接提示凭据读取失败。

Overlay-install. Local data, backups and settings are untouched. Schema 16 is migrated automatically after the usual pre-migration backup. Full changelog: CHANGELOG.md. Checksums: SHA256SUMS.txt.

ZeppBridge 1.1.1

Choose a tag to compare

@github-actions github-actions released this 30 Aug 15:23
218c6f8

ZeppBridge 1.1.1 — Zepp OAuth and English sidebar hotfix / 第三方登录与英文侧栏紧急修复

Two urgent fixes for Zepp account sign-in and the English desktop layout.

两个紧急修复:Zepp 账号登录与英文桌面布局。

  • Xiaomi, WeChat, Google and Facebook sign-in can now navigate through the official Zepp login window. The login WebView allows only the exact OAuth hosts used by the current official page, keeps popup-style authorization in the same cookie session, and continues to reject unrelated destinations.

  • English cloud status, account and version text now stays inside the lower-left sidebar at narrow widths and enlarged UI scales.

  • Blocked login diagnostics include host and path only; OAuth query and fragment values are never logged.

  • 小米、微信、Google、Facebook 登录现在可以在 Zepp 官方登录窗口中继续完成。登录 WebView 只精确放行当前官方页面实际使用的 OAuth 主机;弹窗式授权也留在同一 Cookie 会话,其他陌生地址仍会被拒绝。

  • 英文界面的云端状态、账号和版本文字在窄侧栏或放大界面时不再越界。

  • 登录拦截日志只记录主机和路径,不记录 OAuth 查询参数或片段。

Overlay-install from 1.1.0. Local data, backups and settings are untouched. No schema change.

从 1.1.0 覆盖安装即可。本地数据、备份和设置都不会动。数据库结构没有变化。

Full changelog: CHANGELOG.md. Checksums: SHA256SUMS.txt.

ZeppBridge 1.1.0

Choose a tag to compare

@github-actions github-actions released this 30 Aug 11:02

ZeppBridge 1.1.0 — English & Chinese desktop UI / 桌面界面中英双语

The first build an English-speaking user can actually sit down and use. The desktop UI follows the system language (Chinese or English) and has a switch in Settings.

这一版是第一次能给英文用户直接用的正式包。桌面界面跟随系统语言(中/英),设置页可以切换。

New

  • English and Chinese UI. Overview, workouts, sleep, devices, insights, weekly report, export, Hand to AI, settings, health check, backups and history backfill. Dates and numbers follow the interface language. Prompts handed to an AI are translated too — an English user should not get a Chinese prompt that makes the model answer in Chinese.
  • Public landing page is bilingual, with a language toggle.
  • CI now fails the build if someone hard-codes Chinese into a Vue file. A leftover Chinese string is exactly the kind of bug an English-speaking user cannot report.

新增

  • 桌面界面中英双语。 概览、运动、睡眠、设备、洞察、周报、导出、交给 AI、设置、数据健康、快照和历史补拉。日期和数字跟着界面语言走。交给 AI 的提示词也翻译了——英文用户不该拿到一段中文提示词,然后看 AI 用中文回答。
  • 落地页同样中英双语,有语言开关。
  • CI 现在会拦住界面里的硬编码中文。漏翻一句,只有看不懂中文的用户会看到它——而他没法告诉你。

Fixes

  • "Pending normalisation" counted already-parsed workout details. A health-page counter that would never go down, and kept suggesting another replay. It now recognises workout-detail output sitting in the sample / route / pause tables.
  • Re-identifying a device could show the old model after you had just assigned one. A request that started before the write could land afterwards and overwrite the screen.

修复

  • 「待归一化」把已经解析好的运动详情也算进去了。 这个数字永远降不下来,健康页还一直劝你再重放一次。现在会把落在逐点样本 / 轨迹 / 暂停表里的运动详情认回来。
  • 刚指认完型号,界面可能又闪回旧的。 写入前发出去的请求稍后回来,会把屏幕盖回旧数据。

Still in Chinese

  • CLI and MCP output stays Chinese: the four exits (GUI / CLI / MCP / export) must give the same answer to the same question, so the backend sends codes and the GUI translates. CLI/MCP still print the original Chinese string.
  • A few failure-path messages from the backend (some errors, disk-estimate stop reasons, snapshot blockers) still arrive as Chinese. They are on exception paths.

仍是中文

  • CLI 和 MCP 的输出仍是中文:四个出口对同一个问题必须给同一份回答,所以后端发码、界面翻译;CLI/MCP 继续打印原来的中文。
  • 少数异常路径上的后端文案(部分错误、磁盘估算的停止原因、快照拦截原因)仍是中文。

Upgrade

  • Overlay-install from 1.0.x. Local data, backups and settings are untouched. No schema change.

升级说明

  • 从 1.0.x 覆盖安装即可。本地数据、备份和设置都不会动。数据库结构没有变化。

Full changelog: CHANGELOG.md. Checksums: SHA256SUMS.txt.

ZeppBridge 1.0.1

Choose a tag to compare

@github-actions github-actions released this 30 Aug 07:04

ZeppBridge 1.0.1

修一个只在从旧版本升级上来时才会出现的问题。全新安装不受影响。

修复

升级后第一次启动会弹一行红色警告:「另一个 ZeppBridge 写入操作正在进行(清理旧数据),请等它结束」。

三件事叠在一起造成的:

  • 后台压缩历史报文时借用了「清理旧数据」这个名字——它一个字节都没删,这句话本身就不对。
  • 应用启动时会自动同步一次,正好和后台压缩撞上,抢不到写锁就报错。现在它会像遇到数据重建时一样让路,并在稍后自动重试。
  • 本该显示的「正在压缩历史报文」提示条从未出现过——它依赖的通知在界面开始监听之前就发出去了,所以没人收到。现在改成随时可读的状态,不再依赖时机。

结果:升级后第一次启动看到的是一条正常的进度提示,而不是一行看不懂的红字。

其它

  • 版本号一致性检查现在也管架构文档开头那句「本文描述 vX.Y.Z 的产品边界」——漏改之后它会变成一句假话。

升级说明

  • 从 1.0.0 升级:直接覆盖安装即可,本地数据、备份和设置都不会动。
  • 从 1.0.0 之前的版本升级:数据库会升到 schema 15,升级前自动生成一份完整备份;第一次启动会在后台压缩历史报文并回收磁盘空间,顶部有进度提示,同步会等它做完再跑。

完整改动见 CHANGELOG.md。校验和见 SHA256SUMS.txt。

ZeppBridge 1.0.0

Choose a tag to compare

@github-actions github-actions released this 30 Aug 06:19

ZeppBridge 1.0.0

第一个正式版。相比开发期的 0.10.x,这一版的主题是把界面上说的每一句话都兑现,并且让长期使用不再越用越沉。

修复

  • 单条运动交给 AI 时,实际发出去的不止那一条。 后端把「单条运动」解析成了「这条运动所在的那一天」,于是整天的心率、睡眠、步数都被一起发了出去;而摘要面板的「时间范围」始终显示页面上那两个无关日期。现在单条运动只包含这条运动本身,加上它进行期间的逐点指标;按天记录的数据流会明确标注为「不在此次范围内」,而不是悄悄少给。
  • 设备识别错了改不回来。 用户的型号指认只在「本机完全认不出这台设备」时才生效。一旦目录靠别名匹配上了(哪怕匹配错了),指认会被存进库但永远不显示。现在无论自动识别得出什么,用户的指认一律优先,并如实标注成「你指认的型号」。
  • 每台设备都能重新指认。 以前只有「未识别」的设备才显示手动指认入口,识别成功就没有退路了。现在每台设备都有独立页面,重选和撤销入口始终可用。
  • 提交错误报告时没有可写的地方,也没有成功反馈。 现在可以写一段说明(500 字上限,发送前自动去掉本机路径、邮箱和长串标识),提交成功会显示报告编号和发送了哪些字段。
  • 本机没检测到问题时,错误报告根本提交不了。 用户遇到的问题不一定是「有未识别的设备」。现在可以自己选反馈类型(设备没识别 / 运动没识别 / 数据对不上 / 其它),选了就能提交。
  • 不支持洞察的运动会显示一张只会说「暂不支持」的空卡片。 现在整块不渲染。
  • 首页 24 小时心率把长时间没有采样的时段用一条直线连了起来。 那条线是插值出来的,不是测出来的。现在断档超过 15 分钟就断开。
  • 「检查更新」只告诉你有新版本,不告诉你更新了什么。 现在会弹出完整的更新说明,并在同一个弹窗里显示下载进度。

新增

  • 历史原始报文自动压缩。 云端原始报文是本机库里最占地方的东西(JSON 文本,压缩后通常只剩五分之一)。装上这一版后第一次启动会在后台压缩存量报文并回收磁盘空间,顶部显示进度,完成后自动消失。实测一个 211 MB 的库压缩后为 55 MB。压缩前会逐字校验能否原样还原,对不上的那条跳过不动——原始报文是本地重放的唯一依据。
  • 首页四个指标都能点进去看趋势。 心率、日常活动各有独立页面;睡眠接到已有的睡眠详情;静息心率并入心率页。
  • 每台设备有独立页面,写明型号从哪来(目录精确匹配 / 别名匹配 / 你指认的 / 没匹配到)、固件、最近数据、本机是否有它的数据。
  • 首页会提醒未识别的设备,点一下直接到那台设备的指认页面。
  • 设置里新增 MCP 一节,附一段可直接复制给 AI 的说明,让 AI 按你的机器给出配置步骤。
  • 本地周报改成图表:每个指标显示「本周 vs 你自己此前 28 天」的对比条,并说明颜色含义。证据不足的指标不画图,只报现状。

优化

  • 切换页面不再每次重查数据库。 主要页面会被缓存,只在首次进入和同步产生新数据时读库。
  • 按天聚合的指标查询快了一个量级。 给按本地日期过滤的采样查询补了索引可用的时间戳边界,实测心率 7 天查询从 92 ms 降到 5 ms(结果不变)。
  • 全应用统一的下拉选择器,替换了各处的系统原生下拉。
  • 「数据健康检查」和「数据库快照」移入「设置 → 高级与维护」,主导航回到三项。
  • 「你的设备能提供什么」改成指示灯板,三种状态分开显示:已获取 / 云端有但本机未收录 / 暂未获取。
  • 设置页与「交给 AI」页重排,去掉了几处大面积留白。
  • 二级页面统一有返回入口。
  • 周报和身体状态卡片不再为没有数据的指标占位;趋势卡片右上角的数字明确标注为「最新」一次读数。

明确不做

  • 体重与血压不支持。 缺少可核对的真实报文样本,贸然解析只会产出没人能验证的数字。
  • 不提供整库加密。健康数据以明文 SQLite 保存在程序目录,依赖系统账户与磁盘加密保护——这一点在设置里写明,不假装提供。

升级说明

  • 数据库 schema 升级到 15(新增压缩列)。升级前会自动生成一份完整备份,升级失败不会动你的原库。
  • 第一次启动会在后台压缩历史报文,期间顶部有提示,同步会稍等一下再跑。库越大耗时越长(1 GB 量级约几分钟)。
  • 本地数据、备份和设置都不会被删除。

完整改动见 CHANGELOG.md。校验和见 SHA256SUMS.txt。

ZeppBridge 0.11.0

Choose a tag to compare

@github-actions github-actions released this 29 Aug 07:59

修复设备与运动识别,新增一键错误报告

  • Balance 2 等设备可从嵌套产品信息识别,不再依赖用户昵称。

  • 补全力量训练、交叉训练等运动类型;未知编码存在云端明确名称时优先使用该名称。

  • 设置页新增一键私密错误报告,无需复制诊断数据或使用 GitHub。

  • 错误报告不含账号、Token、设备 ID、序列号、GPS、健康数据或原始响应。

ZeppBridge 0.10.0

Choose a tag to compare

@github-actions github-actions released this 25 Aug 12:59

新增身体状态与训练状态两个页面,心率区间支持三种算法,并接入跑步功率与跑姿。

新增:身体状态页(/body

  • 八张趋势卡:恢复、压力、血氧、夜间血氧 ODI、HRV (SDNN)、HRV (RMSSD)、呼吸率、静息心率。
  • 每张卡支持 7 天 / 1 个月 / 6 个月切换。数据早已在本机库里,这一版只是把它们呈现出来,不需要重新联网。
  • 压力、血氧、HRV、呼吸率在折线后面画出当日实测区间的阴影;当天没测出区间的,不画零宽阴影。
  • 每张卡都写明覆盖度,例如「30 天里有 12 天记录」。没有记录的那几天曲线直接断开,不插值也不补 0。
  • 某个范围内只有 1 天数据时不画图,直接说「画不出趋势」——一个读数是数值,不是趋势。

新增:训练状态页(/training

  • VO₂max、训练负荷、PAI 三张趋势卡。
  • 乳酸阈值卡:心率与配速双轴,配速轴反向,让「更快」朝上。
  • 运动负荷平衡卡:7 天负荷、28 天周均、急慢比三条线。急慢比 = 7 天负荷之和 ÷(28 天负荷之和 ÷ 4);28 天窗口覆盖不足 21 天时不给比值,曲线在那里断开——是没算,不是等于零。
  • 急慢比与导出里的 training_load_balance 现在共用同一个函数,界面和文件不可能给出不同的数字。
  • 6 个月这一档不是装饰:VO₂max 与乳酸阈值一年只测几次,30 天窗口会把库里已有的数据显示成空。

新增:心率区间,三种算法,不预设默认

  • 支持最大心率区间、储备心率区间、乳酸阈值区间三种算法。
  • 五个基准全部取自本机实测,各自标注出处与测量日期:max(workouts.max_hr)daily_metrics.device_max_hrdaily_metrics.device_resting_hr、近 30 天 avg(daily_metrics.resting_hr)daily_metrics.lactate_threshold_hr
  • 不预设默认,也不替你挑基准。 选择器初始为空;导出里 selected_modelnull 时列出全部可算的组合,每一项 selected 都是 false
  • 不使用 220−年龄 之类的公式估算。
  • 区间百分比与向下取整不是照抄来的:运动摘要里带着手表自己的边界(heart_range)与 heartrate_setting_type。本账号 heartrate_setting_type = 3、边界 113/141/154/162/173/190,而 lactateThresholdHr = 175——正好是 floor(175 × 65/81/88/93/99/109%)。这组数字现在由测试守着。
  • 五个区间之外的时间单独统计为「低于 Z1」与「高于 Z5」,五个带标签的区间因此严格就是标签所说的范围。

新增:跑步功率与跑姿

workout_samples 增加五列,全部由本地已存的原始报文回填,不需要重新联网。每一项都对着同一次运动的摘要字段验证过,不是看着像就接:

字段 语义 验证方式
power_meter 跑步功率(W) 序列均值 249.3 / 231.5 对上摘要 average_power 249.0 / 231.0;最大值 326 / 303 对上 max_power
runPosture 第 1 项 触地时间(ms) 均值 263.5 对上 averageGct 263,最小值 232 对上 minGct
runPosture 第 2 项 垂直振幅(mm) 均值 88.3 对上 averageVo 88,最大值 95 对上 maxVo
runPosture 第 3 项 垂直步幅比(%) 均值 87.1 对上 avgVertStrideRatio 87;且 88 mm ÷ 1010 mm 步幅 = 8.7%,两个字段互证单位
equivPace 等效配速(秒/公里) 最小值 264 对上 bestEquivPace;按距离加权均值 355.8 对上 avgEquivPace 355
  • 运动详情页新增六项:平均功率、最大功率、平均触地时间、平均垂直振幅、垂直步幅比、最佳等效配速。
  • runPosture 的哨兵 65535255 一律转 null,不落库为 0。
  • equivPace 不是 1/speed:两者逐秒比对有三分之一的样本对不上,最佳偏移下仍有 32%–36% 偏差。它是坡度校正配速,不能拿现有 pace 顶替,也不能拿它反推速度。
  • 站着不动时设备照发等效配速读数,本账号库里出现过 51604 秒/公里(十四小时每公里)。读取路径只接受 60–3600 秒/公里,与 pace 转分钟每公里用的是同一个窗口。

改动:概览页

  • 新增「身体状态」「训练状态」两张入口卡,各带当日数值与 7 天走势。
  • 这两张卡取代了原来的训练负荷、VO₂ Max 两张小卡——同一屏不重复展示同一个数字。
  • 走势图少于两个点时不画:一个读数是数值不是趋势,画成一条平线等于宣称了没测过的稳定性。

改动:交给 AI

  • 「已选数据流」从只读列表改成真正的选择器:按活动 / 睡眠 / 身体状态 / 训练四组呈现,组标题可整组全选或全不选,单项是复选框。
  • 提示词模板只负责预填选择,不再锁定它。勾了什么,导出就是什么,摘要里的条数与体积始终描述你马上会拿到的那个文件。

修复:重放与同步抢锁

  • 解析器修订号变化后,启动时的原始报文重放会批量写库;此前落在这期间的自动同步会输掉 SQLite 写锁之争,弹出红色的「workouts 失败:本地数据库暂时不可用」。数据其实一条没丢。
  • 现在同步会主动让路,返回中性的 deferred 状态并在一分钟后自动重试,横幅是灰色而不是红色。
  • busy_timeout 从 5 秒提高到 30 秒。
  • SyncReport.outcome 因此新增 deferred

数据层与接口

  • SQLite schema 升到 user_version = 10(新增跑步功率与跑姿列)。
  • NORMALIZER_REVISION 升到 zepp-normalizer-2026-08-v14
  • 新增四个 command:get_metric_seriesget_training_balanceget_heart_rate_zonesset_heart_rate_zone_preference
  • get_metric_series 只应答白名单内的指标名,别的直接跳过,调用方写错名字不会得到一个凭空编出单位的图表。
  • 心率区间选择的四个槽位都可为 null——「还没决定」必须能存回去。
  • 设置页「你的设备能提供什么」卡片对齐设计 token,与上方「连接设备」卡片统一间距、圆角与字号。
  • Rust 测试从 98 个增加到 102 个。

文档

  • README 重写:界面一览、当前能力、下载与安装、第一次连接、隐私、许可证全部对齐现状。
  • 架构摘要补上运动 detail 字段的验证结论、心率区间三种算法的来源,以及事件接口的第四种形态(/users/me/fileInfo/events)。
  • 发版说明改为取附注标签的正文,而不是自动生成的 commit 列表。

已知未接入

以下四项都留在「未验证清单」里,没有猜测性接入:

  • Charge/insight_data — 曾被怀疑是综合能量分,已排除:同一天可以出现三条样本(insight 分别为 6 / 79 / 6)。一个日度分数不会一天出现三个值。字段语义没有对照组可验证,因此只保留原始报文。
  • Charge/stress_data — 已确认是 protobuf,解析后是四组 float32,没有一组对得上 App 显示的日均与区间。日汇总走已验证的 all_day_stress
  • 逐秒心率 — 接口确认有数据,但返回的是文件索引而不是样本,取到样本还需要下载额外域名上的文件;接入等于放宽 host 白名单,未做。
  • 2026-08-16 之后的逐条血氧 — 点测在该日停止,之后只有夜间汇总。已逐一排除文件索引接口、band_data 8 字节块、auto / real_data 子类型;剩下的方向只有抓取 App 的真实请求,而本项目禁止恢复 MITM / 用户 CA / 代理路线,因此到此为止。

升级注意

首次启动这一版时,应用会在后台重放本地已存的原始报文来回填跑步功率与跑姿。大库(1 GB 以上)约需 15 分钟,跑在后台线程,不阻塞窗口;期间的自动同步会显示灰色的「稍后自动重试」而不再报错。整个过程不需要联网。