SEO unlighthouse

Multi-page Lighthouse audit via the MIT-licensed Unlighthouse CLI.

How to use it

  1. Hit Copy SKILL.md — or use the Claude Code line below to get every file.
  2. Claude: ⋯ → Download .md, then Customize → Skills → Add → Upload skill.
    ChatGPT: make a Project and paste it into Instructions.
    Neither? Paste it at the top of a new chat — it works for that chat.
  3. Describe your job in plain words. The AI follows the skill from there.
Claude Code — installs the whole folder, not just SKILL.md
npx degit AgriciDaniel/claude-seo/extensions/unlighthouse/skills/seo-unlighthouse#main ~/.claude/skills/seo-unlighthouse

For one project only, change the path to .claude/skills/seo-unlighthouse. This skill also uses unlighthouse_run.py, ci-result.json, lcp_subparts.py — copying SKILL.md alone won't be enough. See the folder on GitHub.

Not working?
  • Check which app you pasted it into — the steps above name the right one.
  • Some skills need the paid tier of Claude or ChatGPT.
Step-by-step guide with screenshots · Ask in the forum

Paste into Claude, ChatGPT or Cursor.

Show the full text57 lines
seo-unlighthouse/SKILL.md57 lines2.4 KBpushed 11d agoRawView on GitHub

seo-unlighthouse

Run Lighthouse against every URL on a site (up to a configurable cap) and aggregate the results. Useful when:

  • PageSpeed Insights' free quota (25k QPD) isn't enough for a large site.
  • You want offline / local CWV measurement (CI integration, restricted environments).
  • You need a quick site-wide regression check after a deploy.

Prerequisites

  • Run extensions/unlighthouse/install.sh (no API key needed).
  • Node 18+ on $PATH.

Routing

Command Effect
/seo unlighthouse <url> Mobile audit, up to 200 routes, JSON+HTML report in a temp dir
/seo unlighthouse <url> --device desktop Desktop form factor
/seo unlighthouse <url> --max-routes 50 --output-dir ./reports Cap + persist

All flags forward through "${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run unlighthouse_run.py, which handles url_safety pre-flight and subprocess timeout management.

Output handling

The wrapper reads ci-result.json from the Unlighthouse output dir, normalizes it (the default jsonSimple reporter writes a flat JSON array of per-route results; a tolerant fallback also accepts the jsonExpanded object shape), and returns:

  • route_count: number of routes actually audited
  • aggregate_scores: median score per Lighthouse category across all audited routes (performance, accessibility, best-practices, seo)
  • routes: the per-route breakdown (also on disk at <output_dir>/ci-result.json)

Route cap and per-page timeout are set via a generated unlighthouse.config.mjs passed with --config-file (the only CLI-documented way to set scanner.maxRoutes; unlighthouse-ci has no --max-routes flag). Use --page-timeout <seconds> to change the per-page Lighthouse task timeout (default 60s); this is separate from the overall --timeout subprocess guard (default 600s).

Cross-skill delegation

  • For single-URL field data (CrUX), use seo-google psi / seo-google crux.
  • For LCP subpart decomposition on slow pages, use the "${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run lcp_subparts.py workflow (Phase C).
1---
2name: seo-unlighthouse
3description: Multi-page Lighthouse audit via the MIT-licensed Unlighthouse CLI. Free-tier alternative to running PageSpeed against every URL on a site, no API quota burn, runs locally.
4metadata:
5 version: "2.3.1"
6compatibility: "Requires Node 18+ and the unlighthouse npm package. Run extensions/unlighthouse/install.sh to pre-warm."
7---
8 
9# seo-unlighthouse
10 
11Run Lighthouse against every URL on a site (up to a configurable cap)
12and aggregate the results. Useful when:
13 
14- PageSpeed Insights' free quota (25k QPD) isn't enough for a large site.
15- You want offline / local CWV measurement (CI integration, restricted environments).
16- You need a quick site-wide regression check after a deploy.
17 
18## Prerequisites
19 
20- Run `extensions/unlighthouse/install.sh` (no API key needed).
21- Node 18+ on `$PATH`.
22 
23## Routing
24 
25| Command | Effect |
26|---|---|
27| `/seo unlighthouse <url>` | Mobile audit, up to 200 routes, JSON+HTML report in a temp dir |
28| `/seo unlighthouse <url> --device desktop` | Desktop form factor |
29| `/seo unlighthouse <url> --max-routes 50 --output-dir ./reports` | Cap + persist |
30 
31All flags forward through `"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run unlighthouse_run.py`, which handles
32url_safety pre-flight and subprocess timeout management.
33 
34## Output handling
35 
36The wrapper reads `ci-result.json` from the Unlighthouse output dir, normalizes
37it (the default `jsonSimple` reporter writes a flat JSON array of per-route
38results; a tolerant fallback also accepts the `jsonExpanded` object shape),
39and returns:
40 
41- `route_count`: number of routes actually audited
42- `aggregate_scores`: median score per Lighthouse category across all audited
43 routes (`performance`, `accessibility`, `best-practices`, `seo`)
44- `routes`: the per-route breakdown (also on disk at `<output_dir>/ci-result.json`)
45 
46Route cap and per-page timeout are set via a generated `unlighthouse.config.mjs`
47passed with `--config-file` (the only CLI-documented way to set `scanner.maxRoutes`;
48unlighthouse-ci has no `--max-routes` flag). Use `--page-timeout <seconds>` to
49change the per-page Lighthouse task timeout (default 60s); this is separate
50from the overall `--timeout` subprocess guard (default 600s).
51 
52## Cross-skill delegation
53 
54- For single-URL field data (CrUX), use `seo-google psi` / `seo-google crux`.
55- For LCP subpart decomposition on slow pages, use the
56 `"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run lcp_subparts.py` workflow (Phase C).
57 

Discussion

From GitHub

1 comment on 1 thread

Alternatives

Also in SEO & keywords