ranklint 1.1.0 release notes

New rule links:no-utm-internal (warn) flags internal links that carry UTM or click-id parameters (utm\_\*, gclid, gbraid, wbraid, fbclid, yclid, msclkid, \_gl,…

Released: 2026-10-11

Features

  • @ranklint/checks, @ranklint/preset-default: New rule links:no-utm-internal (warn) flags internal links that carry UTM or click-id parameters (utm_*, gclid, gbraid, wbraid, fbclid, yclid, msclkid, _gl, mc_cid, mc_eid) (9172e75)
  • @ranklint/cli, @ranklint/reporters: New ranklint dashboard command and dashboard() reporter: a single-file HTML monitoring dashboard for GitLab or GitHub Pages built from the stored monitor reports. It shows the latest run with deltas against the previous one, new and fixed issues by rule with errors first, trends for errors, warnings, Lighthouse scores and CrUX field data, Lighthouse by page and the history of every run with a per-run report in runs/<date>.html. An issue explorer groups problems by rule or by page: every page gets a checklist of what to fix with the suggestion and docs link for each rule, the affected elements and a NEW mark, and a "Fix once" block lists issues repeated across a section or the whole site that are fixed in one template. Optional branding with --logo, --brand-name and --accent: your logo top left, one accent color for the whole page and a "powered by ranklint" line in the side panel. A --run-url button opens the CI pipeline form. The html reporter (--reporter html, --html-output) gets the same design: issues grouped by page by default, the explorer with filters and a Web Vitals section with CrUX ratings and a Lighthouse table. Pages embed their data and script and load the brand fonts from Google Fonts, falling back to system fonts offline. (e35b41d)
  • @ranklint/core: Export isTrackingParam(name) from @ranklint/core: true for utm_* and gclid, gbraid, wbraid, fbclid, yclid, msclkid, _gl, mc_cid, mc_eid. normalizeUrl and links:no-utm-internal share this list. (1f669ea)

Fixes

  • @ranklint/checks, @ranklint/cli, @ranklint/core: The crawler no longer treats a page that redirects to another origin as a page of the site: it is counted in crawlStats.external, its links are not crawled and page checks don't run on its HTML. Links of a page redirected inside the site resolve against the final URL, and several URLs redirecting to one final URL give a single snapshot, reported under the final URL. An entry URL redirecting to another origin (example.com → www.example.com, http → https) is reported as a crawl:entry-redirect error instead of an empty audit. PageSnapshot gets an optional finalUrl, filled by HttpFetcher and PlaywrightFetcher. links:no-broken, links:no-redirect-chain, links:permanent-redirects, links:no-utm-internal, links:no-orphans and canonical:no-chain resolve relative URLs against finalUrl when it is set. (41da7b8)
  • @ranklint/checks: Collapse line breaks and repeated spaces in H1 and title text: indexability:ssr-content no longer reports multi-line headings as client-side only, headings:h1-length and meta:title-length measure the normalized text, and headings:unique-h1, meta:no-duplicate-title and meta:no-duplicate-description group duplicates that differ only in whitespace. http:no-soft-404 matches not-found titles split across lines and shows the normalized title in the message. (98e44d7)
  • @ranklint/checks: i18n:no-locale-leak ignores subtrees whose lang attribute differs from the page language (660be37)
  • @ranklint/checks, @ranklint/reporters: links:no-utm-internal and images:* escape " and \ in the attribute value of the issue selector. markdownDiff, the monitor dashboard and Slack/Telegram notifications list new and fixed issues by severity (error, warn, info), so errors are not cut off by the item limit. (1f669ea)
  • @ranklint/checks, @ranklint/cli, @ranklint/core: Page checks skip 4xx/5xx snapshots, so an HTML 404 behind a broken link no longer raises canonical or duplicate title issues; the broken link itself is still reported by links:no-broken. New crawl.respectRobots option (default true): the crawler loads <origin>/robots.txt once and does not crawl links disallowed for * or for the group matching crawl.userAgent; entry URLs are always crawled and the count is reported as crawlStats.disallowed and in the crawl log. The robots.txt parser moved to @ranklint/core (parseRobotsTxt, isPathDisallowed, still re-exported by @ranklint/checks) and now supports Google * and $ patterns, percent-encoded and non-ASCII paths and most specific user agent group selection. robots.txt is read from the raw response (ssrHtml) so browser-rendered fetchers no longer hide its rules from the crawler and robots:* checks. Entry URLs are exempt from robots.txt, sitemap+sample samples are not. New lighthouse.urls option pins the exact list of paths or URLs measured by Lighthouse in audit and the lighthouse command; an empty list counts as not set. images:* issues for data: images use a structural nth-of-type selector instead of embedding the data URI. (4cab41d)
  • @ranklint/checks, @ranklint/core: normalizeUrl strips tracking params (utm_*, gclid, gbraid, wbraid, fbclid, yclid, msclkid, _gl, mc_cid, mc_eid), so the crawler no longer visits /a?utm_source=x as a separate page. links:no-broken, links:no-redirect-chain and links:permanent-redirects check such links once and still report the original href. (d1c054c)
  • @ranklint/core: Route patterns ending with /** match their prefix as a glob, so /*/market/** covers /en/market and /en/market/cars (81088bc)

Highlights

ranklint 1.1.0 turns monitor mode into a place to read results. ranklint dashboard builds a single-file HTML dashboard from the stored monitor reports, ready for GitLab or GitHub Pages: the latest run with deltas, new and fixed issues with errors first, trends for errors, Lighthouse scores and CrUX field data, a per-run report for every date and an issue explorer that turns each page into a checklist of what to fix. A "Fix once" block lists problems repeated across a section or the whole site, and --logo, --brand-name and --accent put your brand on it. The crawler now respects robots.txt, follows redirects to the final URL, skips pages that redirect off the site and drops tracking parameters when it dedupes URLs; lighthouse.urls pins Lighthouse to your key pages, and the new links:no-utm-internal rule flags internal links with UTM tags.