performance-and-web-vitals
Audit UI performance with Lighthouse and fix Core Web Vitals — LCP, CLS, INP. Fast UI is good UX. Use when optimising page load, fixing layout shift, reducing input delay, improving Lighthouse scores, or reviewing images, fonts, and render-blocking resources.
By dembrandt · 737 installs
npx skills add dembrandt/dembrandt-skills --skill performance-and-web-vitals
Source repository · Upstream listing
Performance and Web Vitals
Run a Lighthouse Audit
Or open Chrome DevTools → Lighthouse tab → Analyse page load.
Target scores:
Category Target
Performance ≥ 90
Accessibility 100
Best Practices ≥ 95
SEO ≥ 95
Core Web Vitals
LCP — Largest Contentful Paint
How fast does the main content appear?
Target: ≤ 2.5s
LCP measures when the largest visible element (hero image, heading, video poster) renders. It is the user's perception of "did the page load?"
Common causes and fixes:
Cause Fix
Unoptimised hero image Use WebP/AVIF, correct size, fetchpriority="high"
Image not preloaded <link rel="preload" as="image" href="hero.webp"
Render blocking CSS/JS Defer non critical JS, inline critical CSS
Slow server response CDN, caching headers, edge delivery
Web font blocking render font display: swap or optional
Never use loading="lazy" on the LCP image — it delays the most important render.
CLS — Cumulative Layout Shift
Does content jump around while loading?
Target: ≤ 0.1
CLS measures unexpected layout shifts — content moving after it has rendered. Caused by images without dimensions, late loading ads, fonts swapping, or dynamic content injected above existing content.
Common causes and fixes:
Cause Fix
Images without width/height Always set width and height on <img
Web font swap Use font display: optional or preload fonts
Dynamic content above fold Reserve space with min height on containers
Late loading ads or embeds Reserve fixed dimensions for ad slots
Animations that shift layout Animate transform only, never top/left/width/height
INP — Interaction to Next Paint
How quickly does the page respond to user input?
Target: ≤ 200ms
INP measures the delay between a user interaction (click, tap, keyboard) and the next visual update. High INP makes the UI feel sluggish or frozen.
Common causes and fixes:
Cause Fix
Heavy JS on main thread Break into smaller tasks, use requestIdleCallback
Large event handlers Debounce/throttle scroll and resize handlers
Synchronous DOM updates Batch DOM writes with requestAnimationFrame
Third party scripts blocking Load third party scripts with async or defer
React re renders Memoize with useMemo , useCallback , React.memo
Images
Images are the single biggest performance lever on most pages.
Rules:
Always set width and height — prevents CLS
Use loading="lazy" below the fold, never on LCP image
Serve WebP or AVIF — typically 30–50% smaller than JPEG
Size images to their display size — do not serve 2000px image for a 400px slot
Use a CDN with automatic format conversion where possible
Fonts
Web fonts block rendering if not handled correctly.
font display: swap — good for headings, acceptable CLS
font display: optional — zero CLS, font only used if cached (best for body text)
Subset fonts to the characters actually used — reduces file size by 60–80%
JavaScript
defer : executes after HTML parsed, in order — use for most scripts
async : executes as soon as downloaded, out of order — use for independent scripts (analytics)
Never block the main thread with synchronous <script in <head
Lighthouse CI (automated audits)
Run Lighthouse in CI to catch regressions before deployment.
Review Checklist
[ ] Lighthouse performance score ≥ 90
[ ] Lighthouse accessibility score = 100
[ ] LCP ≤ 2.5s — LCP image preloaded, no loading="lazy" on it
[ ] CLS ≤ 0.1 — all images have width and height , no layout shifting animations
[ ] INP ≤ 200ms — no heavy synchronous JS on main thread
[ ] Images served as WebP or AVIF with correct dimensions
[ ] loading="lazy" on all below fold images
[ ] Web fonts use font display: swap or optional
[ ] Non critical JS loaded with defer or async
[ ] Lighthouse CI configured to catch regressions in deployment pipeline