From skull
Frontend performance where users feel it — Core Web Vitals, bundle size, render cost. Triggers on "it's slow / laggy / janky", "the page jumps", a poor Lighthouse or PageSpeed score, LCP/CLS/INP problems, a large bundle, slow lists or re-renders, or before launching anything public. Diagnoses with real numbers first, then fixes the thing that actually costs — not the thing that's fun to optimize.
How this skill is triggered — by the user, by Claude, or both
Slash command
/skull:fe-perfThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Perceived speed is a design property. The rule that saves the most time: **measure before you optimize.**
Perceived speed is a design property. The rule that saves the most time: measure before you optimize. Most "performance work" is guessing, and guessing usually lands on the 2% that wasn't the problem.
| Metric | Good | What it means | Usual culprit |
|---|---|---|---|
| LCP | <2.5s | when the main thing appears | unoptimized hero image, render-blocking JS/CSS, slow server |
| CLS | <0.1 | how much the page jumps | images with no dimensions, injected banners, late fonts |
| INP | <200ms | interaction → visible response | long tasks on the main thread |
npx lighthouse <url> --only-categories=performance --view
npx @unlighthouse/cli --site <url> # every route at once
Then read the field data (CrUX / RUM) if it exists. Lab numbers on your laptop lie: your machine is fast, your network is fast, and your cache is warm. Users have none of that.
Every layout jump is reserved space you didn't reserve.
<img width height> always (or aspect-ratio) — the browser needs the box before the bytes.font-display: swap plus a metric-matched fallback (size-adjust) — otherwise the swap itself is a jump.<link rel="preload"> the hero image; fetchpriority="high"; never lazy-load it.srcset for density.loading="lazy" on the hero is a self-inflicted LCP wound.preconnect to the CDN.@tanstack/virtual). The DOM is not a database.memo() everywhere adds cost and hides the real problem.npx vite-bundle-visualizer # or: npx source-map-explorer 'build/static/js/*.js'
npx bundlephobia <pkg> # check the cost BEFORE adding it
sideEffects: false).Micro-optimizing a map() over 20 rows. Replacing a 3KB library to save 1KB. Memoizing a component that
renders twice a session. Server-rendering a page nobody's LCP depends on. If it doesn't move LCP, CLS, INP or
bundle size, it isn't performance work — it's fidgeting.
Metric → current number → target → the specific change → expected delta. "It felt faster" is not a result.
Priority 3 on the ui-intel ladder. Pairs with fe-motion (the frame budget) and fe-component-craft
(render cost). See docs/ECOSYSTEM.md.
npx claudepluginhub aturzone/skullDiagnoses frontend performance: Core Web Vitals, bundle size, rendering cost, network waterfalls, memory leaks, long tasks. Uses Lighthouse, Performance trace, React Profiler, Vue Devtools.
Optimizes frontend performance via Core Web Vitals (LCP, INP, CLS), code splitting, tree shaking, image/font optimization (WebP, AVIF, lazy loading), service workers, and webpack-bundle-analyzer. Use for diagnosing slow loads, bundle size reduction, and CI budgets.
Diagnoses web performance issues, fixes Core Web Vitals (LCP, INP, CLS), optimizes bundles, assets, and render performance. Use for slow pages or dropping traffic due to speed.