Skip to content

PingFang SC for the shell and every app on macOS (makepad#129 stacked) - #548

Merged
ymote merged 2 commits into
mainfrom
feat/pingfang-ui-font
Oct 20, 2026
Merged

ymote merged 2 commits into
mainfrom
feat/pingfang-ui-font

Conversation

@ymote

@ymote ymote commented Oct 19, 2026

Copy link
Copy Markdown
Contributor

Why

The maintainer asked for PingFang across OctoSense's desktop and every app, so all of them look alike.

Today the theme's text roles draw Latin text in IBM Plex Sans and Chinese in LXGW WenKai, a calligraphic face. A tab title that mixes the two shows two unrelated typefaces.

The markdown editor installs Rinx's own PingFang override (article_makepad::apple_fonts) in every isolate, and logs "Apple typography: PingFang SC…" each time. It never takes effect: Makepad sees that the family's member count differs from its declared members and rewrites the family before anything draws.

What

  • tools/runtime-patches/makepad-apple-ui-font.patch stacks Text roles lead with the platform UI typeface (PingFang SC) on macOS and iOS makepad#129 on the pinned Makepad (d653bc44). runtime-patches.lock.json gets the stacked entry, its sha256, the new tree and a product_fixes line. On macOS and iOS, every theme text role leads with PingFang SC, read from the system:
    • Apple does not license PingFang for redistribution, so it is never packaged.
    • Regular leads the regular and italic roles; Semibold leads the bold ones.
    • It is fitted to the theme's line box, so layouts keep their size.
    • The bundled IBM Plex → LXGW WenKai → emoji chain stays behind it.
    • Code and icon roles, other platforms and MAKEPAD_SYSTEM_FONTS=0 keep today's faces.
    • Theme roles are written in the shell, every Splash isolate and every app process, so the shell, every in-window app and every native app process change together.
  • crates/markdown-editor stops installing Rinx's override.

The next Makepad sweep drops the patch once makepad#129 is in the pinned revision.

Verified (macOS 26, Apple silicon)

  • Hidden shell on Metal (MAKEPAD_HIDE_WINDOWS=1, /g grabs), built with this patch on top of current main's runtime patches, before and after:
    • The shell's bar, Quick Deck's tabs, toolbar and buttons, and a tab title mixing Chinese and English all draw in PingFang SC.
    • Every element keeps its position.
    • MAKEPAD_TRACE_FONT_LOAD=1 shows PingFang.ttc loaded as both members.
    • The grabs are not attached: they show a maintainer's private document.
  • Checks:
    • makepad#129's own checks: makepad-widgets font_policy 5/5 and makepad-draw text 49/49, both on macOS.
    • python3 tools/setup.py --check passes with the new stacked entry.
    • cargo check --locked -p octosense-markdown-editor passes.
  • Local CI runs in this PR's queue turn.

Not covered

  • iOS (Home on an iPhone) is unverified.
  • Faces an app picks for itself stay as they are: Clock and Weather's Inter Light, App Hub's Inter Heavy headings (App Hub repo), OctosCode's Inter and Noto Sans SC (octoscode-app repo), and the Terminal and Sheets grids. Phone styles keep Inter and RobotoFlex as their primary faces.
  • Conflicts with runtime: Android buffer-stuffing recovery (makepad #128) until the next sweep #546: both append to stacked and change tree in runtime-patches.lock.json, so whichever lands second rebases its entry onto the other's tree.

🤖 Generated with Claude Code

ymote and others added 2 commits October 20, 2026 01:44
Stacks OctoSense-org/makepad#129 on the pinned Makepad (d653bc44) as
tools/runtime-patches/makepad-apple-ui-font.patch: on macOS and iOS every
theme text role leads with PingFang SC, read from the system and never
packaged, fitted to the theme's line box. The shell, every in-window app and
every app process now draw Latin and Chinese in PingFang, where Chinese used
to come from the bundled LXGW WenKai beside IBM Plex Sans. Code and icon
roles, other platforms and MAKEPAD_SYSTEM_FONTS=0 keep today's faces.

The markdown editor no longer installs Rinx's own PingFang override
(article_makepad::apple_fonts) in every isolate: Makepad rewrote that family
from its declared members before anything drew, so it never took effect.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@ymote
ymote marked this pull request as ready for review October 20, 2026 01:46
@ymote

ymote commented Oct 20, 2026

Copy link
Copy Markdown
Contributor Author

Local CI passed on 2cfc31b (tools/ci-local.sh --only all --linux-host --offload, 14m36s, Darwin arm64; the ubuntu jobs and the macOS jobs' portable steps (their macOS steps ran here) on the Linux build host, Linux x86_64).

GitHub would run for this PR: desktop.yml, phone.yml, apps.yml. Merged on this local pass (macOS runner queue); GitHub CI runs on the merge commit on main.

Job Step Result Time
ci-local / drift The local mapping fits the workflows PASS -
desktop.yml / desktop Prepare the pinned framework sources PASS 1s
desktop.yml / desktop Compile the desktop with the shared runtime PASS 5m38s
desktop.yml / desktop Desktop tools and scripts PASS 20s
desktop.yml / desktop (linux) Prepare the pinned framework sources PASS 1s
desktop.yml / desktop (linux) One copy of every shell source PASS -
desktop.yml / desktop (linux) In-app updater and installer handoff PASS 1m43s
desktop.yml / desktop (linux) One Makepad, App Hub, octos and Rinx in the locked graph PASS 2s
desktop.yml / desktop (linux) The native apps' generated places match native-apps.json PASS 0s
desktop.yml / native-host-api Prepare the pinned framework sources PASS 1s
desktop.yml / native-host-api Build the native acceptance host and pinned Hub CLI PASS 3m50s
desktop.yml / native-host-api Signed app tool calls a real OS permission API PASS 4s
phone.yml / home Prepare pinned sources and the reviewed runtime patch PASS 1s
phone.yml / home Validate launcher icons and Apple asset catalogs PASS 3s
phone.yml / home Compile Home and its bundled modules PASS 3m43s
phone.yml / home (linux) Prepare pinned sources and the reviewed runtime patch PASS 0s
phone.yml / home (linux) Verify the single runtime graph PASS 2s
phone.yml / home (linux) The native apps' generated places match native-apps.json PASS 0s
phone.yml / home (linux) The pinned octos revision PASS 0s
phone.yml / home (linux) Build octos (unless cached) PASS -
phone.yml / home (linux) Build Home, App Hub admission and runtime policy tests PASS 3m22s
phone.yml / home (linux) Test Home, App Hub admission and runtime policy PASS 42s
phone.yml / home (linux) Two-lane scenario (real kernel, scripted model) PASS 26s
phone.yml / home (linux) Build opt-in AppCard tests PASS 2m44s
phone.yml / home (linux) Test opt-in AppCard PASS 1s
phone.yml / home (linux) Build craft-engine relay and system-chat tests PASS 2m48s
phone.yml / home (linux) Test craft-engine relay and system chat PASS 13s
phone.yml / home (linux) Build linked Terminal tests PASS 2m31s
phone.yml / home (linux) Test linked Terminal PASS 1s
phone.yml / home (linux) Build Wasm and runtime policy tests PASS 1m15s
phone.yml / home (linux) Test Wasm and runtime policy PASS 11s
apps.yml / services (linux) python3 tools/setup.py PASS 0s
apps.yml / services (linux) Shared system app interface PASS 0s
apps.yml / services (linux) Kernel service PASS 18s
apps.yml / services (linux) OctoSense release updater PASS 6s
apps.yml / services (linux) App peers PASS 30s
apps.yml / services (linux) AI providers config PASS 6s
apps.yml / services (linux) Connected provider protocols and Linux host adapter PASS 47s
apps.yml / services (linux) L0 in-card chat (sys.chat, host side) PASS 10s
apps.yml / services (linux) System toolbox (workflow templates) PASS 1m31s
apps.yml / kernel-security (linux) python3 tools/setup.py PASS 0s
apps.yml / kernel-security (linux) The pinned octos revision PASS 0s
apps.yml / kernel-security (linux) Build octos (unless cached) PASS -
apps.yml / kernel-security (linux) Real-kernel tests PASS 41s
apps.yml / apps (linux) python3 tools/setup.py PASS 0s
apps.yml / apps (linux) Host services (Mail, AI providers, News) PASS 2m05s
apps.yml / apps (linux) Connected accounts and Rinx editor PASS 1m31s
apps.yml / apps (linux) Shell AI services (crates/ai-host) PASS 2m57s
apps.yml / apps (linux) AppCard runtime setup safeguards PASS 0s
apps.yml / apps (linux) AppCard clippy (own crates; shared runtime compiles) PASS 27s
apps.yml / apps (linux) AppCard transport and store PASS 7s
apps.yml / apps (linux) One Makepad, App Hub, octos and Rinx in the locked graph PASS 3s
rom.yml / product (linux) python3 -m unittest discover -s tests -v SKIPPED (!) -
rom.yml / product (linux) Check generated Agent Binder client SKIPPED (!) -
rom.yml / product (linux) bash -n scripts/stage-forks.sh scripts/publish-release.sh scripts/apply-to-tree.sh scripts/build-rom.sh PASS -
rom.yml / web-installer (linux) npm ci --ignore-scripts --no-audit --no-fund SKIPPED (!) -
rom.yml / web-installer (linux) npm test SKIPPED (!) -
rom.yml / web-installer (linux) npx playwright install --with-deps chromium SKIPPED (!) -
rom.yml / web-installer (linux) npm run test:browser SKIPPED (!) -
rom.yml / web-installer (linux) python3 -m unittest discover -s tests -p test_installer_manifest.py -v SKIPPED (!) -
rom.yml / web-installer (linux) bash -n scripts/release.sh SKIPPED (!) -
linux-host / sandbox (linux) python3 tools/setup.py PASS 0s
linux-host / sandbox (linux) Process sandbox on Linux (Landlock, seccomp) PASS 1m47s

Skipped (these did NOT pass; (!) marks a skip that blocks tools/ci-local-merge.sh):

  • rom.yml / product (linux): python3 -m unittest discover -s tests -v: javac -version does not work here: install a JDK (17 or newer) and put its bin/ on PATH or set JAVA_HOME
  • rom.yml / product (linux): Check generated Agent Binder client: needs build-tools/35.0.0/aidl, platforms/android-35/framework.aidl in the Android SDK (no Android SDK found): install the SDK packages 'build-tools;35.0.0' and 'platforms;android-35' (sdkmanager) and set ANDROID_HOME
  • rom.yml / web-installer (linux): npm ci --ignore-scripts --no-audit --no-fund: no node, npm, npx on PATH (the workflow uses node 24); put node on PATH
  • rom.yml / web-installer (linux): npm test: no node, npm, npx on PATH (the workflow uses node 24); put node on PATH
  • rom.yml / web-installer (linux): npx playwright install --with-deps chromium: no node, npm, npx on PATH (the workflow uses node 24); put node on PATH
  • rom.yml / web-installer (linux): npm run test:browser: no node, npm, npx on PATH (the workflow uses node 24); put node on PATH
  • rom.yml / web-installer (linux): python3 -m unittest discover -s tests -p test_installer_manifest.py -v: no node, npm, npx on PATH (the workflow uses node 24); put node on PATH
  • rom.yml / web-installer (linux): bash -n scripts/release.sh: no node, npm, npx on PATH (the workflow uses node 24); put node on PATH

Notes:

  • GitHub runs Python 3.12; this run used Python 3.9.6
  • GitHub runs Python 3.12; the Linux host used Python 3.14.4

Native GitHub acceptance passed on the same head: embedded-browser.yml.

@ymote
ymote merged commit 2ad6437 into main Oct 20, 2026
7 of 8 checks passed
ymote added a commit that referenced this pull request Oct 20, 2026
#548 stacked makepad-apple-ui-font.patch on the same lock lines. The
buffer-stuffing patch now follows it (stacked entry and product fix after
#548's) and applies unchanged; the lock tree is regenerated from the whole
stack: 9d9aef6e, which differs from main's 90b364c1 only in this patch's
Android files. `tools/setup.py --check --cargo` passes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant