Intelligent loading performance analysis with automated workflows for TTFB investigation (DNS/connection/server breakdown), render-blocking detection, script performance deep dive (first vs third-party attribution), font optimization, and resource hints validation. Includes decision trees that automatically analyze TTFB sub-parts when slow, detect script loading anti-patterns (async/defer/preload conflicts), identify render-blocking resources, and validate resource hints usage. Features workflows for complete loading audit (6 phases), backend performance investigation, and priority optimization. Cross-skill integration with Core Web Vitals (LCP resource loading), Interaction (script execution blocking), and Media (lazy loading strategy). Use when the user asks about TTFB, FCP, render-blocking, slow loading, font performance, script optimization, or resource hints. Compatible with Chrome DevTools MCP.
3.9k tokens
context cost
SKILL.md, read when the skill is used
37
files
ships runnable scripts
0
copies elsewhere
how many repositories repackaged it
1 454
stars on the repo
on the repository, not the skill itself
Install
one command, takes just this skill from the repository
JavaScript snippets for measuring web performance in Chrome DevTools.
Running a script
Run the script with mcp__chrome-devtools__evaluate_script and read the object it returns. The scripts have no console output, so the returned object is the result: script, status and the metric data (value, rating, details, items, issues), as described in references/schema.md.
When status is "tracking", the script keeps observing the page. After the interactions, call the function named in getDataFn with another mcp__chrome-devtools__evaluate_script call, for example getINP(), and read the object it returns.
When status is "error" or "unsupported", read error: 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/Back-Forward-Cache.js — Back Forward Cache
scripts/CSS-Media-Queries-Analysis.js — CSS media queries analysis
If preloads on async/defer scripts → Run Validate-Preload-Async-Defer-Scripts.js
After Compression-Audit.js
If uncompressed CSS/JS found → Run Find-render-blocking-resources.js to see if they block rendering
If estimated savings > 100KB → Recommend enabling gzip or brotli on the server or CDN
If corsLimitedAnalysis is true → Report the result as a lower bound and suggest Timing-Allow-Origin on resources you control
After Third-Party-Impact-by-Domain.js
If a domain is render-blocking → Recommend async, defer, lazy loading or self-hosting; run Script-Loading.js for the loading strategy
If a domain's main-thread time > 250ms → Run Long-Animation-Frames-Script-Attribution.js (webperf-interaction) to find the functions responsible, and recommend delaying or removing the script
If many domains with few requests each → Recommend auditing tags and removing unused ones
If corsLimitedAnalysis is true → Report sizes as a lower bound; use First-And-Third-Party-Script-Timings.js for timings of the hidden resources
After Service-Worker-Analysis.js
If SW overhead > 100ms → Recommend Navigation Preload API
If SW caching many resources → Run TTFB-Resources.js to verify cache hits
If SW not detected but site is SPA/PWA → Recommend implementing SW
After Fonts-Preloaded-Loaded-and-used-above-the-fold.js
If fonts preloaded but not used above-the-fold → Recommend removing preloads
If fonts used but not preloaded → Recommend adding preload
If many font variants loaded → Suggest subsetting or reducing variants, and run Webfont-Usage-Analyzer.js to find the unused ones
After Webfont-Usage-Analyzer.js
If fonts loaded but not used → Recommend removing the @font-face declaration or the preload
If faces use font-display: auto or block → Recommend swap or optional, then check Find-render-blocking-resources.js
If font bytes are high → Suggest subsetting with unicode-range and WOFF2
If the LCP element is text → Run LCP.js with the webperf-core-web-vitals skill