webperf-core-web-vitals
Skill1.5k starsChanged 8 months agoMITView on GitHub
Intelligent Core Web Vitals analysis with automated workflows and decision trees. Measures LCP, CLS, INP with guided debugging that automatically determines follow-up analysis based on results. Includes workflows for LCP deep dive (5 phases), CLS investigation (loading vs interaction), INP debugging (latency breakdown + attribution), and cross-skill integration with loading, interaction, and media skills. Use when the user asks about Core Web Vitals, LCP optimization, layout shifts, or interaction responsiveness. Compatible with Chrome DevTools MCP.
- Installs packages
We split this skill into the rules it gives an agent
18 rules. About 0 are common, 11 are distinctive, and 7 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈11
Distinctive · estimate
This author's own choices. Worth a look.
7
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 19
Run the script with mcp__chrome-devtools__evaluate_script and read the object it returns.
- Very specific: line 20
When status is "tracking", the script keeps observing the page.
- Very specific: line 21
When status is "error" or "unsupported", read error: the page may not have loaded yet, or the browser lacks the API.
- Distinctive: line 40
When the user asks for a comprehensive Core Web Vitals analysis or "audit CWV":
- Distinctive: line 50
When LCP is slow or the user asks "debug LCP" or "why is LCP slow":
- Very specific: line 55
LCP-Image-Entropy.js: - Check if LCP image has visual complexity issues
- Distinctive: line 60
When layout shifts are detected or the user asks "debug CLS" or "layout shift issues":
- Distinctive: line 70
When interactions feel slow or the user asks "debug INP" or "slow interactions":
- Very specific: line 80
When LCP is a video element (detected by LCP-Video-Candidate.js):
- Distinctive: line 91
When LCP is an image (most common case):
- Distinctive: line 105
Use this decision tree to automatically run follow-up snippets based on results:
- Distinctive: line 177
If early in load: wait and re-run the script
- Distinctive: line 178
If page is an SPA: user may need to navigate to the target route first
- Distinctive: line 223
When multiple CWV metrics are poor, prioritize investigation:
- Distinctive: line 226
Check for late-loading content pushing LCP element
- Very specific: line 227
Run LCP-Trail.js to see LCP candidate changes
- Very specific: line 228
Run Layout-Shift-Loading-and-Interaction.js to correlate timing
- Distinctive: line 238
Check if shifts occur during/after interactions
≈ “Common” is an estimate: at least 1 in 5 of the 308,232 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
WebPerf: Core Web Vitals
JavaScript snippets for measuring web performance in Chrome DevTools.
Running a script
- Run the script with
mcp__chrome-devtools__evaluate_scriptand read the object it returns. The scripts have no console output, so the returned object is the result:script,statusand the metric data (value,rating,details,items,issues), as described inreferences/schema.md. - When
statusis"tracking", the script keeps observing the page. After the interactions, call the function named ingetDataFnwith anothermcp__chrome-devtools__evaluate_scriptcall, for examplegetINP(), and read the object it returns. - When
statusis"error"or"unsupported", readerror: the page may not have loaded yet, or the browser lacks the API.
Without Chrome DevTools MCP, run the same snippet with the webperf-snippets CLI, which loads the page in headless Chromium and prints the same result objects: npx webperf-snippets <url> --snippet <Name> --json, where <Name> is the script name without .js. It needs Playwright and Chromium (npm install --save-dev webperf-snippets playwright, then npx playwright install chromium), and tracking snippets take --interact-script <file> to drive the interactions.
Scripts
scripts/CLS.js— Cumulative layout shift (CLS)scripts/INP.js— Interaction to next paint (INP)scripts/LCP-Image-Entropy.js— LCP image entropyscripts/LCP-Subparts.js— LCP subpartsscripts/LCP-Trail.js— LCP trailscripts/LCP-Video-Candidate.js— LCP video candidatescripts/LCP.js— Largest contentful paint (LCP)
Common Workflows
Complete Core Web Vitals Audit
When the user asks for a comprehensive Core Web Vitals analysis or "audit CWV":
- LCP.js - Measure Largest Contentful Paint
- CLS.js - Measure Cumulative Layout Shift
- INP.js - Measure Interaction to Next Paint
- LCP-Subparts.js - Break down LCP timing phases
- LCP-Trail.js - Track LCP candidate evolution
LCP Deep Dive
When LCP is slow or the user asks "debug LCP" or "why is LCP slow":
- LCP.js - Establish baseline LCP value
- LCP-Subparts.js - Break down into TTFB, resource load, render delay
- LCP-Trail.js - Identify all LCP candidates and changes
- LCP-Image-Entropy.js - Check if LCP image has visual complexity issues
- LCP-Video-Candidate.js - Detect if LCP is a video (poster or video element)
CLS Investigation
When layout shifts are detected or the user asks "debug CLS" or "layout shift issues":
- CLS.js - Measure overall CLS score
- Layout-Shift-Loading-and-Interaction.js (pending — available in webperf-interaction skill)
- Cross-reference with webperf-loading skill:
- Find-Above-The-Fold-Lazy-Loaded-Images.js (lazy images causing shifts)
- Fonts-Preloaded-Loaded-and-used-above-the-fold.js (font swap causing shifts)
INP Debugging
When interactions feel slow or the user asks "debug INP" or "slow interactions":
- INP.js - Measure overall INP value; call
getINP()after interactions,getINPDetails()for the 15 slowest interactions - Interactions.js (pending — available in webperf-interaction skill)
- Input-Latency-Breakdown.js (pending — available in webperf-interaction skill)
- Long-Animation-Frames.js (pending — available in webperf-interaction skill)
- Long-Animation-Frames-Script-Attribution.js (pending — available in webperf-interaction skill)
Video as LCP Investigation
When LCP is a video element (detected by LCP-Video-Candidate.js):
- LCP-Video-Candidate.js - Identify video as LCP candidate
- Video-Element-Audit.js (from Media skill) - Audit video loading strategy
- LCP-Subparts.js - Analyze video loading phases
- Cross-reference with webperf-loading skill:
- Resource-Hints-Validation.js (check for video preload)
- Priority-Hints-Audit.js (check for fetchpriority on video)
Image as LCP Investigation
When LCP is an image (most common case):
- LCP.js - Measure LCP timing
- LCP-Subparts.js - Break down timing phases
- LCP-Image-Entropy.js - Analyze image complexity
- Cross-reference with webperf-media skill:
- Image-Element-Audit.js (check format, dimensions, lazy loading)
- Cross-reference with webperf-loading skill:
- Find-Above-The-Fold-Lazy-Loaded-Images.js (check if incorrectly lazy)
- Priority-Hints-Audit.js (check for fetchpriority="high")
- Resource-Hints-Validation.js (check for preload)
Decision Tree
Use this decision tree to automatically run follow-up snippets based on results:
After LCP.js
- If LCP > 2.5s → Run LCP-Subparts.js to diagnose which phase is slow
- If LCP > 4.0s (poor) → Run full LCP deep dive workflow (5 snippets)
- If LCP candidate is an image → Run LCP-Image-Entropy.js and webperf-media:Image-Element-Audit.js
- If LCP candidate is a video → Run LCP-Video-Candidate.js and webperf-media:Video-Element-Audit.js
- Always run → LCP-Trail.js to understand candidate evolution
After LCP-Subparts.js
- If TTFB phase > 600ms → Switch to webperf-loading skill and run TTFB-Sub-Parts.js
- If Resource Load Time > 1500ms → Run:
- webperf-loading:Resource-Hints-Validation.js (check for preload/preconnect)
- webperf-loading:Priority-Hints-Audit.js (check fetchpriority)
- webperf-loading:Find-render-blocking-resources.js (competing resources)
- If Render Delay > 200ms → Run:
- webperf-loading:Find-render-blocking-resources.js (blocking CSS/JS)
- webperf-loading:Script-Loading.js (parser-blocking scripts)
- webperf-interaction:Long-Animation-Frames.js (main thread blocking)
After LCP-Trail.js
- If many LCP candidate changes (>3) → This causes visual instability, investigate:
- webperf-loading:Find-Above-The-Fold-Lazy-Loaded-Images.js (late-loading images)
- webperf-loading:Fonts-Preloaded-Loaded-and-used-above-the-fold.js (font swaps)
- CLS.js (layout shifts contributing to LCP changes)
- If final LCP candidate appears late → Run webperf-loading:Resource-Hints-Validation.js
- If early candidate was replaced → Understand why initial content was pushed down (likely CLS issue)
After LCP-Image-Entropy.js
- If entropy is very high → Image is visually complex, recommend:
- Modern formats (WebP, AVIF)
- Appropriate compression
- Potentially a placeholder strategy
- If entropy is low → Image may be over-optimized or placeholder-like
- If large file size detected → Run webperf-media:Image-Element-Audit.js for format/sizing analysis
After LCP-Video-Candidate.js
- If video is LCP → Run:
- webperf-media:Video-Element-Audit.js (check poster, preload, formats)
- webperf-loading:Priority-Hints-Audit.js (check fetchpriority on poster)
- LCP-Subparts.js (analyze video loading phases)
- If poster image is LCP → Treat as image LCP (run image workflows)
After CLS.js
- If CLS > 0.1 → Run webperf-interaction:Layout-Shift-Loading-and-Interaction.js (pending — available in webperf-interaction skill)
- If CLS > 0.25 (poor) → Run comprehensive shift investigation:
- webperf-loading:Find-Above-The-Fold-Lazy-Loaded-Images.js (images without dimensions)
- webperf-loading:Fonts-Preloaded-Loaded-and-used-above-the-fold.js (font loading strategy)
- webperf-loading:Critical-CSS-Detection.js (late-loading styles)
- webperf-media:Image-Element-Audit.js (missing width/height)
- If CLS = 0 → Confirm with multiple page loads (might be timing-dependent)
After INP.js
- If INP > 200ms → Run webperf-interaction:Interactions.js to identify slow interactions
- If INP > 500ms (poor) → Run full INP debugging workflow:
- webperf-interaction:Interactions.js (list all interactions)
- webperf-interaction:Input-Latency-Breakdown.js (phase breakdown)
- webperf-interaction:Long-Animation-Frames.js (blocking frames)
- webperf-interaction:Long-Animation-Frames-Script-Attribution.js (culprit scripts)
- If specific interaction type is slow (e.g., keyboard) → Focus analysis on that interaction type
- After INP data is collected → call
getINPDetails()for the 15 slowest interactions, slowest first (useful for identifying patterns across multiple slow interactions)
Error Recovery
- If any script returns
status: "error"→ Check if the page has finished loading:- If early in load: wait and re-run the script
- If page is an SPA: user may need to navigate to the target route first
- If LCP.js / LCP-Subparts.js returns
status: "error"→ Tell the user: "LCP data is not available yet. Please ensure the page has fully loaded, then run the analysis again." - If INP.js
getINP()returnsstatus: "error"→ ThegetDataFn: "getINP"field signals the agent can retry after user interaction. Prompt the user to click, type, or scroll, then callgetINP()again.
Cross-Skill Triggers
Context fork note: This skill runs with
context: fork. Cross-skill triggers below are recommendations to report back to the parent agent, not direct calls this subagent can execute. When a cross-skill trigger fires, tell the user which skill and script to run next. Scripts marked (pending) are not yet available — skip them and note the limitation.
These triggers recommend using snippets from other skills:
From LCP to Loading Skill
- If LCP > 2.5s and TTFB phase is dominant → Use webperf-loading skill:
- TTFB.js, TTFB-Sub-Parts.js, Service-Worker-Analysis.js
- If LCP image is lazy-loaded → Use webperf-loading skill:
- Find-Above-The-Fold-Lazy-Loaded-Images.js
- If LCP has no fetchpriority → Use webperf-loading skill:
- Priority-Hints-Audit.js
From CLS to Loading Skill
- If CLS caused by fonts → Use webperf-loading skill:
- Fonts-Preloaded-Loaded-and-used-above-the-fold.js
- Resource-Hints-Validation.js (for font preload)
- If CLS caused by images → Use webperf-media skill:
- Image-Element-Audit.js (check for width/height attributes)
From INP to Interaction Skill
- If INP > 200ms → Use webperf-interaction skill for full debugging:
- Interactions.js, Input-Latency-Breakdown.js
- Long-Animation-Frames.js, Long-Animation-Frames-Script-Attribution.js
- LongTask.js (if pre-interaction blocking suspected)
From LCP/INP to Interaction Skill
- If render delay or interaction delay is high → Use webperf-interaction skill:
- Long-Animation-Frames.js (main thread blocking)
- LongTask.js (long tasks delaying rendering)
Multi-Metric Correlation
When multiple CWV metrics are poor, prioritize investigation:
- If LCP > 2.5s AND CLS > 0.1 → Likely shared root cause:
- Check for late-loading content pushing LCP element
- Run LCP-Trail.js to see LCP candidate changes
- Run Layout-Shift-Loading-and-Interaction.js to correlate timing
- If LCP > 2.5s AND INP > 200ms → Main thread congestion:
- Run Long-Animation-Frames.js
- Run webperf-loading:Script-Loading.js
- Run webperf-loading:JS-Execution-Time-Breakdown.js
- If CLS > 0.1 AND INP > 200ms → Layout thrashing or interaction-triggered shifts:
- Run Layout-Shift-Loading-and-Interaction.js
- Run Interactions.js
- Check if shifts occur during/after interactions
References
references/snippets.md— Descriptions and thresholds for each scriptreferences/schema.md— Return value schema for interpreting script output
Trending
More talk lately.about the whole repository
Who's talking about nucliweb/webperf-snippets
- A Hacker News story“Web Performance Snippets”Hacker News · May 27, 2023 · 3 points
- @nucliweb.net“📣 New webperf-snippet to measure the click interactions on the page. …”Bluesky · May 26, 2023 · 3 likes
- A Hacker News story“Web Performance Snippets”Hacker News · May 28, 2023 · 2 points
- @nucliweb.net“📣 New webperf-snippet "Largest Contentful Paint Sub-Parts" …”Bluesky · May 24, 2023 · 1 likes
- @nucliweb.net“Get your <head> in order, a new web perf snipped, by Rick Viscomi, to use in the Chrome Dev Tools How you …”Bluesky · May 22, 2023 · 1 likes
The biggest 5 of 24 mentions linking to the repository that our crawl found. Each line is their own headline.
See all 24
Talked about on GitHub, Bluesky and Hacker News (24 times).
On GitHub · 19
- Oct 30, 2026claude-code-marketplaces.github.nucliweb.webperf-snippets: 2.4.1 → 2.4.2 — sudosubin/agents.nix0 reactions
- Oct 30, 2026agent-skills.github.nucliweb.webperf-snippets: 2.4.0 → 2.4.1 — sudosubin/agents.nix0 reactions
- Oct 29, 2026claude-code-plugins.github.nucliweb.webperf-snippets: 2.4.0 → 2.4.1 — sudosubin/agents.nix0 reactions
- Oct 29, 2026claude-code-marketplaces.github.nucliweb.webperf-snippets: 2.4.0 → 2.4.1 — sudosubin/agents.nix0 reactions
- Oct 29, 2026claude-code-plugins.github.nucliweb.webperf-snippets: 2.3.0 → 2.4.0 — sudosubin/agents.nix0 reactions
14 more on GitHub
- Oct 29, 2026claude-code-marketplaces.github.nucliweb.webperf-snippets: 2.3.0 → 2.4.0 — sudosubin/agents.nix0 reactions
- Oct 29, 2026agent-skills.github.nucliweb.webperf-snippets: 2.3.0 → 2.4.0 — sudosubin/agents.nix0 reactions
- Oct 28, 2026claude-code-plugins.github.nucliweb.webperf-snippets: init at 2.3.0 — sudosubin/agents.nix0 reactions
- Oct 28, 2026claude-code-marketplaces.github.nucliweb.webperf-snippets: init at 2.3.0 — sudosubin/agents.nix0 reactions
- Oct 27, 2026agent-skills.github.nucliweb.webperf-snippets: 2.1.0 → 2.3.0 — sudosubin/agents.nix0 reactions
- Oct 25, 2026agent-skills.github.nucliweb.webperf-snippets: 2.0.1 → 2.1.0 — sudosubin/agents.nix0 reactions
- Oct 20, 2026[Candidate] nucliweb/webperf-snippets/skills/webperf - webperf — ProSkillsMD/proskills0 reactions · 1 comment
- Oct 20, 2026[Candidate] nucliweb/webperf-snippets/.claude/skills/webperf-core-web-vitals - webperf-core-web-vitals — ProSkillsMD/proskills0 reactions · 1 comment
- Oct 20, 2026[Candidate] nucliweb/webperf-snippets/.claude/skills/webperf - webperf — ProSkillsMD/proskills0 reactions · 1 comment
- Oct 16, 2026agent-skills.github.nucliweb.webperf-snippets: 1.3.0 → 2.0.1 — sudosubin/agents.nix0 reactions
- Oct 3, 2026agent-skills.github.nucliweb.webperf-snippets: 1.2.0 → 1.3.0 — sudosubin/agents.nix0 reactions
- Sep 30, 2026agent-skills.github.nucliweb.webperf-snippets: init at 1.2.0 — sudosubin/agents.nix0 reactions
- Apr 12, 2024Improve TTFB snippet — corewebvitals/pagespeed0 reactions
- Dec 7, 2022feat: add other author snippets — push-based/awesome-web-performance-snippets0 reactions
On Bluesky · 3
- May 26, 2023📣 New webperf-snippet to measure the click interactions on the page. https://github.com/nucliweb/webperf-snippets#interactions Thank you… — @nucliweb.net3 likes and reposts
- May 24, 2023📣 New webperf-snippet "Largest Contentful Paint Sub-Parts" https://github.com/nucliweb/webperf-snippets#largest-contentful-paint-sub-parts-… — @nucliweb.net1 likes and repost
- May 22, 2023Get your <head> in order, a new web perf snipped, by Rick Viscomi, to use in the Chrome Dev Tools How you order elements can have an effect… — @nucliweb.net1 likes and repost
On Hacker News · 2
- May 27, 2023Web Performance Snippets3 points
- May 28, 2023Web Performance Snippets2 points
In this repository14 other files it gives its agents.
- CLAUDE.mdCLAUDE.md
- public/llms-full.txtllms.txt
- public/llms.txtllms.txt
- webperf-core-web-vitalsSkill
- webperf-interactionSkill
- webperf-loadingSkill
- webperf-mediaSkill
- webperf-resourcesSkill
- webperfSkill
- webperf-interactionSkill
- webperf-loadingSkill
- webperf-mediaSkill
- webperf-resourcesSkill
- webperfSkill
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
Reviews can't be read right now.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

