#659 by GitHub stars
nucliweb/webperf-snippets
Tested JavaScript snippets that measure and debug web performance. Your AI agent runs them for you, or you run them yourself in DevTools: the same code every time.
History
Review weekly changes to SKILL.md before updating. Dates mark the weeks in which we observed each version; checks apply to the recorded commits.
View weekly changes
dist/antigravity/webperf/SKILL.md
Week of Nov 2, 2026 · +5 / −5 lines
Before Instructions only → After Instructions only
1640fbff27d7 → 4605c0882e9b
- 11 version: 2.4.2
+ 11 version: 2.5.1
- 19 A collection of 56 JavaScript snippets for measuring and debugging web performance in Chrome DevTools. Each snippet runs in the page and returns a structured result object.
+ 19 A collection of 57 JavaScript snippets for measuring and debugging web performance in Chrome DevTools. Each snippet runs in the page and returns a structured result object.
- 26 | webperf-loading | 34 | "TTFB", "slow server", "FCP", "render blocking", "font loading", "script loading", "resource hints", "service worker" |
+ 26 | webperf-loading | 35 | "TTFB", "slow server", "FCP", "render blocking", "font loading", "script loading", "resource hints", "service worker" |
- 37 - `mcp__chrome-devtools__evaluate_script` → run the snippet and read the returned object, which is the result (the scripts have no console output)
- 38 - `status: "tracking"` → call the function named in `getDataFn` with another `mcp__chrome-devtools__evaluate_script` call after the interactions
+ 37 - `mcp__chrome-devtools__evaluate_script` with `sourcePath` (the absolute path of the script) and `format: "script"` → run the snippet and read the returned object, which is the result (the scripts have no console output)
+ 38 - `status: "tracking"` → call the function named in `getDataFn` with another `mcp__chrome-devtools__evaluate_script` call after the interactions, as an arrow function such as `() => getINP()`
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → 1640fbff27d7
No earlier version was observed for comparison.
dist/antigravity/webperf-core-web-vitals/SKILL.md
Week of Nov 2, 2026 · +5 / −3 lines
Before Network or broad shell → After Network or broad shell
1640fbff27d7 → 4605c0882e9b
- 14 version: 2.4.2
+ 14 version: 2.5.1
- 26 1. 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`.
- 27 2. 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.
+ 26 1. Run the script with `mcp__chrome-devtools__evaluate_script`, passing the file instead of its code: `sourcePath` with the absolute path of `scripts/<Name>.js` in this skill, and `format: "script"`, since a script runs by itself and is not a function. 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`.
+ 27 2. 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, as an arrow function in `function`, for example `() => getINP()`, and read the object it returns.
+ 29
+ 30 `sourcePath` and `format` need Chrome DevTools MCP 1.11.0 or later, and the server only reads files inside its workspace roots: the project, the temp folder and each `--workspace=<folder>` in its arguments. When it answers `Access denied`, as it does for a skill installed outside the project, such as in `~/.claude/skills/`, read the file and pass its code in `function`, still with `format: "script"`. A `--workspace` with the real folder of the skills makes the path work; the server follows symlinks, so a link to the folder is not enough.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1640fbff27d7
No earlier version was observed for comparison.
dist/antigravity/webperf-interaction/SKILL.md
Week of Nov 2, 2026 · +5 / −3 lines
Before Network or broad shell → After Network or broad shell
1640fbff27d7 → 4605c0882e9b
- 14 version: 2.4.2
+ 14 version: 2.5.1
- 26 1. 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`.
- 27 2. 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.
+ 26 1. Run the script with `mcp__chrome-devtools__evaluate_script`, passing the file instead of its code: `sourcePath` with the absolute path of `scripts/<Name>.js` in this skill, and `format: "script"`, since a script runs by itself and is not a function. 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`.
+ 27 2. 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, as an arrow function in `function`, for example `() => getINP()`, and read the object it returns.
+ 29
+ 30 `sourcePath` and `format` need Chrome DevTools MCP 1.11.0 or later, and the server only reads files inside its workspace roots: the project, the temp folder and each `--workspace=<folder>` in its arguments. When it answers `Access denied`, as it does for a skill installed outside the project, such as in `~/.claude/skills/`, read the file and pass its code in `function`, still with `format: "script"`. A `--workspace` with the real folder of the skills makes the path work; the server follows symlinks, so a link to the folder is not enough.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1640fbff27d7
No earlier version was observed for comparison.
dist/antigravity/webperf-loading/SKILL.md
Week of Nov 2, 2026 · +16 / −3 lines
Before Network or broad shell → After Network or broad shell
1640fbff27d7 → 4605c0882e9b
- 14 version: 2.4.2
+ 14 version: 2.5.1
- 26 1. 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`.
- 27 2. 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.
+ 26 1. Run the script with `mcp__chrome-devtools__evaluate_script`, passing the file instead of its code: `sourcePath` with the absolute path of `scripts/<Name>.js` in this skill, and `format: "script"`, since a script runs by itself and is not a function. 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`.
+ 27 2. 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, as an arrow function in `function`, for example `() => getINP()`, and read the object it returns.
+ 30 `sourcePath` and `format` need Chrome DevTools MCP 1.11.0 or later, and the server only reads files inside its workspace roots: the project, the temp folder and each `--workspace=<folder>` in its arguments. When it answers `Access denied`, as it does for a skill installed outside the project, such as in `~/.claude/skills/`, read the file and pass its code in `function`, still with `format: "script"`. A `--workspace` with the real folder of the skills makes the path work; the server follows symlinks, so a link to the folder is not enough.
+ 31
+ 37 - `scripts/CSS-Complexity.js` — CSS complexity
+ 273 ### After CSS-Complexity.js
+ 274
+ 275 - **If embedded-font** → Recommend serving the font as a WOFF2 file, and run **Webfont-Usage-Analyzer.js** to check its `font-display`
+ 276 - **If embedded-content** → Run **Critical-CSS-Detection.js**: embedded bytes in render-blocking CSS delay the first paint
+ 277 - **If import** → Recommend linking the imported stylesheet from the HTML or bundling it, and run **Find-render-blocking-resources.js** to see the chain
+ 278 - **If font-face-count** → Run **Webfont-Usage-Analyzer.js** to find the faces that never load
+ 279 - **If unused-keyframes** → Check that no script sets the animation before suggesting to remove it
+ 280 - **If selector-complexity** → Treat it as maintainability: only a trace with CSS selector stats (Performance panel, CSS selector costs insight) shows whether matching it is slow
+ 281 - **If corsLimitedAnalysis is true** → Report the counts as a lower bound, and suggest `crossorigin` on the `<link>` with `Access-Control-Allow-Origin` on stylesheets you control
+ 282
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1640fbff27d7
No earlier version was observed for comparison.
dist/antigravity/webperf-media/SKILL.md
Week of Nov 2, 2026 · +5 / −3 lines
Before Network or broad shell → After Network or broad shell
1640fbff27d7 → 4605c0882e9b
- 14 version: 2.4.2
+ 14 version: 2.5.1
- 26 1. 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`.
- 27 2. 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.
+ 26 1. Run the script with `mcp__chrome-devtools__evaluate_script`, passing the file instead of its code: `sourcePath` with the absolute path of `scripts/<Name>.js` in this skill, and `format: "script"`, since a script runs by itself and is not a function. 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`.
+ 27 2. 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, as an arrow function in `function`, for example `() => getINP()`, and read the object it returns.
+ 29
+ 30 `sourcePath` and `format` need Chrome DevTools MCP 1.11.0 or later, and the server only reads files inside its workspace roots: the project, the temp folder and each `--workspace=<folder>` in its arguments. When it answers `Access denied`, as it does for a skill installed outside the project, such as in `~/.claude/skills/`, read the file and pass its code in `function`, still with `format: "script"`. A `--workspace` with the real folder of the skills makes the path work; the server follows symlinks, so a link to the folder is not enough.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1640fbff27d7
No earlier version was observed for comparison.
dist/antigravity/webperf-resources/SKILL.md
Week of Nov 2, 2026 · +5 / −3 lines
Before Network or broad shell → After Network or broad shell
1640fbff27d7 → 4605c0882e9b
- 14 version: 2.4.2
+ 14 version: 2.5.1
- 26 1. 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`.
- 27 2. 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.
+ 26 1. Run the script with `mcp__chrome-devtools__evaluate_script`, passing the file instead of its code: `sourcePath` with the absolute path of `scripts/<Name>.js` in this skill, and `format: "script"`, since a script runs by itself and is not a function. 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`.
+ 27 2. 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, as an arrow function in `function`, for example `() => getINP()`, and read the object it returns.
+ 29
+ 30 `sourcePath` and `format` need Chrome DevTools MCP 1.11.0 or later, and the server only reads files inside its workspace roots: the project, the temp folder and each `--workspace=<folder>` in its arguments. When it answers `Access denied`, as it does for a skill installed outside the project, such as in `~/.claude/skills/`, read the file and pass its code in `function`, still with `format: "script"`. A `--workspace` with the real folder of the skills makes the path work; the server follows symlinks, so a link to the folder is not enough.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1640fbff27d7
No earlier version was observed for comparison.
skills/webperf/SKILL.md
Week of Nov 2, 2026 · +5 / −5 lines
Before Instructions only → After Instructions only
1640fbff27d7 → 4605c0882e9b
- 7 version: 2.4.2
+ 7 version: 2.5.1
- 15 A collection of 56 JavaScript snippets for measuring and debugging web performance in Chrome DevTools. Each snippet runs in the page and returns a structured result object.
+ 15 A collection of 57 JavaScript snippets for measuring and debugging web performance in Chrome DevTools. Each snippet runs in the page and returns a structured result object.
- 22 | webperf-loading | 34 | "TTFB", "slow server", "FCP", "render blocking", "font loading", "script loading", "resource hints", "service worker" |
+ 22 | webperf-loading | 35 | "TTFB", "slow server", "FCP", "render blocking", "font loading", "script loading", "resource hints", "service worker" |
- 33 - `mcp__chrome-devtools__evaluate_script` → run the snippet and read the returned object, which is the result (the scripts have no console output)
- 34 - `status: "tracking"` → call the function named in `getDataFn` with another `mcp__chrome-devtools__evaluate_script` call after the interactions
+ 33 - `mcp__chrome-devtools__evaluate_script` with `sourcePath` (the absolute path of the script) and `format: "script"` → run the snippet and read the returned object, which is the result (the scripts have no console output)
+ 34 - `status: "tracking"` → call the function named in `getDataFn` with another `mcp__chrome-devtools__evaluate_script` call after the interactions, as an arrow function such as `() => getINP()`
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → 1640fbff27d7
No earlier version was observed for comparison.
skills/webperf-core-web-vitals/SKILL.md
Week of Nov 2, 2026 · +5 / −3 lines
Before Network or broad shell → After Network or broad shell
1640fbff27d7 → 4605c0882e9b
- 7 version: 2.4.2
+ 7 version: 2.5.1
- 19 1. 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`.
- 20 2. 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.
+ 19 1. Run the script with `mcp__chrome-devtools__evaluate_script`, passing the file instead of its code: `sourcePath` with the absolute path of `scripts/<Name>.js` in this skill, and `format: "script"`, since a script runs by itself and is not a function. 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`.
+ 20 2. 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, as an arrow function in `function`, for example `() => getINP()`, and read the object it returns.
+ 22
+ 23 `sourcePath` and `format` need Chrome DevTools MCP 1.11.0 or later, and the server only reads files inside its workspace roots: the project, the temp folder and each `--workspace=<folder>` in its arguments. When it answers `Access denied`, as it does for a skill installed outside the project, such as in `~/.claude/skills/`, read the file and pass its code in `function`, still with `format: "script"`. A `--workspace` with the real folder of the skills makes the path work; the server follows symlinks, so a link to the folder is not enough.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1640fbff27d7
No earlier version was observed for comparison.
skills/webperf-interaction/SKILL.md
Week of Nov 2, 2026 · +5 / −3 lines
Before Network or broad shell → After Network or broad shell
1640fbff27d7 → 4605c0882e9b
- 7 version: 2.4.2
+ 7 version: 2.5.1
- 19 1. 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`.
- 20 2. 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.
+ 19 1. Run the script with `mcp__chrome-devtools__evaluate_script`, passing the file instead of its code: `sourcePath` with the absolute path of `scripts/<Name>.js` in this skill, and `format: "script"`, since a script runs by itself and is not a function. 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`.
+ 20 2. 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, as an arrow function in `function`, for example `() => getINP()`, and read the object it returns.
+ 22
+ 23 `sourcePath` and `format` need Chrome DevTools MCP 1.11.0 or later, and the server only reads files inside its workspace roots: the project, the temp folder and each `--workspace=<folder>` in its arguments. When it answers `Access denied`, as it does for a skill installed outside the project, such as in `~/.claude/skills/`, read the file and pass its code in `function`, still with `format: "script"`. A `--workspace` with the real folder of the skills makes the path work; the server follows symlinks, so a link to the folder is not enough.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1640fbff27d7
No earlier version was observed for comparison.
skills/webperf-loading/SKILL.md
Week of Nov 2, 2026 · +16 / −3 lines
Before Network or broad shell → After Network or broad shell
1640fbff27d7 → 4605c0882e9b
- 7 version: 2.4.2
+ 7 version: 2.5.1
- 19 1. 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`.
- 20 2. 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.
+ 19 1. Run the script with `mcp__chrome-devtools__evaluate_script`, passing the file instead of its code: `sourcePath` with the absolute path of `scripts/<Name>.js` in this skill, and `format: "script"`, since a script runs by itself and is not a function. 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`.
+ 20 2. 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, as an arrow function in `function`, for example `() => getINP()`, and read the object it returns.
+ 23 `sourcePath` and `format` need Chrome DevTools MCP 1.11.0 or later, and the server only reads files inside its workspace roots: the project, the temp folder and each `--workspace=<folder>` in its arguments. When it answers `Access denied`, as it does for a skill installed outside the project, such as in `~/.claude/skills/`, read the file and pass its code in `function`, still with `format: "script"`. A `--workspace` with the real folder of the skills makes the path work; the server follows symlinks, so a link to the folder is not enough.
+ 24
+ 30 - `scripts/CSS-Complexity.js` — CSS complexity
+ 266 ### After CSS-Complexity.js
+ 267
+ 268 - **If embedded-font** → Recommend serving the font as a WOFF2 file, and run **Webfont-Usage-Analyzer.js** to check its `font-display`
+ 269 - **If embedded-content** → Run **Critical-CSS-Detection.js**: embedded bytes in render-blocking CSS delay the first paint
+ 270 - **If import** → Recommend linking the imported stylesheet from the HTML or bundling it, and run **Find-render-blocking-resources.js** to see the chain
+ 271 - **If font-face-count** → Run **Webfont-Usage-Analyzer.js** to find the faces that never load
+ 272 - **If unused-keyframes** → Check that no script sets the animation before suggesting to remove it
+ 273 - **If selector-complexity** → Treat it as maintainability: only a trace with CSS selector stats (Performance panel, CSS selector costs insight) shows whether matching it is slow
+ 274 - **If corsLimitedAnalysis is true** → Report the counts as a lower bound, and suggest `crossorigin` on the `<link>` with `Access-Control-Allow-Origin` on stylesheets you control
+ 275
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1640fbff27d7
No earlier version was observed for comparison.
skills/webperf-media/SKILL.md
Week of Nov 2, 2026 · +5 / −3 lines
Before Network or broad shell → After Network or broad shell
1640fbff27d7 → 4605c0882e9b
- 7 version: 2.4.2
+ 7 version: 2.5.1
- 19 1. 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`.
- 20 2. 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.
+ 19 1. Run the script with `mcp__chrome-devtools__evaluate_script`, passing the file instead of its code: `sourcePath` with the absolute path of `scripts/<Name>.js` in this skill, and `format: "script"`, since a script runs by itself and is not a function. 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`.
+ 20 2. 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, as an arrow function in `function`, for example `() => getINP()`, and read the object it returns.
+ 22
+ 23 `sourcePath` and `format` need Chrome DevTools MCP 1.11.0 or later, and the server only reads files inside its workspace roots: the project, the temp folder and each `--workspace=<folder>` in its arguments. When it answers `Access denied`, as it does for a skill installed outside the project, such as in `~/.claude/skills/`, read the file and pass its code in `function`, still with `format: "script"`. A `--workspace` with the real folder of the skills makes the path work; the server follows symlinks, so a link to the folder is not enough.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1640fbff27d7
No earlier version was observed for comparison.
skills/webperf-resources/SKILL.md
Week of Nov 2, 2026 · +5 / −3 lines
Before Network or broad shell → After Network or broad shell
1640fbff27d7 → 4605c0882e9b
- 7 version: 2.4.2
+ 7 version: 2.5.1
- 19 1. 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`.
- 20 2. 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.
+ 19 1. Run the script with `mcp__chrome-devtools__evaluate_script`, passing the file instead of its code: `sourcePath` with the absolute path of `scripts/<Name>.js` in this skill, and `format: "script"`, since a script runs by itself and is not a function. 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`.
+ 20 2. 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, as an arrow function in `function`, for example `() => getINP()`, and read the object it returns.
+ 22
+ 23 `sourcePath` and `format` need Chrome DevTools MCP 1.11.0 or later, and the server only reads files inside its workspace roots: the project, the temp folder and each `--workspace=<folder>` in its arguments. When it answers `Access denied`, as it does for a skill installed outside the project, such as in `~/.claude/skills/`, read the file and pass its code in `function`, still with `format: "script"`. A `--workspace` with the real folder of the skills makes the path work; the server follows symlinks, so a link to the folder is not enough.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1640fbff27d7
No earlier version was observed for comparison.
Verified commit 4605c0882e9bf4e8fae1d2019e2f65e36a432ebb
git clone --filter=blob:none --no-checkout https://github.com/nucliweb/webperf-snippets.git .hotskills/nucliweb-webperf-snippets && git -C .hotskills/nucliweb-webperf-snippets checkout --detach 4605c0882e9bf4e8fae1d2019e2f65e36a432ebb
# Copy each selected skill directory from .hotskills/nucliweb-webperf-snippets into .claude/skills/<skill-name>/Heat
1.9- Star growth, last 7 daysAhead of 6% of tracked repositories
- Star growth, last 24 hoursAhead of 5% of tracked repositories
- Rank movement, last 7 daysAhead of 16% of tracked repositories
- Commits, last 30 daysAhead of 98% of tracked repositories
- Accounts asking about it through MCP, last 7 daysNot available
- Hot votes this weekAhead of 0% of tracked repositories
Heat never changes the order by stars, and sponsorship never touches it. How heat works
Stars over time
Individual skills in this repository
- webperf
dist/antigravity/webperf - webperf-core-web-vitals
dist/antigravity/webperf-core-web-vitals - webperf-interaction
dist/antigravity/webperf-interaction - webperf-loading
dist/antigravity/webperf-loading - webperf-media
dist/antigravity/webperf-media - webperf-resources
dist/antigravity/webperf-resources - webperf
skills/webperf - webperf-core-web-vitals
skills/webperf-core-web-vitals - webperf-interaction
skills/webperf-interaction - webperf-loading
skills/webperf-loading - webperf-media
skills/webperf-media - webperf-resources
skills/webperf-resources
How it works
webperf
When your agent uses it
Web performance measurement and debugging toolkit. Use when the user asks about web performance, wants to audit a page, or says "analyze performance", "debug lcp", "check ttfb", "measure core web vitals", "audit images", or similar.
What it loads into context
Frontmatter
147 tokensAlways available to the agent
SKILL.md
598 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Quick Reference
- Workflow
Files
../../../.claude-plugin/marketplace.jsonasset436 bytesSKILL.mdcore2,328 bytes../../../plugins/webperf/.claude-plugin/plugin.jsonasset549 bytes
Read SKILL.md
# WebPerf Snippets Toolkit
A collection of 57 JavaScript snippets for measuring and debugging web performance in Chrome DevTools. Each snippet runs in the page and returns a structured result object.
## Quick Reference
| Skill | Snippets | Trigger phrases |
|-------|----------|-----------------|
| webperf-core-web-vitals | 7 | "debug LCP", "slow LCP", "CLS", "layout shifts", "INP", "interaction latency", "responsiveness" |
| webperf-loading | 35 | "TTFB", "slow server", "FCP", "render blocking", "font loading", "script loading", "resource hints", "service worker" |
| webperf-interaction | 10 | "jank", "scroll performance", "long tasks", "animation frames", "INP debug" |
| webperf-media | 4 | "image audit", "lazy loading", "image optimization", "video audit" |
| webperf-resources | 1 | "network quality", "bandwidth", "connection type", "save-data" |
View the complete source on GitHubwebperf-core-web-vitals
When your agent uses it
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.
What it loads into context
Frontmatter
218 tokensAlways available to the agent
SKILL.md
3,582 tokensWhen the skill is activated
Reference documents
22,400 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Running a script
- Scripts
- Common Workflows
- Decision Tree
- References
Scripts executed separately
scripts/CLS.jsscripts/INP.jsscripts/LCP-Image-Entropy.jsscripts/LCP-Subparts.jsscripts/LCP-Trail.jsscripts/LCP-Video-Candidate.jsscripts/LCP.js
Files
SKILL.mdcore13,504 bytesreferences/schema.mddoc79,157 bytesreferences/snippets.mddoc2,861 bytesscripts/CLS.jsruns2,357 bytesscripts/INP.jsruns11,595 bytesscripts/LCP-Image-Entropy.jsruns7,499 bytesscripts/LCP-Subparts.jsruns10,310 bytesscripts/LCP-Trail.jsruns6,566 bytesscripts/LCP-Video-Candidate.jsruns7,236 bytesscripts/LCP.jsruns4,212 bytes
Read SKILL.md
# WebPerf: Core Web Vitals
JavaScript snippets for measuring web performance in Chrome DevTools.
## Running a script
1. Run the script with `mcp__chrome-devtools__evaluate_script`, passing the file instead of its code: `sourcePath` with the absolute path of `scripts/<Name>.js` in this skill, and `format: "script"`, since a script runs by itself and is not a function. 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`.
2. 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, as an arrow function in `function`, for example `() => getINP()`, and read the object it returns.
3. When `status` is `"error"` or `"unsupported"`, read `error`: the page may not have loaded yet, or the browser lacks the API.
`sourcePath` and `format` need Chrome DevTools MCP 1.11.0 or later, and the server only reads files inside its workspace roots: the project, the temp folder and each `--workspace=<folder>` in its arguments. When it answers `Access denied`, as it does for a skill installed outside the project, such as in `~/.claude/skills/`, read the file and pass its code in `function`, still with `format: "script"`. A `--workspace` with the real folder of the skills makes the path work; the server follows symlinks, so a link to the folder is not enough.
Without Chrome DevTools MCP, run the same snippet with the [webperf-snippets CLI](https://webperf-snippets.net/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.
View the complete source on GitHubwebperf-interaction
When your agent uses it
Intelligent interaction performance analysis with automated workflows for INP debugging, scroll jank investigation, and main thread blocking. Includes decision trees that automatically run script attribution when long frames detected, break down input latency phases, and correlate layout shifts with interactions. Features workflows for complete interaction audit, third-party script impact analysis, and animation performance debugging. Cross-skill integration with Core Web Vitals (INP/CLS correlation) and Loading (script execution analysis). Use when the user asks about slow interactions, janky scrolling, unresponsive pages, or INP optimization. Compatible with Chrome DevTools MCP.
What it loads into context
Frontmatter
229 tokensAlways available to the agent
SKILL.md
3,476 tokensWhen the skill is activated
Reference documents
22,732 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Running a script
- Scripts
- Common Workflows
- Decision Tree
- References
Scripts executed separately
scripts/DOM-Size-and-Depth.jsscripts/Forced-Synchronous-Layout.jsscripts/Input-Latency-Breakdown.jsscripts/Interactions.jsscripts/Layout-Shift-Loading-and-Interaction.jsscripts/Long-Animation-Frames-Helpers.jsscripts/Long-Animation-Frames-Script-Attribution.jsscripts/Long-Animation-Frames.jsscripts/LongTask.jsscripts/Scroll-Performance.js
Files
SKILL.mdcore14,218 bytesreferences/schema.mddoc79,157 bytesreferences/snippets.mddoc4,488 bytesscripts/DOM-Size-and-Depth.jsruns4,958 bytesscripts/Forced-Synchronous-Layout.jsruns6,688 bytesscripts/Input-Latency-Breakdown.jsruns7,945 bytesscripts/Interactions.jsruns7,275 bytesscripts/Layout-Shift-Loading-and-Interaction.jsruns7,426 bytesscripts/Long-Animation-Frames-Helpers.jsruns9,023 bytesscripts/Long-Animation-Frames-Script-Attribution.jsruns4,682 bytesscripts/Long-Animation-Frames.jsruns8,351 bytesscripts/LongTask.jsruns5,166 bytesscripts/Scroll-Performance.jsruns7,776 bytes
Read SKILL.md
# WebPerf: Interaction & Animation
JavaScript snippets for measuring web performance in Chrome DevTools.
## Running a script
1. Run the script with `mcp__chrome-devtools__evaluate_script`, passing the file instead of its code: `sourcePath` with the absolute path of `scripts/<Name>.js` in this skill, and `format: "script"`, since a script runs by itself and is not a function. 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`.
2. 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, as an arrow function in `function`, for example `() => getINP()`, and read the object it returns.
3. When `status` is `"error"` or `"unsupported"`, read `error`: the page may not have loaded yet, or the browser lacks the API.
`sourcePath` and `format` need Chrome DevTools MCP 1.11.0 or later, and the server only reads files inside its workspace roots: the project, the temp folder and each `--workspace=<folder>` in its arguments. When it answers `Access denied`, as it does for a skill installed outside the project, such as in `~/.claude/skills/`, read the file and pass its code in `function`, still with `format: "script"`. A `--workspace` with the real folder of the skills makes the path work; the server follows symlinks, so a link to the folder is not enough.
Without Chrome DevTools MCP, run the same snippet with the [webperf-snippets CLI](https://webperf-snippets.net/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.
View the complete source on GitHubwebperf-loading
When your agent uses it
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.
What it loads into context
Frontmatter
277 tokensAlways available to the agent
SKILL.md
4,352 tokensWhen the skill is activated
Reference documents
24,186 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Running a script
- Scripts
- Common Workflows
- Decision Tree
- References
Scripts executed separately
scripts/Back-Forward-Cache.jsscripts/CSS-Complexity.jsscripts/CSS-Media-Queries-Analysis.jsscripts/Cache-Strategy-Analysis.jsscripts/Client-Side-Redirect-Detection.jsscripts/Compression-Audit.jsscripts/Content-Visibility.jsscripts/Critical-CSS-Detection.jsscripts/Event-Processing-Time.jsscripts/FCP.jsscripts/Find-Above-The-Fold-Lazy-Loaded-Images.jsscripts/Find-Images-With-Lazy-and-Fetchpriority.jsscripts/Find-non-Lazy-Loaded-Images-outside-of-the-viewport.jsscripts/Find-render-blocking-resources.jsscripts/First-And-Third-Party-Script-Info.jsscripts/First-And-Third-Party-Script-Timings.jsscripts/Fonts-Preloaded-Loaded-and-used-above-the-fold.jsscripts/Inline-CSS-Info-and-Size.jsscripts/Inline-Script-Info-and-Size.jsscripts/JS-Execution-Time-Breakdown.jsscripts/Prefetch-Resource-Validation.jsscripts/Priority-Hints-Audit.jsscripts/Resource-Hints-Validation.jsscripts/Resource-Hints.jsscripts/SSR-Hydration-Data-Analysis.jsscripts/Script-Loading.jsscripts/Server-Timing-Early-Hints.jsscripts/Service-Worker-Analysis.jsscripts/Speculation-Rules-Inspector.jsscripts/TTFB-Resources.jsscripts/TTFB-Sub-Parts.jsscripts/TTFB.jsscripts/Third-Party-Impact-by-Domain.jsscripts/Validate-Preload-Async-Defer-Scripts.jsscripts/Webfont-Usage-Analyzer.js
Files
SKILL.mdcore17,675 bytesreferences/schema.mddoc79,157 bytesreferences/snippets.mddoc11,554 bytesscripts/Back-Forward-Cache.jsruns6,331 bytesscripts/CSS-Complexity.jsruns18,877 bytesscripts/CSS-Media-Queries-Analysis.jsruns6,145 bytesscripts/Cache-Strategy-Analysis.jsruns21,165 bytesscripts/Client-Side-Redirect-Detection.jsruns5,521 bytesscripts/Compression-Audit.jsruns4,896 bytesscripts/Content-Visibility.jsruns6,791 bytesscripts/Critical-CSS-Detection.jsruns6,230 bytesscripts/Event-Processing-Time.jsruns5,905 bytesscripts/FCP.jsruns3,793 bytesscripts/Find-Above-The-Fold-Lazy-Loaded-Images.jsruns6,599 bytesscripts/Find-Images-With-Lazy-and-Fetchpriority.jsruns3,366 bytesscripts/Find-non-Lazy-Loaded-Images-outside-of-the-viewport.jsruns7,244 bytesscripts/Find-render-blocking-resources.jsruns2,880 bytesscripts/First-And-Third-Party-Script-Info.jsruns7,470 bytesscripts/First-And-Third-Party-Script-Timings.jsruns8,072 bytesscripts/Fonts-Preloaded-Loaded-and-used-above-the-fold.jsruns7,025 bytesscripts/Inline-CSS-Info-and-Size.jsruns4,970 bytesscripts/Inline-Script-Info-and-Size.jsruns8,234 bytesscripts/JS-Execution-Time-Breakdown.jsruns8,155 bytesscripts/Prefetch-Resource-Validation.jsruns9,452 bytesscripts/Priority-Hints-Audit.jsruns6,180 bytesscripts/Resource-Hints-Validation.jsruns10,735 bytesscripts/Resource-Hints.jsruns8,981 bytesscripts/SSR-Hydration-Data-Analysis.jsruns9,288 bytesscripts/Script-Loading.jsruns9,298 bytesscripts/Server-Timing-Early-Hints.jsruns3,502 bytesscripts/Service-Worker-Analysis.jsruns7,518 bytesscripts/Speculation-Rules-Inspector.jsruns4,953 bytesscripts/TTFB-Resources.jsruns4,661 bytesscripts/TTFB-Sub-Parts.jsruns4,979 bytesscripts/TTFB.jsruns1,057 bytesscripts/Third-Party-Impact-by-Domain.jsruns7,233 bytesscripts/Validate-Preload-Async-Defer-Scripts.jsruns8,088 bytesscripts/Webfont-Usage-Analyzer.jsruns14,842 bytes
Read SKILL.md
# WebPerf: Loading Performance
JavaScript snippets for measuring web performance in Chrome DevTools.
## Running a script
1. Run the script with `mcp__chrome-devtools__evaluate_script`, passing the file instead of its code: `sourcePath` with the absolute path of `scripts/<Name>.js` in this skill, and `format: "script"`, since a script runs by itself and is not a function. 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`.
2. 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, as an arrow function in `function`, for example `() => getINP()`, and read the object it returns.
3. When `status` is `"error"` or `"unsupported"`, read `error`: the page may not have loaded yet, or the browser lacks the API.
`sourcePath` and `format` need Chrome DevTools MCP 1.11.0 or later, and the server only reads files inside its workspace roots: the project, the temp folder and each `--workspace=<folder>` in its arguments. When it answers `Access denied`, as it does for a skill installed outside the project, such as in `~/.claude/skills/`, read the file and pass its code in `function`, still with `format: "script"`. A `--workspace` with the real folder of the skills makes the path work; the server follows symlinks, so a link to the folder is not enough.
Without Chrome DevTools MCP, run the same snippet with the [webperf-snippets CLI](https://webperf-snippets.net/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.
View the complete source on GitHubwebperf-media
When your agent uses it
Intelligent media optimization with automated workflows for images, videos, and SVGs. Includes decision trees that detect LCP images (triggers format/lazy-loading/priority analysis), identify layout shift risks (missing dimensions), and flag lazy loading issues (above-fold lazy or below-fold eager). Features workflows for complete media audit, LCP image investigation, video performance (poster optimization), and SVG embedded bitmap detection. Cross-skill integration with Core Web Vitals (LCP/CLS impact) and Loading (priority hints, resource preloading). Provides performance budgets and format recommendations based on content type. Use when the user asks about image optimization, LCP is an image/video, layout shifts from media, or media loading strategy. Compatible with Chrome DevTools MCP.
What it loads into context
Frontmatter
260 tokensAlways available to the agent
SKILL.md
3,096 tokensWhen the skill is activated
Reference documents
21,962 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Running a script
- Scripts
- Common Workflows
- Decision Tree
- References
Scripts executed separately
scripts/Image-Element-Audit.jsscripts/Oversized-Images.jsscripts/SVG-Embedded-Bitmap-Analysis.jsscripts/Video-Element-Audit.js
Files
SKILL.mdcore12,633 bytesSKILL.mdcore12,633 bytesSKILL.mdcore12,633 bytesreferences/schema.mddoc79,157 bytesreferences/snippets.mddoc1,172 bytesscripts/Image-Element-Audit.jsruns12,356 bytesscripts/Oversized-Images.jsruns8,124 bytesscripts/SVG-Embedded-Bitmap-Analysis.jsruns4,926 bytesscripts/Video-Element-Audit.jsruns6,299 bytes
Read SKILL.md
# WebPerf: Media Performance
JavaScript snippets for measuring web performance in Chrome DevTools.
## Running a script
1. Run the script with `mcp__chrome-devtools__evaluate_script`, passing the file instead of its code: `sourcePath` with the absolute path of `scripts/<Name>.js` in this skill, and `format: "script"`, since a script runs by itself and is not a function. 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`.
2. 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, as an arrow function in `function`, for example `() => getINP()`, and read the object it returns.
3. When `status` is `"error"` or `"unsupported"`, read `error`: the page may not have loaded yet, or the browser lacks the API.
`sourcePath` and `format` need Chrome DevTools MCP 1.11.0 or later, and the server only reads files inside its workspace roots: the project, the temp folder and each `--workspace=<folder>` in its arguments. When it answers `Access denied`, as it does for a skill installed outside the project, such as in `~/.claude/skills/`, read the file and pass its code in `function`, still with `format: "script"`. A `--workspace` with the real folder of the skills makes the path work; the server follows symlinks, so a link to the folder is not enough.
Without Chrome DevTools MCP, run the same snippet with the [webperf-snippets CLI](https://webperf-snippets.net/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.
View the complete source on GitHubwebperf-resources
When your agent uses it
Intelligent network quality analysis with adaptive loading strategies. Detects connection type (2g/3g/4g), bandwidth, RTT, and save-data mode, then automatically triggers appropriate optimization workflows. Includes decision trees that recommend image compression for slow connections, critical CSS inlining for high RTT, and save-data optimizations (disable autoplay, reduce quality). Features connection-aware performance budgets (500KB for 2g, 1.5MB for 3g, 3MB for 4g+) and adaptive loading implementation guides. Cross-skill integration with Loading (TTFB impact), Media (responsive images), and Core Web Vitals (connection impact on LCP/INP). Use when the user asks about slow connections, mobile optimization, save-data support, or adaptive loading strategies. Compatible with Chrome DevTools MCP.
What it loads into context
Frontmatter
278 tokensAlways available to the agent
SKILL.md
2,485 tokensWhen the skill is activated
Reference documents
21,863 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Running a script
- Scripts
- Common Workflows
- Decision Tree
- References
Scripts executed separately
scripts/Network-Bandwidth-Connection-Quality.js
Files
SKILL.mdcore9,996 bytesreferences/schema.mddoc79,157 bytesreferences/snippets.mddoc536 bytesscripts/Network-Bandwidth-Connection-Quality.jsruns1,511 bytes
Read SKILL.md
# WebPerf: Resources & Network
JavaScript snippets for measuring web performance in Chrome DevTools.
## Running a script
1. Run the script with `mcp__chrome-devtools__evaluate_script`, passing the file instead of its code: `sourcePath` with the absolute path of `scripts/<Name>.js` in this skill, and `format: "script"`, since a script runs by itself and is not a function. 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`.
2. 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, as an arrow function in `function`, for example `() => getINP()`, and read the object it returns.
3. When `status` is `"error"` or `"unsupported"`, read `error`: the page may not have loaded yet, or the browser lacks the API.
`sourcePath` and `format` need Chrome DevTools MCP 1.11.0 or later, and the server only reads files inside its workspace roots: the project, the temp folder and each `--workspace=<folder>` in its arguments. When it answers `Access denied`, as it does for a skill installed outside the project, such as in `~/.claude/skills/`, read the file and pass its code in `function`, still with `format: "script"`. A `--workspace` with the real folder of the skills makes the path work; the server follows symlinks, so a link to the folder is not enough.
Without Chrome DevTools MCP, run the same snippet with the [webperf-snippets CLI](https://webperf-snippets.net/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.
View the complete source on GitHubwebperf
When your agent uses it
Web performance measurement and debugging toolkit. Use when the user asks about web performance, wants to audit a page, or says "analyze performance", "debug lcp", "check ttfb", "measure core web vitals", "audit images", or similar.
What it loads into context
Frontmatter
118 tokensAlways available to the agent
SKILL.md
569 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Quick Reference
- Workflow
Files
SKILL.mdcore2,261 bytes
Read SKILL.md
# WebPerf Snippets Toolkit
A collection of 57 JavaScript snippets for measuring and debugging web performance in Chrome DevTools. Each snippet runs in the page and returns a structured result object.
## Quick Reference
| Skill | Snippets | Trigger phrases |
|-------|----------|-----------------|
| webperf-core-web-vitals | 7 | "debug LCP", "slow LCP", "CLS", "layout shifts", "INP", "interaction latency", "responsiveness" |
| webperf-loading | 35 | "TTFB", "slow server", "FCP", "render blocking", "font loading", "script loading", "resource hints", "service worker" |
| webperf-interaction | 10 | "jank", "scroll performance", "long tasks", "animation frames", "INP debug" |
| webperf-media | 4 | "image audit", "lazy loading", "image optimization", "video audit" |
| webperf-resources | 1 | "network quality", "bandwidth", "connection type", "save-data" |
View the complete source on GitHubwebperf-core-web-vitals
When your agent uses it
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.
What it loads into context
Frontmatter
173 tokensAlways available to the agent
SKILL.md
3,537 tokensWhen the skill is activated
Reference documents
22,400 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Running a script
- Scripts
- Common Workflows
- Decision Tree
- References
Scripts executed separately
scripts/CLS.jsscripts/INP.jsscripts/LCP-Image-Entropy.jsscripts/LCP-Subparts.jsscripts/LCP-Trail.jsscripts/LCP-Video-Candidate.jsscripts/LCP.js
Files
SKILL.mdcore13,389 bytesreferences/schema.mddoc79,157 bytesreferences/snippets.mddoc2,861 bytesscripts/CLS.jsruns1,289 bytesscripts/INP.jsruns5,891 bytesscripts/LCP-Image-Entropy.jsruns4,499 bytesscripts/LCP-Subparts.jsruns4,949 bytesscripts/LCP-Trail.jsruns3,328 bytesscripts/LCP-Video-Candidate.jsruns4,503 bytesscripts/LCP.jsruns2,225 bytes
Read SKILL.md
# WebPerf: Core Web Vitals
JavaScript snippets for measuring web performance in Chrome DevTools.
## Running a script
1. Run the script with `mcp__chrome-devtools__evaluate_script`, passing the file instead of its code: `sourcePath` with the absolute path of `scripts/<Name>.js` in this skill, and `format: "script"`, since a script runs by itself and is not a function. 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`.
2. 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, as an arrow function in `function`, for example `() => getINP()`, and read the object it returns.
3. When `status` is `"error"` or `"unsupported"`, read `error`: the page may not have loaded yet, or the browser lacks the API.
`sourcePath` and `format` need Chrome DevTools MCP 1.11.0 or later, and the server only reads files inside its workspace roots: the project, the temp folder and each `--workspace=<folder>` in its arguments. When it answers `Access denied`, as it does for a skill installed outside the project, such as in `~/.claude/skills/`, read the file and pass its code in `function`, still with `format: "script"`. A `--workspace` with the real folder of the skills makes the path work; the server follows symlinks, so a link to the folder is not enough.
Without Chrome DevTools MCP, run the same snippet with the [webperf-snippets CLI](https://webperf-snippets.net/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.
View the complete source on GitHubwebperf-interaction
When your agent uses it
Intelligent interaction performance analysis with automated workflows for INP debugging, scroll jank investigation, and main thread blocking. Includes decision trees that automatically run script attribution when long frames detected, break down input latency phases, and correlate layout shifts with interactions. Features workflows for complete interaction audit, third-party script impact analysis, and animation performance debugging. Cross-skill integration with Core Web Vitals (INP/CLS correlation) and Loading (script execution analysis). Use when the user asks about slow interactions, janky scrolling, unresponsive pages, or INP optimization. Compatible with Chrome DevTools MCP.
What it loads into context
Frontmatter
184 tokensAlways available to the agent
SKILL.md
3,431 tokensWhen the skill is activated
Reference documents
22,732 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Running a script
- Scripts
- Common Workflows
- Decision Tree
- References
Scripts executed separately
scripts/DOM-Size-and-Depth.jsscripts/Forced-Synchronous-Layout.jsscripts/Input-Latency-Breakdown.jsscripts/Interactions.jsscripts/Layout-Shift-Loading-and-Interaction.jsscripts/Long-Animation-Frames-Helpers.jsscripts/Long-Animation-Frames-Script-Attribution.jsscripts/Long-Animation-Frames.jsscripts/LongTask.jsscripts/Scroll-Performance.js
Files
SKILL.mdcore14,103 bytesreferences/schema.mddoc79,157 bytesreferences/snippets.mddoc4,488 bytesscripts/DOM-Size-and-Depth.jsruns2,851 bytesscripts/Forced-Synchronous-Layout.jsruns3,894 bytesscripts/Input-Latency-Breakdown.jsruns4,386 bytesscripts/Interactions.jsruns3,818 bytesscripts/Layout-Shift-Loading-and-Interaction.jsruns3,866 bytesscripts/Long-Animation-Frames-Helpers.jsruns5,527 bytesscripts/Long-Animation-Frames-Script-Attribution.jsruns3,203 bytesscripts/Long-Animation-Frames.jsruns4,771 bytesscripts/LongTask.jsruns2,831 bytesscripts/Scroll-Performance.jsruns3,957 bytes
Read SKILL.md
# WebPerf: Interaction & Animation
JavaScript snippets for measuring web performance in Chrome DevTools.
## Running a script
1. Run the script with `mcp__chrome-devtools__evaluate_script`, passing the file instead of its code: `sourcePath` with the absolute path of `scripts/<Name>.js` in this skill, and `format: "script"`, since a script runs by itself and is not a function. 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`.
2. 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, as an arrow function in `function`, for example `() => getINP()`, and read the object it returns.
3. When `status` is `"error"` or `"unsupported"`, read `error`: the page may not have loaded yet, or the browser lacks the API.
`sourcePath` and `format` need Chrome DevTools MCP 1.11.0 or later, and the server only reads files inside its workspace roots: the project, the temp folder and each `--workspace=<folder>` in its arguments. When it answers `Access denied`, as it does for a skill installed outside the project, such as in `~/.claude/skills/`, read the file and pass its code in `function`, still with `format: "script"`. A `--workspace` with the real folder of the skills makes the path work; the server follows symlinks, so a link to the folder is not enough.
Without Chrome DevTools MCP, run the same snippet with the [webperf-snippets CLI](https://webperf-snippets.net/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.
View the complete source on GitHubwebperf-loading
When your agent uses it
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.
What it loads into context
Frontmatter
232 tokensAlways available to the agent
SKILL.md
4,307 tokensWhen the skill is activated
Reference documents
24,186 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Running a script
- Scripts
- Common Workflows
- Decision Tree
- References
Scripts executed separately
scripts/Back-Forward-Cache.jsscripts/CSS-Complexity.jsscripts/CSS-Media-Queries-Analysis.jsscripts/Cache-Strategy-Analysis.jsscripts/Client-Side-Redirect-Detection.jsscripts/Compression-Audit.jsscripts/Content-Visibility.jsscripts/Critical-CSS-Detection.jsscripts/Event-Processing-Time.jsscripts/FCP.jsscripts/Find-Above-The-Fold-Lazy-Loaded-Images.jsscripts/Find-Images-With-Lazy-and-Fetchpriority.jsscripts/Find-non-Lazy-Loaded-Images-outside-of-the-viewport.jsscripts/Find-render-blocking-resources.jsscripts/First-And-Third-Party-Script-Info.jsscripts/First-And-Third-Party-Script-Timings.jsscripts/Fonts-Preloaded-Loaded-and-used-above-the-fold.jsscripts/Inline-CSS-Info-and-Size.jsscripts/Inline-Script-Info-and-Size.jsscripts/JS-Execution-Time-Breakdown.jsscripts/Prefetch-Resource-Validation.jsscripts/Priority-Hints-Audit.jsscripts/Resource-Hints-Validation.jsscripts/Resource-Hints.jsscripts/SSR-Hydration-Data-Analysis.jsscripts/Script-Loading.jsscripts/Server-Timing-Early-Hints.jsscripts/Service-Worker-Analysis.jsscripts/Speculation-Rules-Inspector.jsscripts/TTFB-Resources.jsscripts/TTFB-Sub-Parts.jsscripts/TTFB.jsscripts/Third-Party-Impact-by-Domain.jsscripts/Validate-Preload-Async-Defer-Scripts.jsscripts/Webfont-Usage-Analyzer.js
Files
SKILL.mdcore17,560 bytesreferences/schema.mddoc79,157 bytesreferences/snippets.mddoc11,554 bytesscripts/Back-Forward-Cache.jsruns4,103 bytesscripts/CSS-Complexity.jsruns10,854 bytesscripts/CSS-Media-Queries-Analysis.jsruns3,603 bytesscripts/Cache-Strategy-Analysis.jsruns12,566 bytesscripts/Client-Side-Redirect-Detection.jsruns2,770 bytesscripts/Compression-Audit.jsruns2,747 bytesscripts/Content-Visibility.jsruns4,176 bytesscripts/Critical-CSS-Detection.jsruns3,748 bytesscripts/Event-Processing-Time.jsruns3,769 bytesscripts/FCP.jsruns1,911 bytesscripts/Find-Above-The-Fold-Lazy-Loaded-Images.jsruns4,224 bytesscripts/Find-Images-With-Lazy-and-Fetchpriority.jsruns2,015 bytesscripts/Find-non-Lazy-Loaded-Images-outside-of-the-viewport.jsruns4,400 bytesscripts/Find-render-blocking-resources.jsruns1,865 bytesscripts/First-And-Third-Party-Script-Info.jsruns4,574 bytesscripts/First-And-Third-Party-Script-Timings.jsruns4,506 bytesscripts/Fonts-Preloaded-Loaded-and-used-above-the-fold.jsruns4,068 bytesscripts/Inline-CSS-Info-and-Size.jsruns3,110 bytesscripts/Inline-Script-Info-and-Size.jsruns4,894 bytesscripts/JS-Execution-Time-Breakdown.jsruns4,584 bytesscripts/Prefetch-Resource-Validation.jsruns5,462 bytesscripts/Priority-Hints-Audit.jsruns4,207 bytesscripts/Resource-Hints-Validation.jsruns4,797 bytesscripts/Resource-Hints.jsruns5,471 bytesscripts/SSR-Hydration-Data-Analysis.jsruns5,325 bytesscripts/Script-Loading.jsruns5,240 bytesscripts/Server-Timing-Early-Hints.jsruns2,355 bytesscripts/Service-Worker-Analysis.jsruns4,248 bytesscripts/Speculation-Rules-Inspector.jsruns3,299 bytesscripts/TTFB-Resources.jsruns2,474 bytesscripts/TTFB-Sub-Parts.jsruns2,860 bytesscripts/TTFB.jsruns777 bytesscripts/Third-Party-Impact-by-Domain.jsruns3,950 bytesscripts/Validate-Preload-Async-Defer-Scripts.jsruns4,697 bytesscripts/Webfont-Usage-Analyzer.jsruns9,142 bytes
Read SKILL.md
# WebPerf: Loading Performance
JavaScript snippets for measuring web performance in Chrome DevTools.
## Running a script
1. Run the script with `mcp__chrome-devtools__evaluate_script`, passing the file instead of its code: `sourcePath` with the absolute path of `scripts/<Name>.js` in this skill, and `format: "script"`, since a script runs by itself and is not a function. 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`.
2. 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, as an arrow function in `function`, for example `() => getINP()`, and read the object it returns.
3. When `status` is `"error"` or `"unsupported"`, read `error`: the page may not have loaded yet, or the browser lacks the API.
`sourcePath` and `format` need Chrome DevTools MCP 1.11.0 or later, and the server only reads files inside its workspace roots: the project, the temp folder and each `--workspace=<folder>` in its arguments. When it answers `Access denied`, as it does for a skill installed outside the project, such as in `~/.claude/skills/`, read the file and pass its code in `function`, still with `format: "script"`. A `--workspace` with the real folder of the skills makes the path work; the server follows symlinks, so a link to the folder is not enough.
Without Chrome DevTools MCP, run the same snippet with the [webperf-snippets CLI](https://webperf-snippets.net/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.
View the complete source on GitHubwebperf-media
When your agent uses it
Intelligent media optimization with automated workflows for images, videos, and SVGs. Includes decision trees that detect LCP images (triggers format/lazy-loading/priority analysis), identify layout shift risks (missing dimensions), and flag lazy loading issues (above-fold lazy or below-fold eager). Features workflows for complete media audit, LCP image investigation, video performance (poster optimization), and SVG embedded bitmap detection. Cross-skill integration with Core Web Vitals (LCP/CLS impact) and Loading (priority hints, resource preloading). Provides performance budgets and format recommendations based on content type. Use when the user asks about image optimization, LCP is an image/video, layout shifts from media, or media loading strategy. Compatible with Chrome DevTools MCP.
What it loads into context
Frontmatter
215 tokensAlways available to the agent
SKILL.md
3,051 tokensWhen the skill is activated
Reference documents
21,962 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Running a script
- Scripts
- Common Workflows
- Decision Tree
- References
Scripts executed separately
scripts/Image-Element-Audit.jsscripts/Oversized-Images.jsscripts/SVG-Embedded-Bitmap-Analysis.jsscripts/Video-Element-Audit.js
Files
SKILL.mdcore12,518 bytesSKILL.mdcore12,518 bytesSKILL.mdcore12,518 bytesreferences/schema.mddoc79,157 bytesreferences/snippets.mddoc1,172 bytesscripts/Image-Element-Audit.jsruns7,275 bytesscripts/Oversized-Images.jsruns4,468 bytesscripts/SVG-Embedded-Bitmap-Analysis.jsruns2,888 bytesscripts/Video-Element-Audit.jsruns4,127 bytes
Read SKILL.md
# WebPerf: Media Performance
JavaScript snippets for measuring web performance in Chrome DevTools.
## Running a script
1. Run the script with `mcp__chrome-devtools__evaluate_script`, passing the file instead of its code: `sourcePath` with the absolute path of `scripts/<Name>.js` in this skill, and `format: "script"`, since a script runs by itself and is not a function. 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`.
2. 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, as an arrow function in `function`, for example `() => getINP()`, and read the object it returns.
3. When `status` is `"error"` or `"unsupported"`, read `error`: the page may not have loaded yet, or the browser lacks the API.
`sourcePath` and `format` need Chrome DevTools MCP 1.11.0 or later, and the server only reads files inside its workspace roots: the project, the temp folder and each `--workspace=<folder>` in its arguments. When it answers `Access denied`, as it does for a skill installed outside the project, such as in `~/.claude/skills/`, read the file and pass its code in `function`, still with `format: "script"`. A `--workspace` with the real folder of the skills makes the path work; the server follows symlinks, so a link to the folder is not enough.
Without Chrome DevTools MCP, run the same snippet with the [webperf-snippets CLI](https://webperf-snippets.net/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.
View the complete source on GitHubwebperf-resources
When your agent uses it
Intelligent network quality analysis with adaptive loading strategies. Detects connection type (2g/3g/4g), bandwidth, RTT, and save-data mode, then automatically triggers appropriate optimization workflows. Includes decision trees that recommend image compression for slow connections, critical CSS inlining for high RTT, and save-data optimizations (disable autoplay, reduce quality). Features connection-aware performance budgets (500KB for 2g, 1.5MB for 3g, 3MB for 4g+) and adaptive loading implementation guides. Cross-skill integration with Loading (TTFB impact), Media (responsive images), and Core Web Vitals (connection impact on LCP/INP). Use when the user asks about slow connections, mobile optimization, save-data support, or adaptive loading strategies. Compatible with Chrome DevTools MCP.
What it loads into context
Frontmatter
232 tokensAlways available to the agent
SKILL.md
2,439 tokensWhen the skill is activated
Reference documents
21,863 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Running a script
- Scripts
- Common Workflows
- Decision Tree
- References
Scripts executed separately
scripts/Network-Bandwidth-Connection-Quality.js
Files
SKILL.mdcore9,879 bytesreferences/schema.mddoc79,157 bytesreferences/snippets.mddoc536 bytesscripts/Network-Bandwidth-Connection-Quality.jsruns778 bytes
Read SKILL.md
# WebPerf: Resources & Network
JavaScript snippets for measuring web performance in Chrome DevTools.
## Running a script
1. Run the script with `mcp__chrome-devtools__evaluate_script`, passing the file instead of its code: `sourcePath` with the absolute path of `scripts/<Name>.js` in this skill, and `format: "script"`, since a script runs by itself and is not a function. 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`.
2. 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, as an arrow function in `function`, for example `() => getINP()`, and read the object it returns.
3. When `status` is `"error"` or `"unsupported"`, read `error`: the page may not have loaded yet, or the browser lacks the API.
`sourcePath` and `format` need Chrome DevTools MCP 1.11.0 or later, and the server only reads files inside its workspace roots: the project, the temp folder and each `--workspace=<folder>` in its arguments. When it answers `Access denied`, as it does for a skill installed outside the project, such as in `~/.claude/skills/`, read the file and pass its code in `function`, still with `format: "script"`. A `--workspace` with the real folder of the skills makes the path work; the server follows symlinks, so a link to the folder is not enough.
Without Chrome DevTools MCP, run the same snippet with the [webperf-snippets CLI](https://webperf-snippets.net/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.
View the complete source on GitHubSkills included
- webperf
- webperf-core-web-vitals
- webperf-interaction
- webperf-loading
- webperf-media
- webperf-resources
- webperf
- webperf-core-web-vitals
- webperf-interaction
- webperf-loading
- webperf-media
- webperf-resources
Repository facts
- License
- MIT
- Created
- May 17, 2022
- Last pushed
- Nov 5, 2026
- Forks
- 90
- Open issues
- 3
- Project activity
- Active
Rank over the last 12 weeks
Now #659 · best #454 · down 144 in 30 days
- #647 on Nov 1
- #652 on Nov 2
- #656 on Nov 3
- #657 on Nov 4
- #658 on Nov 5
- #659 since Nov 6
17 earlier periods
- #463 on Aug 1
- #454 on Aug 22
- #460 on Aug 30
- #496 on Sep 7
- #520 on Sep 16
- #515 on Sep 17
- #515 on Sep 21
- #561 on Oct 8
- #568 on Oct 14
- #568 on Oct 16
- #561 on Oct 18
- #571 on Oct 23
- #623 on Oct 25
- #634 on Oct 28
- #639 on Oct 29
- #643 on Oct 30
- #645 on Oct 31
Before you install
Network or broad shellAutomated signals, not a guarantee
Checked Nov 6, 2026
Not fully analyzed: some files were too long, unreadable or missing. This never lowers the level.
Show 29 notes
dist/antigravity/webperf-media/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzeddist/antigravity/webperf-media/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzeddist/antigravity/webperf-resources/references/snippets.md:1Analysis incomplete: Frontmatter missing closing delimiter or exceeds byte/line limitskills/webperf-core-web-vitals/scripts/INP.js:2Analysis incomplete: physical or joined line exceeds character limitskills/webperf-core-web-vitals/scripts/LCP-Image-Entropy.js:2Analysis incomplete: physical or joined line exceeds character limitskills/webperf-core-web-vitals/scripts/LCP-Subparts.js:2Analysis incomplete: physical or joined line exceeds character limitskills/webperf-core-web-vitals/scripts/LCP-Video-Candidate.js:2Analysis incomplete: physical or joined line exceeds character limitskills/webperf-interaction/scripts/Input-Latency-Breakdown.js:2Analysis incomplete: physical or joined line exceeds character limitskills/webperf-interaction/scripts/Long-Animation-Frames-Helpers.js:2Analysis incomplete: physical or joined line exceeds character limitskills/webperf-interaction/scripts/Long-Animation-Frames.js:2Analysis incomplete: physical or joined line exceeds character limitskills/webperf-loading/scripts/CSS-Complexity.js:2Analysis incomplete: physical or joined line exceeds character limitskills/webperf-loading/scripts/Cache-Strategy-Analysis.js:2Analysis incomplete: physical or joined line exceeds character limitskills/webperf-loading/scripts/Find-non-Lazy-Loaded-Images-outside-of-the-viewport.js:2Analysis incomplete: physical or joined line exceeds character limitskills/webperf-loading/scripts/First-And-Third-Party-Script-Info.js:2Analysis incomplete: physical or joined line exceeds character limitskills/webperf-loading/scripts/First-And-Third-Party-Script-Timings.js:2Analysis incomplete: physical or joined line exceeds character limitskills/webperf-loading/scripts/Inline-Script-Info-and-Size.js:2Analysis incomplete: physical or joined line exceeds character limitskills/webperf-loading/scripts/JS-Execution-Time-Breakdown.js:2Analysis incomplete: physical or joined line exceeds character limitskills/webperf-loading/scripts/Prefetch-Resource-Validation.js:2Analysis incomplete: physical or joined line exceeds character limitskills/webperf-loading/scripts/Resource-Hints-Validation.js:2Analysis incomplete: physical or joined line exceeds character limitskills/webperf-loading/scripts/Resource-Hints.js:2Analysis incomplete: physical or joined line exceeds character limit
- 2 broad permissionsin 2 files: webperf-resources/references/snippets.md:1 webperf-resources/references/snippets.md:1
- No dangerous shell commands
- 603 network referencesin 88 files: webperf-core-web-vitals/references/schema.md:210 webperf-interaction/references/schema.md:210 webperf-loading/references/schema.md:210 and 85 more
- 54 obfuscation signalsin 54 files: webperf-core-web-vitals/scripts/INP.js:2 webperf-core-web-vitals/scripts/LCP-Image-Entropy.js:2 webperf-core-web-vitals/scripts/LCP-Subparts.js:2 and 51 more
- No instruction overrides
- 114 executable scriptsin 114 files: webperf-core-web-vitals/scripts/CLS.js:1 webperf-core-web-vitals/scripts/INP.js:1 webperf-core-web-vitals/scripts/LCP-Image-Entropy.js:1 and 111 more
- 2 references to secretsin 2 files: webperf-loading/scripts/SSR-Hydration-Data-Analysis.js:154 webperf-loading/scripts/SSR-Hydration-Data-Analysis.js:2
- No requests to vote in Hot
Show all 775 signals by file
.claude-plugin/marketplace.json
dist/antigravity/webperf-core-web-vitals/SKILL.md
- Network accessline 15
mcp-server: chrome-devtools category: web-performance repository: https://github.com/nucliweb/webperf-snippets - Network accessline 16
category: web-performance repository: https://github.com/nucliweb/webperf-snippets --- - Network accessline 17
repository: https://github.com/nucliweb/webperf-snippets - Network accessline 32
Without Chrome DevTools MCP, run the same snippet with the [webperf-snippets CLI](https://webperf-snippets.net/CLI), which loads the page in headless Chromium and prints the same result objects: `npx webperf-snippets <url> --snippet <Name>
dist/antigravity/webperf-core-web-vitals/references/schema.md
- Network accessline 210
"element": "img.hero", "elementType": "Image", "url": "https://example.com/hero.jpg", - Network accessline 211
"elementType": "Image", "url": "https://example.com/hero.jpg", "sizePixels": 756000 - Network accessline 212
"url": "https://example.com/hero.jpg", - Network accessline 417
"details": { "isVideo": true, "posterUrl": "https://example.com/hero.avif", - Network accessline 418
"isVideo": true, "posterUrl": "https://example.com/hero.avif", "posterFormat": "avif", - Network accessline 419
"posterUrl": "https://example.com/hero.avif", - Network accessline 493
{ "type": "link", "url": "https://example.com/style.css", - Network accessline 494
"type": "link", "url": "https://example.com/style.css", "shortName": "style.css", - Network accessline 495
"url": "https://example.com/style.css", - Network accessline 522
"items": [ { "url": "https://example.com/app.js", - Network accessline 523
{ "url": "https://example.com/app.js", "shortName": "app.js", - Network accessline 524
"url": "https://example.com/app.js", - Network accessline 562
"items": [ { "url": "https://example.com/app.css", - Network accessline 563
{ "url": "https://example.com/app.css", "shortName": "app.css", - Network accessline 564
"url": "https://example.com/app.css", - Network accessline 669
"items": [ { "scope": "https://example.com/", - Network accessline 670
{ "scope": "https://example.com/", "scriptURL": "https://example.com/sw.js", - Network accessline 671
"scope": "https://example.com/", - Network accessline 672
"scriptURL": "https://example.com/sw.js", - Network accessline 746
"missingPreconnectsCount": 1, "missingPreconnects": [ { "origin": "https://cdn.example", "requestCount": 6, "sizeBytes": 84000, "resourceTypes": ["script", "img"], "recommendedHint": "preconnect" } - Network accessline 747
"missingPreconnects": [ { "origin": "https://cdn.example", "requestCount": 6, "sizeBytes": 84000, "resourceTypes": ["script", "img"], "recommendedHint": "preconnect" } ] - Network accessline 748
{ "origin": "https://cdn.example", "requestCount": 6, "sizeBytes": 84000, "resourceTypes": ["script", "img"], "recommendedHint": "preconnect" } - Network accessline 761
"status": "ok", "items": [ { "domain": "https://old.example", "href": "https://old.example/", "requestCount": 0, "action": "remove-unused-preconnect", "recommendedHint": null }, - Network accessline 762
"items": [ { "domain": "https://old.example", "href": "https://old.example/", "requestCount": 0, "action": "remove-unused-preconnect", "recommendedHint": null }, { "domain": "https://cdn.example", "href": null, "requestCount": 6, "a - Network accessline 763
{ "domain": "https://old.example", "href": "https://old.example/", "requestCount": 0, "action": "remove-unused-preconnect", "recommendedHint": null }, - Network accessline 764
{ "domain": "https://cdn.example", "href": null, "requestCount": 6, "action": "add-preconnect", "recommendedHint": "preconnect" }, - Network accessline 765
{ "domain": "https://fonts.example", "href": null, "requestCount": 2, "action": "remove-dns-prefetch", "recommendedHint": "preconnect" } - Network accessline 796
"preloadedNotUsedCount": 0, "usedNotPreloadedCount": 0, "preloadedFonts": [{ "family": "inter", "href": "https://cdn.example/inter.woff2", "fontType": "font/woff2", "crossorigin": "anonymous", "thirdParty": true }] - Network accessline 797
"usedNotPreloadedCount": 0, "preloadedFonts": [{ "family": "inter", "href": "https://cdn.example/inter.woff2", "fontType": "font/woff2", "crossorigin": "anonymous", "thirdParty": true }] }, - Network accessline 798
"preloadedFonts": [{ "family": "inter", "href": "https://cdn.example/inter.woff2", "fontType": "font/woff2", "crossorigin": "anonymous", "thirdParty": true }] - Network accessline 833
`details` counts what the CSSOM keeps of the CSS as written, as [css-analyzer](https://github.com/projectwallace/css-analyzer) counts its text: rules (style rules, nested and inside at-rules), selectors (each one of a list), declarations (a - Network accessline 862
}, "items": [ { "source": "https://example.com/app.css", "read": "cssom", "ruleCount": 790, "embeddedBytes": 41210, "importCount": 1, "importantCount": 48 }, - Network accessline 863
"items": [ { "source": "https://example.com/app.css", "read": "cssom", "ruleCount": 790, "embeddedBytes": 41210, "importCount": 1, "importantCount": 48 }, { "source": "https://cdn.example.com/vendor.css", "read": "fetched", "ruleCou - Network accessline 864
{ "source": "https://example.com/app.css", "read": "cssom", "ruleCount": 790, "embeddedBytes": 41210, "importCount": 1, "importantCount": 48 }, - Network accessline 865
{ "source": "https://cdn.example.com/vendor.css", "read": "fetched", "ruleCount": 22, "embeddedBytes": 0, "importCount": 0, "importantCount": 3 } - Network accessline 866
], "issues": [{ "code": "import", "severity": "warning", "message": "https://example.com/app.css imports https://cdn.example.com/vendor.css with @import: ...", "target": "https://cdn.example.com/vendor.css" }] } - Network accessline 867
"issues": [{ "code": "import", "severity": "warning", "message": "https://example.com/app.css imports https://cdn.example.com/vendor.css with @import: ...", "target": "https://cdn.example.com/vendor.css" }] - Network accessline 886
"properties": 5, "bytes": 160, "bySource": [{ "source": "https://example.com/app.css", "inline": false, "rules": 3, "bytes": 160 }], - Network accessline 887
"bytes": 160, "bySource": [{ "source": "https://example.com/app.css", "inline": false, "rules": 3, "bytes": 160 }], "corsBlockedCount": 0 - Network accessline 888
"bySource": [{ "source": "https://example.com/app.css", "inline": false, "rules": 3, "bytes": 160 }], - Network accessline 1154
`items` holds the 50 images to look at first: the LCP image, then those with the most errors and warnings. `count` and `details` cover every image. The format comes from the `Content-Type` of the response; when a cross-origin image blocks ` - Network accessline 1211
"details": { "devicePixelRatio": 2, "totalImages": 9, "imagesChecked": 7, "oversized": 1, "undersized": 0, "wastedPixels": 1800000, "wastedBytes": 1614610, "skippedHidden": 1, "skippedNotLoaded": 1, "skippedVector": 0 }, "items": [ { - Network accessline 1212
"items": [ { "selector": "#hero", "url": "https://example.com/hero.png", "verdict": "oversized", "naturalWidth": 1600, "naturalHeight": 1200, "renderedWidth": 200, "renderedHeight": 150, "neededWidth": 400, "neededHeight": 300, "ratio": - Network accessline 1213
{ "selector": "#hero", "url": "https://example.com/hero.png", "verdict": "oversized", "naturalWidth": 1600, "naturalHeight": 1200, "renderedWidth": 200, "renderedHeight": 150, "neededWidth": 400, "neededHeight": 300, "ratio": 4, "wastedPixe
dist/antigravity/webperf-core-web-vitals/scripts/CLS.js
- Executable scriptline 1
Executable file
dist/antigravity/webperf-core-web-vitals/scripts/INP.js
- Executable scriptline 1
Executable file
dist/antigravity/webperf-core-web-vitals/scripts/LCP-Image-Entropy.js
- Executable scriptline 1
Executable file
dist/antigravity/webperf-core-web-vitals/scripts/LCP-Subparts.js
- Executable scriptline 1
Executable file
dist/antigravity/webperf-core-web-vitals/scripts/LCP-Trail.js
- Executable scriptline 1
Executable file
dist/antigravity/webperf-core-web-vitals/scripts/LCP-Video-Candidate.js
- Executable scriptline 1
Executable file
dist/antigravity/webperf-core-web-vitals/scripts/LCP.js
- Executable scriptline 1
Executable file
dist/antigravity/webperf-interaction/SKILL.md
- Network accessline 15
mcp-server: chrome-devtools category: web-performance repository: https://github.com/nucliweb/webperf-snippets - Network accessline 16
category: web-performance repository: https://github.com/nucliweb/webperf-snippets --- - Network accessline 17
repository: https://github.com/nucliweb/webperf-snippets - Network accessline 32
Without Chrome DevTools MCP, run the same snippet with the [webperf-snippets CLI](https://webperf-snippets.net/CLI), which loads the page in headless Chromium and prints the same result objects: `npx webperf-snippets <url> --snippet <Name>
dist/antigravity/webperf-interaction/references/schema.md
- Network accessline 210
"element": "img.hero", "elementType": "Image", "url": "https://example.com/hero.jpg", - Network accessline 211
"elementType": "Image", "url": "https://example.com/hero.jpg", "sizePixels": 756000 - Network accessline 212
"url": "https://example.com/hero.jpg", - Network accessline 417
"details": { "isVideo": true, "posterUrl": "https://example.com/hero.avif", - Network accessline 418
"isVideo": true, "posterUrl": "https://example.com/hero.avif", "posterFormat": "avif", - Network accessline 419
"posterUrl": "https://example.com/hero.avif", - Network accessline 493
{ "type": "link", "url": "https://example.com/style.css", - Network accessline 494
"type": "link", "url": "https://example.com/style.css", "shortName": "style.css", - Network accessline 495
"url": "https://example.com/style.css", - Network accessline 522
"items": [ { "url": "https://example.com/app.js", - Network accessline 523
{ "url": "https://example.com/app.js", "shortName": "app.js", - Network accessline 524
"url": "https://example.com/app.js", - Network accessline 562
"items": [ { "url": "https://example.com/app.css", - Network accessline 563
{ "url": "https://example.com/app.css", "shortName": "app.css", - Network accessline 564
"url": "https://example.com/app.css", - Network accessline 669
"items": [ { "scope": "https://example.com/", - Network accessline 670
{ "scope": "https://example.com/", "scriptURL": "https://example.com/sw.js", - Network accessline 671
"scope": "https://example.com/", - Network accessline 672
"scriptURL": "https://example.com/sw.js", - Network accessline 746
"missingPreconnectsCount": 1, "missingPreconnects": [ { "origin": "https://cdn.example", "requestCount": 6, "sizeBytes": 84000, "resourceTypes": ["script", "img"], "recommendedHint": "preconnect" } - Network accessline 747
"missingPreconnects": [ { "origin": "https://cdn.example", "requestCount": 6, "sizeBytes": 84000, "resourceTypes": ["script", "img"], "recommendedHint": "preconnect" } ] - Network accessline 748
{ "origin": "https://cdn.example", "requestCount": 6, "sizeBytes": 84000, "resourceTypes": ["script", "img"], "recommendedHint": "preconnect" } - Network accessline 761
"status": "ok", "items": [ { "domain": "https://old.example", "href": "https://old.example/", "requestCount": 0, "action": "remove-unused-preconnect", "recommendedHint": null }, - Network accessline 762
"items": [ { "domain": "https://old.example", "href": "https://old.example/", "requestCount": 0, "action": "remove-unused-preconnect", "recommendedHint": null }, { "domain": "https://cdn.example", "href": null, "requestCount": 6, "a - Network accessline 763
{ "domain": "https://old.example", "href": "https://old.example/", "requestCount": 0, "action": "remove-unused-preconnect", "recommendedHint": null }, - Network accessline 764
{ "domain": "https://cdn.example", "href": null, "requestCount": 6, "action": "add-preconnect", "recommendedHint": "preconnect" }, - Network accessline 765
{ "domain": "https://fonts.example", "href": null, "requestCount": 2, "action": "remove-dns-prefetch", "recommendedHint": "preconnect" } - Network accessline 796
"preloadedNotUsedCount": 0, "usedNotPreloadedCount": 0, "preloadedFonts": [{ "family": "inter", "href": "https://cdn.example/inter.woff2", "fontType": "font/woff2", "crossorigin": "anonymous", "thirdParty": true }] - Network accessline 797
"usedNotPreloadedCount": 0, "preloadedFonts": [{ "family": "inter", "href": "https://cdn.example/inter.woff2", "fontType": "font/woff2", "crossorigin": "anonymous", "thirdParty": true }] }, - Network accessline 798
"preloadedFonts": [{ "family": "inter", "href": "https://cdn.example/inter.woff2", "fontType": "font/woff2", "crossorigin": "anonymous", "thirdParty": true }] - Network accessline 833
`details` counts what the CSSOM keeps of the CSS as written, as [css-analyzer](https://github.com/projectwallace/css-analyzer) counts its text: rules (style rules, nested and inside at-rules), selectors (each one of a list), declarations (a - Network accessline 862
}, "items": [ { "source": "https://example.com/app.css", "read": "cssom", "ruleCount": 790, "embeddedBytes": 41210, "importCount": 1, "importantCount": 48 }, - Network accessline 863
"items": [ { "source": "https://example.com/app.css", "read": "cssom", "ruleCount": 790, "embeddedBytes": 41210, "importCount": 1, "importantCount": 48 }, { "source": "https://cdn.example.com/vendor.css", "read": "fetched", "ruleCou - Network accessline 864
{ "source": "https://example.com/app.css", "read": "cssom", "ruleCount": 790, "embeddedBytes": 41210, "importCount": 1, "importantCount": 48 }, - Network accessline 865
{ "source": "https://cdn.example.com/vendor.css", "read": "fetched", "ruleCount": 22, "embeddedBytes": 0, "importCount": 0, "importantCount": 3 } - Network accessline 866
], "issues": [{ "code": "import", "severity": "warning", "message": "https://example.com/app.css imports https://cdn.example.com/vendor.css with @import: ...", "target": "https://cdn.example.com/vendor.css" }] } - Network accessline 867
"issues": [{ "code": "import", "severity": "warning", "message": "https://example.com/app.css imports https://cdn.example.com/vendor.css with @import: ...", "target": "https://cdn.example.com/vendor.css" }] - Network accessline 886
"properties": 5, "bytes": 160, "bySource": [{ "source": "https://example.com/app.css", "inline": false, "rules": 3, "bytes": 160 }], - Network accessline 887
"bytes": 160, "bySource": [{ "source": "https://example.com/app.css", "inline": false, "rules": 3, "bytes": 160 }], "corsBlockedCount": 0 - Network accessline 888
"bySource": [{ "source": "https://example.com/app.css", "inline": false, "rules": 3, "bytes": 160 }], - Network accessline 1154
`items` holds the 50 images to look at first: the LCP image, then those with the most errors and warnings. `count` and `details` cover every image. The format comes from the `Content-Type` of the response; when a cross-origin image blocks ` - Network accessline 1211
"details": { "devicePixelRatio": 2, "totalImages": 9, "imagesChecked": 7, "oversized": 1, "undersized": 0, "wastedPixels": 1800000, "wastedBytes": 1614610, "skippedHidden": 1, "skippedNotLoaded": 1, "skippedVector": 0 }, "items": [ { - Network accessline 1212
"items": [ { "selector": "#hero", "url": "https://example.com/hero.png", "verdict": "oversized", "naturalWidth": 1600, "naturalHeight": 1200, "renderedWidth": 200, "renderedHeight": 150, "neededWidth": 400, "neededHeight": 300, "ratio": - Network accessline 1213
{ "selector": "#hero", "url": "https://example.com/hero.png", "verdict": "oversized", "naturalWidth": 1600, "naturalHeight": 1200, "renderedWidth": 200, "renderedHeight": 150, "neededWidth": 400, "neededHeight": 300, "ratio": 4, "wastedPixe
dist/antigravity/webperf-interaction/scripts/DOM-Size-and-Depth.js
- Executable scriptline 1
Executable file
dist/antigravity/webperf-interaction/scripts/Forced-Synchronous-Layout.js
- Executable scriptline 1
Executable file
dist/antigravity/webperf-interaction/scripts/Input-Latency-Breakdown.js
- Executable scriptline 1
Executable file
dist/antigravity/webperf-interaction/scripts/Interactions.js
- Executable scriptline 1
Executable file
dist/antigravity/webperf-interaction/scripts/Layout-Shift-Loading-and-Interaction.js
- Executable scriptline 1
Executable file
dist/antigravity/webperf-interaction/scripts/Long-Animation-Frames-Helpers.js
- Executable scriptline 1
Executable file
dist/antigravity/webperf-interaction/scripts/Long-Animation-Frames-Script-Attribution.js
- Executable scriptline 1
Executable file
dist/antigravity/webperf-interaction/scripts/Long-Animation-Frames.js
- Executable scriptline 1
Executable file
dist/antigravity/webperf-interaction/scripts/LongTask.js
- Executable scriptline 1
Executable file
dist/antigravity/webperf-interaction/scripts/Scroll-Performance.js
- Executable scriptline 1
Executable file
dist/antigravity/webperf-loading/SKILL.md
- Network accessline 15
mcp-server: chrome-devtools category: web-performance repository: https://github.com/nucliweb/webperf-snippets - Network accessline 16
category: web-performance repository: https://github.com/nucliweb/webperf-snippets --- - Network accessline 17
repository: https://github.com/nucliweb/webperf-snippets - Network accessline 32
Without Chrome DevTools MCP, run the same snippet with the [webperf-snippets CLI](https://webperf-snippets.net/CLI), which loads the page in headless Chromium and prints the same result objects: `npx webperf-snippets <url> --snippet <Name>
dist/antigravity/webperf-loading/references/schema.md
- Network accessline 210
"element": "img.hero", "elementType": "Image", "url": "https://example.com/hero.jpg", - Network accessline 211
"elementType": "Image", "url": "https://example.com/hero.jpg", "sizePixels": 756000 - Network accessline 212
"url": "https://example.com/hero.jpg", - Network accessline 417
"details": { "isVideo": true, "posterUrl": "https://example.com/hero.avif", - Network accessline 418
"isVideo": true, "posterUrl": "https://example.com/hero.avif", "posterFormat": "avif", - Network accessline 419
"posterUrl": "https://example.com/hero.avif", - Network accessline 493
{ "type": "link", "url": "https://example.com/style.css", - Network accessline 494
"type": "link", "url": "https://example.com/style.css", "shortName": "style.css", - Network accessline 495
"url": "https://example.com/style.css", - Network accessline 522
"items": [ { "url": "https://example.com/app.js", - Network accessline 523
{ "url": "https://example.com/app.js", "shortName": "app.js", - Network accessline 524
"url": "https://example.com/app.js", - Network accessline 562
"items": [ { "url": "https://example.com/app.css", - Network accessline 563
{ "url": "https://example.com/app.css", "shortName": "app.css", - Network accessline 564
"url": "https://example.com/app.css", - Network accessline 669
"items": [ { "scope": "https://example.com/", - Network accessline 670
{ "scope": "https://example.com/", "scriptURL": "https://example.com/sw.js", - Network accessline 671
"scope": "https://example.com/", - Network accessline 672
"scriptURL": "https://example.com/sw.js", - Network accessline 746
"missingPreconnectsCount": 1, "missingPreconnects": [ { "origin": "https://cdn.example", "requestCount": 6, "sizeBytes": 84000, "resourceTypes": ["script", "img"], "recommendedHint": "preconnect" } - Network accessline 747
"missingPreconnects": [ { "origin": "https://cdn.example", "requestCount": 6, "sizeBytes": 84000, "resourceTypes": ["script", "img"], "recommendedHint": "preconnect" } ] - Network accessline 748
{ "origin": "https://cdn.example", "requestCount": 6, "sizeBytes": 84000, "resourceTypes": ["script", "img"], "recommendedHint": "preconnect" } - Network accessline 761
"status": "ok", "items": [ { "domain": "https://old.example", "href": "https://old.example/", "requestCount": 0, "action": "remove-unused-preconnect", "recommendedHint": null }, - Network accessline 762
"items": [ { "domain": "https://old.example", "href": "https://old.example/", "requestCount": 0, "action": "remove-unused-preconnect", "recommendedHint": null }, { "domain": "https://cdn.example", "href": null, "requestCount": 6, "a - Network accessline 763
{ "domain": "https://old.example", "href": "https://old.example/", "requestCount": 0, "action": "remove-unused-preconnect", "recommendedHint": null }, - Network accessline 764
{ "domain": "https://cdn.example", "href": null, "requestCount": 6, "action": "add-preconnect", "recommendedHint": "preconnect" }, - Network accessline 765
{ "domain": "https://fonts.example", "href": null, "requestCount": 2, "action": "remove-dns-prefetch", "recommendedHint": "preconnect" } - Network accessline 796
"preloadedNotUsedCount": 0, "usedNotPreloadedCount": 0, "preloadedFonts": [{ "family": "inter", "href": "https://cdn.example/inter.woff2", "fontType": "font/woff2", "crossorigin": "anonymous", "thirdParty": true }] - Network accessline 797
"usedNotPreloadedCount": 0, "preloadedFonts": [{ "family": "inter", "href": "https://cdn.example/inter.woff2", "fontType": "font/woff2", "crossorigin": "anonymous", "thirdParty": true }] }, - Network accessline 798
"preloadedFonts": [{ "family": "inter", "href": "https://cdn.example/inter.woff2", "fontType": "font/woff2", "crossorigin": "anonymous", "thirdParty": true }] - Network accessline 833
`details` counts what the CSSOM keeps of the CSS as written, as [css-analyzer](https://github.com/projectwallace/css-analyzer) counts its text: rules (style rules, nested and inside at-rules), selectors (each one of a list), declarations (a - Network accessline 862
}, "items": [ { "source": "https://example.com/app.css", "read": "cssom", "ruleCount": 790, "embeddedBytes": 41210, "importCount": 1, "importantCount": 48 }, - Network accessline 863
"items": [ { "source": "https://example.com/app.css", "read": "cssom", "ruleCount": 790, "embeddedBytes": 41210, "importCount": 1, "importantCount": 48 }, { "source": "https://cdn.example.com/vendor.css", "read": "fetched", "ruleCou - Network accessline 864
{ "source": "https://example.com/app.css", "read": "cssom", "ruleCount": 790, "embeddedBytes": 41210, "importCount": 1, "importantCount": 48 }, - Network accessline 865
{ "source": "https://cdn.example.com/vendor.css", "read": "fetched", "ruleCount": 22, "embeddedBytes": 0, "importCount": 0, "importantCount": 3 } - Network accessline 866
], "issues": [{ "code": "import", "severity": "warning", "message": "https://example.com/app.css imports https://cdn.example.com/vendor.css with @import: ...", "target": "https://cdn.example.com/vendor.css" }] } - Network accessline 867
"issues": [{ "code": "import", "severity": "warning", "message": "https://example.com/app.css imports https://cdn.example.com/vendor.css with @import: ...", "target": "https://cdn.example.com/vendor.css" }] - Network accessline 886
"properties": 5, "bytes": 160, "bySource": [{ "source": "https://example.com/app.css", "inline": false, "rules": 3, "bytes": 160 }], - Network accessline 887
"bytes": 160, "bySource": [{ "source": "https://example.com/app.css", "inline": false, "rules": 3, "bytes": 160 }], "corsBlockedCount": 0 - Network accessline 888
"bySource": [{ "source": "https://example.com/app.css", "inline": false, "rules": 3, "bytes": 160 }], - Network accessline 1154
`items` holds the 50 images to look at first: the LCP image, then those with the most errors and warnings. `count` and `details` cover every image. The format comes from the `Content-Type` of the response; when a cross-origin image blocks ` - Network accessline 1211
"details": { "devicePixelRatio": 2, "totalImages": 9, "imagesChecked": 7, "oversized": 1, "undersized": 0, "wastedPixels": 1800000, "wastedBytes": 1614610, "skippedHidden": 1, "skippedNotLoaded": 1, "skippedVector": 0 }, "items": [ { - Network accessline 1212
"items": [ { "selector": "#hero", "url": "https://example.com/hero.png", "verdict": "oversized", "naturalWidth": 1600, "naturalHeight": 1200, "renderedWidth": 200, "renderedHeight": 150, "neededWidth": 400, "neededHeight": 300, "ratio": - Network accessline 1213
{ "selector": "#hero", "url": "https://example.com/hero.png", "verdict": "oversized", "naturalWidth": 1600, "naturalHeight": 1200, "renderedWidth": 200, "renderedHeight": 150, "neededWidth": 400, "neededHeight": 300, "ratio": 4, "wastedPixe
dist/antigravity/webperf-loading/scripts/Back-Forward-Cache.js
- Executable scriptline 1
Executable file - Network accessline 65
}); if (/^https?:$/.test(location.protocol)) try { const res = await fetch(ownRequestUrl(location.href), { - Network accessline 66
if (/^https?:$/.test(location.protocol)) try { const res = await fetch(ownRequestUrl(location.href), { method: "HEAD", - Network accessline 67
const res = await fetch(ownRequestUrl(location.href), {
dist/antigravity/webperf-loading/scripts/CSS-Complexity.js
- Executable scriptline 1
Executable file - Network accessline 172
async function fetchSheet(href) { try { const response = await fetch(ownRequestUrl(href)); - Network accessline 173
try { const response = await fetch(ownRequestUrl(href)); if (!response.ok) return null; - Network accessline 174
const response = await fetch(ownRequestUrl(href)); - Network accessline 424
code: "unreadable-stylesheets", severity: "info", message: `${plural(unreadable.length, "cross-origin stylesheet")} could not be read, by the page or with fetch (no Access-Control-Allow-Origin), so the counts are a lower bound: ${un - Network accessline 425
severity: "info", message: `${plural(unreadable.length, "cross-origin stylesheet")} could not be read, by the page or with fetch (no Access-Control-Allow-Origin), so the counts are a lower bound: ${unreadable.map(s => s.source).join(", - Network accessline 426
message: `${plural(unreadable.length, "cross-origin stylesheet")} could not be read, by the page or with fetch (no Access-Control-Allow-Origin), so the counts are a lower bound: ${unreadable.map(s => s.source).join(", ")}`
dist/antigravity/webperf-loading/scripts/CSS-Media-Queries-Analysis.js
- Executable scriptline 1
Executable file - Network accessline 75
} catch { if (sheet.href) try { const response = await fetch(ownRequestUrl(sheet.href)); - Network accessline 76
if (sheet.href) try { const response = await fetch(ownRequestUrl(sheet.href)); parseMediaQueriesFromCSS(await response.text(), sheet.href); - Network accessline 77
const response = await fetch(ownRequestUrl(sheet.href));
dist/antigravity/webperf-loading/scripts/Cache-Strategy-Analysis.js
- Executable scriptline 1
Executable file - Network accessline 193
await Promise.allSettled(batch.map(async url => { try { const resp = await fetch(ownRequestUrl(url), { - Network accessline 194
try { const resp = await fetch(ownRequestUrl(url), { method: "HEAD", - Network accessline 195
const resp = await fetch(ownRequestUrl(url), { - Network accessline 336
code: "header-coverage", id: "header-coverage", message: `Cache headers were read for ${headersAnalyzed} of ${entries.length} resources (${headerCoveragePercent}%): the rest are on other origins or are not static assets, so thei - Network accessline 337
id: "header-coverage", message: `Cache headers were read for ${headersAnalyzed} of ${entries.length} resources (${headerCoveragePercent}%): the rest are on other origins or are not static assets, so their Cache-Control cannot be read - Network accessline 338
message: `Cache headers were read for ${headersAnalyzed} of ${entries.length} resources (${headerCoveragePercent}%): the rest are on other origins or are not static assets, so their Cache-Control cannot be read from the page. Most of them a
dist/antigravity/webperf-loading/scripts/Client-Side-Redirect-Detection.js
- Executable scriptline 1
Executable file
dist/antigravity/webperf-loading/scripts/Compression-Audit.js
- Executable scriptline 1
Executable file
dist/antigravity/webperf-loading/scripts/Content-Visibility.js
- Executable scriptline 1
Executable file
dist/antigravity/webperf-loading/scripts/Critical-CSS-Detection.js
- Executable scriptline 1
Executable file
dist/antigravity/webperf-loading/scripts/Event-Processing-Time.js
- Executable scriptline 1
Executable file
dist/antigravity/webperf-loading/scripts/FCP.js
- Executable scriptline 1
Executable file
dist/antigravity/webperf-loading/scripts/Find-Above-The-Fold-Lazy-Loaded-Images.js
- Executable scriptline 1
Executable file
dist/antigravity/webperf-loading/scripts/Find-Images-With-Lazy-and-Fetchpriority.js
- Executable scriptline 1
Executable file
dist/antigravity/webperf-loading/scripts/Find-non-Lazy-Loaded-Images-outside-of-the-viewport.js
- Executable scriptline 1
Executable file
dist/antigravity/webperf-loading/scripts/Find-render-blocking-resources.js
- Executable scriptline 1
Executable file
dist/antigravity/webperf-loading/scripts/First-And-Third-Party-Script-Info.js
- Executable scriptline 1
Executable file
dist/antigravity/webperf-loading/scripts/First-And-Third-Party-Script-Timings.js
- Executable scriptline 1
Executable file
dist/antigravity/webperf-loading/scripts/Fonts-Preloaded-Loaded-and-used-above-the-fold.js
- Executable scriptline 1
Executable file
dist/antigravity/webperf-loading/scripts/Inline-CSS-Info-and-Size.js
- Executable scriptline 1
Executable file
dist/antigravity/webperf-loading/scripts/Inline-Script-Info-and-Size.js
- Executable scriptline 1
Executable file
dist/antigravity/webperf-loading/scripts/JS-Execution-Time-Breakdown.js
- Executable scriptline 1
Executable file
dist/antigravity/webperf-loading/scripts/Prefetch-Resource-Validation.js
- Executable scriptline 1
Executable file
dist/antigravity/webperf-loading/scripts/Priority-Hints-Audit.js
- Executable scriptline 1
Executable file
dist/antigravity/webperf-loading/scripts/Resource-Hints-Validation.js
- Executable scriptline 1
Executable file
dist/antigravity/webperf-loading/scripts/Resource-Hints.js
- Executable scriptline 1
Executable file
dist/antigravity/webperf-loading/scripts/SSR-Hydration-Data-Analysis.js
- Executable scriptline 1
Executable file - Network accessline 12
type: "json", threshold: 128 * 1024, docs: "https://nextjs.org/docs/messages/large-page-data" - Network accessline 13
threshold: 128 * 1024, docs: "https://nextjs.org/docs/messages/large-page-data" }, { - Network accessline 14
docs: "https://nextjs.org/docs/messages/large-page-data" - Network accessline 18
type: "json-array", threshold: 100 * 1024, docs: "https://nuxt.com/docs/api/composables/use-hydration" - Network accessline 19
threshold: 100 * 1024, docs: "https://nuxt.com/docs/api/composables/use-hydration" }, { - Network accessline 20
docs: "https://nuxt.com/docs/api/composables/use-hydration" - Network accessline 24
type: "script", threshold: 100 * 1024, docs: "https://nuxtjs.org/" - Network accessline 25
threshold: 100 * 1024, docs: "https://nuxtjs.org/" }, { - Network accessline 26
docs: "https://nuxtjs.org/" - Network accessline 30
type: "script", threshold: 100 * 1024, docs: "https://remix.run/docs/en/main/guides/performance" - Network accessline 31
threshold: 100 * 1024, docs: "https://remix.run/docs/en/main/guides/performance" }, { - Network accessline 32
docs: "https://remix.run/docs/en/main/guides/performance" - Network accessline 37
type: "script", threshold: 100 * 1024, docs: "https://www.gatsbyjs.com/docs/" - Network accessline 38
threshold: 100 * 1024, docs: "https://www.gatsbyjs.com/docs/" }, { - Network accessline 39
docs: "https://www.gatsbyjs.com/docs/" - Network accessline 43
type: "json", threshold: 100 * 1024, docs: "https://kit.svelte.dev/docs/performance" - Network accessline 44
threshold: 100 * 1024, docs: "https://kit.svelte.dev/docs/performance" }, { - Network accessline 45
docs: "https://kit.svelte.dev/docs/performance" - Network accessline 49
type: "props", threshold: 50 * 1024, docs: "https://docs.astro.build/en/concepts/islands/" - Network accessline 50
threshold: 50 * 1024, docs: "https://docs.astro.build/en/concepts/islands/" } ]; - Network accessline 51
docs: "https://docs.astro.build/en/concepts/islands/" - Access to secretsline 154
[Credential-related source omitted]
dist/antigravity/webperf-loading/scripts/Script-Loading.js
- Executable scriptline 1
Executable file
dist/antigravity/webperf-loading/scripts/Server-Timing-Early-Hints.js
- Executable scriptline 1
Executable file
dist/antigravity/webperf-loading/scripts/Service-Worker-Analysis.js
- Executable scriptline 1
Executable file
dist/antigravity/webperf-loading/scripts/Speculation-Rules-Inspector.js
- Executable scriptline 1
Executable file
dist/antigravity/webperf-loading/scripts/TTFB-Resources.js
- Executable scriptline 1
Executable file
dist/antigravity/webperf-loading/scripts/TTFB-Sub-Parts.js
- Executable scriptline 1
Executable file
dist/antigravity/webperf-loading/scripts/TTFB.js
- Executable scriptline 1
Executable file
dist/antigravity/webperf-loading/scripts/Third-Party-Impact-by-Domain.js
- Executable scriptline 1
Executable file
dist/antigravity/webperf-loading/scripts/Validate-Preload-Async-Defer-Scripts.js
- Executable scriptline 1
Executable file
dist/antigravity/webperf-loading/scripts/Webfont-Usage-Analyzer.js
- Executable scriptline 1
Executable file
dist/antigravity/webperf-media/SKILL.md
- Network accessline 15
mcp-server: chrome-devtools category: web-performance repository: https://github.com/nucliweb/webperf-snippets - Network accessline 16
category: web-performance repository: https://github.com/nucliweb/webperf-snippets --- - Network accessline 17
repository: https://github.com/nucliweb/webperf-snippets - Network accessline 32
Without Chrome DevTools MCP, run the same snippet with the [webperf-snippets CLI](https://webperf-snippets.net/CLI), which loads the page in headless Chromium and prints the same result objects: `npx webperf-snippets <url> --snippet <Name>
dist/antigravity/webperf-media/references/schema.md
- Network accessline 210
"element": "img.hero", "elementType": "Image", "url": "https://example.com/hero.jpg", - Network accessline 211
"elementType": "Image", "url": "https://example.com/hero.jpg", "sizePixels": 756000 - Network accessline 212
"url": "https://example.com/hero.jpg", - Network accessline 417
"details": { "isVideo": true, "posterUrl": "https://example.com/hero.avif", - Network accessline 418
"isVideo": true, "posterUrl": "https://example.com/hero.avif", "posterFormat": "avif", - Network accessline 419
"posterUrl": "https://example.com/hero.avif", - Network accessline 493
{ "type": "link", "url": "https://example.com/style.css", - Network accessline 494
"type": "link", "url": "https://example.com/style.css", "shortName": "style.css", - Network accessline 495
"url": "https://example.com/style.css", - Network accessline 522
"items": [ { "url": "https://example.com/app.js", - Network accessline 523
{ "url": "https://example.com/app.js", "shortName": "app.js", - Network accessline 524
"url": "https://example.com/app.js", - Network accessline 562
"items": [ { "url": "https://example.com/app.css", - Network accessline 563
{ "url": "https://example.com/app.css", "shortName": "app.css", - Network accessline 564
"url": "https://example.com/app.css", - Network accessline 669
"items": [ { "scope": "https://example.com/", - Network accessline 670
{ "scope": "https://example.com/", "scriptURL": "https://example.com/sw.js", - Network accessline 671
"scope": "https://example.com/", - Network accessline 672
"scriptURL": "https://example.com/sw.js", - Network accessline 746
"missingPreconnectsCount": 1, "missingPreconnects": [ { "origin": "https://cdn.example", "requestCount": 6, "sizeBytes": 84000, "resourceTypes": ["script", "img"], "recommendedHint": "preconnect" } - Network accessline 747
"missingPreconnects": [ { "origin": "https://cdn.example", "requestCount": 6, "sizeBytes": 84000, "resourceTypes": ["script", "img"], "recommendedHint": "preconnect" } ] - Network accessline 748
{ "origin": "https://cdn.example", "requestCount": 6, "sizeBytes": 84000, "resourceTypes": ["script", "img"], "recommendedHint": "preconnect" } - Network accessline 761
"status": "ok", "items": [ { "domain": "https://old.example", "href": "https://old.example/", "requestCount": 0, "action": "remove-unused-preconnect", "recommendedHint": null }, - Network accessline 762
"items": [ { "domain": "https://old.example", "href": "https://old.example/", "requestCount": 0, "action": "remove-unused-preconnect", "recommendedHint": null }, { "domain": "https://cdn.example", "href": null, "requestCount": 6, "a - Network accessline 763
{ "domain": "https://old.example", "href": "https://old.example/", "requestCount": 0, "action": "remove-unused-preconnect", "recommendedHint": null }, - Network accessline 764
{ "domain": "https://cdn.example", "href": null, "requestCount": 6, "action": "add-preconnect", "recommendedHint": "preconnect" }, - Network accessline 765
{ "domain": "https://fonts.example", "href": null, "requestCount": 2, "action": "remove-dns-prefetch", "recommendedHint": "preconnect" } - Network accessline 796
"preloadedNotUsedCount": 0, "usedNotPreloadedCount": 0, "preloadedFonts": [{ "family": "inter", "href": "https://cdn.example/inter.woff2", "fontType": "font/woff2", "crossorigin": "anonymous", "thirdParty": true }] - Network accessline 797
"usedNotPreloadedCount": 0, "preloadedFonts": [{ "family": "inter", "href": "https://cdn.example/inter.woff2", "fontType": "font/woff2", "crossorigin": "anonymous", "thirdParty": true }] }, - Network accessline 798
"preloadedFonts": [{ "family": "inter", "href": "https://cdn.example/inter.woff2", "fontType": "font/woff2", "crossorigin": "anonymous", "thirdParty": true }] - Network accessline 833
`details` counts what the CSSOM keeps of the CSS as written, as [css-analyzer](https://github.com/projectwallace/css-analyzer) counts its text: rules (style rules, nested and inside at-rules), selectors (each one of a list), declarations (a - Network accessline 862
}, "items": [ { "source": "https://example.com/app.css", "read": "cssom", "ruleCount": 790, "embeddedBytes": 41210, "importCount": 1, "importantCount": 48 }, - Network accessline 863
"items": [ { "source": "https://example.com/app.css", "read": "cssom", "ruleCount": 790, "embeddedBytes": 41210, "importCount": 1, "importantCount": 48 }, { "source": "https://cdn.example.com/vendor.css", "read": "fetched", "ruleCou - Network accessline 864
{ "source": "https://example.com/app.css", "read": "cssom", "ruleCount": 790, "embeddedBytes": 41210, "importCount": 1, "importantCount": 48 }, - Network accessline 865
{ "source": "https://cdn.example.com/vendor.css", "read": "fetched", "ruleCount": 22, "embeddedBytes": 0, "importCount": 0, "importantCount": 3 } - Network accessline 866
], "issues": [{ "code": "import", "severity": "warning", "message": "https://example.com/app.css imports https://cdn.example.com/vendor.css with @import: ...", "target": "https://cdn.example.com/vendor.css" }] } - Network accessline 867
"issues": [{ "code": "import", "severity": "warning", "message": "https://example.com/app.css imports https://cdn.example.com/vendor.css with @import: ...", "target": "https://cdn.example.com/vendor.css" }] - Network accessline 886
"properties": 5, "bytes": 160, "bySource": [{ "source": "https://example.com/app.css", "inline": false, "rules": 3, "bytes": 160 }], - Network accessline 887
"bytes": 160, "bySource": [{ "source": "https://example.com/app.css", "inline": false, "rules": 3, "bytes": 160 }], "corsBlockedCount": 0 - Network accessline 888
"bySource": [{ "source": "https://example.com/app.css", "inline": false, "rules": 3, "bytes": 160 }], - Network accessline 1154
`items` holds the 50 images to look at first: the LCP image, then those with the most errors and warnings. `count` and `details` cover every image. The format comes from the `Content-Type` of the response; when a cross-origin image blocks ` - Network accessline 1211
"details": { "devicePixelRatio": 2, "totalImages": 9, "imagesChecked": 7, "oversized": 1, "undersized": 0, "wastedPixels": 1800000, "wastedBytes": 1614610, "skippedHidden": 1, "skippedNotLoaded": 1, "skippedVector": 0 }, "items": [ { - Network accessline 1212
"items": [ { "selector": "#hero", "url": "https://example.com/hero.png", "verdict": "oversized", "naturalWidth": 1600, "naturalHeight": 1200, "renderedWidth": 200, "renderedHeight": 150, "neededWidth": 400, "neededHeight": 300, "ratio": - Network accessline 1213
{ "selector": "#hero", "url": "https://example.com/hero.png", "verdict": "oversized", "naturalWidth": 1600, "naturalHeight": 1200, "renderedWidth": 200, "renderedHeight": 150, "neededWidth": 400, "neededHeight": 300, "ratio": 4, "wastedPixe
dist/antigravity/webperf-media/scripts/Image-Element-Audit.js
- Executable scriptline 1
Executable file - Network accessline 96
if (!url) return detectFormat(url); try { const res = await fetch(ownRequestUrl(url), { - Network accessline 97
try { const res = await fetch(ownRequestUrl(url), { cache: "force-cache" - Network accessline 98
const res = await fetch(ownRequestUrl(url), {
dist/antigravity/webperf-media/scripts/Oversized-Images.js
- Executable scriptline 1
Executable file
dist/antigravity/webperf-media/scripts/SVG-Embedded-Bitmap-Analysis.js
- Executable scriptline 1
Executable file - Network accessline 49
let bitmaps = []; try { const res = await fetch(ownRequestUrl(entry.name), { - Network accessline 50
try { const res = await fetch(ownRequestUrl(entry.name), { cache: "force-cache" - Network accessline 51
const res = await fetch(ownRequestUrl(entry.name), {
dist/antigravity/webperf-media/scripts/Video-Element-Audit.js
- Executable scriptline 1
Executable file
dist/antigravity/webperf-resources/SKILL.md
- Network accessline 15
mcp-server: chrome-devtools category: web-performance repository: https://github.com/nucliweb/webperf-snippets - Network accessline 16
category: web-performance repository: https://github.com/nucliweb/webperf-snippets --- - Network accessline 17
repository: https://github.com/nucliweb/webperf-snippets - Network accessline 32
Without Chrome DevTools MCP, run the same snippet with the [webperf-snippets CLI](https://webperf-snippets.net/CLI), which loads the page in headless Chromium and prints the same result objects: `npx webperf-snippets <url> --snippet <Name>
dist/antigravity/webperf-resources/references/schema.md
- Network accessline 210
"element": "img.hero", "elementType": "Image", "url": "https://example.com/hero.jpg", - Network accessline 211
"elementType": "Image", "url": "https://example.com/hero.jpg", "sizePixels": 756000 - Network accessline 212
"url": "https://example.com/hero.jpg", - Network accessline 417
"details": { "isVideo": true, "posterUrl": "https://example.com/hero.avif", - Network accessline 418
"isVideo": true, "posterUrl": "https://example.com/hero.avif", "posterFormat": "avif", - Network accessline 419
"posterUrl": "https://example.com/hero.avif", - Network accessline 493
{ "type": "link", "url": "https://example.com/style.css", - Network accessline 494
"type": "link", "url": "https://example.com/style.css", "shortName": "style.css", - Network accessline 495
"url": "https://example.com/style.css", - Network accessline 522
"items": [ { "url": "https://example.com/app.js", - Network accessline 523
{ "url": "https://example.com/app.js", "shortName": "app.js", - Network accessline 524
"url": "https://example.com/app.js", - Network accessline 562
"items": [ { "url": "https://example.com/app.css", - Network accessline 563
{ "url": "https://example.com/app.css", "shortName": "app.css", - Network accessline 564
"url": "https://example.com/app.css", - Network accessline 669
"items": [ { "scope": "https://example.com/", - Network accessline 670
{ "scope": "https://example.com/", "scriptURL": "https://example.com/sw.js", - Network accessline 671
"scope": "https://example.com/", - Network accessline 672
"scriptURL": "https://example.com/sw.js", - Network accessline 746
"missingPreconnectsCount": 1, "missingPreconnects": [ { "origin": "https://cdn.example", "requestCount": 6, "sizeBytes": 84000, "resourceTypes": ["script", "img"], "recommendedHint": "preconnect" } - Network accessline 747
"missingPreconnects": [ { "origin": "https://cdn.example", "requestCount": 6, "sizeBytes": 84000, "resourceTypes": ["script", "img"], "recommendedHint": "preconnect" } ] - Network accessline 748
{ "origin": "https://cdn.example", "requestCount": 6, "sizeBytes": 84000, "resourceTypes": ["script", "img"], "recommendedHint": "preconnect" } - Network accessline 761
"status": "ok", "items": [ { "domain": "https://old.example", "href": "https://old.example/", "requestCount": 0, "action": "remove-unused-preconnect", "recommendedHint": null }, - Network accessline 762
"items": [ { "domain": "https://old.example", "href": "https://old.example/", "requestCount": 0, "action": "remove-unused-preconnect", "recommendedHint": null }, { "domain": "https://cdn.example", "href": null, "requestCount": 6, "a - Network accessline 763
{ "domain": "https://old.example", "href": "https://old.example/", "requestCount": 0, "action": "remove-unused-preconnect", "recommendedHint": null }, - Network accessline 764
{ "domain": "https://cdn.example", "href": null, "requestCount": 6, "action": "add-preconnect", "recommendedHint": "preconnect" }, - Network accessline 765
{ "domain": "https://fonts.example", "href": null, "requestCount": 2, "action": "remove-dns-prefetch", "recommendedHint": "preconnect" } - Network accessline 796
"preloadedNotUsedCount": 0, "usedNotPreloadedCount": 0, "preloadedFonts": [{ "family": "inter", "href": "https://cdn.example/inter.woff2", "fontType": "font/woff2", "crossorigin": "anonymous", "thirdParty": true }] - Network accessline 797
"usedNotPreloadedCount": 0, "preloadedFonts": [{ "family": "inter", "href": "https://cdn.example/inter.woff2", "fontType": "font/woff2", "crossorigin": "anonymous", "thirdParty": true }] }, - Network accessline 798
"preloadedFonts": [{ "family": "inter", "href": "https://cdn.example/inter.woff2", "fontType": "font/woff2", "crossorigin": "anonymous", "thirdParty": true }] - Network accessline 833
`details` counts what the CSSOM keeps of the CSS as written, as [css-analyzer](https://github.com/projectwallace/css-analyzer) counts its text: rules (style rules, nested and inside at-rules), selectors (each one of a list), declarations (a - Network accessline 862
}, "items": [ { "source": "https://example.com/app.css", "read": "cssom", "ruleCount": 790, "embeddedBytes": 41210, "importCount": 1, "importantCount": 48 }, - Network accessline 863
"items": [ { "source": "https://example.com/app.css", "read": "cssom", "ruleCount": 790, "embeddedBytes": 41210, "importCount": 1, "importantCount": 48 }, { "source": "https://cdn.example.com/vendor.css", "read": "fetched", "ruleCou - Network accessline 864
{ "source": "https://example.com/app.css", "read": "cssom", "ruleCount": 790, "embeddedBytes": 41210, "importCount": 1, "importantCount": 48 }, - Network accessline 865
{ "source": "https://cdn.example.com/vendor.css", "read": "fetched", "ruleCount": 22, "embeddedBytes": 0, "importCount": 0, "importantCount": 3 } - Network accessline 866
], "issues": [{ "code": "import", "severity": "warning", "message": "https://example.com/app.css imports https://cdn.example.com/vendor.css with @import: ...", "target": "https://cdn.example.com/vendor.css" }] } - Network accessline 867
"issues": [{ "code": "import", "severity": "warning", "message": "https://example.com/app.css imports https://cdn.example.com/vendor.css with @import: ...", "target": "https://cdn.example.com/vendor.css" }] - Network accessline 886
"properties": 5, "bytes": 160, "bySource": [{ "source": "https://example.com/app.css", "inline": false, "rules": 3, "bytes": 160 }], - Network accessline 887
"bytes": 160, "bySource": [{ "source": "https://example.com/app.css", "inline": false, "rules": 3, "bytes": 160 }], "corsBlockedCount": 0 - Network accessline 888
"bySource": [{ "source": "https://example.com/app.css", "inline": false, "rules": 3, "bytes": 160 }], - Network accessline 1154
`items` holds the 50 images to look at first: the LCP image, then those with the most errors and warnings. `count` and `details` cover every image. The format comes from the `Content-Type` of the response; when a cross-origin image blocks ` - Network accessline 1211
"details": { "devicePixelRatio": 2, "totalImages": 9, "imagesChecked": 7, "oversized": 1, "undersized": 0, "wastedPixels": 1800000, "wastedBytes": 1614610, "skippedHidden": 1, "skippedNotLoaded": 1, "skippedVector": 0 }, "items": [ { - Network accessline 1212
"items": [ { "selector": "#hero", "url": "https://example.com/hero.png", "verdict": "oversized", "naturalWidth": 1600, "naturalHeight": 1200, "renderedWidth": 200, "renderedHeight": 150, "neededWidth": 400, "neededHeight": 300, "ratio": - Network accessline 1213
{ "selector": "#hero", "url": "https://example.com/hero.png", "verdict": "oversized", "naturalWidth": 1600, "naturalHeight": 1200, "renderedWidth": 200, "renderedHeight": 150, "neededWidth": 400, "neededHeight": 300, "ratio": 4, "wastedPixe
dist/antigravity/webperf-resources/references/snippets.md
- Broad permissionsline 1
Unsupported or unresolved allowed-tools declaration
dist/antigravity/webperf-resources/scripts/Network-Bandwidth-Connection-Quality.js
- Executable scriptline 1
Executable file
dist/antigravity/webperf/SKILL.md
- Network accessline 12
mcp-server: chrome-devtools category: web-performance repository: https://github.com/nucliweb/webperf-snippets - Network accessline 13
category: web-performance repository: https://github.com/nucliweb/webperf-snippets --- - Network accessline 14
repository: https://github.com/nucliweb/webperf-snippets
plugins/webperf/.claude-plugin/plugin.json
- Network accessline 6
"author": { "name": "Joan Leon", "url": "https://webperf-snippets.net" - Network accessline 7
"name": "Joan Leon", "url": "https://webperf-snippets.net" }, - Network accessline 8
"url": "https://webperf-snippets.net" - Network accessline 9
}, "homepage": "https://webperf-snippets.net/MCP", "repository": "https://github.com/nucliweb/webperf-snippets", - Network accessline 10
"homepage": "https://webperf-snippets.net/MCP", - Network accessline 11
"repository": "https://github.com/nucliweb/webperf-snippets",
skills/webperf-core-web-vitals/SKILL.md
- Network accessline 8
mcp-server: chrome-devtools category: web-performance repository: https://github.com/nucliweb/webperf-snippets - Network accessline 9
category: web-performance repository: https://github.com/nucliweb/webperf-snippets --- - Network accessline 10
repository: https://github.com/nucliweb/webperf-snippets - Network accessline 25
Without Chrome DevTools MCP, run the same snippet with the [webperf-snippets CLI](https://webperf-snippets.net/CLI), which loads the page in headless Chromium and prints the same result objects: `npx webperf-snippets <url> --snippet <Name>
skills/webperf-core-web-vitals/references/schema.md
- Network accessline 210
"element": "img.hero", "elementType": "Image", "url": "https://example.com/hero.jpg", - Network accessline 211
"elementType": "Image", "url": "https://example.com/hero.jpg", "sizePixels": 756000 - Network accessline 212
"url": "https://example.com/hero.jpg", - Network accessline 417
"details": { "isVideo": true, "posterUrl": "https://example.com/hero.avif", - Network accessline 418
"isVideo": true, "posterUrl": "https://example.com/hero.avif", "posterFormat": "avif", - Network accessline 419
"posterUrl": "https://example.com/hero.avif", - Network accessline 493
{ "type": "link", "url": "https://example.com/style.css", - Network accessline 494
"type": "link", "url": "https://example.com/style.css", "shortName": "style.css", - Network accessline 495
"url": "https://example.com/style.css", - Network accessline 522
"items": [ { "url": "https://example.com/app.js", - Network accessline 523
{ "url": "https://example.com/app.js", "shortName": "app.js", - Network accessline 524
"url": "https://example.com/app.js", - Network accessline 562
"items": [ { "url": "https://example.com/app.css", - Network accessline 563
{ "url": "https://example.com/app.css", "shortName": "app.css", - Network accessline 564
"url": "https://example.com/app.css", - Network accessline 669
"items": [ { "scope": "https://example.com/", - Network accessline 670
{ "scope": "https://example.com/", "scriptURL": "https://example.com/sw.js", - Network accessline 671
"scope": "https://example.com/", - Network accessline 672
"scriptURL": "https://example.com/sw.js", - Network accessline 746
"missingPreconnectsCount": 1, "missingPreconnects": [ { "origin": "https://cdn.example", "requestCount": 6, "sizeBytes": 84000, "resourceTypes": ["script", "img"], "recommendedHint": "preconnect" } - Network accessline 747
"missingPreconnects": [ { "origin": "https://cdn.example", "requestCount": 6, "sizeBytes": 84000, "resourceTypes": ["script", "img"], "recommendedHint": "preconnect" } ] - Network accessline 748
{ "origin": "https://cdn.example", "requestCount": 6, "sizeBytes": 84000, "resourceTypes": ["script", "img"], "recommendedHint": "preconnect" } - Network accessline 761
"status": "ok", "items": [ { "domain": "https://old.example", "href": "https://old.example/", "requestCount": 0, "action": "remove-unused-preconnect", "recommendedHint": null }, - Network accessline 762
"items": [ { "domain": "https://old.example", "href": "https://old.example/", "requestCount": 0, "action": "remove-unused-preconnect", "recommendedHint": null }, { "domain": "https://cdn.example", "href": null, "requestCount": 6, "a - Network accessline 763
{ "domain": "https://old.example", "href": "https://old.example/", "requestCount": 0, "action": "remove-unused-preconnect", "recommendedHint": null }, - Network accessline 764
{ "domain": "https://cdn.example", "href": null, "requestCount": 6, "action": "add-preconnect", "recommendedHint": "preconnect" }, - Network accessline 765
{ "domain": "https://fonts.example", "href": null, "requestCount": 2, "action": "remove-dns-prefetch", "recommendedHint": "preconnect" } - Network accessline 796
"preloadedNotUsedCount": 0, "usedNotPreloadedCount": 0, "preloadedFonts": [{ "family": "inter", "href": "https://cdn.example/inter.woff2", "fontType": "font/woff2", "crossorigin": "anonymous", "thirdParty": true }] - Network accessline 797
"usedNotPreloadedCount": 0, "preloadedFonts": [{ "family": "inter", "href": "https://cdn.example/inter.woff2", "fontType": "font/woff2", "crossorigin": "anonymous", "thirdParty": true }] }, - Network accessline 798
"preloadedFonts": [{ "family": "inter", "href": "https://cdn.example/inter.woff2", "fontType": "font/woff2", "crossorigin": "anonymous", "thirdParty": true }] - Network accessline 833
`details` counts what the CSSOM keeps of the CSS as written, as [css-analyzer](https://github.com/projectwallace/css-analyzer) counts its text: rules (style rules, nested and inside at-rules), selectors (each one of a list), declarations (a - Network accessline 862
}, "items": [ { "source": "https://example.com/app.css", "read": "cssom", "ruleCount": 790, "embeddedBytes": 41210, "importCount": 1, "importantCount": 48 }, - Network accessline 863
"items": [ { "source": "https://example.com/app.css", "read": "cssom", "ruleCount": 790, "embeddedBytes": 41210, "importCount": 1, "importantCount": 48 }, { "source": "https://cdn.example.com/vendor.css", "read": "fetched", "ruleCou - Network accessline 864
{ "source": "https://example.com/app.css", "read": "cssom", "ruleCount": 790, "embeddedBytes": 41210, "importCount": 1, "importantCount": 48 }, - Network accessline 865
{ "source": "https://cdn.example.com/vendor.css", "read": "fetched", "ruleCount": 22, "embeddedBytes": 0, "importCount": 0, "importantCount": 3 } - Network accessline 866
], "issues": [{ "code": "import", "severity": "warning", "message": "https://example.com/app.css imports https://cdn.example.com/vendor.css with @import: ...", "target": "https://cdn.example.com/vendor.css" }] } - Network accessline 867
"issues": [{ "code": "import", "severity": "warning", "message": "https://example.com/app.css imports https://cdn.example.com/vendor.css with @import: ...", "target": "https://cdn.example.com/vendor.css" }] - Network accessline 886
"properties": 5, "bytes": 160, "bySource": [{ "source": "https://example.com/app.css", "inline": false, "rules": 3, "bytes": 160 }], - Network accessline 887
"bytes": 160, "bySource": [{ "source": "https://example.com/app.css", "inline": false, "rules": 3, "bytes": 160 }], "corsBlockedCount": 0 - Network accessline 888
"bySource": [{ "source": "https://example.com/app.css", "inline": false, "rules": 3, "bytes": 160 }], - Network accessline 1154
`items` holds the 50 images to look at first: the LCP image, then those with the most errors and warnings. `count` and `details` cover every image. The format comes from the `Content-Type` of the response; when a cross-origin image blocks ` - Network accessline 1211
"details": { "devicePixelRatio": 2, "totalImages": 9, "imagesChecked": 7, "oversized": 1, "undersized": 0, "wastedPixels": 1800000, "wastedBytes": 1614610, "skippedHidden": 1, "skippedNotLoaded": 1, "skippedVector": 0 }, "items": [ { - Network accessline 1212
"items": [ { "selector": "#hero", "url": "https://example.com/hero.png", "verdict": "oversized", "naturalWidth": 1600, "naturalHeight": 1200, "renderedWidth": 200, "renderedHeight": 150, "neededWidth": 400, "neededHeight": 300, "ratio": - Network accessline 1213
{ "selector": "#hero", "url": "https://example.com/hero.png", "verdict": "oversized", "naturalWidth": 1600, "naturalHeight": 1200, "renderedWidth": 200, "renderedHeight": 150, "neededWidth": 400, "neededHeight": 300, "ratio": 4, "wastedPixe
skills/webperf-core-web-vitals/scripts/CLS.js
skills/webperf-core-web-vitals/scripts/INP.js
- Network accessline 1
// snippets/CoreWebVitals/INP.js | sha256:aedd064970241d69 | https://github.com/nucliweb/webperf-snippets/blob/main/snippets/CoreWebVitals/INP.js - Executable scriptline 1
Executable file - Possible obfuscationline 2
(()=>{if(!PerformanceObserver.supportedEntryTypes?.includes("event"))return{script:"INP",status:"unsupported",error:"event entries not supported in this browser"};let t=[],e=0,n=null;const a=t=>t<=200?"good":t<=500?"needs-improvement":"poor
skills/webperf-core-web-vitals/scripts/LCP-Image-Entropy.js
- Network accessline 1
// snippets/CoreWebVitals/LCP-Image-Entropy.js | sha256:735dc092285d4598 | https://github.com/nucliweb/webperf-snippets/blob/main/snippets/CoreWebVitals/LCP-Image-Entropy.js - Executable scriptline 1
Executable file - Possible obfuscationline 2
(async()=>{if(!PerformanceObserver.supportedEntryTypes?.includes("largest-contentful-paint"))return{script:"LCP-Image-Entropy",status:"unsupported",error:"largest-contentful-paint entries not supported in this browser"};function e(e){if(nul
skills/webperf-core-web-vitals/scripts/LCP-Subparts.js
- Network accessline 1
// snippets/CoreWebVitals/LCP-Subparts.js | sha256:b165d410cc3983ea | https://github.com/nucliweb/webperf-snippets/blob/main/snippets/CoreWebVitals/LCP-Subparts.js - Executable scriptline 1
Executable file - Possible obfuscationline 2
(async()=>{if(!PerformanceObserver.supportedEntryTypes?.includes("largest-contentful-paint"))return{script:"LCP-Subparts",status:"unsupported",error:"largest-contentful-paint entries not supported in this browser"};const e=e=>e<=2500?"good"
skills/webperf-core-web-vitals/scripts/LCP-Trail.js
- Network accessline 1
// snippets/CoreWebVitals/LCP-Trail.js | sha256:5c73673f4c889f18 | https://github.com/nucliweb/webperf-snippets/blob/main/snippets/CoreWebVitals/LCP-Trail.js - Executable scriptline 1
Executable file - Possible obfuscationline 2
(async()=>{if(!PerformanceObserver.supportedEntryTypes?.includes("largest-contentful-paint"))return{script:"LCP-Trail",status:"unsupported",error:"largest-contentful-paint entries not supported in this browser"};const e=[{color:"#EF4444",na
skills/webperf-core-web-vitals/scripts/LCP-Video-Candidate.js
- Network accessline 1
// snippets/CoreWebVitals/LCP-Video-Candidate.js | sha256:d26129e5eb37f8de | https://github.com/nucliweb/webperf-snippets/blob/main/snippets/CoreWebVitals/LCP-Video-Candidate.js - Executable scriptline 1
Executable file - Possible obfuscationline 2
(async()=>{if(!PerformanceObserver.supportedEntryTypes?.includes("largest-contentful-paint"))return{script:"LCP-Video-Candidate",status:"unsupported",error:"largest-contentful-paint entries not supported in this browser"};const e=await((e,t
skills/webperf-core-web-vitals/scripts/LCP.js
- Network accessline 1
// snippets/CoreWebVitals/LCP.js | sha256:58eb5a9f00258b43 | https://github.com/nucliweb/webperf-snippets/blob/main/snippets/CoreWebVitals/LCP.js - Executable scriptline 1
Executable file - Possible obfuscationline 2
(async()=>{if(!PerformanceObserver.supportedEntryTypes?.includes("largest-contentful-paint"))return{script:"LCP",status:"unsupported",error:"largest-contentful-paint entries not supported in this browser"};const e=e=>e<=2500?"good":e<=4e3?"
skills/webperf-interaction/SKILL.md
- Network accessline 8
mcp-server: chrome-devtools category: web-performance repository: https://github.com/nucliweb/webperf-snippets - Network accessline 9
category: web-performance repository: https://github.com/nucliweb/webperf-snippets --- - Network accessline 10
repository: https://github.com/nucliweb/webperf-snippets - Network accessline 25
Without Chrome DevTools MCP, run the same snippet with the [webperf-snippets CLI](https://webperf-snippets.net/CLI), which loads the page in headless Chromium and prints the same result objects: `npx webperf-snippets <url> --snippet <Name>
skills/webperf-interaction/references/schema.md
- Network accessline 210
"element": "img.hero", "elementType": "Image", "url": "https://example.com/hero.jpg", - Network accessline 211
"elementType": "Image", "url": "https://example.com/hero.jpg", "sizePixels": 756000 - Network accessline 212
"url": "https://example.com/hero.jpg", - Network accessline 417
"details": { "isVideo": true, "posterUrl": "https://example.com/hero.avif", - Network accessline 418
"isVideo": true, "posterUrl": "https://example.com/hero.avif", "posterFormat": "avif", - Network accessline 419
"posterUrl": "https://example.com/hero.avif", - Network accessline 493
{ "type": "link", "url": "https://example.com/style.css", - Network accessline 494
"type": "link", "url": "https://example.com/style.css", "shortName": "style.css", - Network accessline 495
"url": "https://example.com/style.css", - Network accessline 522
"items": [ { "url": "https://example.com/app.js", - Network accessline 523
{ "url": "https://example.com/app.js", "shortName": "app.js", - Network accessline 524
"url": "https://example.com/app.js", - Network accessline 562
"items": [ { "url": "https://example.com/app.css", - Network accessline 563
{ "url": "https://example.com/app.css", "shortName": "app.css", - Network accessline 564
"url": "https://example.com/app.css", - Network accessline 669
"items": [ { "scope": "https://example.com/", - Network accessline 670
{ "scope": "https://example.com/", "scriptURL": "https://example.com/sw.js", - Network accessline 671
"scope": "https://example.com/", - Network accessline 672
"scriptURL": "https://example.com/sw.js", - Network accessline 746
"missingPreconnectsCount": 1, "missingPreconnects": [ { "origin": "https://cdn.example", "requestCount": 6, "sizeBytes": 84000, "resourceTypes": ["script", "img"], "recommendedHint": "preconnect" } - Network accessline 747
"missingPreconnects": [ { "origin": "https://cdn.example", "requestCount": 6, "sizeBytes": 84000, "resourceTypes": ["script", "img"], "recommendedHint": "preconnect" } ] - Network accessline 748
{ "origin": "https://cdn.example", "requestCount": 6, "sizeBytes": 84000, "resourceTypes": ["script", "img"], "recommendedHint": "preconnect" } - Network accessline 761
"status": "ok", "items": [ { "domain": "https://old.example", "href": "https://old.example/", "requestCount": 0, "action": "remove-unused-preconnect", "recommendedHint": null }, - Network accessline 762
"items": [ { "domain": "https://old.example", "href": "https://old.example/", "requestCount": 0, "action": "remove-unused-preconnect", "recommendedHint": null }, { "domain": "https://cdn.example", "href": null, "requestCount": 6, "a - Network accessline 763
{ "domain": "https://old.example", "href": "https://old.example/", "requestCount": 0, "action": "remove-unused-preconnect", "recommendedHint": null }, - Network accessline 764
{ "domain": "https://cdn.example", "href": null, "requestCount": 6, "action": "add-preconnect", "recommendedHint": "preconnect" }, - Network accessline 765
{ "domain": "https://fonts.example", "href": null, "requestCount": 2, "action": "remove-dns-prefetch", "recommendedHint": "preconnect" } - Network accessline 796
"preloadedNotUsedCount": 0, "usedNotPreloadedCount": 0, "preloadedFonts": [{ "family": "inter", "href": "https://cdn.example/inter.woff2", "fontType": "font/woff2", "crossorigin": "anonymous", "thirdParty": true }] - Network accessline 797
"usedNotPreloadedCount": 0, "preloadedFonts": [{ "family": "inter", "href": "https://cdn.example/inter.woff2", "fontType": "font/woff2", "crossorigin": "anonymous", "thirdParty": true }] }, - Network accessline 798
"preloadedFonts": [{ "family": "inter", "href": "https://cdn.example/inter.woff2", "fontType": "font/woff2", "crossorigin": "anonymous", "thirdParty": true }] - Network accessline 833
`details` counts what the CSSOM keeps of the CSS as written, as [css-analyzer](https://github.com/projectwallace/css-analyzer) counts its text: rules (style rules, nested and inside at-rules), selectors (each one of a list), declarations (a - Network accessline 862
}, "items": [ { "source": "https://example.com/app.css", "read": "cssom", "ruleCount": 790, "embeddedBytes": 41210, "importCount": 1, "importantCount": 48 }, - Network accessline 863
"items": [ { "source": "https://example.com/app.css", "read": "cssom", "ruleCount": 790, "embeddedBytes": 41210, "importCount": 1, "importantCount": 48 }, { "source": "https://cdn.example.com/vendor.css", "read": "fetched", "ruleCou - Network accessline 864
{ "source": "https://example.com/app.css", "read": "cssom", "ruleCount": 790, "embeddedBytes": 41210, "importCount": 1, "importantCount": 48 }, - Network accessline 865
{ "source": "https://cdn.example.com/vendor.css", "read": "fetched", "ruleCount": 22, "embeddedBytes": 0, "importCount": 0, "importantCount": 3 } - Network accessline 866
], "issues": [{ "code": "import", "severity": "warning", "message": "https://example.com/app.css imports https://cdn.example.com/vendor.css with @import: ...", "target": "https://cdn.example.com/vendor.css" }] } - Network accessline 867
"issues": [{ "code": "import", "severity": "warning", "message": "https://example.com/app.css imports https://cdn.example.com/vendor.css with @import: ...", "target": "https://cdn.example.com/vendor.css" }] - Network accessline 886
"properties": 5, "bytes": 160, "bySource": [{ "source": "https://example.com/app.css", "inline": false, "rules": 3, "bytes": 160 }], - Network accessline 887
"bytes": 160, "bySource": [{ "source": "https://example.com/app.css", "inline": false, "rules": 3, "bytes": 160 }], "corsBlockedCount": 0 - Network accessline 888
"bySource": [{ "source": "https://example.com/app.css", "inline": false, "rules": 3, "bytes": 160 }], - Network accessline 1154
`items` holds the 50 images to look at first: the LCP image, then those with the most errors and warnings. `count` and `details` cover every image. The format comes from the `Content-Type` of the response; when a cross-origin image blocks ` - Network accessline 1211
"details": { "devicePixelRatio": 2, "totalImages": 9, "imagesChecked": 7, "oversized": 1, "undersized": 0, "wastedPixels": 1800000, "wastedBytes": 1614610, "skippedHidden": 1, "skippedNotLoaded": 1, "skippedVector": 0 }, "items": [ { - Network accessline 1212
"items": [ { "selector": "#hero", "url": "https://example.com/hero.png", "verdict": "oversized", "naturalWidth": 1600, "naturalHeight": 1200, "renderedWidth": 200, "renderedHeight": 150, "neededWidth": 400, "neededHeight": 300, "ratio": - Network accessline 1213
{ "selector": "#hero", "url": "https://example.com/hero.png", "verdict": "oversized", "naturalWidth": 1600, "naturalHeight": 1200, "renderedWidth": 200, "renderedHeight": 150, "neededWidth": 400, "neededHeight": 300, "ratio": 4, "wastedPixe
skills/webperf-interaction/scripts/DOM-Size-and-Depth.js
- Network accessline 1
// snippets/Interaction/DOM-Size-and-Depth.js | sha256:03523c3039d4df7b | https://github.com/nucliweb/webperf-snippets/blob/main/snippets/Interaction/DOM-Size-and-Depth.js - Executable scriptline 1
Executable file - Possible obfuscationline 2
(()=>{const e={warnNodes:800,errorNodes:1400,maxDepth:32,maxChildren:60},t=e=>{const t=[];let o=e,n=!1;for(;o&&1===o.nodeType;){if(4===t.length){n=!0;break}let e=o.localName;if(o.id){t.unshift(`${e}#${window.CSS.escape(o.id)}`);break}const
skills/webperf-interaction/scripts/Forced-Synchronous-Layout.js
- Network accessline 1
// snippets/Interaction/Forced-Synchronous-Layout.js | sha256:9a938d65fd9f793f | https://github.com/nucliweb/webperf-snippets/blob/main/snippets/Interaction/Forced-Synchronous-Layout.js - Executable scriptline 1
Executable file - Possible obfuscationline 2
(()=>{let t=!1,e=0,r=!1;const o=[],s=[],n=()=>{t=!0,e=performance.now(),r||(r=!0,requestAnimationFrame(()=>{t=!1,r=!1}))},c=DOMTokenList.prototype;["add","remove","toggle","replace"].forEach(t=>{const e=c[t];c[t]=function(...t){return n(),e
skills/webperf-interaction/scripts/Input-Latency-Breakdown.js
- Network accessline 1
// snippets/Interaction/Input-Latency-Breakdown.js | sha256:241e19e7c6218141 | https://github.com/nucliweb/webperf-snippets/blob/main/snippets/Interaction/Input-Latency-Breakdown.js - Executable scriptline 1
Executable file - Possible obfuscationline 2
(()=>{if(!PerformanceObserver.supportedEntryTypes?.includes("event"))return{script:"Input-Latency-Breakdown",status:"unsupported",error:"event entries not supported in this browser"};const e=e=>e<=200?"good":e<=500?"needs-improvement":"poor
skills/webperf-interaction/scripts/Interactions.js
- Network accessline 1
// snippets/Interaction/Interactions.js | sha256:b0ddce2b57e52d1a | https://github.com/nucliweb/webperf-snippets/blob/main/snippets/Interaction/Interactions.js - Executable scriptline 1
Executable file - Possible obfuscationline 2
(()=>{if(!PerformanceObserver.supportedEntryTypes?.includes("event"))return{script:"Interactions",status:"unsupported",error:"event entries not supported in this browser"};const t=t=>t<=200?"good":t<=500?"needs-improvement":"poor",e=functio
skills/webperf-interaction/scripts/Layout-Shift-Loading-and-Interaction.js
- Network accessline 1
// snippets/Interaction/Layout-Shift-Loading-and-Interaction.js | sha256:e263cdacb220604a | https://github.com/nucliweb/webperf-snippets/blob/main/snippets/Interaction/Layout-Shift-Loading-and-Interaction.js - Executable scriptline 1
Executable file - Possible obfuscationline 2
(async()=>{if(!PerformanceObserver.supportedEntryTypes?.includes("layout-shift"))return{script:"Layout-Shift-Loading-and-Interaction",status:"unsupported",error:"layout-shift entries not supported in this browser"};const t=t=>t<=.1?"good":t
skills/webperf-interaction/scripts/Long-Animation-Frames-Helpers.js
- Network accessline 1
// snippets/Interaction/Long-Animation-Frames-Helpers.js | sha256:14778e1d9eba5346 | https://github.com/nucliweb/webperf-snippets/blob/main/snippets/Interaction/Long-Animation-Frames-Helpers.js - Executable scriptline 1
Executable file - Possible obfuscationline 2
(()=>{"use strict";if(!("PerformanceObserver"in window)||!PerformanceObserver.supportedEntryTypes.includes("long-animation-frame"))return{script:"Long-Animation-Frames-Helpers",status:"unsupported",error:"Long Animation Frames API not suppo
skills/webperf-interaction/scripts/Long-Animation-Frames-Script-Attribution.js
- Network accessline 1
// snippets/Interaction/Long-Animation-Frames-Script-Attribution.js | sha256:d1853795853ea45e | https://github.com/nucliweb/webperf-snippets/blob/main/snippets/Interaction/Long-Animation-Frames-Script-Attribution.js - Executable scriptline 1
Executable file - Possible obfuscationline 2
(()=>{if(!PerformanceObserver.supportedEntryTypes?.includes("long-animation-frame"))return{script:"Long-Animation-Frames-Script-Attribution",status:"unsupported",error:"long-animation-frame not supported. Chrome 116+ required."};const t=per
skills/webperf-interaction/scripts/Long-Animation-Frames.js
- Network accessline 1
// snippets/Interaction/Long-Animation-Frames.js | sha256:ea43732d42237528 | https://github.com/nucliweb/webperf-snippets/blob/main/snippets/Interaction/Long-Animation-Frames.js - Executable scriptline 1
Executable file - Possible obfuscationline 2
(()=>{if(!PerformanceObserver.supportedEntryTypes?.includes("long-animation-frame")){const t={script:"Long-Animation-Frames",status:"unsupported",error:"long-animation-frame entries not supported in this browser (Chrome 123+)"};return windo
skills/webperf-interaction/scripts/LongTask.js
- Network accessline 1
// snippets/Interaction/LongTask.js | sha256:b7f5789471673975 | https://github.com/nucliweb/webperf-snippets/blob/main/snippets/Interaction/LongTask.js - Executable scriptline 1
Executable file - Possible obfuscationline 2
(async()=>{if(!PerformanceObserver.supportedEntryTypes?.includes("longtask"))return{script:"LongTask",status:"unsupported",error:"longtask entries not supported in this browser"};const t=t=>`${Math.round(t)}ms`,i=t=>t>250?{level:"critical",
skills/webperf-interaction/scripts/Scroll-Performance.js
- Network accessline 1
// snippets/Interaction/Scroll-Performance.js | sha256:356905098f5584e0 | https://github.com/nucliweb/webperf-snippets/blob/main/snippets/Interaction/Scroll-Performance.js - Executable scriptline 1
Executable file - Possible obfuscationline 2
(()=>{const e=[],t=new Set(["scroll","wheel","touchstart","touchmove","touchend"]),s=EventTarget.prototype.addEventListener;EventTarget.prototype.addEventListener=function(l,n,o){return t.has(l)&&(!0!==o&&"object"==typeof o&&null!==o&&!0===
skills/webperf-loading/SKILL.md
- Network accessline 8
mcp-server: chrome-devtools category: web-performance repository: https://github.com/nucliweb/webperf-snippets - Network accessline 9
category: web-performance repository: https://github.com/nucliweb/webperf-snippets --- - Network accessline 10
repository: https://github.com/nucliweb/webperf-snippets - Network accessline 25
Without Chrome DevTools MCP, run the same snippet with the [webperf-snippets CLI](https://webperf-snippets.net/CLI), which loads the page in headless Chromium and prints the same result objects: `npx webperf-snippets <url> --snippet <Name>
skills/webperf-loading/references/schema.md
- Network accessline 210
"element": "img.hero", "elementType": "Image", "url": "https://example.com/hero.jpg", - Network accessline 211
"elementType": "Image", "url": "https://example.com/hero.jpg", "sizePixels": 756000 - Network accessline 212
"url": "https://example.com/hero.jpg", - Network accessline 417
"details": { "isVideo": true, "posterUrl": "https://example.com/hero.avif", - Network accessline 418
"isVideo": true, "posterUrl": "https://example.com/hero.avif", "posterFormat": "avif", - Network accessline 419
"posterUrl": "https://example.com/hero.avif", - Network accessline 493
{ "type": "link", "url": "https://example.com/style.css", - Network accessline 494
"type": "link", "url": "https://example.com/style.css", "shortName": "style.css", - Network accessline 495
"url": "https://example.com/style.css", - Network accessline 522
"items": [ { "url": "https://example.com/app.js", - Network accessline 523
{ "url": "https://example.com/app.js", "shortName": "app.js", - Network accessline 524
"url": "https://example.com/app.js", - Network accessline 562
"items": [ { "url": "https://example.com/app.css", - Network accessline 563
{ "url": "https://example.com/app.css", "shortName": "app.css", - Network accessline 564
"url": "https://example.com/app.css", - Network accessline 669
"items": [ { "scope": "https://example.com/", - Network accessline 670
{ "scope": "https://example.com/", "scriptURL": "https://example.com/sw.js", - Network accessline 671
"scope": "https://example.com/", - Network accessline 672
"scriptURL": "https://example.com/sw.js", - Network accessline 746
"missingPreconnectsCount": 1, "missingPreconnects": [ { "origin": "https://cdn.example", "requestCount": 6, "sizeBytes": 84000, "resourceTypes": ["script", "img"], "recommendedHint": "preconnect" } - Network accessline 747
"missingPreconnects": [ { "origin": "https://cdn.example", "requestCount": 6, "sizeBytes": 84000, "resourceTypes": ["script", "img"], "recommendedHint": "preconnect" } ] - Network accessline 748
{ "origin": "https://cdn.example", "requestCount": 6, "sizeBytes": 84000, "resourceTypes": ["script", "img"], "recommendedHint": "preconnect" } - Network accessline 761
"status": "ok", "items": [ { "domain": "https://old.example", "href": "https://old.example/", "requestCount": 0, "action": "remove-unused-preconnect", "recommendedHint": null }, - Network accessline 762
"items": [ { "domain": "https://old.example", "href": "https://old.example/", "requestCount": 0, "action": "remove-unused-preconnect", "recommendedHint": null }, { "domain": "https://cdn.example", "href": null, "requestCount": 6, "a - Network accessline 763
{ "domain": "https://old.example", "href": "https://old.example/", "requestCount": 0, "action": "remove-unused-preconnect", "recommendedHint": null }, - Network accessline 764
{ "domain": "https://cdn.example", "href": null, "requestCount": 6, "action": "add-preconnect", "recommendedHint": "preconnect" }, - Network accessline 765
{ "domain": "https://fonts.example", "href": null, "requestCount": 2, "action": "remove-dns-prefetch", "recommendedHint": "preconnect" } - Network accessline 796
"preloadedNotUsedCount": 0, "usedNotPreloadedCount": 0, "preloadedFonts": [{ "family": "inter", "href": "https://cdn.example/inter.woff2", "fontType": "font/woff2", "crossorigin": "anonymous", "thirdParty": true }] - Network accessline 797
"usedNotPreloadedCount": 0, "preloadedFonts": [{ "family": "inter", "href": "https://cdn.example/inter.woff2", "fontType": "font/woff2", "crossorigin": "anonymous", "thirdParty": true }] }, - Network accessline 798
"preloadedFonts": [{ "family": "inter", "href": "https://cdn.example/inter.woff2", "fontType": "font/woff2", "crossorigin": "anonymous", "thirdParty": true }] - Network accessline 833
`details` counts what the CSSOM keeps of the CSS as written, as [css-analyzer](https://github.com/projectwallace/css-analyzer) counts its text: rules (style rules, nested and inside at-rules), selectors (each one of a list), declarations (a - Network accessline 862
}, "items": [ { "source": "https://example.com/app.css", "read": "cssom", "ruleCount": 790, "embeddedBytes": 41210, "importCount": 1, "importantCount": 48 }, - Network accessline 863
"items": [ { "source": "https://example.com/app.css", "read": "cssom", "ruleCount": 790, "embeddedBytes": 41210, "importCount": 1, "importantCount": 48 }, { "source": "https://cdn.example.com/vendor.css", "read": "fetched", "ruleCou - Network accessline 864
{ "source": "https://example.com/app.css", "read": "cssom", "ruleCount": 790, "embeddedBytes": 41210, "importCount": 1, "importantCount": 48 }, - Network accessline 865
{ "source": "https://cdn.example.com/vendor.css", "read": "fetched", "ruleCount": 22, "embeddedBytes": 0, "importCount": 0, "importantCount": 3 } - Network accessline 866
], "issues": [{ "code": "import", "severity": "warning", "message": "https://example.com/app.css imports https://cdn.example.com/vendor.css with @import: ...", "target": "https://cdn.example.com/vendor.css" }] } - Network accessline 867
"issues": [{ "code": "import", "severity": "warning", "message": "https://example.com/app.css imports https://cdn.example.com/vendor.css with @import: ...", "target": "https://cdn.example.com/vendor.css" }] - Network accessline 886
"properties": 5, "bytes": 160, "bySource": [{ "source": "https://example.com/app.css", "inline": false, "rules": 3, "bytes": 160 }], - Network accessline 887
"bytes": 160, "bySource": [{ "source": "https://example.com/app.css", "inline": false, "rules": 3, "bytes": 160 }], "corsBlockedCount": 0 - Network accessline 888
"bySource": [{ "source": "https://example.com/app.css", "inline": false, "rules": 3, "bytes": 160 }], - Network accessline 1154
`items` holds the 50 images to look at first: the LCP image, then those with the most errors and warnings. `count` and `details` cover every image. The format comes from the `Content-Type` of the response; when a cross-origin image blocks ` - Network accessline 1211
"details": { "devicePixelRatio": 2, "totalImages": 9, "imagesChecked": 7, "oversized": 1, "undersized": 0, "wastedPixels": 1800000, "wastedBytes": 1614610, "skippedHidden": 1, "skippedNotLoaded": 1, "skippedVector": 0 }, "items": [ { - Network accessline 1212
"items": [ { "selector": "#hero", "url": "https://example.com/hero.png", "verdict": "oversized", "naturalWidth": 1600, "naturalHeight": 1200, "renderedWidth": 200, "renderedHeight": 150, "neededWidth": 400, "neededHeight": 300, "ratio": - Network accessline 1213
{ "selector": "#hero", "url": "https://example.com/hero.png", "verdict": "oversized", "naturalWidth": 1600, "naturalHeight": 1200, "renderedWidth": 200, "renderedHeight": 150, "neededWidth": 400, "neededHeight": 300, "ratio": 4, "wastedPixe
skills/webperf-loading/scripts/Back-Forward-Cache.js
- Network accessline 1
// snippets/Loading/Back-Forward-Cache.js | sha256:6b9e604a83c42bfb | https://github.com/nucliweb/webperf-snippets/blob/main/snippets/Loading/Back-Forward-Cache.js - Executable scriptline 1
Executable file - Network accessline 2
(async()=>{const e={supported:"PerformanceNavigationTiming"in window,wasRestored:!1,eligibility:null,blockingReasons:[],notRestoredReasons:null,recommendations:[]};window.addEventListener("pageshow",o=>{o.persisted&&(e.wasRestored=!0)});con - Possible obfuscationline 2
(async()=>{const e={supported:"PerformanceNavigationTiming"in window,wasRestored:!1,eligibility:null,blockingReasons:[],notRestoredReasons:null,recommendations:[]};window.addEventListener("pageshow",o=>{o.persisted&&(e.wasRestored=!0)});con
skills/webperf-loading/scripts/CSS-Complexity.js
- Network accessline 1
// snippets/Loading/CSS-Complexity.js | sha256:bc5fcc3e361aa741 | https://github.com/nucliweb/webperf-snippets/blob/main/snippets/Loading/CSS-Complexity.js - Executable scriptline 1
Executable file - Network accessline 2
(async()=>{function e(e){if(null==e||Number.isNaN(e))return"-";if(0===e)return"0 B";const t=["B","KB","MB","GB"],o=Math.max(0,Math.min(Math.floor(Math.log(e)/Math.log(1024)),t.length-1));return(e/Math.pow(1024,o)).toFixed(1)+" "+t[o]}const - Possible obfuscationline 2
(async()=>{function e(e){if(null==e||Number.isNaN(e))return"-";if(0===e)return"0 B";const t=["B","KB","MB","GB"],o=Math.max(0,Math.min(Math.floor(Math.log(e)/Math.log(1024)),t.length-1));return(e/Math.pow(1024,o)).toFixed(1)+" "+t[o]}const
skills/webperf-loading/scripts/CSS-Media-Queries-Analysis.js
- Network accessline 1
// snippets/Loading/CSS-Media-Queries-Analysis.js | sha256:0b5fe535e72f38fc | https://github.com/nucliweb/webperf-snippets/blob/main/snippets/Loading/CSS-Media-Queries-Analysis.js - Executable scriptline 1
Executable file - Network accessline 2
async function analyzeCSSMediaQueries(e=768){function s(e){try{const s=new URL(e,location.href);return/^https?:$/.test(s.protocol)?(s.hash="webperf-snippets",s.href):e}catch{return e}}const t=[...document.styleSheets],r=[];let n=0;function - Possible obfuscationline 2
async function analyzeCSSMediaQueries(e=768){function s(e){try{const s=new URL(e,location.href);return/^https?:$/.test(s.protocol)?(s.hash="webperf-snippets",s.href):e}catch{return e}}const t=[...document.styleSheets],r=[];let n=0;function
skills/webperf-loading/scripts/Cache-Strategy-Analysis.js
- Network accessline 1
// snippets/Loading/Cache-Strategy-Analysis.js | sha256:5d3f9e708bc0711f | https://github.com/nucliweb/webperf-snippets/blob/main/snippets/Loading/Cache-Strategy-Analysis.js - Executable scriptline 1
Executable file - Possible obfuscationline 2
(async()=>{function e(e){try{const t=new URL(e,location.href);return/^https?:$/.test(t.protocol)?(t.hash="webperf-snippets",t.href):e}catch{return e}}const t=[];function n(e){const t=e.replace(/\.$/,"");if(/^\d{1,3}(\.\d{1,3}){3}$/.test(t)|
skills/webperf-loading/scripts/Client-Side-Redirect-Detection.js
- Network accessline 1
// snippets/Loading/Client-Side-Redirect-Detection.js | sha256:fd9ba5519aed1976 | https://github.com/nucliweb/webperf-snippets/blob/main/snippets/Loading/Client-Side-Redirect-Detection.js - Executable scriptline 1
Executable file - Possible obfuscationline 2
(async()=>{const e=performance.getEntriesByType("navigation");if(0===e.length)return{script:"Client-Side-Redirect-Detection",status:"unsupported",error:"Navigation Timing not available"};const t=e[0],r=new URL(window.location.href),i=perfor
skills/webperf-loading/scripts/Compression-Audit.js
- Network accessline 1
// snippets/Loading/Compression-Audit.js | sha256:3ff52ec890aa8366 | https://github.com/nucliweb/webperf-snippets/blob/main/snippets/Loading/Compression-Audit.js - Executable scriptline 1
Executable file - Possible obfuscationline 2
(()=>{const e={js:.7,css:.7,html:.7,json:.7,svg:.7,xml:.7,font:.5},t={js:"js",mjs:"js",cjs:"js",css:"css",html:"html",htm:"html",json:"json",webmanifest:"json",svg:"svg",xml:"xml",rss:"xml",atom:"xml",ttf:"font",otf:"font",eot:"font"},n=[..
skills/webperf-loading/scripts/Content-Visibility.js
- Network accessline 1
// snippets/Loading/Content-Visibility.js | sha256:9d4887d3949d18cb | https://github.com/nucliweb/webperf-snippets/blob/main/snippets/Loading/Content-Visibility.js - Executable scriptline 1
Executable file - Possible obfuscationline 2
function uniqueSelector(e){const t=e.getRootNode(),n=e=>{try{return 1===t.querySelectorAll(e).length}catch{return!1}},i=[];let o=e;for(;o&&1===o.nodeType;){if(o.id&&n(`#${window.CSS.escape(o.id)}`)){i.unshift(`#${window.CSS.escape(o.id)}`);
skills/webperf-loading/scripts/Critical-CSS-Detection.js
- Network accessline 1
// snippets/Loading/Critical-CSS-Detection.js | sha256:d54510d6c691f440 | https://github.com/nucliweb/webperf-snippets/blob/main/snippets/Loading/Critical-CSS-Detection.js - Executable scriptline 1
Executable file - Possible obfuscationline 2
(()=>{function e(e){if(null==e||Number.isNaN(e))return"-";if(0===e)return"0 B";const t=["B","KB","MB","GB"],n=Math.max(0,Math.min(Math.floor(Math.log(e)/Math.log(1024)),t.length-1));return(e/Math.pow(1024,n)).toFixed(1)+" "+t[n]}const t=143
skills/webperf-loading/scripts/Event-Processing-Time.js
- Network accessline 1
// snippets/Loading/Event-Processing-Time.js | sha256:33aaf72d7b92de16 | https://github.com/nucliweb/webperf-snippets/blob/main/snippets/Loading/Event-Processing-Time.js - Executable scriptline 1
Executable file - Possible obfuscationline 2
(()=>{const t=[{name:"Redirect",start:"redirectStart",end:"redirectEnd",icon:"🔄"},{name:"DNS Lookup",start:"domainLookupStart",end:"domainLookupEnd",icon:"🔍"},{name:"TCP Connection",start:"connectStart",end:"connectEnd",icon:"🔌"},{name:"SSL
skills/webperf-loading/scripts/FCP.js
- Network accessline 1
// snippets/Loading/FCP.js | sha256:cd37fc62ecf86388 | https://github.com/nucliweb/webperf-snippets/blob/main/snippets/Loading/FCP.js - Executable scriptline 1
Executable file - Possible obfuscationline 2
(()=>{function e(e){return e.name.endsWith("#webperf-snippets")}const t=e=>e<=1800?"good":e<=3e3?"needs-improvement":"poor",r=!!window.PerformanceResourceTiming&&"renderBlockingStatus"in window.PerformanceResourceTiming.prototype;new Perfor
skills/webperf-loading/scripts/Find-Above-The-Fold-Lazy-Loaded-Images.js
- Network accessline 1
// snippets/Loading/Find-Above-The-Fold-Lazy-Loaded-Images.js | sha256:5b640f598b3405e3 | https://github.com/nucliweb/webperf-snippets/blob/main/snippets/Loading/Find-Above-The-Fold-Lazy-Loaded-Images.js - Executable scriptline 1
Executable file - Possible obfuscationline 2
(function(){function e(e){const t=e.getRootNode(),i=e=>{try{return 1===t.querySelectorAll(e).length}catch{return!1}},a=[];let n=e;for(;n&&1===n.nodeType;){if(n.id&&i(`#${window.CSS.escape(n.id)}`)){a.unshift(`#${window.CSS.escape(n.id)}`);b
skills/webperf-loading/scripts/Find-Images-With-Lazy-and-Fetchpriority.js
- Network accessline 1
// snippets/Loading/Find-Images-With-Lazy-and-Fetchpriority.js | sha256:b9428aef89563d89 | https://github.com/nucliweb/webperf-snippets/blob/main/snippets/Loading/Find-Images-With-Lazy-and-Fetchpriority.js - Executable scriptline 1
Executable file - Possible obfuscationline 2
(()=>{function e(e){const t=e.getRootNode(),n=e=>{try{return 1===t.querySelectorAll(e).length}catch{return!1}},i=[];let r=e;for(;r&&1===r.nodeType;){if(r.id&&n(`#${window.CSS.escape(r.id)}`)){i.unshift(`#${window.CSS.escape(r.id)}`);break}c
skills/webperf-loading/scripts/Find-non-Lazy-Loaded-Images-outside-of-the-viewport.js
- Network accessline 1
// snippets/Loading/Find-non-Lazy-Loaded-Images-outside-of-the-viewport.js | sha256:84cf7a5adcd5c632 | https://github.com/nucliweb/webperf-snippets/blob/main/snippets/Loading/Find-non-Lazy-Loaded-Images-outside-of-the-viewport.js - Executable scriptline 1
Executable file - Possible obfuscationline 2
(function(){function e(e){const t=e.getRootNode(),n=e=>{try{return 1===t.querySelectorAll(e).length}catch{return!1}},o=[];let i=e;for(;i&&1===i.nodeType;){if(i.id&&n(`#${window.CSS.escape(i.id)}`)){o.unshift(`#${window.CSS.escape(i.id)}`);b
skills/webperf-loading/scripts/Find-render-blocking-resources.js
- Network accessline 1
// snippets/Loading/Find-render-blocking-resources.js | sha256:956e114c83da4ff2 | https://github.com/nucliweb/webperf-snippets/blob/main/snippets/Loading/Find-render-blocking-resources.js - Executable scriptline 1
Executable file - Possible obfuscationline 2
(()=>{function e(e){return e.name.endsWith("#webperf-snippets")}const r=performance.getEntriesByType("resource").filter(r=>!e(r))[0];if(r&&!("renderBlockingStatus"in r))return{script:"Find-render-blocking-resources",status:"unsupported",err
skills/webperf-loading/scripts/First-And-Third-Party-Script-Info.js
- Network accessline 1
// snippets/Loading/First-And-Third-Party-Script-Info.js | sha256:6cfae12c4fdf4595 | https://github.com/nucliweb/webperf-snippets/blob/main/snippets/Loading/First-And-Third-Party-Script-Info.js - Executable scriptline 1
Executable file - Possible obfuscationline 2
(()=>{const e=[];function t(e){const t=e.replace(/\.$/,"");if(/^\d{1,3}(\.\d{1,3}){3}$/.test(t)||t.includes(":"))return t;const r=t.split(".");return r.length<=2?t:2===r[r.length-1].length&&["ac","co","com","edu","go","gob","gouv","gov","go
skills/webperf-loading/scripts/First-And-Third-Party-Script-Timings.js
- Network accessline 1
// snippets/Loading/First-And-Third-Party-Script-Timings.js | sha256:e7def6fa54125f16 | https://github.com/nucliweb/webperf-snippets/blob/main/snippets/Loading/First-And-Third-Party-Script-Timings.js - Executable scriptline 1
Executable file - Possible obfuscationline 2
(()=>{const t=[];function e(t){const e=t.replace(/\.$/,"");if(/^\d{1,3}(\.\d{1,3}){3}$/.test(e)||e.includes(":"))return e;const s=e.split(".");return s.length<=2?e:2===s[s.length-1].length&&["ac","co","com","edu","go","gob","gouv","gov","go
skills/webperf-loading/scripts/Fonts-Preloaded-Loaded-and-used-above-the-fold.js
- Network accessline 1
// snippets/Loading/Fonts-Preloaded-Loaded-and-used-above-the-fold.js | sha256:6308d064c5b2afb9 | https://github.com/nucliweb/webperf-snippets/blob/main/snippets/Loading/Fonts-Preloaded-Loaded-and-used-above-the-fold.js - Executable scriptline 1
Executable file - Possible obfuscationline 2
(()=>{const e=[];function t(e){try{const t=new URL(e).pathname;return t.split("/").pop()||t}catch{return e}}function o(e){const t=e.replace(/\.$/,"");if(/^\d{1,3}(\.\d{1,3}){3}$/.test(t)||t.includes(":"))return t;const o=t.split(".");return
skills/webperf-loading/scripts/Inline-CSS-Info-and-Size.js
- Network accessline 1
// snippets/Loading/Inline-CSS-Info-and-Size.js | sha256:4248d11299b3cb45 | https://github.com/nucliweb/webperf-snippets/blob/main/snippets/Loading/Inline-CSS-Info-and-Size.js - Executable scriptline 1
Executable file - Possible obfuscationline 2
(()=>{function e(e){if(null==e||Number.isNaN(e))return"-";if(0===e)return"0 B";const t=["B","KB","MB","GB"],s=Math.max(0,Math.min(Math.floor(Math.log(e)/Math.log(1024)),t.length-1));return(e/Math.pow(1024,s)).toFixed(1)+" "+t[s]}const t=Arr
skills/webperf-loading/scripts/Inline-Script-Info-and-Size.js
- Network accessline 1
// snippets/Loading/Inline-Script-Info-and-Size.js | sha256:b1e137e379ae0e3f | https://github.com/nucliweb/webperf-snippets/blob/main/snippets/Loading/Inline-Script-Info-and-Size.js - Executable scriptline 1
Executable file - Possible obfuscationline 2
(()=>{function e(e){if(null==e||Number.isNaN(e))return"-";if(0===e)return"0 B";const t=["B","KB","MB","GB"],s=Math.max(0,Math.min(Math.floor(Math.log(e)/Math.log(1024)),t.length-1));return(e/Math.pow(1024,s)).toFixed(1)+" "+t[s]}const t=["_
skills/webperf-loading/scripts/JS-Execution-Time-Breakdown.js
- Network accessline 1
// snippets/Loading/JS-Execution-Time-Breakdown.js | sha256:ff61fb6a7face483 | https://github.com/nucliweb/webperf-snippets/blob/main/snippets/Loading/JS-Execution-Time-Breakdown.js - Executable scriptline 1
Executable file - Possible obfuscationline 2
(()=>{const e=e=>e>0?e.toFixed(0)+"ms":"-";function t(e){if(null==e||Number.isNaN(e))return"-";if(0===e)return"0 B";const t=["B","KB","MB","GB"],s=Math.max(0,Math.min(Math.floor(Math.log(e)/Math.log(1024)),t.length-1));return(e/Math.pow(102
skills/webperf-loading/scripts/Prefetch-Resource-Validation.js
- Network accessline 1
// snippets/Loading/Prefetch-Resource-Validation.js | sha256:f1c557ac1ad1c6d5 | https://github.com/nucliweb/webperf-snippets/blob/main/snippets/Loading/Prefetch-Resource-Validation.js - Executable scriptline 1
Executable file - Possible obfuscationline 2
(()=>{const e=Array.from(document.querySelectorAll('link[rel="prefetch"]'));if(0===e.length)return{script:"Prefetch-Resource-Validation",status:"ok",count:0,items:[],issues:[{code:"no-prefetch",severity:"info",message:'No prefetch hints on
skills/webperf-loading/scripts/Priority-Hints-Audit.js
- Network accessline 1
// snippets/Loading/Priority-Hints-Audit.js | sha256:e88ca8e26ddc425e | https://github.com/nucliweb/webperf-snippets/blob/main/snippets/Loading/Priority-Hints-Audit.js - Executable scriptline 1
Executable file - Possible obfuscationline 2
(()=>{function e(e){const t=e.getBoundingClientRect();return t.top<window.innerHeight&&t.bottom>0&&t.left<window.innerWidth&&t.right>0&&t.width>0&&t.height>0}function t(e){const t=e.src||e.href||e.getAttribute("href")||"";return t.split("/"
skills/webperf-loading/scripts/Resource-Hints-Validation.js
- Network accessline 1
// snippets/Loading/Resource-Hints-Validation.js | sha256:dbffcd164a73b907 | https://github.com/nucliweb/webperf-snippets/blob/main/snippets/Loading/Resource-Hints-Validation.js - Executable scriptline 1
Executable file - Possible obfuscationline 2
(()=>{document;const e=Array.from(document.querySelectorAll('link[rel="preload"]')),t=Array.from(document.querySelectorAll('link[rel="preconnect"]')),n=Array.from(document.querySelectorAll('link[rel="dns-prefetch"]')),r=performance.getEntri
skills/webperf-loading/scripts/Resource-Hints.js
- Network accessline 1
// snippets/Loading/Resource-Hints.js | sha256:07b5029ae84b9011 | https://github.com/nucliweb/webperf-snippets/blob/main/snippets/Loading/Resource-Hints.js - Executable scriptline 1
Executable file - Possible obfuscationline 2
(()=>{function e(e){return e.name.endsWith("#webperf-snippets")}function r(e){if(null==e||Number.isNaN(e))return"-";if(0===e)return"0 B";const r=["B","KB","MB","GB"],o=Math.max(0,Math.min(Math.floor(Math.log(e)/Math.log(1024)),r.length-1));
skills/webperf-loading/scripts/SSR-Hydration-Data-Analysis.js
- Network accessline 1
// snippets/Loading/SSR-Hydration-Data-Analysis.js | sha256:eb254bf7a31cac66 | https://github.com/nucliweb/webperf-snippets/blob/main/snippets/Loading/SSR-Hydration-Data-Analysis.js - Executable scriptline 1
Executable file - Network accessline 2
[Credential-related source omitted] - Possible obfuscationline 2
[Credential-related source omitted] - Access to secretsline 2
[Credential-related source omitted]
skills/webperf-loading/scripts/Script-Loading.js
- Network accessline 1
// snippets/Loading/Script-Loading.js | sha256:c926cc2a1babbfd3 | https://github.com/nucliweb/webperf-snippets/blob/main/snippets/Loading/Script-Loading.js - Executable scriptline 1
Executable file - Possible obfuscationline 2
(()=>{const e=[];function t(e){if(null==e||Number.isNaN(e))return"-";if(0===e)return"0 B";const t=["B","KB","MB","GB"],r=Math.max(0,Math.min(Math.floor(Math.log(e)/Math.log(1024)),t.length-1));return(e/Math.pow(1024,r)).toFixed(1)+" "+t[r]}
skills/webperf-loading/scripts/Server-Timing-Early-Hints.js
- Network accessline 1
// snippets/Loading/Server-Timing-Early-Hints.js | sha256:5d59b89aac1ec7b3 | https://github.com/nucliweb/webperf-snippets/blob/main/snippets/Loading/Server-Timing-Early-Hints.js - Executable scriptline 1
Executable file - Possible obfuscationline 2
(()=>{const e="Server-Timing-Early-Hints",[r]=performance.getEntriesByType("navigation");if(!r)return{script:e,status:"error",error:"No navigation entry available"};if(!Array.isArray(r.serverTiming))return{script:e,status:"unsupported",erro
skills/webperf-loading/scripts/Service-Worker-Analysis.js
- Network accessline 1
// snippets/Loading/Service-Worker-Analysis.js | sha256:1e4ed59b35983d19 | https://github.com/nucliweb/webperf-snippets/blob/main/snippets/Loading/Service-Worker-Analysis.js - Executable scriptline 1
Executable file - Possible obfuscationline 2
(async()=>{if(!("serviceWorker"in navigator))return{script:"Service-Worker-Analysis",status:"unsupported",error:"Service Workers not supported in this browser",count:0,details:{},items:[],issues:[{code:"unsupported",severity:"error",message
skills/webperf-loading/scripts/Speculation-Rules-Inspector.js
- Network accessline 1
// snippets/Loading/Speculation-Rules-Inspector.js | sha256:6bd00e36c4f0b97c | https://github.com/nucliweb/webperf-snippets/blob/main/snippets/Loading/Speculation-Rules-Inspector.js - Executable scriptline 1
Executable file - Possible obfuscationline 2
(()=>{const e={activated:!document.prerendering,activatedAt:null};document.prerendering&&document.addEventListener("prerenderingchange",()=>{e.activated=!0,e.activatedAt=Math.round(performance.now())},{once:!0});const r=()=>{const r=[],t=[]
skills/webperf-loading/scripts/TTFB-Resources.js
- Network accessline 1
// snippets/Loading/TTFB-Resources.js | sha256:358f34a389183974 | https://github.com/nucliweb/webperf-snippets/blob/main/snippets/Loading/TTFB-Resources.js - Executable scriptline 1
Executable file - Possible obfuscationline 2
(()=>{function t(t){return t.name.endsWith("#webperf-snippets")}const e=[],r=t=>t.responseStart-t.requestStart,s=t=>t.responseStart>0;function n(t){const e=t.replace(/\.$/,"");if(/^\d{1,3}(\.\d{1,3}){3}$/.test(e)||e.includes(":"))return e;c
skills/webperf-loading/scripts/TTFB-Sub-Parts.js
- Network accessline 1
// snippets/Loading/TTFB-Sub-Parts.js | sha256:bd057af385152ba3 | https://github.com/nucliweb/webperf-snippets/blob/main/snippets/Loading/TTFB-Sub-Parts.js - Executable scriptline 1
Executable file - Possible obfuscationline 2
(()=>{new PerformanceObserver(e=>{const[t]=e.getEntriesByType("navigation"),r=t.activationStart||0,n=Math.max((t.workerStart||t.fetchStart)-r,0),o=Math.max(t.domainLookupStart-r,0),a=Math.max(t.connectStart-r,0),i=Math.max(t.connectEnd-r,0)
skills/webperf-loading/scripts/TTFB.js
skills/webperf-loading/scripts/Third-Party-Impact-by-Domain.js
- Network accessline 1
// snippets/Loading/Third-Party-Impact-by-Domain.js | sha256:c0d214a959c10e80 | https://github.com/nucliweb/webperf-snippets/blob/main/snippets/Loading/Third-Party-Impact-by-Domain.js - Executable scriptline 1
Executable file - Possible obfuscationline 2
(()=>{const e=[];function n(e){const n=e.replace(/\.$/,"");if(/^\d{1,3}(\.\d{1,3}){3}$/.test(n)||n.includes(":"))return n;const t=n.split(".");return t.length<=2?n:2===t[t.length-1].length&&["ac","co","com","edu","go","gob","gouv","gov","go
skills/webperf-loading/scripts/Validate-Preload-Async-Defer-Scripts.js
- Network accessline 1
// snippets/Loading/Validate-Preload-Async-Defer-Scripts.js | sha256:5f1f5f1c01180037 | https://github.com/nucliweb/webperf-snippets/blob/main/snippets/Loading/Validate-Preload-Async-Defer-Scripts.js - Executable scriptline 1
Executable file - Possible obfuscationline 2
(()=>{const e=Array.from(document.querySelectorAll('link[rel="preload"][as="script"]'));if(0===e.length)return{script:"Validate-Preload-Async-Defer-Scripts",status:"ok",count:0,items:[],issues:[]};const t=performance.getEntriesByType("resou
skills/webperf-loading/scripts/Webfont-Usage-Analyzer.js
- Network accessline 1
// snippets/Loading/Webfont-Usage-Analyzer.js | sha256:47176322809a830c | https://github.com/nucliweb/webperf-snippets/blob/main/snippets/Loading/Webfont-Usage-Analyzer.js - Executable scriptline 1
Executable file - Possible obfuscationline 2
(()=>{const e="Webfont-Usage-Analyzer",t=307200,s=/\.(woff2?|ttf|otf|eot)(\?|#|$)/i;if("undefined"==typeof FontFace||!document.fonts)return{script:e,status:"unsupported",message:"The CSS Font Loading API (document.fonts) is not available in
skills/webperf-media/SKILL.md
- Network accessline 8
mcp-server: chrome-devtools category: web-performance repository: https://github.com/nucliweb/webperf-snippets - Network accessline 9
category: web-performance repository: https://github.com/nucliweb/webperf-snippets --- - Network accessline 10
repository: https://github.com/nucliweb/webperf-snippets - Network accessline 25
Without Chrome DevTools MCP, run the same snippet with the [webperf-snippets CLI](https://webperf-snippets.net/CLI), which loads the page in headless Chromium and prints the same result objects: `npx webperf-snippets <url> --snippet <Name>
skills/webperf-media/references/schema.md
- Network accessline 210
"element": "img.hero", "elementType": "Image", "url": "https://example.com/hero.jpg", - Network accessline 211
"elementType": "Image", "url": "https://example.com/hero.jpg", "sizePixels": 756000 - Network accessline 212
"url": "https://example.com/hero.jpg", - Network accessline 417
"details": { "isVideo": true, "posterUrl": "https://example.com/hero.avif", - Network accessline 418
"isVideo": true, "posterUrl": "https://example.com/hero.avif", "posterFormat": "avif", - Network accessline 419
"posterUrl": "https://example.com/hero.avif", - Network accessline 493
{ "type": "link", "url": "https://example.com/style.css", - Network accessline 494
"type": "link", "url": "https://example.com/style.css", "shortName": "style.css", - Network accessline 495
"url": "https://example.com/style.css", - Network accessline 522
"items": [ { "url": "https://example.com/app.js", - Network accessline 523
{ "url": "https://example.com/app.js", "shortName": "app.js", - Network accessline 524
"url": "https://example.com/app.js", - Network accessline 562
"items": [ { "url": "https://example.com/app.css", - Network accessline 563
{ "url": "https://example.com/app.css", "shortName": "app.css", - Network accessline 564
"url": "https://example.com/app.css", - Network accessline 669
"items": [ { "scope": "https://example.com/", - Network accessline 670
{ "scope": "https://example.com/", "scriptURL": "https://example.com/sw.js", - Network accessline 671
"scope": "https://example.com/", - Network accessline 672
"scriptURL": "https://example.com/sw.js", - Network accessline 746
"missingPreconnectsCount": 1, "missingPreconnects": [ { "origin": "https://cdn.example", "requestCount": 6, "sizeBytes": 84000, "resourceTypes": ["script", "img"], "recommendedHint": "preconnect" } - Network accessline 747
"missingPreconnects": [ { "origin": "https://cdn.example", "requestCount": 6, "sizeBytes": 84000, "resourceTypes": ["script", "img"], "recommendedHint": "preconnect" } ] - Network accessline 748
{ "origin": "https://cdn.example", "requestCount": 6, "sizeBytes": 84000, "resourceTypes": ["script", "img"], "recommendedHint": "preconnect" } - Network accessline 761
"status": "ok", "items": [ { "domain": "https://old.example", "href": "https://old.example/", "requestCount": 0, "action": "remove-unused-preconnect", "recommendedHint": null }, - Network accessline 762
"items": [ { "domain": "https://old.example", "href": "https://old.example/", "requestCount": 0, "action": "remove-unused-preconnect", "recommendedHint": null }, { "domain": "https://cdn.example", "href": null, "requestCount": 6, "a - Network accessline 763
{ "domain": "https://old.example", "href": "https://old.example/", "requestCount": 0, "action": "remove-unused-preconnect", "recommendedHint": null }, - Network accessline 764
{ "domain": "https://cdn.example", "href": null, "requestCount": 6, "action": "add-preconnect", "recommendedHint": "preconnect" }, - Network accessline 765
{ "domain": "https://fonts.example", "href": null, "requestCount": 2, "action": "remove-dns-prefetch", "recommendedHint": "preconnect" } - Network accessline 796
"preloadedNotUsedCount": 0, "usedNotPreloadedCount": 0, "preloadedFonts": [{ "family": "inter", "href": "https://cdn.example/inter.woff2", "fontType": "font/woff2", "crossorigin": "anonymous", "thirdParty": true }] - Network accessline 797
"usedNotPreloadedCount": 0, "preloadedFonts": [{ "family": "inter", "href": "https://cdn.example/inter.woff2", "fontType": "font/woff2", "crossorigin": "anonymous", "thirdParty": true }] }, - Network accessline 798
"preloadedFonts": [{ "family": "inter", "href": "https://cdn.example/inter.woff2", "fontType": "font/woff2", "crossorigin": "anonymous", "thirdParty": true }] - Network accessline 833
`details` counts what the CSSOM keeps of the CSS as written, as [css-analyzer](https://github.com/projectwallace/css-analyzer) counts its text: rules (style rules, nested and inside at-rules), selectors (each one of a list), declarations (a - Network accessline 862
}, "items": [ { "source": "https://example.com/app.css", "read": "cssom", "ruleCount": 790, "embeddedBytes": 41210, "importCount": 1, "importantCount": 48 }, - Network accessline 863
"items": [ { "source": "https://example.com/app.css", "read": "cssom", "ruleCount": 790, "embeddedBytes": 41210, "importCount": 1, "importantCount": 48 }, { "source": "https://cdn.example.com/vendor.css", "read": "fetched", "ruleCou - Network accessline 864
{ "source": "https://example.com/app.css", "read": "cssom", "ruleCount": 790, "embeddedBytes": 41210, "importCount": 1, "importantCount": 48 }, - Network accessline 865
{ "source": "https://cdn.example.com/vendor.css", "read": "fetched", "ruleCount": 22, "embeddedBytes": 0, "importCount": 0, "importantCount": 3 } - Network accessline 866
], "issues": [{ "code": "import", "severity": "warning", "message": "https://example.com/app.css imports https://cdn.example.com/vendor.css with @import: ...", "target": "https://cdn.example.com/vendor.css" }] } - Network accessline 867
"issues": [{ "code": "import", "severity": "warning", "message": "https://example.com/app.css imports https://cdn.example.com/vendor.css with @import: ...", "target": "https://cdn.example.com/vendor.css" }] - Network accessline 886
"properties": 5, "bytes": 160, "bySource": [{ "source": "https://example.com/app.css", "inline": false, "rules": 3, "bytes": 160 }], - Network accessline 887
"bytes": 160, "bySource": [{ "source": "https://example.com/app.css", "inline": false, "rules": 3, "bytes": 160 }], "corsBlockedCount": 0 - Network accessline 888
"bySource": [{ "source": "https://example.com/app.css", "inline": false, "rules": 3, "bytes": 160 }], - Network accessline 1154
`items` holds the 50 images to look at first: the LCP image, then those with the most errors and warnings. `count` and `details` cover every image. The format comes from the `Content-Type` of the response; when a cross-origin image blocks ` - Network accessline 1211
"details": { "devicePixelRatio": 2, "totalImages": 9, "imagesChecked": 7, "oversized": 1, "undersized": 0, "wastedPixels": 1800000, "wastedBytes": 1614610, "skippedHidden": 1, "skippedNotLoaded": 1, "skippedVector": 0 }, "items": [ { - Network accessline 1212
"items": [ { "selector": "#hero", "url": "https://example.com/hero.png", "verdict": "oversized", "naturalWidth": 1600, "naturalHeight": 1200, "renderedWidth": 200, "renderedHeight": 150, "neededWidth": 400, "neededHeight": 300, "ratio": - Network accessline 1213
{ "selector": "#hero", "url": "https://example.com/hero.png", "verdict": "oversized", "naturalWidth": 1600, "naturalHeight": 1200, "renderedWidth": 200, "renderedHeight": 150, "neededWidth": 400, "neededHeight": 300, "ratio": 4, "wastedPixe
skills/webperf-media/scripts/Image-Element-Audit.js
- Network accessline 1
// snippets/Media/Image-Element-Audit.js | sha256:e3ea2eb85a482386 | https://github.com/nucliweb/webperf-snippets/blob/main/snippets/Media/Image-Element-Audit.js - Executable scriptline 1
Executable file - Network accessline 2
(async()=>{function e(e){const t=e.getBoundingClientRect();return t.top<window.innerHeight&&t.bottom>0&&t.left<window.innerWidth&&t.right>0&&t.width>0&&t.height>0}function t(t){let i=null,n=0;return t.filter(e).forEach(e=>{const{width:t,hei - Possible obfuscationline 2
(async()=>{function e(e){const t=e.getBoundingClientRect();return t.top<window.innerHeight&&t.bottom>0&&t.left<window.innerWidth&&t.right>0&&t.width>0&&t.height>0}function t(t){let i=null,n=0;return t.filter(e).forEach(e=>{const{width:t,hei
skills/webperf-media/scripts/Oversized-Images.js
- Network accessline 1
// snippets/Media/Oversized-Images.js | sha256:6ddfaee478d9617b | https://github.com/nucliweb/webperf-snippets/blob/main/snippets/Media/Oversized-Images.js - Executable scriptline 1
Executable file - Possible obfuscationline 2
(async()=>{const e=window.devicePixelRatio||1,t=e=>Math.round(100*e)/100,r=e=>parseFloat(e)||0,i=e=>e.startsWith("data:")?e.slice(0,60):e,n=e=>e.split("?")[0].split("/").pop()||e;function s(e){const t=e.getRootNode(),r=e=>{try{return 1===t.
skills/webperf-media/scripts/SVG-Embedded-Bitmap-Analysis.js
- Network accessline 1
// snippets/Media/SVG-Embedded-Bitmap-Analysis.js | sha256:8ea5fc906cba2e82 | https://github.com/nucliweb/webperf-snippets/blob/main/snippets/Media/SVG-Embedded-Bitmap-Analysis.js - Executable scriptline 1
Executable file - Network accessline 2
(async()=>{function e(e){try{const t=new URL(e).pathname,n=t.split("/").pop()||t;return n.length>45?"…"+n.slice(-42):n}catch{return e.slice(-45)}}function t(e){const t=[],n=/data:image\/(png|jpe?g|gif|webp|avif|bmp|tiff?|ico);base64,([A-Za- - Possible obfuscationline 2
(async()=>{function e(e){try{const t=new URL(e).pathname,n=t.split("/").pop()||t;return n.length>45?"…"+n.slice(-42):n}catch{return e.slice(-45)}}function t(e){const t=[],n=/data:image\/(png|jpe?g|gif|webp|avif|bmp|tiff?|ico);base64,([A-Za-
skills/webperf-media/scripts/Video-Element-Audit.js
- Network accessline 1
// snippets/Media/Video-Element-Audit.js | sha256:86d32365d49e63a8 | https://github.com/nucliweb/webperf-snippets/blob/main/snippets/Media/Video-Element-Audit.js - Executable scriptline 1
Executable file - Possible obfuscationline 2
(()=>{const e=Array.from(document.querySelectorAll("video"));if(0===e.length)return{script:"Video-Element-Audit",status:"ok",count:0,items:[],issues:[{code:"no-videos",severity:"info",message:"No <video> elements on this page, so there was
skills/webperf-resources/SKILL.md
- Network accessline 8
mcp-server: chrome-devtools category: web-performance repository: https://github.com/nucliweb/webperf-snippets - Network accessline 9
category: web-performance repository: https://github.com/nucliweb/webperf-snippets --- - Network accessline 10
repository: https://github.com/nucliweb/webperf-snippets - Network accessline 25
Without Chrome DevTools MCP, run the same snippet with the [webperf-snippets CLI](https://webperf-snippets.net/CLI), which loads the page in headless Chromium and prints the same result objects: `npx webperf-snippets <url> --snippet <Name>
skills/webperf-resources/references/schema.md
- Network accessline 210
"element": "img.hero", "elementType": "Image", "url": "https://example.com/hero.jpg", - Network accessline 211
"elementType": "Image", "url": "https://example.com/hero.jpg", "sizePixels": 756000 - Network accessline 212
"url": "https://example.com/hero.jpg", - Network accessline 417
"details": { "isVideo": true, "posterUrl": "https://example.com/hero.avif", - Network accessline 418
"isVideo": true, "posterUrl": "https://example.com/hero.avif", "posterFormat": "avif", - Network accessline 419
"posterUrl": "https://example.com/hero.avif", - Network accessline 493
{ "type": "link", "url": "https://example.com/style.css", - Network accessline 494
"type": "link", "url": "https://example.com/style.css", "shortName": "style.css", - Network accessline 495
"url": "https://example.com/style.css", - Network accessline 522
"items": [ { "url": "https://example.com/app.js", - Network accessline 523
{ "url": "https://example.com/app.js", "shortName": "app.js", - Network accessline 524
"url": "https://example.com/app.js", - Network accessline 562
"items": [ { "url": "https://example.com/app.css", - Network accessline 563
{ "url": "https://example.com/app.css", "shortName": "app.css", - Network accessline 564
"url": "https://example.com/app.css", - Network accessline 669
"items": [ { "scope": "https://example.com/", - Network accessline 670
{ "scope": "https://example.com/", "scriptURL": "https://example.com/sw.js", - Network accessline 671
"scope": "https://example.com/", - Network accessline 672
"scriptURL": "https://example.com/sw.js", - Network accessline 746
"missingPreconnectsCount": 1, "missingPreconnects": [ { "origin": "https://cdn.example", "requestCount": 6, "sizeBytes": 84000, "resourceTypes": ["script", "img"], "recommendedHint": "preconnect" } - Network accessline 747
"missingPreconnects": [ { "origin": "https://cdn.example", "requestCount": 6, "sizeBytes": 84000, "resourceTypes": ["script", "img"], "recommendedHint": "preconnect" } ] - Network accessline 748
{ "origin": "https://cdn.example", "requestCount": 6, "sizeBytes": 84000, "resourceTypes": ["script", "img"], "recommendedHint": "preconnect" } - Network accessline 761
"status": "ok", "items": [ { "domain": "https://old.example", "href": "https://old.example/", "requestCount": 0, "action": "remove-unused-preconnect", "recommendedHint": null }, - Network accessline 762
"items": [ { "domain": "https://old.example", "href": "https://old.example/", "requestCount": 0, "action": "remove-unused-preconnect", "recommendedHint": null }, { "domain": "https://cdn.example", "href": null, "requestCount": 6, "a - Network accessline 763
{ "domain": "https://old.example", "href": "https://old.example/", "requestCount": 0, "action": "remove-unused-preconnect", "recommendedHint": null }, - Network accessline 764
{ "domain": "https://cdn.example", "href": null, "requestCount": 6, "action": "add-preconnect", "recommendedHint": "preconnect" }, - Network accessline 765
{ "domain": "https://fonts.example", "href": null, "requestCount": 2, "action": "remove-dns-prefetch", "recommendedHint": "preconnect" } - Network accessline 796
"preloadedNotUsedCount": 0, "usedNotPreloadedCount": 0, "preloadedFonts": [{ "family": "inter", "href": "https://cdn.example/inter.woff2", "fontType": "font/woff2", "crossorigin": "anonymous", "thirdParty": true }] - Network accessline 797
"usedNotPreloadedCount": 0, "preloadedFonts": [{ "family": "inter", "href": "https://cdn.example/inter.woff2", "fontType": "font/woff2", "crossorigin": "anonymous", "thirdParty": true }] }, - Network accessline 798
"preloadedFonts": [{ "family": "inter", "href": "https://cdn.example/inter.woff2", "fontType": "font/woff2", "crossorigin": "anonymous", "thirdParty": true }] - Network accessline 833
`details` counts what the CSSOM keeps of the CSS as written, as [css-analyzer](https://github.com/projectwallace/css-analyzer) counts its text: rules (style rules, nested and inside at-rules), selectors (each one of a list), declarations (a - Network accessline 862
}, "items": [ { "source": "https://example.com/app.css", "read": "cssom", "ruleCount": 790, "embeddedBytes": 41210, "importCount": 1, "importantCount": 48 }, - Network accessline 863
"items": [ { "source": "https://example.com/app.css", "read": "cssom", "ruleCount": 790, "embeddedBytes": 41210, "importCount": 1, "importantCount": 48 }, { "source": "https://cdn.example.com/vendor.css", "read": "fetched", "ruleCou - Network accessline 864
{ "source": "https://example.com/app.css", "read": "cssom", "ruleCount": 790, "embeddedBytes": 41210, "importCount": 1, "importantCount": 48 }, - Network accessline 865
{ "source": "https://cdn.example.com/vendor.css", "read": "fetched", "ruleCount": 22, "embeddedBytes": 0, "importCount": 0, "importantCount": 3 } - Network accessline 866
], "issues": [{ "code": "import", "severity": "warning", "message": "https://example.com/app.css imports https://cdn.example.com/vendor.css with @import: ...", "target": "https://cdn.example.com/vendor.css" }] } - Network accessline 867
"issues": [{ "code": "import", "severity": "warning", "message": "https://example.com/app.css imports https://cdn.example.com/vendor.css with @import: ...", "target": "https://cdn.example.com/vendor.css" }] - Network accessline 886
"properties": 5, "bytes": 160, "bySource": [{ "source": "https://example.com/app.css", "inline": false, "rules": 3, "bytes": 160 }], - Network accessline 887
"bytes": 160, "bySource": [{ "source": "https://example.com/app.css", "inline": false, "rules": 3, "bytes": 160 }], "corsBlockedCount": 0 - Network accessline 888
"bySource": [{ "source": "https://example.com/app.css", "inline": false, "rules": 3, "bytes": 160 }], - Network accessline 1154
`items` holds the 50 images to look at first: the LCP image, then those with the most errors and warnings. `count` and `details` cover every image. The format comes from the `Content-Type` of the response; when a cross-origin image blocks ` - Network accessline 1211
"details": { "devicePixelRatio": 2, "totalImages": 9, "imagesChecked": 7, "oversized": 1, "undersized": 0, "wastedPixels": 1800000, "wastedBytes": 1614610, "skippedHidden": 1, "skippedNotLoaded": 1, "skippedVector": 0 }, "items": [ { - Network accessline 1212
"items": [ { "selector": "#hero", "url": "https://example.com/hero.png", "verdict": "oversized", "naturalWidth": 1600, "naturalHeight": 1200, "renderedWidth": 200, "renderedHeight": 150, "neededWidth": 400, "neededHeight": 300, "ratio": - Network accessline 1213
{ "selector": "#hero", "url": "https://example.com/hero.png", "verdict": "oversized", "naturalWidth": 1600, "naturalHeight": 1200, "renderedWidth": 200, "renderedHeight": 150, "neededWidth": 400, "neededHeight": 300, "ratio": 4, "wastedPixe
skills/webperf-resources/references/snippets.md
- Broad permissionsline 1
Unsupported or unresolved allowed-tools declaration
skills/webperf-resources/scripts/Network-Bandwidth-Connection-Quality.js
skills/webperf/SKILL.md
- Network accessline 8
mcp-server: chrome-devtools category: web-performance repository: https://github.com/nucliweb/webperf-snippets - Network accessline 9
category: web-performance repository: https://github.com/nucliweb/webperf-snippets --- - Network accessline 10
repository: https://github.com/nucliweb/webperf-snippets
How the signals fit together
Facts from a static read of the files at the pinned commit. They describe what the code does, not why.
Some files could not be read; the facts below still hold.
Declared and executed: 7 facts
- Contacts nextjs.org, which SKILL.md, the README and the plugin manifest do not mentionwebperf-loading/scripts/SSR-Hydration-Data-Analysis.js:14High confidence
- Contacts nuxt.com, which SKILL.md, the README and the plugin manifest do not mentionwebperf-loading/scripts/SSR-Hydration-Data-Analysis.js:20High confidence
- Contacts nuxtjs.org, which SKILL.md, the README and the plugin manifest do not mentionwebperf-loading/scripts/SSR-Hydration-Data-Analysis.js:26High confidence
- Contacts remix.run, which SKILL.md, the README and the plugin manifest do not mentionwebperf-loading/scripts/SSR-Hydration-Data-Analysis.js:32High confidence
- Contacts www.gatsbyjs.com, which SKILL.md, the README and the plugin manifest do not mentionwebperf-loading/scripts/SSR-Hydration-Data-Analysis.js:39High confidence
- Contacts kit.svelte.dev, which SKILL.md, the README and the plugin manifest do not mentionwebperf-loading/scripts/SSR-Hydration-Data-Analysis.js:45High confidence
- Contacts docs.astro.build, which SKILL.md, the README and the plugin manifest do not mentionwebperf-loading/scripts/SSR-Hydration-Data-Analysis.js:51High confidence
Signal confidence: 493 facts
- Network access in the frontmatter of the SKILL.mdwebperf-core-web-vitals/SKILL.md:15Low confidence
- Network access in the frontmatter of the SKILL.mdwebperf-core-web-vitals/SKILL.md:16Low confidence
- Network access in the frontmatter of the SKILL.mdwebperf-core-web-vitals/SKILL.md:17Low confidence
- Network access in prose of the SKILL.mdwebperf-core-web-vitals/SKILL.md:32Low confidence
- Network access in code of documentationwebperf-core-web-vitals/references/schema.md:210Low confidence
- Network access in code of documentationwebperf-core-web-vitals/references/schema.md:211Low confidence
- Network access in code of documentationwebperf-core-web-vitals/references/schema.md:212Low confidence
- Network access in code of documentationwebperf-core-web-vitals/references/schema.md:417Low confidence
- Network access in code of documentationwebperf-core-web-vitals/references/schema.md:418Low confidence
- Network access in code of documentationwebperf-core-web-vitals/references/schema.md:419Low confidence
- Network access in code of documentationwebperf-core-web-vitals/references/schema.md:493Low confidence
- Network access in code of documentationwebperf-core-web-vitals/references/schema.md:494Low confidence
- Network access in code of documentationwebperf-core-web-vitals/references/schema.md:495Low confidence
- Network access in code of documentationwebperf-core-web-vitals/references/schema.md:522Low confidence
- Network access in code of documentationwebperf-core-web-vitals/references/schema.md:523Low confidence
- Network access in code of documentationwebperf-core-web-vitals/references/schema.md:524Low confidence
- Network access in code of documentationwebperf-core-web-vitals/references/schema.md:562Low confidence
- Network access in code of documentationwebperf-core-web-vitals/references/schema.md:563Low confidence
- Network access in code of documentationwebperf-core-web-vitals/references/schema.md:564Low confidence
- Network access in code of documentationwebperf-core-web-vitals/references/schema.md:669Low confidence
- Network access in code of documentationwebperf-core-web-vitals/references/schema.md:670Low confidence
- Network access in code of documentationwebperf-core-web-vitals/references/schema.md:671Low confidence
- Network access in code of documentationwebperf-core-web-vitals/references/schema.md:672Low confidence
- Network access in code of documentationwebperf-core-web-vitals/references/schema.md:746Low confidence
- Network access in code of documentationwebperf-core-web-vitals/references/schema.md:747Low confidence
- Network access in code of documentationwebperf-core-web-vitals/references/schema.md:748Low confidence
- Network access in code of documentationwebperf-core-web-vitals/references/schema.md:761Low confidence
- Network access in code of documentationwebperf-core-web-vitals/references/schema.md:762Low confidence
- Network access in code of documentationwebperf-core-web-vitals/references/schema.md:763Low confidence
- Network access in code of documentationwebperf-core-web-vitals/references/schema.md:764Low confidence
- Network access in code of documentationwebperf-core-web-vitals/references/schema.md:765Low confidence
- Network access in code of documentationwebperf-core-web-vitals/references/schema.md:796Low confidence
- Network access in code of documentationwebperf-core-web-vitals/references/schema.md:797Low confidence
- Network access in code of documentationwebperf-core-web-vitals/references/schema.md:798Low confidence
- Network access in prose of documentationwebperf-core-web-vitals/references/schema.md:833Low confidence
- Network access in code of documentationwebperf-core-web-vitals/references/schema.md:862Low confidence
- Network access in code of documentationwebperf-core-web-vitals/references/schema.md:863Low confidence
- Network access in code of documentationwebperf-core-web-vitals/references/schema.md:864Low confidence
- Network access in code of documentationwebperf-core-web-vitals/references/schema.md:865Low confidence
- Network access in code of documentationwebperf-core-web-vitals/references/schema.md:866Low confidence
- Network access in code of documentationwebperf-core-web-vitals/references/schema.md:867Low confidence
- Network access in code of documentationwebperf-core-web-vitals/references/schema.md:886Low confidence
- Network access in code of documentationwebperf-core-web-vitals/references/schema.md:887Low confidence
- Network access in code of documentationwebperf-core-web-vitals/references/schema.md:888Low confidence
- Network access in prose of documentationwebperf-core-web-vitals/references/schema.md:1154Low confidence
- Network access in code of documentationwebperf-core-web-vitals/references/schema.md:1211Low confidence
- Network access in code of documentationwebperf-core-web-vitals/references/schema.md:1212Low confidence
- Network access in code of documentationwebperf-core-web-vitals/references/schema.md:1213Low confidence
- Executable script in code of a file that runswebperf-core-web-vitals/scripts/CLS.js:1High confidence
- Executable script in code of a file that runswebperf-core-web-vitals/scripts/INP.js:1High confidence
and 443 more
Only the first 500 facts are listed.
Works with
| Agent | Status | Evidence | Install to |
|---|---|---|---|
| Claude Code | Native | Manifest .claude-plugin/marketplace.json | .claude/skills/<skill-name>/ |
| Codex | Compatible | Standard SKILL.md dist/antigravity/webperf/SKILL.md | .agents/skills/<skill-name>/ |
| Cursor | Compatible | Standard SKILL.md dist/antigravity/webperf/SKILL.md | .cursor/skills/<skill-name>/ |
| Gemini CLI | Compatible | Standard SKILL.md dist/antigravity/webperf/SKILL.md | .gemini/skills/<skill-name>/ |
| GitHub Copilot | Compatible | Standard SKILL.md dist/antigravity/webperf/SKILL.md | .github/skills/<skill-name>/ |
| OpenCode | Compatible | Standard SKILL.md dist/antigravity/webperf/SKILL.md | .opencode/skills/<skill-name>/ |
- Native The repository ships a manifest, folder or frontmatter field for this agent.
- Compatible A standard SKILL.md that this agent can read.
- Unknown No evidence either way.
Derived automatically from paths, manifests and frontmatter. Not tested on each agent.
Explore alternatives and comparisons
Add this badge to your README
It updates every night and links to this page.
[](https://hotskills.dev/skill/nucliweb-webperf-snippets/)