Nerve continuously repaints due to several UI elements that update on a timer regardless of whether the tab is active or not. The most visible offenders are the live clock and the sparkline/mini graph. On hardware where the GPU is shared with other workloads, this creates unnecessary constant load even when the user is not actively using the interface.
Current behavior: The live clock and sparkline graph update continuously, forcing the browser to repaint on every tick. This persists in background tabs as well as when the user is idle on the page.
Expected behavior: A "performance mode" toggle in settings that disables or freezes non-essential live-updating elements, specifically:
Live clock — replace with a static timestamp that updates only on user interaction or on a slow interval (e.g. every 60s)
Sparkline / mini graph — freeze or hide entirely in performance mode
Any other elements driven by a recurring timer rather than actual agent events
The WebSocket connection and all functional elements (chat, session state, agent output) should remain fully live. Only cosmetic/informational elements that repaint continuously without user-facing value should be affected.
Why this matters: These elements look polished but impose a real and measurable GPU cost with no functional benefit during normal use. Users running Nerve alongside GPU-intensive workloads have no way to trade visual polish for lower resource usage today.
Suggested implementation:
Add a PERFORMANCE_MODE toggle in the settings panel (persisted to localStorage or .env)
When enabled: stop the clock interval, freeze the sparkline, skip animation frames on non-event-driven components
When disabled: restore current behavior
Environment: Linux, Chromium/Vivaldi, Nerve v1.5.2
Addendum:
After investigating with Chrome DevTools Paint flashing, the animated logo (canvas element) was identified as the primary confirmed source of continuous repaints. The following elements were blocked together via uBlock Origin, bringing GPU usage from continuous background load to near zero when idle:
localhost##.text-muted-foreground.tracking-[-0.08em].text-[0.667rem].font-mono.py-1.px-2.5.bg-background/75.border-border/70.border.rounded-full
localhost##.lg:inline.text-foreground/72.hidden
localhost##.md:inline.text-foreground/72.tabular-nums.font-mono.hidden
localhost##canvas
The canvas element (animated logo) was confirmed via paint flashing as the primary offender. The uptime counter and sparkline were blocked as part of the same pass and also contribute to the issue.
A performance mode toggle that skips rendering these elements would eliminate the need for this workaround.
Nerve continuously repaints due to several UI elements that update on a timer regardless of whether the tab is active or not. The most visible offenders are the live clock and the sparkline/mini graph. On hardware where the GPU is shared with other workloads, this creates unnecessary constant load even when the user is not actively using the interface.
Current behavior: The live clock and sparkline graph update continuously, forcing the browser to repaint on every tick. This persists in background tabs as well as when the user is idle on the page.
Expected behavior: A "performance mode" toggle in settings that disables or freezes non-essential live-updating elements, specifically:
Live clock — replace with a static timestamp that updates only on user interaction or on a slow interval (e.g. every 60s)
Sparkline / mini graph — freeze or hide entirely in performance mode
Any other elements driven by a recurring timer rather than actual agent events
The WebSocket connection and all functional elements (chat, session state, agent output) should remain fully live. Only cosmetic/informational elements that repaint continuously without user-facing value should be affected.
Why this matters: These elements look polished but impose a real and measurable GPU cost with no functional benefit during normal use. Users running Nerve alongside GPU-intensive workloads have no way to trade visual polish for lower resource usage today.
Suggested implementation:
Add a PERFORMANCE_MODE toggle in the settings panel (persisted to localStorage or .env)
When enabled: stop the clock interval, freeze the sparkline, skip animation frames on non-event-driven components
When disabled: restore current behavior
Environment: Linux, Chromium/Vivaldi, Nerve v1.5.2
Addendum:
After investigating with Chrome DevTools Paint flashing, the animated logo (canvas element) was identified as the primary confirmed source of continuous repaints. The following elements were blocked together via uBlock Origin, bringing GPU usage from continuous background load to near zero when idle:
localhost##.text-muted-foreground.tracking-[-0.08em].text-[0.667rem].font-mono.py-1.px-2.5.bg-background/75.border-border/70.border.rounded-full
localhost##.lg:inline.text-foreground/72.hidden
localhost##.md:inline.text-foreground/72.tabular-nums.font-mono.hidden
localhost##canvas
The canvas element (animated logo) was confirmed via paint flashing as the primary offender. The uptime counter and sparkline were blocked as part of the same pass and also contribute to the issue.
A performance mode toggle that skips rendering these elements would eliminate the need for this workaround.