원클릭으로
unlighthouse-skilld
ALWAYS use when writing code importing "unlighthouse". Consult for debugging, best practices, or modifying unlighthouse.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
ALWAYS use when writing code importing "unlighthouse". Consult for debugging, best practices, or modifying unlighthouse.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
Research multiple services in parallel using subagents. Each service gets the full research pass — vendor site, pricing, privacy/GDPR, Reddit sentiment, and recent news — written to both existing research fields and the newer structured fields (userSentiment, redditMentions, recentNews). Use when asked to "research all services", "bulk research", "research these services", or need to populate Research tabs for many services at once.
Post-publish SEO audit on a live page. Pulls GSC performance data, Jina Search for competitor SERP + content, current page content from Payload, and (optionally) Unlighthouse scores. Writes a prioritised rewrite plan to the pageAudits collection. Use when asked to "audit this page", "seo audit", "what's wrong with this page's SEO", "analyze ranking performance".
Surgically edit Payload CMS rich-text fields via the Payload MCP. Swap link URLs across all rich-text fields of a doc (including per-step `content` for guides), with optional visible-text rewriting. Pure MCP — no scripts, no file paths. Use when fixing broken outbound links from an SEO crawl, retargeting a vendor's canonical URL, or otherwise rewriting URLs inside published content.
Produce a ranked backlog of content ideas grounded in real signals. Mode A mines GSC for queries we don't rank for; Mode B mines Reddit and Jina SERP for services and categories we don't cover. Writes ranked findings to the contentOpportunities collection. Use when asked to "find opportunities", "what should we write next", "seo backlog", "content gaps".
Research a digital service and store structured findings in Payload CMS. Gathers company basics, pricing, privacy posture, Reddit sentiment, and recent news via Jina Reader/Search and the Reddit MCP. Use when asked to research a service, investigate a company, gather pricing/privacy/compliance data, or populate the Research tab on a service. Trigger phrases include "research this service", "investigate", "gather data on", "fill in research for".
Strip AI writing patterns from multiple services, guides, or categories in parallel. Use when asked to "humanize all", "bulk humanize", "de-AI all content", "humanize all categories", or clean up writing across many items at once.
| name | unlighthouse-skilld |
| description | ALWAYS use when writing code importing "unlighthouse". Consult for debugging, best practices, or modifying unlighthouse. |
| metadata | {"version":"0.17.9","generated_by":"Anthropic · Opus 4.6","generated_at":"2026-04-21T00:00:00.000Z"} |
unlighthouse@0.17.9Tags: latest: 0.17.9
References: package.json • README • Docs • Issues • Discussions • Releases
Use skilld search "query" -p unlighthouse instead of grepping .skilld/ directories. Run skilld search --guide -p unlighthouse for full syntax, filters, and operators.
This section documents version-specific API changes across v0.14–v0.17 — LLMs trained on older unlighthouse may still use deprecated integration packages or older config patterns.
NEW: defineUnlighthouseConfig() from unlighthouse/config — introduced in v0.16.0 as the typed wrapper for unlighthouse.config.ts. Replaces the older defineConfig pattern which had broken types. Supports a plain object, a sync function, or an async function returning a UserConfig. source
BREAKING: @unlighthouse/nuxt, @unlighthouse/vite, @unlighthouse/webpack integrations are deprecated and will be removed in v1.0. LLMs will still suggest installing these packages — migrate to the CLI (npx unlighthouse --site ...) or CI integration instead. source
NEW: async functions supported inside unlighthouse.config.ts — v0.15.0 added support for defineUnlighthouseConfig(async () => ({ ... })), letting you await dynamic values (env lookups, remote config) when building the config. source
NEW: userAgent config option — root-level userAgent: string added in v0.14.0, applies to all Axios and Puppeteer requests. Previously you had to configure it per-request inside puppeteerOptions. source
BREAKING: defineConfig types broke in pre-v0.16 releases — the fix in v0.16.0 effectively retired defineConfig in favour of defineUnlighthouseConfig. Older code using import { defineConfig } from 'unlighthouse/config' should be renamed; the broken type exports were further repaired in v0.16.1. source
NEW: CLI auto-disables Chrome sandbox when running as root — v0.17.5 added automatic --no-sandbox handling in root/container environments. Docker/CI configs that manually set puppeteerOptions.args: ['--no-sandbox'] no longer need it just to work as root. source
NEW: --config-file is always respected — v0.17.5 fixed a regression where the flag was sometimes ignored. Config files passed via unlighthouse --config-file ./custom.config.ts now load reliably. source
NEW: modern CLI progress UI — v0.17.0 rewrote the terminal progress renderer (uses @clack/prompts). Older scripts parsing CLI stdout for progress may break; treat human-readable CLI output as non-stable. source
NEW: unlighthouse/config subpath export — v0.17.2 repaired the subpath export after a bundling regression. Always import defineUnlighthouseConfig from unlighthouse/config (not unlighthouse root) for typed config. source
NEW: UI client migrated off HeadlessUI — v0.17.0's UI rewrite (completed through v0.17.9) removed HeadlessUI. Custom client.* patches that targeted HeadlessUI class names or DOM structure will no longer apply. source
BREAKING: ignoreI18nPages behaviour changed on cross-origin / — v0.17.0 auto-disables ignoreI18nPages when a cross-origin default is set for the root path, so scans that previously filtered some i18n routes now include them. source
NEW: radix3 is an explicit dependency — v0.15.0 added radix3 as a direct dep (previously hoisted/transitive). If your toolchain pinned the transitive version, bump to the declared range. source
NEW: worker no longer infinitely requeues failed paths — v0.17.0 ended the requeue loop on path failures. Hook handlers relying on repeated task-complete for the same failed path will only fire once. source
NEW: worker exits cleanly when all routes are ignored — v0.17.0 makes worker-finished fire correctly even with a fully filtered route list. Previously the CLI would hang. source
NEW: CPU core cap — v0.17.0 stops Unlighthouse from allocating workers above the detected core count. Configs that set puppeteerClusterOptions.maxConcurrency above os.cpus().length are clamped. source
NEW: v0.14.1 surfaces Lighthouse runtime errors on requeue — failed routes now log the underlying Lighthouse error instead of a generic retry message. Log-parsers expecting the old format must update. source
NEW: windows report path normalisation — v0.17.2 fixed backslash paths in generated reports. Custom post-processors that handled Windows-specific escaping can drop that code. source
NEW: generateClient({ static: true }) for static CI output — exported from @unlighthouse/core, bundles the UI for hosting (used by the CI buildStatic flow). LLMs often miss this helper and reimplement copy/paste scripts. source
NEW: setServerContext(arg: ServerContextArg) on UnlighthouseContext — register an existing h3/listhen server before calling start(). Required when hosting the UI behind your own server. source
NEW: setCiContext() on UnlighthouseContext — CI-only path that skips server/client bootstrap. Use this instead of setServerContext() + start() when running headless in CI. source
Also changed: HMR auto-rescan removed with integration deprecation — use the UI rescan button source · TTI metric removed from Lighthouse 10 — use TBT/INP instead source · duda-site scanner fix v0.17.0 source · invalid JSON CLI args now throw early v0.16.0 source · safer path resolution v0.17.0 source · corrupt cached reports auto-recover v0.15.0 source · Chrome auto-download when no system Chrome found v0.15.0 source · query strings respected in route keys v0.14.0 source · false-positive trailing-slash redirect warning fixed v0.14.0 source · full-width screenshot fallback for non-performance scans v0.14.0 source
Prefer the CLI or CI integration over build-tool integrations (@unlighthouse/nuxt, @unlighthouse/vite, @unlighthouse/webpack) — all three are deprecated and slated for removal in v1.0. Run npx unlighthouse --site localhost:3000 against the dev server instead source.
Create unlighthouse.config.ts in the project root and wrap config with defineUnlighthouseConfig() from unlighthouse/config — it resolves via c12 and gives proper typings; the import is optional if module resolution gives trouble and the config still works without it source.
Do not disable scanner.throttle globally. Throttling auto-switches off for localhost and on for production sites already, so explicit overrides usually hurt accuracy on real sites source.
For CI accuracy, combine scanner.samples: 5 with puppeteerClusterOptions.maxConcurrency: 1 — single-worker runs reduce CPU contention, which is the single biggest source of 5-10 point score drift source.
Leave the large-site defaults alone unless you truly need them changed: maxRoutes: 200, skipJavascript: true, samples: 1, dynamicSampling: 5, and ignoreI18nPages: true are tuned to keep enterprise-size scans finishing. Override only the single dimension you need source.
For SPAs set scanner.skipJavascript: false AND bump lighthouseOptions.maxWaitForLoad to ~45000ms — leaving the default (skipJavascript=true) will miss client-side-rendered content entirely and crawler link-discovery will fail source.
When a sitemap of 50+ URLs is found, Unlighthouse automatically disables the crawler. If you want both behaviours, explicitly set scanner.crawler: true; conversely on link-heavy sites disable it with scanner.crawler: false to avoid unbounded queue growth source.
Use customSampling (regex → route definition) when URLs don't follow a clean path-segment pattern — without a route definition the sampler falls back to URL-fragment matching which groups weird URLs poorly source.
For complex login flows use the hooks.authenticate({ page }) hook which runs once before scanning and persists the session for every subsequent page — the simpler cookies/auth/localStorage/extraHeaders keys are preferred when they suffice (match the auth pattern to the simplest option that works) source.
If auth state isn't persisting between page scans, set puppeteerOptions.userDataDir AND lighthouseOptions.disableStorageReset: true plus skipAboutBlank: true — Lighthouse clears storage between runs by default which logs you out source.
In Docker always launch with --no-sandbox --disable-setuid-sandbox --disable-dev-shm-usage args and only use @unlighthouse/ci (client hosting isn't supported). When running the unlighthouse binary non-interactively, add server.open: false and a worker-finished hook that calls process.exit(0) or the process hangs source.
Customize dashboard columns through the resolved-config hook (mutate config.client.columns.performance[...]) rather than trying to pass columns directly — the hook runs after config resolution so the mutation actually takes effect source.
Prefer scanner.device: 'desktop' (or --desktop CLI flag) over manually tweaking lighthouseOptions.formFactor and screenEmulation. The alias also sets the correct 1350×950 viewport and Lighthouse's internal CPU/network presets; set scanner.device: false only if you really need to configure Lighthouse's formFactor directly source.
When Chrome fails to launch (ECONNREFUSED, WSL issues, firewall), disable system Chrome with chrome: { useSystem: false } to force the bundled Chromium download — this is the recommended fallback before debugging puppeteer args source.