Databuddy
databuddy-analytics/Databuddy
Integrate Databuddy analytics using the SDK, REST API, or MCP.
Optimize Core Web Vitals (LCP, INP, CLS) for better page experience and search ranking.
$ npx skills add vmDeshpande/ai-agent-automation --skill core-web-vitals -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install vmDeshpande/ai-agent-automation core-web-vitals --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/vmDeshpande/ai-agent-automation.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/core-web-vitals .claude/skills/core-web-vitals && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "core-web-vitals" agent skill from https://github.com/vmDeshpande/ai-agent-automation/tree/main/.agents/skills/core-web-vitals into .claude/skills/core-web-vitals/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "core-web-vitals", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/vmDeshpande/ai-agent-automation/tree/main/.agents/skills/core-web-vitalsType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add vmDeshpande/ai-agent-automation --skill core-web-vitals -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install vmDeshpande/ai-agent-automation core-web-vitals --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/vmDeshpande/ai-agent-automation.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/core-web-vitals .agents/skills/core-web-vitals && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "core-web-vitals" agent skill from https://github.com/vmDeshpande/ai-agent-automation/tree/main/.agents/skills/core-web-vitals into .agents/skills/core-web-vitals/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "core-web-vitals", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add vmDeshpande/ai-agent-automation --skill core-web-vitals -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install vmDeshpande/ai-agent-automation core-web-vitals --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/vmDeshpande/ai-agent-automation.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/core-web-vitals .cursor/skills/core-web-vitals && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "core-web-vitals" agent skill from https://github.com/vmDeshpande/ai-agent-automation/tree/main/.agents/skills/core-web-vitals into .cursor/skills/core-web-vitals/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "core-web-vitals", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/vmDeshpande/ai-agent-automation.git --path .agents/skills/core-web-vitals--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add vmDeshpande/ai-agent-automation --skill core-web-vitals -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install vmDeshpande/ai-agent-automation core-web-vitals --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/vmDeshpande/ai-agent-automation.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/core-web-vitals .gemini/skills/core-web-vitals && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "core-web-vitals" agent skill from https://github.com/vmDeshpande/ai-agent-automation/tree/main/.agents/skills/core-web-vitals into .gemini/skills/core-web-vitals/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "core-web-vitals", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install vmDeshpande/ai-agent-automation core-web-vitalsInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add vmDeshpande/ai-agent-automation --skill core-web-vitals -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/vmDeshpande/ai-agent-automation.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/core-web-vitals .github/skills/core-web-vitals && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "core-web-vitals" agent skill from https://github.com/vmDeshpande/ai-agent-automation/tree/main/.agents/skills/core-web-vitals into .github/skills/core-web-vitals/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "core-web-vitals", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add vmDeshpande/ai-agent-automation --skill core-web-vitals -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install vmDeshpande/ai-agent-automation core-web-vitals --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/vmDeshpande/ai-agent-automation.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/core-web-vitals .opencode/skills/core-web-vitals && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "core-web-vitals" agent skill from https://github.com/vmDeshpande/ai-agent-automation/tree/main/.agents/skills/core-web-vitals into .opencode/skills/core-web-vitals/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "core-web-vitals", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
core-web-vitalsOptimize Core Web Vitals (LCP, INP, CLS) for better page experience and search ranking.
Core Web Vitals is an agent skill from vmDeshpande/ai-agent-automation. Optimize Core Web Vitals (LCP, INP, CLS) for better page experience and search ranking. Use when asked to "improve Core Web Vitals", "fix LCP", "reduce CLS", "optimize INP", "page experience optimization", or "fix layout shifts".
Its SKILL.md is about 3.6k tokens, which your agent loads only when the skill is triggered. The skill folder holds 2 other files, including reference files (for example `references/LCP.md`).
It sits in Frontend & Design, covering Web performance. It works with Next.js, React and Node.js. The repository describes itself as: Modular AI agent workflow automation platform with schedulers, tools, and observability. https://vmdeshpande.github.io/ai-automation-platform-website/. The licence is MIT.
Read from SKILL.md and the folder at commit 86b6072. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
npxFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
heavy-widget.comad-network.comyoutube.comAlso links to:
web.devdeveloper.chrome.comgithub.comFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Core Web Vitals loads about 3.6k tokens when it runs, and up to ~4.7k if it reads all its reference files. Until then it costs about 61 tokens; SKILL.md has 516 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from vmDeshpande/ai-agent-automation at commit 86b6072, republished under its MIT licence (© vmDeshpande). 516 words, ~3,614 tokens.
.claude/skills/core-web-vitals/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.Targeted optimization for the three Core Web Vitals metrics that affect Google Search ranking and user experience.
| Metric | Measures | Good | Needs work | Poor |
|---|---|---|---|---|
| LCP | Loading | ≤ 2.5s | 2.5s – 4s | > 4s |
| INP | Interactivity | ≤ 200ms | 200ms – 500ms | > 500ms |
| CLS | Visual Stability | ≤ 0.1 | 0.1 – 0.25 | > 0.25 |
Google measures at the 75th percentile — 75% of page visits must meet "Good" thresholds.
LCP measures when the largest visible content element renders. Usually this is:
<svg> element1. Slow server response (TTFB > 800ms)
Fix: CDN, caching, optimized backend, edge rendering2. Render-blocking resources
<!-- ❌ Blocks rendering -->
<link rel="stylesheet" href="/all-styles.css">
<!-- ✅ Critical CSS inlined, rest deferred -->
<style>/* Critical above-fold CSS */</style>
<link rel="preload" href="/styles.css" as="style"
onload="this.onload=null;this.rel='stylesheet'">3. Slow resource load times
<!-- ❌ No hints, discovered late -->
<img src="/hero.jpg" alt="Hero">
<!-- ✅ Preloaded with high priority -->
<link rel="preload" href="/hero.webp" as="image" fetchpriority="high">
<img src="/hero.webp" alt="Hero" fetchpriority="high">4. Client-side rendering delays
// ❌ Content loads after JavaScript
useEffect(() => {
fetch('/api/hero-text').then(r => r.json()).then(setHeroText);
}, []);
// ✅ Server-side or static rendering
// Use SSR, SSG, or streaming to send HTML with content
export async function getServerSideProps() {
const heroText = await fetchHeroText();
return { props: { heroText } };
}5. Make navigations instant with the Speculation Rules API
For most sites, the LCP a user actually experiences is dominated by the next page they navigate to, not the one they landed on. Telling the browser to prerender likely-next pages on hover collapses that LCP to ~0ms.
<script type="speculationrules">
{
"prerender": [{
"where": { "href_matches": "/*" },
"eagerness": "moderate"
}]
}
</script>eagerness settings (cheapest → most aggressive): conservative (start on pointerdown), moderate (start after ~200ms hover), eager (start as soon as the link is in the viewport), immediate (start on page load). Start with moderate — it captures most navigations without prerendering pages users never visit.
Caveats:
where carefully (href_matches patterns, exclude logout/checkout) and avoid immediate outside small sites.prerenderingchange event or document.prerendering.- [ ] TTFB < 800ms (use CDN, edge caching)
- [ ] LCP image preloaded with fetchpriority="high"
- [ ] LCP image optimized (WebP/AVIF, correct size)
- [ ] Critical CSS inlined (< 14KB)
- [ ] No render-blocking JavaScript in <head>
- [ ] Fonts don't block text rendering (font-display: swap)
- [ ] LCP element in initial HTML (not JS-rendered)
- [ ] Speculation Rules added for likely-next navigations (moderate eagerness)// Find your LCP element
new PerformanceObserver((list) => {
const entries = list.getEntries();
const lastEntry = entries[entries.length - 1];
console.log('LCP element:', lastEntry.element);
console.log('LCP time:', lastEntry.startTime);
}).observe({ type: 'largest-contentful-paint', buffered: true });INP measures responsiveness across ALL interactions (clicks, taps, key presses) during a page visit. It reports the worst interaction (at 98th percentile for high-traffic pages).
Total INP = Input Delay + Processing Time + Presentation Delay
| Phase | Target | Optimization |
|---|---|---|
| Input Delay | < 50ms | Reduce main thread blocking |
| Processing | < 100ms | Optimize event handlers |
| Presentation | < 50ms | Minimize rendering work |
1. Long tasks blocking main thread
// ❌ Long synchronous task
function processLargeArray(items) {
items.forEach(item => expensiveOperation(item));
}
// ✅ Break into chunks and yield to the scheduler. scheduler.yield() is the
// recommended modern API — its continuation is queued at a boosted
// priority so the rest of your work resumes ahead of unrelated tasks,
// while still letting the browser handle pending input first.
async function processLargeArray(items) {
const CHUNK_SIZE = 100;
for (let i = 0; i < items.length; i += CHUNK_SIZE) {
items.slice(i, i + CHUNK_SIZE).forEach(expensiveOperation);
if ('scheduler' in window && 'yield' in scheduler) {
await scheduler.yield();
} else {
// Fallback for browsers without scheduler.yield (Safari, older Firefox).
// setTimeout(0) yields but loses priority — your continuation may run
// after unrelated tasks the browser picked up in between.
await new Promise(r => setTimeout(r, 0));
}
}
}2. Heavy event handlers
// ❌ All work in handler
button.addEventListener('click', () => {
// Heavy computation
const result = calculateComplexThing();
// DOM updates
updateUI(result);
// Analytics
trackEvent('click');
});
// ✅ Prioritize visual feedback, then yield before doing the heavy work
button.addEventListener('click', async () => {
// 1. Immediate visual feedback (cheap DOM update)
button.classList.add('loading');
// 2. Yield so the browser can paint the loading state before we block
if ('scheduler' in window && 'yield' in scheduler) {
await scheduler.yield();
}
// 3. Now do the heavy work — the user already saw the click register
const result = calculateComplexThing();
updateUI(result);
// 4. Lowest-priority work last, when the main thread is idle
if ('requestIdleCallback' in window) {
requestIdleCallback(() => trackEvent('click'));
} else {
setTimeout(() => trackEvent('click'), 0);
}
});3. Third-party scripts
// ❌ Eagerly loaded, blocks interactions
<script src="https://heavy-widget.com/widget.js"></script>
// ✅ Lazy loaded on interaction or visibility
const loadWidget = () => {
import('https://heavy-widget.com/widget.js')
.then(widget => widget.init());
};
button.addEventListener('click', loadWidget, { once: true });4. Excessive re-renders (React/Vue)
// ❌ Re-renders entire tree
function App() {
const [count, setCount] = useState(0);
return (
<div>
<Counter count={count} />
<ExpensiveComponent /> {/* Re-renders on every count change */}
</div>
);
}
// ✅ Memoized expensive components
const MemoizedExpensive = React.memo(ExpensiveComponent);
function App() {
const [count, setCount] = useState(0);
return (
<div>
<Counter count={count} />
<MemoizedExpensive />
</div>
);
}- [ ] No tasks > 50ms on main thread
- [ ] Event handlers complete quickly (< 100ms)
- [ ] Visual feedback provided immediately
- [ ] Heavy work deferred with requestIdleCallback
- [ ] Third-party scripts don't block interactions
- [ ] Debounced input handlers where appropriate
- [ ] Web Workers for CPU-intensive operations// Identify slow interactions. durationThreshold: 40 matches what the
// web-vitals library uses — 16 (one frame) fires on nearly every interaction
// and drowns the console; 40 surfaces interactions that are starting to feel
// sluggish without spamming.
new PerformanceObserver((list) => {
for (const entry of list.getEntries()) {
if (entry.duration > 200) {
console.warn('Slow interaction:', {
type: entry.name,
duration: entry.duration,
processingStart: entry.processingStart,
processingEnd: entry.processingEnd,
target: entry.target
});
}
}
}).observe({ type: 'event', buffered: true, durationThreshold: 40 });For field debugging across real users, prefer the web-vitals/attribution build of the web-vitals library — onINP() from that build attaches a LoAF (Long Animation Frame) breakdown identifying the longest script and the input/processing/presentation phase that ate the budget.
CLS measures unexpected layout shifts. A shift occurs when a visible element changes position between frames without user interaction.
CLS Formula: impact fraction × distance fraction
1. Images without dimensions
<!-- ❌ Causes layout shift when loaded -->
<img src="photo.jpg" alt="Photo">
<!-- ✅ Space reserved -->
<img src="photo.jpg" alt="Photo" width="800" height="600">
<!-- ✅ Or use aspect-ratio -->
<img src="photo.jpg" alt="Photo" style="aspect-ratio: 4/3; width: 100%;">2. Ads, embeds, and iframes
<!-- ❌ Unknown size until loaded -->
<iframe src="https://ad-network.com/ad"></iframe>
<!-- ✅ Reserve space with min-height -->
<div style="min-height: 250px;">
<iframe src="https://ad-network.com/ad" height="250"></iframe>
</div>
<!-- ✅ Or use aspect-ratio container -->
<div style="aspect-ratio: 16/9;">
<iframe src="https://youtube.com/embed/..."
style="width: 100%; height: 100%;"></iframe>
</div>3. Dynamically injected content
// ❌ Inserts content above viewport
notifications.prepend(newNotification);
// ✅ Insert below viewport or use transform
const insertBelow = viewport.bottom < newNotification.top;
if (insertBelow) {
notifications.prepend(newNotification);
} else {
// Animate in without shifting
newNotification.style.transform = 'translateY(-100%)';
notifications.prepend(newNotification);
requestAnimationFrame(() => {
newNotification.style.transform = '';
});
}4. Web fonts causing FOUT
/* ❌ Font swap shifts text */
@font-face {
font-family: 'Custom';
src: url('custom.woff2') format('woff2');
}
/* ✅ Optional font (no shift if slow) */
@font-face {
font-family: 'Custom';
src: url('custom.woff2') format('woff2');
font-display: optional;
}
/* ✅ Or match fallback metrics */
@font-face {
font-family: 'Custom';
src: url('custom.woff2') format('woff2');
font-display: swap;
size-adjust: 105%; /* Match fallback size */
ascent-override: 95%;
descent-override: 20%;
}5. Animations triggering layout
/* ❌ Animates layout properties */
.animate {
transition: height 0.3s, width 0.3s;
}
/* ✅ Use transform instead */
.animate {
transition: transform 0.3s;
}
.animate.expanded {
transform: scale(1.2);
}- [ ] All images have width/height or aspect-ratio
- [ ] All videos/embeds have reserved space
- [ ] Ads have min-height containers
- [ ] Fonts use font-display: optional or matched metrics
- [ ] Dynamic content inserted below viewport
- [ ] Animations use transform/opacity only
- [ ] No content injected above existing content// Track layout shifts
new PerformanceObserver((list) => {
for (const entry of list.getEntries()) {
if (!entry.hadRecentInput) {
console.log('Layout shift:', entry.value);
entry.sources?.forEach(source => {
console.log(' Shifted element:', source.node);
console.log(' Previous rect:', source.previousRect);
console.log(' Current rect:', source.currentRect);
});
}
}
}).observe({ type: 'layout-shift', buffered: true });npx lighthouse <url>import {onLCP, onINP, onCLS} from 'web-vitals';
function sendToAnalytics({name, value, rating}) {
gtag('event', name, {
event_category: 'Web Vitals',
value: Math.round(name === 'CLS' ? value * 1000 : value),
event_label: rating
});
}
onLCP(sendToAnalytics);
onINP(sendToAnalytics);
onCLS(sendToAnalytics);// LCP: Use next/image with priority
import Image from 'next/image';
<Image src="/hero.jpg" priority fill alt="Hero" />
// INP: Use dynamic imports
const HeavyComponent = dynamic(() => import('./Heavy'), { ssr: false });
// CLS: Image component handles dimensions automatically// LCP: Preload in head
<link rel="preload" href="/hero.jpg" as="image" fetchpriority="high" />
// INP: Memoize and useTransition
const [isPending, startTransition] = useTransition();
startTransition(() => setExpensiveState(newValue));
// CLS: Always specify dimensions in img tags<!-- LCP: Use nuxt/image with preload -->
<NuxtImg src="/hero.jpg" preload loading="eager" />
<!-- INP: Use async components -->
<component :is="() => import('./Heavy.vue')" />
<!-- CLS: Use aspect-ratio CSS -->
<img :style="{ aspectRatio: '16/9' }" />© vmDeshpande, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 1 other file (references) in .agents/skills/core-web-vitals of vmDeshpande/ai-agent-automation.
Open the folder on GitHubat commit 86b6072
We found 4 copies of this SKILL.md (exact, near-identical or edited) in other folders, from 4 other GitHub owners. This page covers the copy in vmDeshpande/ai-agent-automation, which our catalogue first saw on October 7, 2026.
Core Web Vitals next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Core Web Vitals this skillvmDeshpande/ai-agent-automation | 178 | 4 repos | ~3.6k | Automated safety check: Pass | MIT | |
| Databuddydatabuddy-analytics/Databuddy | 1.2k | — | ~2.1k | Automated safety check: Pass | AGPL-3.0 | |
| Spotpatchhuanglvjing/spotpatch | 134 | — | ~998 | Automated safety check: Pass | MIT | |
| React Best Practicesryokun6/ryos | 1.3k | — | ~2k | Automated safety check: Pass | MIT | |
| Senior Frontendalirezarezvani/claude-skills | 28k | 5 repos | ~3.9k | Automated safety check: Pass | MIT | |
| Next.js DeveloperJeffallan/claude-skills | 12k | — | ~1.4k | Automated safety check: Pass | MIT |
databuddy-analytics/Databuddy
Integrate Databuddy analytics using the SDK, REST API, or MCP.
huanglvjing/spotpatch
为 React 项目建立从浏览器页面元素到精确 JSX/TSX 源码、结构化上下文与可审阅修改的 SpotPatch 工作流。用户提到 SpotPatch、截图沟通前端修改、页面元素定位源码、Vite 或 Next.js 接入、组件数据链路、结构化 Prompt、AI 补丁审阅、安装检查或故障排查时使用此技能。
ryokun6/ryos
React performance optimization guidelines from Vercel Engineering (vercel-labs/agent-skills).
alirezarezvani/claude-skills
Frontend development skill for React, Next.js, TypeScript, and Tailwind CSS applications.
Jeffallan/claude-skills
Builds Next.js 14+ apps on the App Router with server components, server actions, explicit caching, SEO metadata, loading and error boundaries and Vercel deployment.
Jeffallan/claude-skills
Builds React 19 components in TypeScript with Server Components, useActionState forms, custom hooks and state libraries, checked with tsc and React Testing Library.
vmDeshpande/ai-agent-automation
Conduct WCAG 2.2 accessibility audits with automated testing, manual verification, and remediation guidance.
vmDeshpande/ai-agent-automation
Implement WCAG 2.2 compliant interfaces with mobile accessibility, inclusive design patterns, and assistive technology support.
Categories
Optimize Core Web Vitals (LCP, INP, CLS) for better page experience and search ranking. Core Web Vitals is an agent skill from vmDeshpande/ai-agent-automation. Optimize Core Web Vitals (LCP, INP, CLS) for better page experience and search ranking.
Core Web Vitals fits situations like: asked to improve Core Web Vitals; page experience optimization; fix layout shifts.
Run `npx skills add vmDeshpande/ai-agent-automation --skill core-web-vitals -a claude-code`. Or copy the skill folder (.agents/skills/core-web-vitals in vmDeshpande/ai-agent-automation) into .claude/skills/core-web-vitals in your project. Claude Code loads it when a task matches its description.
Run `npx skills add vmDeshpande/ai-agent-automation --skill core-web-vitals -a codex`. Or copy the skill folder (.agents/skills/core-web-vitals in vmDeshpande/ai-agent-automation) into .agents/skills/core-web-vitals in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add vmDeshpande/ai-agent-automation --skill core-web-vitals -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/core-web-vitals, .gemini/skills/core-web-vitals, .github/skills/core-web-vitals and .opencode/skills/core-web-vitals in your project.
Going by SKILL.md and its folder, Core Web Vitals needs the command-line tools its instructions call (npx).
SKILL.md names 6 domains. In commands or code: heavy-widget.com, ad-network.com and youtube.com; the agent is likely to contact these when it follows the instructions. As links in the text: web.dev, developer.chrome.com and github.com. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Core Web Vitals is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.6k tokens (SKILL.md is roughly 14k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 1.1k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Core Web Vitals: Databuddy (databuddy-analytics/Databuddy, 1.2k stars), Spotpatch (huanglvjing/spotpatch, 134 stars), React Best Practices (ryokun6/ryos, 1.3k stars) and Senior Frontend (alirezarezvani/claude-skills, 28k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
vmDeshpande (a GitHub user) maintains it in vmDeshpande/ai-agent-automation, which has 178 GitHub stars. The repository holds 3 skills in this directory. The repository was last updated on September 12, 2026.
Source: vmDeshpande/ai-agent-automation on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.