Astro's default output is nearly perfect on Core Web Vitals — the regression usually comes from a client:load island that grew unnoticed. Since Astro ships zero JS by default, a single heavy island doubles your INP p75.
What's different about Astro
Astro's default output is nearly perfect on Core Web Vitals — the regression usually comes from a client:load island that grew unnoticed. Since Astro ships zero JS by default, a single heavy island doubles your INP p75.
Signals to watch on Astro
INP regression traced to a client:load or client:visible island
LCP shift when an integration like @astrojs/image is misconfigured
CLS from View Transitions running before web-font swap
How Lemwatch surfaces it
We track the specific route where CWV degraded, so you know which island to convert back to client:idle or server-only.
What we check for core web vitals
Largest Contentful Paint (LCP) — 75th percentile, tracked hourly
Cumulative Layout Shift (CLS) — with the specific shifting element flagged
Interaction to Next Paint (INP) — replaces FID for 2026 rankings
Alerts fire when the 7-day rolling baseline degrades by >20%
Other ways Astro sites break
Monitor Astro sites for build drift, hydration errors, and stale islands.
Common failure modes
Partial hydration JS bundles missing after CDN purge
View Transitions failing on cross-origin navigations