Fixed in v2.3.0: route caps and per-page timeout go through a generated config file, the form factor uses --desktop/--mobile, ci-result.json is parsed as the array the default reporter writes, and install.sh proceeds on plugin installs. Thank you for the detailed report.
SEO unlighthouse
Multi-page Lighthouse audit via the MIT-licensed Unlighthouse CLI.
How to use it
- Hit Copy SKILL.md — or use the Claude Code line below to get every file.
- 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. - Describe your job in plain words. The AI follows the skill from there.
npx degit AgriciDaniel/claude-seo/extensions/unlighthouse/skills/seo-unlighthouse#main ~/.claude/skills/seo-unlighthouseFor 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.
Paste into Claude, ChatGPT or Cursor.
Show the full text57 lines
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 auditedaggregate_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.pyworkflow (Phase C).
| 1 | |
| 2 | name seo-unlighthouse |
| 3 | description 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. |
| 4 | metadata |
| 5 | version "2.3.1" |
| 6 | compatibility "Requires Node 18+ and the unlighthouse npm package. Run extensions/unlighthouse/install.sh to pre-warm." |
| 7 | |
| 8 | |
| 9 | # seo-unlighthouse |
| 10 | |
| 11 | Run Lighthouse against every URL on a site (up to a configurable cap) |
| 12 | and 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 | |
| 31 | All flags forward through `"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run unlighthouse_run.py`, which handles |
| 32 | url_safety pre-flight and subprocess timeout management. |
| 33 | |
| 34 | ## Output handling |
| 35 | |
| 36 | The wrapper reads `ci-result.json` from the Unlighthouse output dir, normalizes |
| 37 | it (the default `jsonSimple` reporter writes a flat JSON array of per-route |
| 38 | results; a tolerant fallback also accepts the `jsonExpanded` object shape), |
| 39 | and 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 | |
| 46 | Route cap and per-page timeout are set via a generated `unlighthouse.config.mjs` |
| 47 | passed with `--config-file` (the only CLI-documented way to set `scanner.maxRoutes`; |
| 48 | unlighthouse-ci has no `--max-routes` flag). Use `--page-timeout <seconds>` to |
| 49 | change the per-page Lighthouse task timeout (default 60s); this is separate |
| 50 | from 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 |