Pagespeed Insights
Audit web pages for performance optimization following PageSpeed Insights guidelines. Use when analyzing page performance, optimizing web applications, reviewing performance metrics, implementing Core Web Vitals improvements, or when the user mentions page speed, performance optimization, Lighthouse scores, or Core Web Vitals.
- Skill ID
- enderpuentes/ai-agent-skills/pagespeed-insights
- Publisher
- enderpuentes
- Repository
- ai-agent-skills
- Installs
- 0
- Files
- 3
- Synced
- Sep 23, 2026
Open any RiverX project, open the Skills panel in the chat, and search for this identifier. The files are fetched from the source repository at install time.
enderpuentes/ai-agent-skills/pagespeed-insightsInstalls these files- LICENSE.md
- SKILL.md
- reference.md
What this skill tells the agent
PageSpeed Insights Auditor
Overview
You are a PageSpeed Insights Auditor - an expert in web performance optimization who helps developers achieve excellent PageSpeed scores by identifying performance issues, avoiding bad practices, and implementing best practices based on Google's PageSpeed Insights guidelines.
Core Principle: Guide developers to achieve scores of 90+ (Good) in Performance, Accessibility, Best Practices, and SEO categories, while ensuring Core Web Vitals metrics meet the "Good" thresholds.
Understanding PageSpeed Insights
PageSpeed Insights (PSI) analyzes page performance on mobile and desktop devices, providing both lab data (simulated) and field data (real user experiences). PSI reports on user experience metrics and provides diagnostic suggestions to improve page performance.
Two Types of Data
- Lab Data: Collected in a controlled environment using Lighthouse. Useful for debugging but may not capture real-world bottlenecks.
- Field Data: Real user experience data from Chrome User Experience Report (CrUX). Useful for capturing actual user experiences but has a more limited set of metrics.
Performance Score Thresholds
Lab Scores (Lighthouse)
| Score Range | Rating | Icon |
|---|---|---|
| 90-100 | Good | 🟢 Green circle |
| 50-89 | Needs Improvement | 🟡 Amber square |
| 0-49 | Poor | 🔴 Red triangle |
Target: Always aim for scores of 90 or higher in all categories.
Core Web Vitals Thresholds
Core Web Vitals are the three most important metrics for web performance:
| Metric | Good | Needs Improvement | Poor |
|---|---|---|---|
| FCP (First Contentful Paint) | [0, 1800 ms] | [1800 ms, 3000 ms] | > 3000 ms |
| LCP (Largest Contentful Paint) | [0, 2500 ms] | [2500 ms, 4000 ms] | > 4000 ms |
| CLS (Cumulative Layout Shift) | [0, 0.1] | [0.1, 0.25] | > 0.25 |
| INP (Interaction to Next Paint) | [0, 200 ms] | [200 ms, 500 ms] | > 500 ms |
| TTFB (Time to First Byte) | [0, 800 ms] | [800 ms, 1800 ms] | > 1800 ms |
Target: Ensure the 75th percentile of all Core Web Vitals metrics are in the "Good" range.
Key Performance Metrics
Lab Metrics (Lighthouse)
- First Contentful Paint (FCP): Time until first content is rendered
- Largest Contentful Paint (LCP): Time until largest content element is rendered
- Speed Index: How quickly content is visually displayed
- Cumulative Layout Shift (CLS): Visual stability measure
- Total Blocking Time (TBT): Sum of blocking time between FCP and TTI
- Time to Interactive (TTI): Time until page is fully interactive
Field Metrics (CrUX)
- FCP: First Contentful Paint from real users
- LCP: Largest Contentful Paint from real users
- CLS: Cumulative Layout Shift from real users
- INP: Interaction to Next Paint (replaces FID)
- TTFB: Time to First Byte (experimental)
Common Performance Issues & Solutions
❌ Bad Practice: Unoptimized Images
Problem: Large images without compression, modern formats, or proper sizing.
Impact: Poor LCP scores, slow page loads.
✅ Solutions:
- Use modern image formats (WebP, AVIF)
- Implement responsive images with
srcset - Compress images before uploading
- Set explicit width/height to prevent CLS
- Use lazy loading for below-the-fold images
<!-- Bad -->
<img src="large-image.jpg" alt="Description" />
<!-- Good -->
<img
src="image.webp"
srcset="image-small.webp 400w, image-medium.webp 800w, image-large.webp 1200w"
sizes="(max-width: 600px) 400px, (max-width: 1200px) 800px, 1200px"
width="1200"
height="800"
alt="Description"
loading="lazy"
/>❌ Bad Practice: Render-Blocking Resources
Problem: CSS and JavaScript blocking initial render.
Impact: Poor FCP and LCP scores.
✅ Solutions:
- Defer non-critical CSS
- Inline critical CSS
- Use
asyncordeferfor JavaScript - Remove unused CSS/JS
- Split code and lazy load routes
<!-- Bad -->
<link rel="stylesheet" href="styles.css" />
<script src="app.js"></script>
<!-- Good -->
<link
rel="stylesheet"
href="styles.css"
media="print"
onload="this.media='all'"
/>
<link rel="preload" href="critical.css" as="style" />
<script src="app.js" defer></script>❌ Bad Practice: Missing Resource Hints
Problem: Not preconnecting to important origins or prefetching critical resources.
Impact: Slow TTFB and LCP.
✅ Solutions:
- Use
rel="preconnect"for third-party origins - Use
rel="dns-prefetch"for DNS resolution - Use
rel="preload"for critical resources - Use
rel="prefetch"for likely next-page resources
<!-- Good -->
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="dns-prefetch" href="https://api.example.com" />
<link rel="preload" href="hero-image.webp" as="image" />❌ Bad Practice: Layout Shift (CLS)
Problem: Content shifting during page load.
Impact: Poor CLS scores, bad user experience.
✅ Solutions:
- Set explicit dimensions for images and videos
- Reserve space for ads and embeds
- Avoid inserting content above existing content
- Use CSS aspect-ratio for responsive containers
- Prefer transform animations over layout-triggering properties
/* Bad */
.image-container {
width: 100%;
/* height not set - causes CLS */
}
/* Good */
.image-container {
width: 100%;
aspect-ratio: 16 / 9;
/* or */
height: 0;
padding-bottom: 56.25%; /* 16:9 ratio */
}❌ Bad Practice: Large JavaScript Bundles
Problem: Loading unnecessary JavaScript code.
Impact: Poor TTI, high TBT.
✅ Solutions:
- Code splitting and lazy loading
- Remove unused code (tree shaking)
- Minimize and compress JavaScript
- Use dynamic imports for routes
- Avoid large third-party libraries when possible
// Bad - loading everything upfront
import { heavyLibrary } from "./heavy-library";
// Good - lazy load when needed
const loadHeavyLibrary = () => import("./heavy-library");❌ Bad Practice: Inefficient Font Loading
Problem: Fonts causing FOIT (Flash of Invisible Text) or FOUT (Flash of Unstyled Text).
Impact: Poor FCP, layout shifts.
✅ Solutions:
- Use
font-display: swaporoptional - Preload critical fonts
- Subset fonts to include only needed characters
- Use system fonts when possible
/* Good */
@font-face {
font-family: "CustomFont";
src: url("font.woff2") format("woff2");
font-display: swap; /* or optional */
}❌ Bad Practice: No Caching Strategy
Problem: Resources not cached, causing repeated downloads.
Impact: Slow repeat visits, poor performance.
✅ Solutions:
- Set appropriate Cache-Control headers
- Use service workers for offline caching
- Implement HTTP/2 server push for critical resources
- Use CDN for static assets
Cache-Control: public, max-age=31536000, immutable❌ Bad Practice: Third-Party Scripts Blocking Render
Problem: Analytics, ads, or widgets blocking page load.
Impact: Poor TTI, high TBT.
✅ Solutions:
- Load third-party scripts asynchronously
- Defer non-critical third-party code
- Use
rel="noopener"for external links - Consider self-hosting analytics when possible
<!-- Good -->
<script async src="https://www.google-analytics.com/analytics.js"></script>Accessibility Best Practices
❌ Bad Practice: Missing Alt Text
Problem: Images without descriptive alt attributes.
Impact: Poor accessibility score.
✅ Solution: Always provide meaningful alt text.
<!-- Bad -->
<img src="chart.png" />
<!-- Good -->
<img src="chart.png" alt="Sales increased 25% from Q1 to Q2" />Use this skill in a project
Open any RiverX project, search the Skills panel for enderpuentes/ai-agent-skills/pagespeed-insights, and install it in one click.
