| description | Web performance analysis - Core Web Vitals, network dependencies, accessibility | ||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| mode | subagent | ||||||||||||||||
| tools |
|
||||||||||||||||
| mcp |
|
- Purpose: Comprehensive web performance analysis from within your repo
- Dependencies: Chrome DevTools MCP (
npx chrome-devtools-mcp@latest) - Core Metrics: FCP (<1.8s), LCP (<2.5s), CLS (<0.1), FID (<100ms), TTFB (<800ms)
- Categories: Performance, Network Dependencies, Core Web Vitals, Accessibility
- Related:
tools/browser/pagespeed.md,tools/browser/chrome-devtools.md
Quick commands:
/performance https://example.com # Full audit
/performance https://example.com --categories=performance,accessibility
/performance http://localhost:3000 # Local dev
/performance https://example.com --compare baseline.json # Before/afterInspired by @elithrar's web-perf agent skill. Runs from within your repo so output becomes immediate context for improvements.
npm install -g chrome-devtools-mcp # or: npx chrome-devtools-mcp@latest --headlessMCP config (headless or connect to existing browser):
{
"mcpServers": {
"chrome-devtools": {
"command": "npx",
"args": ["chrome-devtools-mcp@latest", "--headless"]
}
}
}For existing browser: replace "--headless" with "--browserUrl", "http://127.0.0.1:9222".
// --- Full Audit ---
await chromeDevTools.lighthouse({
url: "https://your-site.com",
categories: ["performance", "accessibility", "best-practices", "seo"],
device: "mobile" // or "desktop"
});
await chromeDevTools.measureWebVitals({
url: "https://your-site.com",
metrics: ["LCP", "FID", "CLS", "TTFB", "FCP"],
iterations: 3
});
// --- Network Dependencies ---
await chromeDevTools.monitorNetwork({
url: "https://your-site.com",
filters: ["script", "xhr", "fetch"],
captureHeaders: true, captureBody: false
});
// Look for: external domain scripts, long chains (A->B->C), bundles >100KB, render-blocking resources
// --- Local Dev (start dev server first, e.g. npm run dev) ---
await chromeDevTools.lighthouse({ url: "http://localhost:3000", categories: ["performance"], device: "desktop" });
await chromeDevTools.captureConsole({ url: "http://localhost:3000", logLevel: "error", duration: 30000 });
// --- Before/After Comparison ---
const baseline = await chromeDevTools.lighthouse({ url: "https://your-site.com", categories: ["performance"] });
// Save baseline.json, make changes, then:
const after = await chromeDevTools.lighthouse({ url: "https://your-site.com", categories: ["performance"] });
// Compare: performance score delta, LCP improvement, CLS reduction, total blocking time change
// --- Accessibility ---
await chromeDevTools.lighthouse({ url: "https://your-site.com", categories: ["accessibility"], device: "desktop" });
// Check: missing alt text, low color contrast, missing form labels, keyboard nav, ARIA attributes| Metric | Good | Needs Improvement | Poor |
|---|---|---|---|
| FCP (First Contentful Paint) | <1.8s | 1.8s-3.0s | >3.0s |
| LCP (Largest Contentful Paint) | <2.5s | 2.5s-4.0s | >4.0s |
| CLS (Cumulative Layout Shift) | <0.1 | 0.1-0.25 | >0.25 |
| FID (First Input Delay) | <100ms | 100ms-300ms | >300ms |
| TTFB (Time to First Byte) | <800ms | 800ms-1800ms | >1800ms |
| INP (Interaction to Next Paint) | <200ms | 200ms-500ms | >500ms |
Slow LCP -- large hero images, render-blocking CSS/JS, slow TTFB, client-side rendering delays:
<link rel="preload" as="image" href="/hero.webp">
<picture>
<source srcset="/hero.avif" type="image/avif">
<source srcset="/hero.webp" type="image/webp">
<img src="/hero.jpg" alt="Hero" loading="eager" fetchpriority="high">
</picture>High CLS -- images without dimensions, ads/embeds without reserved space, web fonts (FOUT/FOIT), dynamic content injection:
<img src="/photo.jpg" width="800" height="600" alt="Photo">
<div style="min-height: 250px;"><!-- Ad or embed --></div>@font-face { font-family: 'Custom'; font-display: swap; src: url('/font.woff2') format('woff2'); }Poor FID/INP -- long JS tasks (>50ms), heavy main thread, large bundles, synchronous third-party scripts:
function processItems(items) {
const chunk = items.splice(0, 100);
if (items.length > 0) requestIdleCallback(() => processItems(items));
}
// Defer non-critical: <script src="/analytics.js" defer></script>
// Offload heavy work: const worker = new Worker('/heavy-task.js');Slow TTFB -- slow DB queries, no caching, geographic distance, cold starts (serverless). Fixes: CDN (Cloudflare, Fastly, Vercel Edge), caching (Redis/Memcached), query optimization, edge functions.
// Third-party script audit
const thirdParty = requests.filter(r => !r.url.includes(yourDomain) && r.resourceType === 'script');
// Check: render-blocking, bundles >50KB, chains (A loads B), missing async/defernpx source-map-explorer dist/main.js # Bundle analysis
gzip -c dist/main.js | wc -c # Compressed sizeRequest chain optimization: replace sequential <script> tags with <link rel="preload" as="script"> for parallel loading.
~/.aidevops/agents/scripts/pagespeed-helper.sh audit https://example.com # Quick audit
~/.aidevops/agents/scripts/dev-browser-helper.sh start # Persistent browser
npx chrome-devtools-mcp@latest --browserUrl http://127.0.0.1:9222 # Connect to itCI/CD (GitHub Actions):
- name: Performance Audit
run: |
npx lighthouse https://staging.example.com \
--output=json --output-path=lighthouse.json \
--chrome-flags="--headless"
SCORE=$(jq '.categories.performance.score * 100 | round' lighthouse.json)
if [ "$SCORE" -lt 90 ]; then echo "Score $SCORE below threshold (90)"; exit 1; fiStructure reports as:
## Performance Report: example.com
| Metric | Value | Status | Target |
|--------|-------|--------|--------|
| LCP | 2.1s | GOOD | <2.5s |
| FID | 45ms | GOOD | <100ms |
| CLS | 0.15 | NEEDS WORK | <0.1 |
| TTFB | 650ms | GOOD | <800ms |
**Top Issues:** 1. CLS 0.15 - images without dimensions (`Hero.tsx:24`) 2. Render-blocking CSS (`fonts.css`) 3. Large JS bundle 245KB (`dist/main.js`)
**Network:** 3 third-party scripts; longest chain: 3 requests (Google Fonts); blocking time: 120ms
**Accessibility:** 92/100 - 2 missing alt textExternal: web.dev/vitals | Chrome DevTools Performance | Lighthouse Scoring | PageSpeed Insights
Subagents: tools/performance/webpagetest.md (multi-location testing) | tools/browser/pagespeed.md (Lighthouse CLI) | tools/browser/chrome-devtools.md (DevTools MCP) | tools/browser/browser-automation.md (tool selection)