algorithmic-color-pale…
Derive a full UI palette from one or two brand colours — state variants, brand-tinted greys, semantic colours. Use when building…
Lighthouse audits and Core Web Vitals — LCP, CLS, INP. Use when optimising page load, layout shift, input delay, images, fonts or render-blocking resources.
Claude Code
$ npx -y skills add dembrandt/dembrandt-skills --skill performance-and-web-vitals --agent claude-code
Codex
$ npx skills add dembrandt/dembrandt-skills --skill performance-and-web-vitals -a codex -y
Cursor
$ npx skills add dembrandt/dembrandt-skills --skill performance-and-web-vitals -a cursor -y
Gemini CLI
$ npx skills add dembrandt/dembrandt-skills --skill performance-and-web-vitals -a gemini-cli -y
GitHub Copilot
$ npx skills add dembrandt/dembrandt-skills --skill performance-and-web-vitals -a github-copilot -y
OpenCode
$ npx skills add dembrandt/dembrandt-skills --skill performance-and-web-vitals -a opencode -y
Windsurf
$ npx skills add dembrandt/dembrandt-skills --skill performance-and-web-vitals -a windsurf -y
name: performance-and-web-vitals
description: Lighthouse audits and Core Web Vitals — LCP, CLS, INP. Use when optimising page load, layout shift, input delay, images, fonts or render-blocking resources.
metadata:
priority: 8
docs:
- "https://web.dev/vitals/"
- "https://developer.chrome.com/docs/lighthouse/overview/"
pathPatterns:
- "**/*.html"
- "**/*.tsx"
- "**/*.jsx"
- "**/*.css"
- "**/*.scss"
- "next.config.*"
- "vite.config.*"
- "app/**"
- "pages/**"
promptSignals:
phrases:
- "lighthouse"
- "performance"
- "web vitals"
- "lcp"
- "cls"
- "inp"
- "layout shift"
- "slow"
- "page speed"
- "core web vitals"
retrieval:
aliases:
- lighthouse
- web vitals
- performance
- LCP
- CLS
- INP
- page speed
- core web vitals
intents:
- run a lighthouse audit
- fix layout shift
- improve lcp
- optimise images
- fix slow page
- improve lighthouse score
examples:
- run lighthouse on this page
- my LCP is too slow
- fix the layout shift on this page
- optimise images for performance
- improve the lighthouse score# CLI audit — outputs JSON and HTML report npx lighthouse https://example.com --output html --output-path ./lighthouse-report.html # Headless, useful in CI npx lighthouse https://example.com --chrome-flags="--headless" --output json --output-path ./report.json # Audit specific categories only npx lighthouse https://example.com --only-categories=performance,accessibility,seo
Or open Chrome DevTools → Lighthouse tab → Analyse page load.
**Target scores:** | Category | Target | |---|---| | Performance | ≥ 90 | | Accessibility | 100 | | Best Practices | ≥ 95 | | SEO | ≥ 95 |
---
*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` |
<!-- Preload LCP image --> <link rel="preload" as="image" href="hero.webp" fetchpriority="high"> <!-- LCP image: no lazy loading --> <img src="hero.webp" alt="..." fetchpriority="high" width="1200" height="600">
Never use `loading="lazy"` on the LCP image — it delays the most important render.
---
*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` |
<!-- Always include dimensions --> <img src="product.jpg" width="400" height="300" alt="...">
/* Reserve space for dynamic content */
.ad-slot { min-height: 250px; }
/* Animate transform, not layout properties */
.slide-in { transform: translateY(0); transition: transform 300ms; }---
*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 are the single biggest performance lever on most pages.
<!-- Modern formats with fallback --> <picture> <source srcset="image.avif" type="image/avif"> <source srcset="image.webp" type="image/webp"> <img src="image.jpg" width="800" height="600" alt="..." loading="lazy"> </picture> <!-- Responsive images --> <img srcset="image-400.webp 400w, image-800.webp 800w, image-1200.webp 1200w" sizes="(max-width: 600px) 100vw, 50vw" src="image-800.webp" alt="..." width="800" height="600" loading="lazy" >
**Rules:**
---
Web fonts block rendering if not handled correctly.
<!-- Preconnect to font origin --> <link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <!-- Preload critical font file --> <link rel="preload" href="/fonts/brand.woff2" as="font" type="font/woff2" crossorigin>
@font-face {
font-family: 'Brand';
src: url('/fonts/brand.woff2') format('woff2');
font-display: swap; /* show fallEnterprise UX secrets, now built into your AI agent. Your agent writes the component in seconds. It does not know the modal should be a drawer, or that the grey it picked fails contrast. These skills carry that judgment: what to do, and what breaks otherwise.
Derive a full UI palette from one or two brand colours — state variants, brand-tinted greys, semantic colours. Use when building…
Top bar, sidebar rail, app launcher, tenant and environment cue, status bar. Use when designing the persistent shell, a…
Product visuals must show the real product with real data. Use when building landing pages, hero sections, screenshots or demo…
Shape language across type, radius and icons carries brand personality. Use when starting a design system, picking icons or…
Rest, hover, active, focus, disabled and loading states, derived from the base colour. Use when designing buttons, links, inputs…
Rebuild a live web page 1:1 from measurement into Figma, Penpot or code, then verify it. Use when reproducing a page or checking…
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…
Ask which skill or flow fits your situation. A router over the skills in this repo.