Skip to content

v1.9.0

Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 02 Jul 13:01

Pi 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, resolves var() references recursively (including vars whose own value is another color-mix()), computes the real sRGB mix with premultiplied alpha, and rewrites the declaration to plain rgb()/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, --border are now resolved to plain rgb()/rgba() values in JS at runtime. They are never themselves color-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 deriveSemanticTokens entry 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 plain rgb() 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.md description 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.