#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()`

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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 

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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()`

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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 

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

View on GitHubAdd to my skills

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>/
1.5kGitHub stars
0stars in 7 days
12skills in this repository
458commits in 30 days

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

Jul 27, 2026Nov 3, 20261,458

Individual skills in this repository

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 tokens

Always available to the agent

SKILL.md

598 tokens

When the skill is activated

Reference documents

0 tokens

Loaded on request

Token counts are estimates. Scripts run separately; they are not counted as reference context.

The playbook

  1. Quick Reference
  2. Workflow

Files

  • ../../../.claude-plugin/marketplace.jsonasset436 bytes
  • SKILL.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 GitHub

Skills 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

  1. #647 on Nov 1
  2. #652 on Nov 2
  3. #656 on Nov 3
  4. #657 on Nov 4
  5. #658 on Nov 5
  6. #659 since Nov 6
17 earlier periods
  1. #463 on Aug 1
  2. #454 on Aug 22
  3. #460 on Aug 30
  4. #496 on Sep 7
  5. #520 on Sep 16
  6. #515 on Sep 17
  7. #515 on Sep 21
  8. #561 on Oct 8
  9. #568 on Oct 14
  10. #568 on Oct 16
  11. #561 on Oct 18
  12. #571 on Oct 23
  13. #623 on Oct 25
  14. #634 on Oct 28
  15. #639 on Oct 29
  16. #643 on Oct 30
  17. #645 on Oct 31

Before you install

Network or broad shell

Automated 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:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • dist/antigravity/webperf-media/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • dist/antigravity/webperf-resources/references/snippets.md:1 Analysis incomplete: Frontmatter missing closing delimiter or exceeds byte/line limit
  • skills/webperf-core-web-vitals/scripts/INP.js:2 Analysis incomplete: physical or joined line exceeds character limit
  • skills/webperf-core-web-vitals/scripts/LCP-Image-Entropy.js:2 Analysis incomplete: physical or joined line exceeds character limit
  • skills/webperf-core-web-vitals/scripts/LCP-Subparts.js:2 Analysis incomplete: physical or joined line exceeds character limit
  • skills/webperf-core-web-vitals/scripts/LCP-Video-Candidate.js:2 Analysis incomplete: physical or joined line exceeds character limit
  • skills/webperf-interaction/scripts/Input-Latency-Breakdown.js:2 Analysis incomplete: physical or joined line exceeds character limit
  • skills/webperf-interaction/scripts/Long-Animation-Frames-Helpers.js:2 Analysis incomplete: physical or joined line exceeds character limit
  • skills/webperf-interaction/scripts/Long-Animation-Frames.js:2 Analysis incomplete: physical or joined line exceeds character limit
  • skills/webperf-loading/scripts/CSS-Complexity.js:2 Analysis incomplete: physical or joined line exceeds character limit
  • skills/webperf-loading/scripts/Cache-Strategy-Analysis.js:2 Analysis incomplete: physical or joined line exceeds character limit
  • skills/webperf-loading/scripts/Find-non-Lazy-Loaded-Images-outside-of-the-viewport.js:2 Analysis incomplete: physical or joined line exceeds character limit
  • skills/webperf-loading/scripts/First-And-Third-Party-Script-Info.js:2 Analysis incomplete: physical or joined line exceeds character limit
  • skills/webperf-loading/scripts/First-And-Third-Party-Script-Timings.js:2 Analysis incomplete: physical or joined line exceeds character limit
  • skills/webperf-loading/scripts/Inline-Script-Info-and-Size.js:2 Analysis incomplete: physical or joined line exceeds character limit
  • skills/webperf-loading/scripts/JS-Execution-Time-Breakdown.js:2 Analysis incomplete: physical or joined line exceeds character limit
  • skills/webperf-loading/scripts/Prefetch-Resource-Validation.js:2 Analysis incomplete: physical or joined line exceeds character limit
  • skills/webperf-loading/scripts/Resource-Hints-Validation.js:2 Analysis incomplete: physical or joined line exceeds character limit
  • skills/webperf-loading/scripts/Resource-Hints.js:2 Analysis incomplete: physical or joined line exceeds character limit
Show all 775 signals by file

.claude-plugin/marketplace.json

  • Network accessline 4
    "owner": {     "name": "Joan Leon",     "url": "https://webperf-snippets.net"
  • Network accessline 5
    "name": "Joan Leon",     "url": "https://webperf-snippets.net"   },
  • Network accessline 6
    "url": "https://webperf-snippets.net"

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

  • Network accessline 1
    // snippets/CoreWebVitals/CLS.js | sha256:738b86913a0a20f5 | https://github.com/nucliweb/webperf-snippets/blob/main/snippets/CoreWebVitals/CLS.js
  • Executable scriptline 1
    Executable file

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

  • Network accessline 1
    // snippets/Loading/TTFB.js | sha256:7e9187ba15c2c402 | https://github.com/nucliweb/webperf-snippets/blob/main/snippets/Loading/TTFB.js
  • Executable scriptline 1
    Executable file

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

  • Network accessline 1
    // snippets/Resources/Network-Bandwidth-Connection-Quality.js | sha256:62f2146f9f4a1fad | https://github.com/nucliweb/webperf-snippets/blob/main/snippets/Resources/Network-Bandwidth-Connection-Quality.js
  • Executable scriptline 1
    Executable file

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
Signal confidence: 493 facts

and 443 more

Only the first 500 facts are listed.

Works with

Agent compatibility, from the files in this repository
AgentStatusEvidenceInstall to
Claude CodeNativeManifest .claude-plugin/marketplace.json.claude/skills/<skill-name>/
CodexCompatibleStandard SKILL.md dist/antigravity/webperf/SKILL.md.agents/skills/<skill-name>/
CursorCompatibleStandard SKILL.md dist/antigravity/webperf/SKILL.md.cursor/skills/<skill-name>/
Gemini CLICompatibleStandard SKILL.md dist/antigravity/webperf/SKILL.md.gemini/skills/<skill-name>/
GitHub CopilotCompatibleStandard SKILL.md dist/antigravity/webperf/SKILL.md.github/skills/<skill-name>/
OpenCodeCompatibleStandard 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.

nucliweb/webperf-snippets: #659 on hotskills, 1.5k stars

[![nucliweb/webperf-snippets on hotskills](https://hotskills.dev/badge/nucliweb-webperf-snippets.svg)](https://hotskills.dev/skill/nucliweb-webperf-snippets/)