DEV Community

Fred ๐Ÿ“
Fred ๐Ÿ“

Posted on

VibeDesk 2.0 is out โ€“ every feature request shipped, and why 1.9 burned 131 % of a CPU core

VibeDesk is a free, open-source Windows desktop for Claude Code: several sessions side by side, a coloured dot that tells you which one is waiting for you, permission prompts as one-click cards (on your PC or your phone) and a project "brain" Claude reads and writes over MCP. It runs your own Claude Code CLI โ€“ nothing is proxied.

Today 2.0 is out. Two things I want to share: what's in it, and a performance bug that is worth knowing about if you build anything with Electron, backdrop-filter or a WebGL background.

Every open wish is in

Since 1.9 I've only collected feature requests as GitHub issues and shipped them in one bigger release instead of a stream of small ones. All six open requests made it:

  • Session wrap-up โ€“ when Claude changed files in a turn, you get Claude's summary, every changed file with line counts and a suggested commit message. One click commits.
  • Pull requests from the Git window โ€“ Claude drafts title and description from your commits; VibeDesk creates the branch, pushes and opens the PR through the GitHub CLI.
  • Tray status โ€“ a dot in the notification area shows the most urgent session, and approvals can be answered from the tray menu.
  • Budget per project โ€“ cost or tokens per day or week, with a quiet heads-up at 75 % and 100 %. Claude is never stopped.
  • "waiting ยท 3 min" โ€“ how long a session has been waiting, on the session, in the tray and on your phone. (This one came from a comment on my last post here โ€“ thank you.)
  • Hand-off between sessions โ€“ when one session sends another a task, a short summary and the changed files come along. (Also from the comments here.)

Plus: living scenes (Claude writes an interactive wallpaper for you), Gemini CLI and Codex as a beta, your own music from a folder, project templates and a second-screen beta.

The bug: 131 % of a core for a terminal spinner

A user (me, honestly) said: "After running VibeDesk for a while it gets really slow." My first guess was a memory leak. I was wrong.

I measured the installed 1.9 with one Claude Code session working in the terminal. Windows said the GPU process used 131 % of a CPU core and the renderer 30 %. Nothing was leaking: main process ~110 MB, renderer heap ~20 MB, flat. The laptop simply got hot and throttled after a while โ€“ that was the "slow after a while".

To find the cause I started a second, isolated instance with Playwright's _electron, a copy of the real settings and its own user-data folder. Then I started a real Claude Code session in it and measured CPU per process with the Windows counters while Claude streamed a long answer. Three things added up:

1. A smooth infinite CSS animation forces 60 fps compositing. The "Claude is working" glow on the terminal was animation: claude-glow 2.8s ease-in-out infinite. It doesn't matter how small or cheap the animated property looks โ€“ every frame is a new compositor frame, and every frame re-ran the large backdrop-filter: blur() of the glass windows. With steps(5) the glow changes about twice a second, and the compositor rests in between. (Already fixed in a 2.0 build; it was most of the 131 %.)

2. The WebGL rain kept rendering at 0 % rain. The background shader was throttled to 15โ€“30 fps, but nobody told it that at intensity 0 the image doesn't depend on time. Now rain === 0 means "draw one still frame and stop the loop".

3. backdrop-filter is re-computed whenever anything inside the glass element changes. A terminal that receives ~10 writes per second means ~10 re-blurs per second of a window-sized area at device pixel ratio 2. In energy-saver mode the windows now use a nearly opaque background instead of live blur.

Measured the same way, with a real Claude session working:

GPU process Renderer
1.9 131 % 30 %
2.0 (glow fix) ~26 % ~14 %
+ still frame at 0 % rain ~20 % ~12 %
+ no live blur in energy saver ~11 % ~11 %

Two measuring traps that cost me time:

  • app.getAppMetrics()[i].cpu.percentCPUUsage in Electron is divided by the number of logical cores. On my 8-core laptop "16 %" meant 128 % of one core. Diffing Get-Process CPU seconds was the honest number.
  • Chromium stops requestAnimationFrame for occluded windows. If your test window is behind another one, everything looks free. I had to call setAlwaysOnTop(true), maximize() and focus() on the test window.

Try it

Windows 10/11, your own Claude Code plan or API key. The installer isn't signed yet, so SmartScreen will ask โ€“ "More info โ†’ Run anyway".

Not affiliated with Anthropic.

Top comments (0)