Advanced
Nuances & limitations
The edge cases and deliberate trade-offs behind the crawler, the rules and the reports.
- URL dedup while crawling: the hash is dropped, the query is kept — faceted filters matter for crawl-budget analysis.
- Tracking params are the exception:
utm_*,gclid,gbraid,wbraid,fbclid,yclid,msclkid,_gl,mc_cid,mc_eidare stripped, so/a?utm_source=xand/aare one page; the other params keep their order. - A page that failed to load (timeout, network, TLS) → a snapshot with statusCode 0 +
crawl:timeout; its page checks are skipped — no false "missing title". The crawler as a whole never dies. - Page checks are also skipped for 4xx/5xx snapshots (an HTML 404 for a dead
/x.pdflink won't raisecanonical:requiredor duplicate titles): the broken link itself is reported bylinks:no-brokenon the linking page. Site checks still see these snapshots. - A page whose redirects end on another origin (an internal
/l/xshort link →apps.apple.com) is counted incrawlStats.external: it isn't audited and its links aren't crawled;links:no-redirect-chainandlinks:no-brokenstill check that link on the linking page. Links of a page redirected inside the site (/a→/b/) resolve against the final URL, and URLs leading to an already crawled final URL give one snapshot, reported under the final URL. An entry (crawl.entry/--url) that redirects to another origin (example.com→www.example.com,http→https) is acrawl:entry-redirecterror with the origin to put intosite.url/--url; the other entries are still crawled. crawl.respectRobots(defaulttrue):<origin>/robots.txtis loaded once and links disallowed for*(or for the group matchingcrawl.userAgent) are not crawled; Google matching —*,$, longest rule wins,Allowwins ties. Missing or failing robots.txt blocks nothing.crawl.entryURLs (or--url) are always crawled;sitemap+samplesamples go through robots.txt. Non-ASCII rules are percent-encoded and hex is compared case-insensitively. The count iscrawlStats.disallowedand the crawl log line.maxPagesreached →truncated: truein the report — you can see the audit is partial.- The Nuxt dev server is not for full crawls: on-the-fly compilation × parallel tabs = worker OOM. Locally use
--startagainst a build or lowerconcurrency/maxPages; full audits belong on deployed environments. insecureTlssets Playwright'signoreHTTPSErrorsandNODE_TLS_REJECT_UNAUTHORIZED=0for the process — dev/staging profiles only.- Lighthouse requires an installed Chrome (chrome-launcher) and doesn't work with self-signed TLS — run it against deployed environments.
- The above-fold heuristic viewport is Playwright's default 1280×720 (or
crawl.viewport). srcset-only images without src aren't measured. http:x-robots-consistentis part of DevTools Level 1, but the panel has no headers — it's a no-op there.- Sitemap function sources are self-contained: no closures over nuxt.config variables.
- A profile is applied as a defu patch: objects merge, scalars override.
- One monitor run = one JSON; storage keys: timestamp (monitor) or commit SHA (MR).
- DOM is parsed by linkedom (server) / DOMParser (panel) — the same rule code runs in both worlds.
- One failing rule (
internal:check-failed, info) never kills the audit; an unknown rule id in the config does — with did-you-mean.