| name | frontend-lighthouse |
| description | Add a portable Lighthouse CI gate for production frontend builds with Core Web Vitals budgets, category floors, median runs, and CI artifacts. |
| category | Creative & Media |
| source | antigravity |
| tags | ["node","claude","ai","agent","workflow","image","seo","cro","marketing"] |
| url | https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/frontend-lighthouse |
Frontend Lighthouse (portable performance gate)
Portable skill — readable by Claude Code, OpenCode, Codex, Cursor, Windsurf, and others.
This skill describes a CI performance gate — a Lighthouse CI config plus a workflow — not a
component library or a visual style. It pairs with the frontend-seo and
frontend-architecture skills: SEO writes the metadata, Lighthouse proves it ships fast.
The goal: every pull request is blocked unless the production build meets explicit Core Web
Vitals budgets and category score floors. Budgets live in one lighthouserc.cjs, runs are
median-of-N so the gate doesn't flake, and the same config runs locally and in CI.
When to Use This Skill
- Use when adding a Lighthouse CI performance gate to a web app.
- Use when setting Core Web Vitals budgets for LCP, CLS, and TBT as the lab proxy for INP.
- Use when configuring category score floors for performance, SEO, accessibility, and best practices.
- Use when debugging flaky Lighthouse runs or making reports visible as CI artifacts.
0. The five core ideas
- One config, one source of truth. All budgets and assertions live in a single
lighthouserc.cjs. Named constants for each budget — no magic numbers buried in assertion objects.
- Gate the production build, never dev. Lighthouse runs against
build + start (the real, optimized output). Dev-server numbers are meaningless for a budget.
- Median-of-N kills flakiness. Run 3+ times and assert on the median run, so per-run jitter (cold caches, CI noise) never red-flags a healthy build.
- Budgets encode Google's "good" thresholds. LCP ≤ 2500 ms, INP ≤ 200 ms (gated via the TBT lab proxy), CLS ≤ 0.1 — the values that earn green scores, not "needs improvement".
- Blocking in CI, visible as artifacts. A GitHub Action runs the gate on every PR touching the app and uploads the HTML/JSON reports so failures are debuggable.
1. Files this skill adds
apps/web/ (or your app root)
├── lighthouserc.cjs ← the gate: budgets + assertions + collect settings
├── package.json ← "lhci": "lhci autorun --config=./lighthouserc.cjs"
└── .github/workflows/lighthouse.yml ← PR-blocking CI job (build → start → lhci → upload)
Plus a dev dependency: @lhci/cli.
pnpm add -D @lhci/cli
2. The config (lighthouserc.cjs)
.cjs (CommonJS) so it loads without ESM/TS transpilation. Every budget is a named constant
with a comment explaining the threshold — never a bare number inside an assertion.
const PORT = 3100;
const BASE_URL = `http://localhost:${PORT}`;
const MARKETING_URLS = [`${BASE_URL}/`];
const LCP_BUDGET_MS = 2500;
const INP_BUDGET_MS = 200;
const CLS_BUDGET = 0.1;
module.exports = {
ci: {
collect: {
startServerCommand: `pnpm start --port ${PORT}`,
startServerReadyPattern: ,
: ,
: ,
: ,
: {
:
process.. === ? : ,
: [
,
,
,
,
],
},
},
: {
: ,
: {
: [
,
{ : },
],