audit-speed
Audit Speed
Deep Core Web Vitals audit with root-cause analysis trees and resource optimization recommendations.
Core Web Vitals Thresholds
| Metric | Good | Needs Improvement | Poor |
|---|---|---|---|
| LCP (Largest Contentful Paint) | < 2.5s | 2.5s - 4.0s | > 4.0s |
| CLS (Cumulative Layout Shift) | < 0.1 | 0.1 - 0.25 | > 0.25 |
| INP (Interaction to Next Paint) | < 200ms | 200ms - 500ms | > 500ms |
| FCP (First Contentful Paint) | < 1.8s | 1.8s - 3.0s | > 3.0s |
| TTFB (Time to First Byte) | < 800ms | 800ms - 1800ms | > 1800ms |
Before You Start
Gather this context:
- Which pages? Homepage, key landing pages, or specific slow pages.
- Current scores. If the user has Lighthouse or PageSpeed Insights data, start there.
- Tech stack. CMS, framework, hosting — this determines which optimizations are available.
- Known constraints. Third-party scripts they can't remove, design requirements that limit optimization.
If no data is available, suggest running Google PageSpeed Insights on the key URLs.
LCP Root-Cause Tree
LCP measures when the largest visible element finishes rendering. Diagnose:
Is TTFB slow (> 800ms)?
- → Server response time issue
- Check: hosting quality, CDN configuration, database queries, server-side rendering time
- Fix: upgrade hosting, add CDN, optimize server-side code, enable caching
Is the LCP element an image?
- → Image optimization issue
- Check: image format (use WebP/AVIF), image size (serve responsive sizes), lazy loading on LCP image (should NOT be lazy loaded)
- Fix: convert to modern formats, add
width/heightattributes, usefetchpriority="high"on LCP image, preload the LCP image
Is the LCP element text?
- → Font loading issue
- Check: custom fonts blocking render, font file size, font-display strategy
- Fix: use
font-display: swaporoptional, preload critical fonts, subset fonts to used characters
Is render-blocking CSS/JS delaying the LCP?
- Check: large CSS files in
<head>, synchronous JS before content - Fix: inline critical CSS, defer non-critical CSS, async/defer JS
CLS Root-Cause Tree
CLS measures unexpected layout shifts. Diagnose:
Do images/videos lack dimensions?
- → Browser can't reserve space before loading
- Fix: add
widthandheightattributes to all<img>and<video>elements, use CSSaspect-ratio
Do ads or embeds inject content?
- → Dynamic content pushing existing content down
- Fix: reserve space for ad slots with min-height, use
contain-intrinsic-sizefor lazy content
Do fonts cause text reflow?
- → FOUT (Flash of Unstyled Text) causes layout shift when custom font loads
- Fix: use
font-display: optional(no swap = no shift), or match fallback font metrics
Does dynamic content insert above the fold?
- → Banners, cookie notices, notifications pushing content
- Fix: use overlays instead of inline insertions, or reserve space with fixed-height containers
INP Root-Cause Tree
INP measures responsiveness to user interactions. Diagnose:
Is the main thread blocked by long tasks?
- Check: JavaScript execution time, third-party scripts, large DOM
- Fix: break long tasks with
requestIdleCallbackorsetTimeout, code-split heavy modules
Do event handlers do heavy synchronous work?
- Check: click handlers that trigger large DOM updates, form validation on every keystroke
- Fix: debounce inputs, use requestAnimationFrame for visual updates, offload work to web workers
Are third-party scripts competing for the main thread?
- Check: analytics, chat widgets, A/B testing tools, social embeds
- Fix: defer loading until after interaction, use
loading="lazy"for embeds, consider removing low-value scripts
Resource Analysis
Break down the total page weight:
| Resource Type | Size | Assessment | Action |
|---|---|---|---|
| HTML | [x] KB | [ok/large] | Compress, reduce inline styles/scripts |
| CSS | [x] KB | [ok/large] | Remove unused CSS, minify, critical CSS extraction |
| JavaScript | [x] KB | [ok/large] | Code-split, tree-shake, defer non-critical |
| Images | [x] KB | [ok/large] | Modern formats, responsive sizes, lazy load below fold |
| Fonts | [x] KB | [ok/large] | Subset, limit families/weights, preload critical |
| Third-party | [x] KB | [ok/large] | Audit necessity, defer, self-host if possible |
Benchmarks:
- Total page weight under 1.5 MB is good
- JavaScript under 300 KB (compressed) for most sites
- CSS under 100 KB (compressed)
- First-party fonts under 100 KB
Output Format
Speed Audit: [URL or domain]
Core Web Vitals
| Metric | Value | Rating | Root Cause |
|---|---|---|---|
| LCP | [value] | Good / Needs Improvement / Poor | [identified cause] |
| CLS | [value] | ... | ... |
| INP | [value] | ... | ... |
| FCP | [value] | ... | ... |
| TTFB | [value] | ... | ... |
Resource Breakdown [Table from Resource Analysis]
Priority Fixes
For each failing metric, ordered by impact:
-
[Metric]: [Root cause]
- Current: [value]
- Target: [threshold]
- Fix: [specific action]
- Estimated impact: [high/medium/low]
-
...
Quick Wins List optimizations that require minimal effort:
- Add
width/heightto images - Set
fetchpriority="high"on LCP image - Defer non-critical JavaScript
- ...
Pro Tip: Use the free CWV Impact Calculator to estimate the traffic impact of fixing Core Web Vitals, and the Critical CSS Generator to extract above-the-fold CSS. SEOJuice MCP users can run
/seojuice:page-audit [domain] [url]for instant CWV scores, Lighthouse data, and resource breakdowns.