diff --git a/client/src/pages/UsagePage.jsx b/client/src/pages/UsagePage.jsx
index 131c5aa2db..580a315e9d 100644
--- a/client/src/pages/UsagePage.jsx
+++ b/client/src/pages/UsagePage.jsx
@@ -126,7 +126,9 @@ function ProviderQuotaCard({ quota, onRefresh, refreshing, disabled }) {
title={`Refresh ${quota.label} usage`}
aria-label={`Refresh ${quota.label} usage`}
>
-
+ {/* `will-change-transform` — see the section-level Refresh button's
+ comment on the compositor-layer artifact this avoids. */}
+
@@ -309,7 +311,11 @@ function ProviderQuotaSection() {
className="flex items-center gap-1.5 px-2 sm:px-3 py-1.5 text-xs sm:text-sm text-gray-400 hover:text-white disabled:opacity-50"
title="Refresh every provider's usage"
>
- Refresh all
+ {/* `will-change-transform` promotes the icon to its own compositor
+ layer before `animate-spin` starts — without it this button's
+ continuous rotate restarts each poll and can leave a stale
+ rasterized frame behind the live one on some GPUs. */}
+ Refresh all