[BUG] Claude-in-Chrome agent glow border pegs GPU at ~150% on 120Hz displays
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
- 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).
- Watch "Google Chrome Helper (GPU)" in Activity Monitor.
- It sits at 140–150% CPU while the attached tab is foregrounded.
- In DevTools on that tab:
``js``
document.getElementById('claude-agent-glow-border').style.animation = 'none';
- 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 …">This issue has 2 comments on GitHub. Read the full discussion on GitHub ↗