[BUG] Claude-in-Chrome agent glow border pegs GPU at ~150% on 120Hz displays

Resolved 💬 2 comments Opened Apr 24, 2026 by yusufmo1 Closed May 28, 2026

Preflight Checklist

  • [x] I have searched existing issues and this hasn't been reported yet
  • [x] This is a single bug report
  • [x] I am using the latest version of Claude Code

What's Wrong?

The Claude Chrome extension injects a full-viewport <div id="claude-agent-glow-border"> on every tab an MCP session attaches to, and animates it with an infinite 2s claude-pulse CSS animation. The div covers the whole viewport (1200×1978px on my window), so on a 120Hz ProMotion display Chrome re-composites the entire screen at ~120fps. The shared Chrome GPU process sits at 140–150% CPU and macOS reports ~98% GPU utilization the whole time the attached tab is in front.

Switch to any other tab and GPU drops to ~10% instantly. The page underneath is completely idle — no user JS, no animations of its own. It's just the indicator.

What Should Happen?

The agent-active indicator shouldn't generate a full-viewport composite at the display's refresh rate. Any of these would fix it:

  • Render the glow as a thin border (four fixed-position edge divs, or box-shadow: inset) so only a narrow band re-composites.
  • Cap effective frame rate via steps(N) timing or fewer keyframes.
  • Respect prefers-reduced-motion.
  • Pause the animation while the agent is idle (thinking/waiting on the user) — it doesn't need a 120fps indicator when nothing's happening.
  • Expose a setting to disable it.

Steps to Reproduce

  1. Install the Claude Chrome extension and attach an MCP session to any tab on a 120Hz display (MacBook Pro w/ ProMotion, or any high-refresh external monitor).
  2. Watch "Google Chrome Helper (GPU)" in Activity Monitor.
  3. It sits at 140–150% CPU while the attached tab is foregrounded.
  4. In DevTools on that tab:

``js
document.getElementById('claude-agent-glow-border').style.animation = 'none';
``

  1. GPU drops to ~0–3% within 2s. Confirmed by polling ps -p <gpu_pid> -o pcpu= every 500ms.

Error Messages / Logs

None — no errors, just continuous compositor load.

Measurements (macOS, Chrome 147.0.7727.56, M3 Max MacBook Pro, ProMotion 120Hz):

| State | Chrome GPU process CPU | macOS GPU utilization |
|---|---|---|
| Attached tab visible, glow active | ~140–150% | ~98% |
| Attached tab backgrounded | ~10% | ~10% |
| Glow animation paused, tab still visible | ~0–3% | — |

Is this a regression?

I don't know

Claude Code Version

2.1.119 (Claude Code)

Chrome extension version: 1.0.68 (Claude in Chrome Beta, id fcoeoabgfenejglbffodgkkbkcdhcgfn)

Platform

Anthropic API

Operating System

macOS

Additional Information

Why this happens: a viewport-sized element with an infinite animation forces a fresh compositor frame at the display's refresh rate. On 60Hz that's already wasteful for a decorative indicator; on 120Hz it doubles. transform/opacity animations are normally cheap because they only invalidate a small compositor layer — but when the layer is the viewport, that optimization doesn't apply.

Relevant injected nodes (both survive across page loads on the attached tab):

<style id="claude-agent-animation-styles">  /* defines @keyframes claude-pulse */
<div id="claude-agent-glow-border" style="animation: claude-pulse 2s infinite …">

View original on GitHub ↗

This issue has 2 comments on GitHub. Read the full discussion on GitHub ↗