v1.9.0
Pre-releasePi Desktop v1.9.0 β macOS Rendering Fixes π
The two macOS-only rendering bugs carried over from v1.8.3 β the see-through model picker and the faint packages skill description β are fixed, along with the systemic root cause behind them. A runtime color-mix() polyfill makes every subtle tint render at its intended translucency on macOS, matching Windows. No new features, just a long-overdue visual correctness fix.
Note: This is a personal fork of
gustavonline/pi-desktop.
π― The headline
The Known Issues shipped in v1.8.3 are gone. On macOS, the model picker popover is now opaque and readable, and the Packages tab's expanded skill description renders with proper contrast. The deeper reason both broke β and why every prior CSS-only attempt failed β turned out to be color-mix() not being computed by older macOS WebKit. v1.9.0 fixes that root cause for ~390 usages in one module, and every future one too. Windows is completely unchanged (the fix is a no-op there).
β¨ What's new
Runtime color-mix polyfill
The systemic fix lives in src/theme/color-mix-polyfill.ts.
- Startup probe β at launch it tests
color-mix(red 0%, blue). On a working engine (Chromium, modern WebKit) the result is pure blue, so the probe passes and nothing runs. On AppleWebKit/605.1.15 (macOS Catalina-class)color-mix()is never computed: it silently returns the first operand, ignoring the percentage and the second color. The probe detects this and the polyfill engages. - Resolve and rewrite β when broken, it walks every stylesheet, parses every
color-mix()declaration, resolvesvar()references recursively (including vars whose own value is anothercolor-mix()), computes the real sRGB mix with premultiplied alpha, and rewrites the declaration to plainrgb()/rgba(). - Theme-aware β re-runs automatically when the theme changes, so freshly-applied token values are re-resolved against the new palette.
- Zero cost on Windows β the probe passes, nothing runs. There is no impact on engines that compute
color-mix()correctly.
Precomputed theme tokens
Defense in depth, in src/theme/color-mix-helpers.ts + src/theme/semantic-tokens.ts.
- Semantic tokens precomputed to literals β tokens like
--color-bg-elevated,--bg-soft,--borderare now resolved to plainrgb()/rgba()values in JS at runtime. They are never themselvescolor-mix()expressions, which would nest and fall foul of the broken-engine behavior above. - Single source of truth β a subsequent refactor consolidated the duplicate color-mix math into one module and made token derivation flow through a single
deriveSemanticTokensentry point. - Cold-start race fixed β the polyfill could previously rewrite declarations against default tokens before the theme applied. The sequencing is now correct so rewrites always use the resolved theme values.
Badge icon visibility
The Installed β / add + / remove β badges in the Packages tab are restyled to solid precomputed tokens β a neutral fill, a colored ring, and a colored icon β so the icons remain visible regardless of color-mix() support. Previously a low-percentage color-mix(success 10%, transparent) rendered as a saturated solid green on broken engines, which hid the green checkmark against the green background.
How it was diagnosed
The cause was found by writing a runtime inspection script that read the element's computed styles through devtools, rather than guessing at CSS. That probe revealed that color-mix() returns its first operand verbatim on older macOS WebKit β a single observation that resolved a bug six-plus prior CSS-only attempts had failed to fix.
π Bugs fixed
- macOS: model picker popover is now opaque β the see-through background that let chat text bleed through and model names overlap is gone. The underlying
color-mix()declaration that was being dropped on macOS is now resolved to a plainrgb()value. - macOS: packages skill description renders with full contrast β the near-transparent description text from v1.8.3 is fixed the same way.
- macOS: all subtle tints render correctly β hover highlights, soft backgrounds, accent fills, and borders now render at their intended translucency instead of as flat solid colors. macOS visuals now match Windows.
- Windows: no change β the polyfill is a no-op on Chromium, so behavior is identical to v1.8.3.
β Resolved Known Issues
Both items carried over from v1.8.3 are now fixed:
- β macOS: model picker see-through β the popover background now resolves to an opaque value. No longer transparent.
- β
macOS: packages skill description faint β the expanded
SKILL.mddescription now renders at full intended contrast.
π¦ Download
This fork builds Windows (.exe) and macOS (.dmg). Both triggered from a single workflow.
β οΈ Unsigned builds
Windows: Click More info β Run anyway on SmartScreen.
macOS: xattr -cr "/Applications/Pi Desktop.app" after mounting.
βοΈ Requirements
- Pi Coding Agent CLI:
npm install -g @earendil-works/pi-coding-agent - Node.js β₯ 22
π Credits
Built on gustavonline/pi-desktop.
π License
MIT β see LICENSE.