Releases: LCorleone/pi-desktop
Release list
v1.9.0
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, 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.
v1.8.3
Pi Desktop v1.8.3 — macOS Fixes & Workflow Polish 🛠️
WebKit regex fix, intent-driven workflow summaries, Craft-style font defaults, animatable theme tokens, and packages-view refinements. Plus an auto session title rewrite and full bash command display.
Note: This is a personal fork of
gustavonline/pi-desktop.
✨ What's new
WebKit / macOS fixes
- Workflow regex crash —
deriveWorkflowIntentused a lookbehind(?<=...)in its sentence-split regex, which macOS WebKit rejects withInvalid regular expression: invalid group specifier name. Replaced with a WebKit-safe split. - Installed badge SVG — the checkmark SVG in "Installed" badges lacked explicit
width/height, causing WebKit to default to 300×150px and render the check at the wrong scale (invisible). Fixed to 16×16px. - Overlay backdrop-filter — removed
backdrop-filter: blur(4px)from the.overlaybackdrop; thergba(0,0,0,0.48)dim is sufficient and avoids macOS compositing issues.
Workflow improvements
- Intent-driven collapsed summary — collapsed workflow turns now show an intent label (first sentence of thinking or tool-category summary) instead of just a duration number
- Full bash command display — expanded tool views now show the complete command instead of truncating; curl progress
\rspam is collapsed into a clean summary - Preamble cleaning — auto session title prompt borrowed quality patterns from Craft Agents; shortened to 2–5 words with preamble stripping
Chassis
- Craft-style font defaults — system sans for UI chrome, JetBrains Mono for code (hardware-accelerated font stack)
- Animatable
@propertycolor tokens — smooth CSS transitions when switching themes - Build fix — committed
Cargo.lock+ pinnedtimeto 0.3.36 for cookie 0.18.1 compatibility
Packages view refinements
- Tab split — Installed section now separated into Skills / Extensions / Themes tabs
- Real skill descriptions — clicking an installed skill shows its
SKILL.mdcontent inline - Composer overflow fix — long markdown or large token counts no longer overflow the input
⚠️ Known Issues (TODO)
- macOS: model picker see-through — the model picker popover renders with a transparent background on macOS WebKit; model names overlap chat content behind. Three attempted CSS fixes (stacking-context, backdrop-filter removal, compositing-layer promotion) did not resolve it. Likely a deeper WebKit compositing bug. Needs macOS-specific visual debugging.
- macOS: packages skill description faint — the expanded SKILL.md description in the Packages tab renders with near-transparent text on macOS, despite provably-opaque CSS (WCAG 7.4:1 contrast). The CSS chain is correct; the rendering failure is specific to macOS WebKit compositing. Needs a screenshot-and-inspect live session to diagnose.
📦 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.
v1.8.2
Pi Desktop v1.8.2 — Token Stats Fix 🔧
A patch release fixing stale token/cost display when switching between sessions via the content cache introduced in v1.8.1.
Note: This is a personal fork of
gustavonline/pi-desktop.
🐛 Fixes
Token usage now resets on cached session switch
After v1.8.1's session content cache, switching between sessions could leave the token ring, cost, and context-usage display showing the previous session's values instead of the newly-selected session.
Root cause: the cache-hit path in prepareForSessionSwitch was pre-setting the session-file marker to the new session, which caused refreshFromBackend's session-boundary detection to skip its sessionStats reset (the marker matched the incoming session, so the code thought nothing changed). The stale token/cost values from the prior session persisted in the composer.
Fix: removed the pre-assignment so the boundary detection fires normally — sessionStats resets to nulls, then the async stats refresh repopulates with the correct session's data.
📦 Download
This fork builds Windows (.exe) and macOS (.dmg).
⚠️ 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.
v1.8.1
Pi Desktop v1.8.1 — Instant Session Switching ⚡
A performance patch that caches session content in memory so switching back to a recently-visited session is instant — no more lengthy reloading when toggling between sessions.
Note: This is a personal fork of
gustavonline/pi-desktop.
✨ What's new
Instant session switching
Previously, every session switch triggered a full re-read of the session's JSONL file from disk via the pi --mode rpc backend, causing a noticeable loading wait each time you toggled between sessions. Now:
- Session content cache — messages and state are saved to an in-memory cache (max 20 entries, oldest evicted) when you switch away from a session.
- Instant restore — switching back to a recently-visited session renders instantly from cache (0ms), with a background
refreshFromBackendverifying the data silently. - No blank flash — cached content appears immediately; only a first-visit to a session shows the loading indicator.
- Skip redundant re-render — if the background refresh returns identical data (matched by stable backend message IDs), the DOM stays untouched to avoid flicker.
july-dev synced with main
This release also brings july-dev up to date with main, incorporating the v1.8.0 provider presets, test connection, and performance improvements.
📦 Download
This fork builds Windows (.exe) and macOS (.dmg).
⚠️ 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.
v1.8.0
Pi Desktop v1.8.0 — Provider Presets, Test Connection & Performance ⚡
A quality-of-life release focused on the provider setup flow: 12 built-in provider presets so you never type a base URL again, an inline "Test Connection" button to verify API keys before chatting, and caching that makes the model picker and session list feel instant.
Note: This is a personal fork of
gustavonline/pi-desktop.
✨ What's new
Provider presets — no more manual URLs
Adding a custom provider used to mean hand-typing the base URL, guessing the API-key env var, and knowing which models exist. Pi Desktop now ships 12 built-in presets that auto-fill everything on selection:
- DeepSeek, Together AI, Groq, Perplexity, Fireworks AI, Mistral, OpenRouter, xAI, Cerebras, GitHub Models, OpenCode Zen, OpenCode Go
- Each preset fills in base URL, API-key placeholder, a docs link, compatibility flags, and a starter model list.
- Pick a preset → all fields populate → paste your key → you're ready.
Inline "Test Connection"
Every configured provider card now has a Test Connection button. It calls GET {baseUrl}/models with your API key and shows a live result like 200 OK (342ms) — or the exact error. No more adding a provider, starting a chat, and waiting for a cryptic failure just to discover a bad key.
Snappier model picker
The model dropdown used to re-fetch on every open. It now:
- Caches loaded models for 30s (previously uncached — reloaded every time the picker opened).
- Bumps auth cache 15s → 60s and model catalog cache 60s → 120s.
- Preloads models eagerly the moment the Pi RPC connects.
Switching models is now effectively instant during normal use.
Faster session list
The sidebar and session browser previously fetched the session list independently, and the sidebar polled every 1.2s. Now they:
- Share a single cached list (
src/rpc/session-cache.ts, 5s TTL) with single-flight deduplication, so concurrent opens collapse into one backend call. - Poll every 5s instead of 1.2s — less IPC churn, smoother UI.
Actionable CLI update notice
The "Pi CLI has an update" notification now carries an "Open Updates" button that jumps straight to Settings → Updates, instead of a static message with no way to act on it.
Install Pi CLI inline + close window
- "Install Pi CLI" now runs
npm install -g @earendil-works/pi-coding-agentinline with a spinner and live log output, instead of a bare terminal command. - A proper Close Pi Desktop button closes the native Tauri window.
Bug fixes
- Preset form state lost on re-render — programmatically-set preset values were wiped by Lit's reactive update cycle. Migrated to reactive class-state properties (
newProviderKey/newProviderUrl/newProviderApiKey) with.valuebindings so they survive re-renders. - CSS font token fix — code/diff blocks referenced a non-existent
--font-monotoken and silently fell back to the system mono font. Corrected to--font-family-mono, so code now uses your configured code font and honors the theme override. - Duplicate CSS block — merged a redundant
.settings-btn-secondaryrule.
📦 Download
This fork builds Windows (.exe) and macOS (.dmg).
⚠️ 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.
v1.7.2
Pi Desktop v1.7.2 — Geist-Aligned Polish & Theme Editing 🎨
Geist design-system alignment (focus rings, motion, shadows, voice) and the ability to save edits directly to existing custom themes from Settings → Appearance.
Note: This is a personal fork of
gustavonline/pi-desktop.
✨ What's new
Geist-aligned polish
Design-system alignment with Vercel's Geist, targeting the top findings from a Geist audit:
- Two-layer focus rings —
:focus-visiblenow renders a proper Geist-style ring (2px surface gap + 4px accent) on all interactive elements: composer buttons, model picker, chat jump button, welcome elements, settings inputs, and file-viewer inputs. Replaces the previous weak 1px translucent rings. prefers-reduced-motiongate — all nonessential animations and transitions are dropped when the OS-level reduced-motion setting is enabled, including the Pi breathing animation, thinking shimmer, and pulse indicators.- Standardized font weights — 23 off-spec weights (520, 550, 560, 620, 640, 660, etc.) snapped to Geist's allowed 400/500/600 range, enforcing the "no more than two weights per view" rule.
- Layered, low-alpha shadows — 22 heavy single-layer shadows replaced with Geist's multi-layered elevation tokens (
--shadow-raised,--shadow-popover,--shadow-modal) across dialogs, menus, popovers, and cards. Borders restored on 3 overlays that previously leaned on shadow alone. - Voice cleanup — dropped trailing "successfully" from status messages; bare "Confirm" → "Confirm Action" (verb + noun convention).
Update existing theme from Settings → Appearance
Previously, editing theme settings (accent, background, foreground, UI/code fonts, contrast, translucent sidebar) only allowed creating a new theme file. You can now save edits directly back to the current custom theme:
- "Update theme" button — appears next to "Create theme" when the selected theme is custom (non-bundled) and there are unpersisted changes.
- Overwrites the existing file in
~/.pi/agent/themes/— no duplicate naming. - Bundled themes remain read-only — only "Create theme" (duplicate-then-edit) is offered, matching the existing convention in the Packages view.
- Handles errors gracefully (shows
themeCatalogErroron disk failures).
Extension-UI confirm dialog fix
The permission-gate (confirm dialog displayed when the agent needs to run rm or other controlled operations) could render invisible on repeated invocations — the overlay backdrop appeared but no buttons, leaving the user stuck with nothing clickable. Root cause: lit's internal render-part cache was corrupted by a raw innerHTML = "" clear in closeOverlay(). Now cleared through lit's render(nothing, ...) to keep the cache consistent. Also hardened the confirm dialog's timeout to prevent spurious double-responses.
📦 Download
This fork builds Windows (.exe) and macOS (.dmg).
⚠️ 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.
v1.7.1
Pi Desktop v1.7.1 — Per-Turn Stats & Auto-Release 📊
Per-turn performance telemetry (tps + cache hit-rate) and CI auto-release on merge to main.
Note: This is a personal fork of
gustavonline/pi-desktop.
✨ What's new
Per-turn stats footer (tps + cache hit-rate)
After each agent turn, a compact footer shows real-time performance metrics:
12.3 tok/s · cache 87%
- Tokens/sec — output generation speed
- Cache hit-rate — percentage of input tokens served from prompt cache
- Robust field reader handles multiple naming conventions (
input/inputTokens/input_tokens,cacheRead/cache_read) - Wired via
agent_end→computeTurnStats→ stored per-message → rendered in the timeline
CI auto-release on merge to main
No more manual workflow dispatch. When you push a releases/v*.md file to main:
- Auto-detects the latest version from the filename
- Idempotency check (skips if tag already exists)
- Builds Windows
.exe+ macOS.dmgin parallel - Tags
v<X.Y.Z>and publishes a GitHub Release automatically - Uses the release note file content as the release body
📦 Download
This fork builds Windows (.exe) and macOS (.dmg).
⚠️ 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.
v1.7.0
Pi Desktop v1.7.0 — Sans-Refresh UI Polish 🎨
A visual refresh of the workspace: proportional sans-serif for chrome and prose while code, terminal, and tools stay JetBrains Mono, a redesigned workflow timeline with a colored status rail, and tighter detail polish throughout.
Note: This is a personal fork of
gustavonline/pi-desktop.
✨ What's new
Typography refresh — sans for chrome, mono for code
The entire UI chrome (sidebar, tabs, composer, controls) now uses a proportional system sans-serif stack (-apple-system, SF Pro Text, Segoe UI, system-ui) instead of running everything in JetBrains Mono.
- Code surfaces stay mono —
code/pre/kbd, fenced code blocks, the PTY terminal, tool output, file diffs, and the collapsed tool-preview line all remain JetBrains Mono via explicit--font-family-mono - One-token change — driven by flipping
--font-family-sans; everything mono is explicitly insulated, so no code/terminal surface regressed to sans - Long-form assistant answers and your messages read more naturally; tooling and code keep their dense, terminal-native feel
Workflow timeline — status rail + colored nodes
The assistant's tool-call timeline gained a vertical rail with status-colored nodes, so a turn's progress reads at a glance:
│ ● read src/styles/tokens.css ✓
│ ● read src/components/*.ts ×3 ✓
│ ● edit src/styles/app.css +24 −3 ✓
│ ◉ edit src/components/sidebar.ts running
- Colored nodes — running (accent blue, breathing), failed (danger red), done (success green), pulled from existing per-call state (
groupRunning/groupFailed) - Connected rail — a hairline vertical rule ties the nodes into one timeline
- Status carries through — the
running/failed/doneclasses are now surfaced on the workflow item from data the renderer already had
Detail polish
- Agent divider — the bold "Agent" wordmark between the workflow and the final answer is now a quiet
[rule][accent dot][rule] - Active session — the selected session gets a 2px accent bar on the left
- Density — the chat thread, composer panel, and workflow lines breathe slightly more (chat-row gap 16 → 20px, composer padding +2px, workflow line 5 → 7px)
- Tool preview stays mono — collapsed tool-call previews are pinned to JetBrains Mono so they match the
×Ncount beside them
📦 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.
v1.6.0
Pi Desktop v1.6.0 — Modified Files & Diff Viewer 📝
Agent file edits now show clickable cards with diff stats and a dedicated diff viewer in the file panel. Plus session stability fixes and macOS rendering fixes.
Note: This is a personal fork of
gustavonline/pi-desktop.
✨ What's new
Modified files cards + diff viewer
When the agent writes, edits, or creates files via tools, compact cards appear after the assistant's answer:
✏️ component.tsx diff +5 -3 ▸
📝 new-feature.ts created
- Diff stats —
diff +N -M(green/red) computed from the edit tool'soldText/newTextargs - Click file name → opens the file (final state) in the right-side viewer
- Click ▸ toggle → opens a red/green unified diff in the file panel
- Created files show "created" (no diff data)
- Clicking the file name again clears the diff and reloads the file content
Stability fixes
- Session runtime dispose — closing a running session tab no longer leaks a zombie
piprocess (synchronous disposal before task enqueue) - File tree refresh — the left-panel file list now refreshes after agent runs (tools may change files) and when the app regains focus
- macOS model picker — fixed popover clipping behind chat content (WebKit stacking context)
- File panel close button — stays visible with long filenames (header now wraps to two lines)
📦 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.
v1.5.0
Pi Desktop v1.5.0 — Subagent Display & Extension UI Fix ✨
Subagent tool calls now render cleanly with a structured completion card, and the broken extension UI dialogs (permission gates, prompts) are fixed.
Note: This is a personal fork of
gustavonline/pi-desktop.
✨ What's new
Subagent display — completely overhauled
When the main agent triggers a subagent (via the Agent tool), it used to dump raw ANSI spinner frames and 0 tool uses...1 tool uses... pings into a noisy text blob. Now it's clean:
- Dedicated category — subagent calls get a 🤖 robot icon +
agentlabel pill +[Type] prompt...summary instead of a generic gear - Live state — shows a compact
working…line while running (no more ping spam) - Structured completion card — when done, parses the
pi-subagents<task-notification>XML and renders a card:- Status glyph:
✓(success) /✗(error/stopped) - Description (extracted from the summary, falls back to prompt)
- Stats row:
7 tool uses · 12.3k token · 8.2s - Scrollable result text
- Status glyph:
- Rolling output window — even without XML, output is trimmed to a readable tail (last 4 lines while running, 15 when done)
Extension UI dialogs — fixed (was invisible)
The confirm / select / input / editor dialogs (used by permission gates and extension prompts) used Tailwind utility classes (bg-background, bg-primary, border-border) that were never themed in this app — so the dialogs rendered invisible, causing permission-gate prompts to hang forever.
Replaced all Tailwind classes with dedicated .ext-ui-* CSS classes backed by the app's CSS variables. Now the dialogs have visible backgrounds, borders, titles, and properly-styled Cancel/Confirm buttons.
Also fixed a P0 regression: the overlay backdrop would remain after a dialog closed (locking the UI) — added .ext-ui-overlay.hidden { display: none }.
📦 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.