UI version display
UI version display 指产品有意识地把“当前运行的到底是哪一版”暴露给用户或操作者查看,而不是把版本号藏在构建日志或开发者工具里。它通常包含一个稳定的人类可读显示位点,以及一条由运行时或构建链提供的版本真相路径,用于支持排障、远程协作和发布确认(projects/codex-vibe-monitor.md、projects/dockrev.
- 前端
- 服务
目录
Definition
UI version display 指产品有意识地把“当前运行的到底是哪一版”暴露给用户或操作者查看,而不是把版本号藏在构建日志或开发者工具里。它通常包含一个稳定的人类可读显示位点,以及一条由运行时或构建链提供的版本真相路径,用于支持排障、远程协作和发布确认(projects/codex-vibe-monitor.md、projects/dockrev.md、projects/display-ambient-light-desktop.md、projects/loadlynx.md)。
这个 Topic 的重点不在“页面角落多了一串文字”,而在于 UI、后端、构建链和 release 语义之间是否真的对齐。若版本显示是假的、过期的或只来自前端 bundle 自报,那它就没有达到本 Topic 的维护价值。
When to use
当项目明确在 Web UI、桌面 UI、About 页、设置页、页脚或控制台中显示版本信息,并且改动会影响版本来源、展示位置、构建注入、后端版本 API、release 值传递或 support/debug 流程时使用。尤其在 self-hosted 服务、桌面应用和设备 UI 中,这个 Topic 常常直接关系到“用户到底跑的是哪个构建”。
如果只是开发阶段临时打印版本、测试页偶尔露出 hash,或版本信息与正式运行无关,不应提升到本 Topic。这里关心的是稳定可依赖的运营/排障语义。
Habits / defaults
在 style playbook 里,UI version display 的默认做法不是只记录“用了什么技术”,而是记录维护者真正需要反复执行的约束、验证和组合方式。现有样本反复出现以下习惯:
- UI always has a place to read the version without devtools (About window / Settings / footer) (
projects/display-ambient-light-desktop.md) - Backend exposes a stable API endpoint for version info, so “UI version” is not coupled to the UI build toolchain (
projects/dockrev.md,projects/codex-vibe-monitor.md,projects/display-ambient-light-desktop.md) - “Effective version” is computed once in CI and propagated via a single env var (commonly
APP_EFFECTIVE_VERSION), with safe fallbacks likeCARGO_PKG_VERSION/package.jsonversion (projects/dockrev.md,projects/codex-vibe-monitor.md,projects/loadlynx.md) - UI version can include build metadata that helps support: dev vs release flag, git SHA/tag, build time (
projects/display-ambient-light-desktop.md,projects/loadlynx.md) - 对 PR-local
VERSION发布链路,开发 identity 应从同一VERSION派生nextPatch(VERSION)-dev.<short-sha>,release identity 读取文件精确文本;UI、CLI、/health、bundle 与 manifest 共同消费该 resolver,而不是从 package metadata 或最新 tag 各自猜测(projects/flux-purr.md、topics/pr-label-release.md)。 - 版本真相应尽量从单一来源产生,再向 UI 分发。常见做法是 CI 先计算
APP_EFFECTIVE_VERSION,后端和前端都消费同一个值;这样用户看到的版本、容器标签、构建产物与日志语义才能对上。 - 对 Web / Pages / desktop hybrid surface,优先把 effective version 在 CI 或 release pipeline 里只算一次,然后原样注入 UI。不要让前端再补
v、去v、截断 metadata 或按环境二次拼接;UI 应展示 raw effective version,而不是自创一套格式化规则。 - mainline/default surface 与 release-tag surface 可以故意显示不同语义,但必须在 contract 里写明,并都来自同一条 effective-version 注入链。常见做法是 owner-facing
main/ preview surface 显示main+<shortsha>或等价 mainline build id,tag/release build 显示完整 tag;区别应来自 CI 选择值,不应由 UI 组件自己猜。 - UI 最好提供一个不依赖开发者工具的查看位置,例如 About、设置页或控制台页脚。对 operator surface 来说,这不是装饰,而是排障入口:用户反馈问题时,先确认版本比先猜环境更高效。
- 对前后端一体项目,优先让运行时或后端暴露版本,再由 UI 消费,而不是让前端单独从
package.json读一个可能与真实部署脱节的值。projects/dockrev.md、projects/codex-vibe-monitor.md、projects/display-ambient-light-desktop.md都体现了这种思路。 - 版本信息最好包含足够的诊断语义,例如 release tag、git SHA、dev/release 形态、构建时间或 artifact variant,但不要把它做成难以阅读的原始元数据倾倒。
- 验证时不仅要看“有没有显示”,还要看显示值是否真的从当前运行产物来、release 之后是否自动更新、开发模式和正式模式是否有安全 fallback。这些才是 Topic 的长期维护重点。
Reference implementations
projects/codex-vibe-monitor.md:代表 self-hosted 服务如何通过构建脚本和运行时把 effective version 送到 dashboard,适合说明版本显示为何是运维支持面的一部分。projects/dockrev.md:代表 operator console 场景。这里的版本显示直接影响 self-hosted 用户判断自己部署的是哪一版,也影响发布和排障对话。projects/display-ambient-light-desktop.md:代表桌面应用场景,说明 About UI 与原生 info/version path 的搭配能把桌面产物和展示层对齐。projects/loadlynx.md:代表设备/本地 UI 也需要版本可见性,特别是在 Web demo、设备页面和 release 流程并存时,版本号是识别 firmware/web 组合态的重要线索。projects/flux-purr.md:代表多语言设备产品从一个 checked-inVERSION同时产生开发显示、release build-info、CLI、/health、bundle 和 manifest identity。skills/style-ui-version-display/SKILL.md:group Skill 强调消费时应核对版本来源、展示位点和 release 传递路径,而不是只说“页面上有版本号”。
Failure modes
- UI 上展示的版本如果来自错误来源,反而比不显示更糟,因为它会误导排障与发布判断。
- 把版本值分别在前端、后端、
Dockerfile、CI中各算一遍,是最常见的漂移根源;最后用户看到的值与实际运行 artifact 往往对不上。 - 只在
releasebuild 有版本、devbuild 什么都不显示,会让日常联调和 issue 反馈失去最基本的上下文。 - 把本 Topic 当成单纯视觉细节,不验证版本 API、构建注入和
release传递链,就会出现“UI 有占位,实际没有真相”的假完成。 - UI 组件对版本值强行加前缀、去前缀或覆盖 metadata,会把 CI 已经算好的 effective version 再次篡改;结果常见表现就是
main+<sha>、v1.2.3-preview.4、desktop build id 等真实值在页面上被错误归一化。 - 没有把 mainline/default surface 和 release-tag surface 的显示语义分开写清时,默认站点很容易错误显示“最新 release tag”而不是当前 main build,或反过来让正式 release 仍显示开发态 hash。
- 开发显示若通过改写源文件来获得版本,会把日常构建污染成发布状态。PR-local
VERSION发布链路必须保持文件只读,并将 short SHA 限定为开发 qualifier(topics/pr-label-release.md)。
Evidence index
projects/codex-vibe-monitor.mdprojects/display-ambient-light-desktop.mdprojects/dockrev.mdprojects/loadlynx.mdprojects/flux-purr.mdtopics/pr-label-release.mdskills/style-ui-version-display/SKILL.mdskills/style-playbook/references/data/topics/ui-version-display.json
相关内容
Codex Vibe Monitor
项目实践Codex Vibe Monitor 是面向自部署的 OpenAI 兼容代理观测工作台:它接入 /v1/* HTTP / WebSocket 流量,将调用留证、实时 SSE、历史统计、请求排障、上游账号池、forward proxy、价格目录和 SQLite 持久化收在同一套运营界面中。
display-ambient-light-desktop
项目实践Cross-platform desktop app for ambient lighting control: Tauri backend + a TS/SolidJS frontend, with Rust toolchain pinned. Evidence: src-tauri/, package.json, rust-toolchain.toml.
Dockrev
项目实践Dockrev 是 self-hosted Docker/Compose update manager。README.md 把根文档定位为快速入口,完整部署、使用、运维、排障和 API 文档在 docs-site/,这说明它是运维工具而不是普通 CRUD 管理台。
LoadLynx
项目实践LoadLynx 是 STM32G431 + ESP32-S3 便携式电子负载。README.md 明确采用分体式架构:STM32G431 执行快速电流/功率闭环与保护,ESP32-S3 负责 UI/Wi-Fi/OTA/记录/标定及上位机桥接。这是典型 device mono-repo,不能只从一个 firmware 目录理解。