fix(web): bundle Source Serif 4 with Cyrillic coverage - #6089
Conversation
|
🧪 This PR has changes that need a manual QA pass before merge — please hold off self-merging for now; we’ll loop QA in once it’s merge-ready (and design/product have signed off, where applicable). |
mrcfps
left a comment
There was a problem hiding this comment.
@roian6 Thanks for the careful self-hosted font fix—the implementation and Cyrillic regression coverage are solid, and the focused font test, repository guard, workspace typecheck, and production web build all pass locally. I found one merge-blocking packaging issue: the dependency update leaves the generated Nix pnpm hash stale, which is exactly why the live Nix check fails. Please refresh that artifact as noted inline; after that, this should be in good shape. Thanks for making the offline typography behavior deterministic across platforms. 🙏
🔁 Powered by Looper · runner=reviewer · agent=codex · An autonomous AI dev team for your GitHub repos.
| "dependencies": { | ||
| "@anthropic-ai/sdk": "0.32.1", | ||
| "@excalidraw/excalidraw": "0.18.1", | ||
| "@fontsource-variable/source-serif-4": "5.3.0", |
There was a problem hiding this comment.
Blocking — refresh the Nix pnpm dependency hash for this dependency change. Adding this package also changes pnpm-lock.yaml, but this branch leaves nix/pnpm-deps.nix unchanged. The live nix flake check job now fails with a fixed-output hash mismatch for open-design-web-pnpm-deps, so the Nix web package cannot build; this is direct evidence from the changed dependency graph rather than an unrelated CI failure. The repository validation contract requires Nix-affecting lockfile changes to regenerate that artifact. Please run pnpm nix:update-hash, commit the resulting nix/pnpm-deps.nix update, and rerun nix flake check --print-build-logs --keep-going.
🔁 Powered by Looper · runner=reviewer · agent=codex · An autonomous AI dev team for your GitHub repos.
There was a problem hiding this comment.
Fixed in dd27707c6: regenerated nix/pnpm-deps.nix with the repository hash updater, which updated only webHash.
Validation on the amended source:
nix flake check --print-build-logs --keep-going— all checks passed- focused Source Serif regression — 3/3 passed
pnpm guard— passedpnpm typecheck— passed
|
Hey @roian6 — the current blocker is the packaging/Nix follow-up from @mrcfps: this dependency update also needs the generated
|
cc87740 to
dd27707
Compare
mrcfps
left a comment
There was a problem hiding this comment.
@roian6 Thank you for the careful typography fix. I verified that the web app now bundles the variable Source Serif face locally, the serif token selects its exact family name, and the imported CSS includes Unicode-ranged Cyrillic and Cyrillic-ext WOFF2 faces without an external font request. The focused regression test passes 3/3, and the repository guard, full workspace typecheck, production web build, and current Nix flake CI check all pass on this head. The refreshed Nix dependency hash also resolves the prior review blocker. Nicely done—this makes the intended serif rendering deterministic and offline-safe across platforms. 🙏
🔁 Powered by Looper · runner=reviewer · agent=codex · An autonomous AI dev team for your GitHub repos.
|
Thanks for the PR — appreciate the careful self-hosted font fix! 🙏 To verify the visible typography change, could you add labelled screenshots from the current head of the Russian Home page at one narrow viewport such as 375px and one desktop viewport such as 1280px? Please include a Source Serif heading with Cyrillic text and enough adjacent UI to show that the glyphs render without fallback tofu, clipping, or a layout shift. A before/after pair is welcome but not required. Once these visuals cover the changed Cyrillic rendering, this should be a quick approve. |
|
Thanks — I captured the requested Russian Home visuals from the current PR head Narrow — 375 × 812 — Russian Home Desktop — 1280 × 900 — Russian Home The visible heading is “Что вы спроектируете сегодня вместе со своим агентом?”. In both captures, the computed serif token includes |
|
Thanks @roian6 — these captures are exactly the kind of evidence the remaining design sign-off needed. The screenshots plus your notes on the local WOFF2 loads / no tofu / no clipping make the current head much easier to verify. |
AmyShang-alt
left a comment
There was a problem hiding this comment.
QA 通过(验证提交:dd27707c)。
已在隔离副本完成:
- Source Serif 专项回归测试:3/3 通过
- @open-design/web production build:通过
- 构建产物包含 6 个 Source Serif 4 WOFF2 子集;Cyrillic 与 Cyrillic-ext 实际静态路径均返回 200(font/woff2)
- Home 标题的计算字体栈包含 Source Serif 4 Variable,且浏览器从本地源加载 Source Serif WOFF2,无外部字体 CDN 请求。
范围为 Web 字体与静态资源,不需要 Electron 验证;无埋点变动。已将 needs-validation 替换为 validated。
备注:当前 Detect validation scopes 和 Static gate 仍处于 queued,合并仍应以这些必需 CI 成功为准。
dd27707 to
761feb6
Compare
|
Resumed after the inactivity handoff and rebased the existing single commit onto current The I also recaptured the requested Russian Home visuals from this exact head: The full Cyrillic heading renders without tofu, clipping, overlap, or broken wrapping. The Cyrillic face loads locally, the Cyrillic-ext face is registered for on-demand glyph loading, and there are no external Source Serif requests. I’ve refreshed the PR body with the same current-head evidence and am returning the PR to Ready for review. Since the head changed to resolve the real merge conflict, the repository may require a fresh approval and CI run. |
|
Thanks @roian6 — noted the rebase onto current |
mrcfps
left a comment
There was a problem hiding this comment.
@roian6 Thank you for carefully carrying this typography fix through the rebase. I verified on the current head that the web app imports the pinned self-hosted Source Serif 4 variable face, keeps local Source Serif Pro first in the stack, and emits six same-origin, Unicode-ranged WOFF2 subsets including Cyrillic and Cyrillic-ext. The focused regression passes 3/3, as do pnpm guard, the full workspace pnpm typecheck, and the production web build; the current-head Nix and landing-page checks also pass, so the regenerated web hash resolves the earlier blocker. The refreshed Russian captures show intact headings at both narrow and desktop viewports. Nicely done—this makes the intended serif rendering deterministic and offline-safe across platforms. 🙏
🔁 Powered by Looper · runner=reviewer · agent=codex · An autonomous AI dev team for your GitHub repos.
|
@roian6 friendly reminder: this PR appears to be waiting on author action (merge conflict, failing CI) and has had no human activity for more than 3 days. When you have a chance, please reply here or push an update. To keep the queue manageable, PRs with no human activity for more than 5 days may be closed automatically, but they can be reopened when work resumes. |
|
Holding this head unchanged after inspecting the current I documented the exact conflict and the separate Cyrillic-coverage concern on #6085: #6085 (comment) No force-push was made; the reviewed head remains |
|
@roian6 — your read is correct. PR #6142 (merged 2026-08-05) replaced the Source Serif contract in Flagging this to the team to formally close the PR. The Cyrillic coverage concern remains valid and is tracked on #6085 — a fresh approach shaped around the current Albert Sans stack is the right next move once the team confirms direction. Thanks for the careful conflict analysis and for keeping the reviewed head frozen. |
|
@roian6 friendly reminder: this PR appears to be waiting on author action (outstanding trusted reviewer or maintainer feedback, merge conflict, failing CI) and has had no human activity for more than 3 days. When you have a chance, please reply here or push an update. To keep the queue manageable, PRs with no human activity for more than 5 days may be closed automatically, but they can be reopened when work resumes. |
|
Closing this PR for now because it appears to be waiting on author action (outstanding trusted reviewer or maintainer feedback, merge conflict, failing CI) and has had no human activity for more than 5 days. This is only a queue-management step, not a rejection of the work. If you would like to continue, please leave a comment or push an update and reopen the PR when ready. |


Fixes #6085
Why
The web typography token already preferred Source Serif, but the web app did not ship that family. On machines without Source Serif Pro installed, Home and other serif headings therefore fell through to unrelated system serif fonts; Cyrillic users saw especially inconsistent metrics across operating systems.
This change adds the OFL-1.1
@fontsource-variable/source-serif-4@5.3.0package toapps/web. The production build emits six self-hosted Unicode-range WOFF2 subsets. A Russian Home page requests the matching Latin and Cyrillic files from the local app origin; the Cyrillic-ext face is registered and remains lazily available for extended glyphs, with no font CDN or other external Source Serif request.What users will see
Serif headings use the existing local Source Serif Pro preference when it is installed. Otherwise, Open Design now renders them with the same self-hosted Source Serif 4 Variable face, including Cyrillic and Cyrillic-ext coverage, instead of an OS-dependent fallback.
Surface area
apps/weborapps/desktop(including Electron menu bar)odsubcommand or flag, newtools-dev/tools-pack/tools-prflag, or newOD_*env var/api/*endpoint, new SSE event, or changed shape inpackages/contractsskills/,design-systems/,design-templates/, orcraft/, or change to the skills protocolTRANSLATIONS.mdfor the locale workflow)package.json(dependenciesordevDependencies); workspace-packagepackage.jsonfiles are out of scope. Include a paragraph on what we get vs. what bytes we ship (seeCONTRIBUTING.md→ Code style)Screenshots
Captured from rebased current head
761feb67e0using its production build.Narrow — 375 × 812 — Russian Home
Desktop — 1280 × 900 — Russian Home
The full Russian Source Serif heading renders without tofu, clipping, overlap, broken wrapping, or an obvious layout shift. The Cyrillic face is loaded, the Cyrillic-ext face is registered for on-demand glyph loading, and all observed Source Serif WOFF2 requests are served from the local app origin.
Bug fix verification
apps/web/tests/source-serif-font.test.tsmainbecause the dependency, global import, and matching variable-family token were absent, then all three passed after the source change.@font-facedeclarations rather than inferring coverage from the package name.Validation
All current-head gates below ran against rebased commit
761feb67e0:pnpm --filter @open-design/web exec vitest run -c vitest.config.ts --maxWorkers=2 tests/source-serif-font.test.ts— 3 passedpnpm guard— passedpnpm typecheck— passedpnpm --filter @open-design/web build— passed; emitted all six local Source Serif 4 WOFF2 subsetswebHashfor the rebased lockfilenix flake check --print-build-logs --keep-going— passed on an archive of the exact current head; all checks passed