[{"data":1,"prerenderedAt":1657},["ShallowReactive",2],{"navigation_docs_en":3,"-en-cli-monitor":361,"-en-cli-monitor-surround":1652},[4,23,49,83,93,115,343,353],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":22},"Getting started","i-lucide-rocket","\u002Fen\u002Fgetting-started","en\u002F1.getting-started",[10,14,18],{"title":11,"path":12,"stem":13},"Introduction","\u002Fen\u002Fgetting-started\u002Fintroduction","en\u002F1.getting-started\u002F1.introduction",{"title":15,"path":16,"stem":17},"Installation","\u002Fen\u002Fgetting-started\u002Finstallation","en\u002F1.getting-started\u002F2.installation",{"title":19,"path":20,"stem":21},"ranklint init","\u002Fen\u002Fgetting-started\u002Finit","en\u002F1.getting-started\u002F3.init",false,{"title":24,"icon":25,"path":26,"stem":27,"children":28,"page":22},"Nuxt module","i-lucide-box","\u002Fen\u002Fmodule","en\u002F2.module",[29,33,37,41,45],{"title":30,"path":31,"stem":32},"Overview","\u002Fen\u002Fmodule\u002Foverview","en\u002F2.module\u002F1.overview",{"title":34,"path":35,"stem":36},"Sitemap","\u002Fen\u002Fmodule\u002Fsitemap","en\u002F2.module\u002F2.sitemap",{"title":38,"path":39,"stem":40},"Robots","\u002Fen\u002Fmodule\u002Frobots","en\u002F2.module\u002F3.robots",{"title":42,"path":43,"stem":44},"Composables","\u002Fen\u002Fmodule\u002Fcomposables","en\u002F2.module\u002F4.composables",{"title":46,"path":47,"stem":48},"DevTools","\u002Fen\u002Fmodule\u002Fdevtools","en\u002F2.module\u002F5.devtools",{"title":50,"icon":51,"path":52,"stem":53,"children":54,"page":22},"CLI","i-lucide-terminal","\u002Fen\u002Fcli","en\u002F3.cli",[55,59,63,67,71,75,79],{"title":56,"path":57,"stem":58},"ranklint audit","\u002Fen\u002Fcli\u002Faudit","en\u002F3.cli\u002F1.audit",{"title":60,"path":61,"stem":62},"Diff & CI","\u002Fen\u002Fcli\u002Fdiff-and-ci","en\u002F3.cli\u002F2.diff-and-ci",{"title":64,"path":65,"stem":66},"Production monitoring","\u002Fen\u002Fcli\u002Fmonitor","en\u002F3.cli\u002F3.monitor",{"title":68,"path":69,"stem":70},"Lighthouse","\u002Fen\u002Fcli\u002Flighthouse","en\u002F3.cli\u002F4.lighthouse",{"title":72,"path":73,"stem":74},"Zones (multi-app domains)","\u002Fen\u002Fcli\u002Fzones","en\u002F3.cli\u002F5.zones",{"title":76,"path":77,"stem":78},"Other commands","\u002Fen\u002Fcli\u002Fother-commands","en\u002F3.cli\u002F6.other-commands",{"title":80,"path":81,"stem":82},"Watch mode","\u002Fen\u002Fcli\u002Fwatch","en\u002F3.cli\u002F7.watch",{"title":84,"icon":85,"path":86,"stem":87,"children":88,"page":22},"Configuration","i-lucide-settings-2","\u002Fen\u002Fconfig","en\u002F4.config",[89],{"title":90,"path":91,"stem":92},"Reference","\u002Fen\u002Fconfig\u002Freference","en\u002F4.config\u002F1.reference",{"title":94,"icon":95,"path":96,"stem":97,"children":98,"page":22},"Advanced","i-lucide-wrench","\u002Fen\u002Fadvanced","en\u002F5.advanced",[99,103,107,111],{"title":100,"path":101,"stem":102},"Custom rules & presets","\u002Fen\u002Fadvanced\u002Fcustom-rules","en\u002F5.advanced\u002F1.custom-rules",{"title":104,"path":105,"stem":106},"Smart heuristics","\u002Fen\u002Fadvanced\u002Fheuristics","en\u002F5.advanced\u002F2.heuristics",{"title":108,"path":109,"stem":110},"Env variables","\u002Fen\u002Fadvanced\u002Fenv","en\u002F5.advanced\u002F3.env",{"title":112,"path":113,"stem":114},"Nuances & limitations","\u002Fen\u002Fadvanced\u002Fnuances","en\u002F5.advanced\u002F4.nuances",{"title":116,"icon":117,"path":118,"stem":119,"children":120},"Rules","i-lucide-list-checks","\u002Fen\u002Frules","en\u002F6.rules\u002Findex",[121,123,148,173,190,207,228,257,306,330],{"title":122,"path":118,"stem":119},"All rules",{"title":124,"path":125,"stem":126,"children":127,"page":22},"Headings","\u002Fen\u002Frules\u002Fheadings","en\u002F6.rules\u002Fheadings",[128,132,136,140,144],{"title":129,"path":130,"stem":131},"headings:h1-length","\u002Fen\u002Frules\u002Fheadings\u002Fheadings-h1-length","en\u002F6.rules\u002Fheadings\u002Fheadings-h1-length",{"title":133,"path":134,"stem":135},"headings:hierarchy","\u002Fen\u002Frules\u002Fheadings\u002Fheadings-hierarchy","en\u002F6.rules\u002Fheadings\u002Fheadings-hierarchy",{"title":137,"path":138,"stem":139},"headings:no-empty","\u002Fen\u002Frules\u002Fheadings\u002Fheadings-no-empty","en\u002F6.rules\u002Fheadings\u002Fheadings-no-empty",{"title":141,"path":142,"stem":143},"headings:single-h1","\u002Fen\u002Frules\u002Fheadings\u002Fheadings-single-h1","en\u002F6.rules\u002Fheadings\u002Fheadings-single-h1",{"title":145,"path":146,"stem":147},"headings:unique-h1","\u002Fen\u002Frules\u002Fheadings\u002Fheadings-unique-h1","en\u002F6.rules\u002Fheadings\u002Fheadings-unique-h1",{"title":149,"path":150,"stem":151,"children":152,"page":22},"Http","\u002Fen\u002Frules\u002Fhttp","en\u002F6.rules\u002Fhttp",[153,157,161,165,169],{"title":154,"path":155,"stem":156},"http:no-mixed-content","\u002Fen\u002Frules\u002Fhttp\u002Fhttp-no-mixed-content","en\u002F6.rules\u002Fhttp\u002Fhttp-no-mixed-content",{"title":158,"path":159,"stem":160},"http:no-soft-404","\u002Fen\u002Frules\u002Fhttp\u002Fhttp-no-soft-404","en\u002F6.rules\u002Fhttp\u002Fhttp-no-soft-404",{"title":162,"path":163,"stem":164},"http:ttfb-budget","\u002Fen\u002Frules\u002Fhttp\u002Fhttp-ttfb-budget","en\u002F6.rules\u002Fhttp\u002Fhttp-ttfb-budget",{"title":166,"path":167,"stem":168},"http:x-robots-consistent","\u002Fen\u002Frules\u002Fhttp\u002Fhttp-x-robots-consistent","en\u002F6.rules\u002Fhttp\u002Fhttp-x-robots-consistent",{"title":170,"path":171,"stem":172},"mobile:viewport","\u002Fen\u002Frules\u002Fhttp\u002Fmobile-viewport","en\u002F6.rules\u002Fhttp\u002Fmobile-viewport",{"title":174,"path":175,"stem":176,"children":177,"page":22},"I18n","\u002Fen\u002Frules\u002Fi18n","en\u002F6.rules\u002Fi18n",[178,182,186],{"title":179,"path":180,"stem":181},"hreflang:symmetric","\u002Fen\u002Frules\u002Fi18n\u002Fhreflang-symmetric","en\u002F6.rules\u002Fi18n\u002Fhreflang-symmetric",{"title":183,"path":184,"stem":185},"hreflang:valid-targets","\u002Fen\u002Frules\u002Fi18n\u002Fhreflang-valid-targets","en\u002F6.rules\u002Fi18n\u002Fhreflang-valid-targets",{"title":187,"path":188,"stem":189},"i18n:no-locale-leak","\u002Fen\u002Frules\u002Fi18n\u002Fi18n-no-locale-leak","en\u002F6.rules\u002Fi18n\u002Fi18n-no-locale-leak",{"title":191,"path":192,"stem":193,"children":194,"page":22},"Images","\u002Fen\u002Frules\u002Fimages","en\u002F6.rules\u002Fimages",[195,199,203],{"title":196,"path":197,"stem":198},"images:alt-required","\u002Fen\u002Frules\u002Fimages\u002Fimages-alt-required","en\u002F6.rules\u002Fimages\u002Fimages-alt-required",{"title":200,"path":201,"stem":202},"images:dimensions-required","\u002Fen\u002Frules\u002Fimages\u002Fimages-dimensions-required","en\u002F6.rules\u002Fimages\u002Fimages-dimensions-required",{"title":204,"path":205,"stem":206},"images:no-lazy-above-fold","\u002Fen\u002Frules\u002Fimages\u002Fimages-no-lazy-above-fold","en\u002F6.rules\u002Fimages\u002Fimages-no-lazy-above-fold",{"title":208,"path":209,"stem":210,"children":211,"page":22},"Indexability","\u002Fen\u002Frules\u002Findexability","en\u002F6.rules\u002Findexability",[212,218,224],{"title":213,"path":214,"stem":215,"children":216},"indexability:ssr-content","\u002Fen\u002Frules\u002Findexability\u002Findexability-ssr-content","en\u002F6.rules\u002Findexability\u002Findexability-ssr-content",[217],{"title":213,"path":214,"stem":215},{"title":219,"path":220,"stem":221,"children":222},"sitemap:no-noindex","\u002Fen\u002Frules\u002Findexability\u002Fsitemap-no-noindex","en\u002F6.rules\u002Findexability\u002Fsitemap-no-noindex",[223],{"title":219,"path":220,"stem":221},{"title":225,"path":226,"stem":227},"sitemap:reachable","\u002Fen\u002Frules\u002Findexability\u002Fsitemap-reachable","en\u002F6.rules\u002Findexability\u002Fsitemap-reachable",{"title":229,"path":230,"stem":231,"children":232,"page":22},"Links","\u002Fen\u002Frules\u002Flinks","en\u002F6.rules\u002Flinks",[233,237,241,245,249,253],{"title":234,"path":235,"stem":236},"links:no-broken","\u002Fen\u002Frules\u002Flinks\u002Flinks-no-broken","en\u002F6.rules\u002Flinks\u002Flinks-no-broken",{"title":238,"path":239,"stem":240},"links:no-orphans","\u002Fen\u002Frules\u002Flinks\u002Flinks-no-orphans","en\u002F6.rules\u002Flinks\u002Flinks-no-orphans",{"title":242,"path":243,"stem":244},"links:no-redirect-chain","\u002Fen\u002Frules\u002Flinks\u002Flinks-no-redirect-chain","en\u002F6.rules\u002Flinks\u002Flinks-no-redirect-chain",{"title":246,"path":247,"stem":248},"links:no-utm-internal","\u002Fen\u002Frules\u002Flinks\u002Flinks-no-utm-internal","en\u002F6.rules\u002Flinks\u002Flinks-no-utm-internal",{"title":250,"path":251,"stem":252},"links:permanent-redirects","\u002Fen\u002Frules\u002Flinks\u002Flinks-permanent-redirects","en\u002F6.rules\u002Flinks\u002Flinks-permanent-redirects",{"title":254,"path":255,"stem":256},"links:trailing-slash-consistent","\u002Fen\u002Frules\u002Flinks\u002Flinks-trailing-slash-consistent","en\u002F6.rules\u002Flinks\u002Flinks-trailing-slash-consistent",{"title":258,"path":259,"stem":260,"children":261,"page":22},"Meta","\u002Fen\u002Frules\u002Fmeta","en\u002F6.rules\u002Fmeta",[262,266,270,274,278,282,286,290,294,298,302],{"title":263,"path":264,"stem":265},"canonical:no-chain","\u002Fen\u002Frules\u002Fmeta\u002Fcanonical-no-chain","en\u002F6.rules\u002Fmeta\u002Fcanonical-no-chain",{"title":267,"path":268,"stem":269},"canonical:required","\u002Fen\u002Frules\u002Fmeta\u002Fcanonical-required","en\u002F6.rules\u002Fmeta\u002Fcanonical-required",{"title":271,"path":272,"stem":273},"canonical:valid","\u002Fen\u002Frules\u002Fmeta\u002Fcanonical-valid","en\u002F6.rules\u002Fmeta\u002Fcanonical-valid",{"title":275,"path":276,"stem":277},"meta:description-length","\u002Fen\u002Frules\u002Fmeta\u002Fmeta-description-length","en\u002F6.rules\u002Fmeta\u002Fmeta-description-length",{"title":279,"path":280,"stem":281},"meta:description-required","\u002Fen\u002Frules\u002Fmeta\u002Fmeta-description-required","en\u002F6.rules\u002Fmeta\u002Fmeta-description-required",{"title":283,"path":284,"stem":285},"meta:no-duplicate-description","\u002Fen\u002Frules\u002Fmeta\u002Fmeta-no-duplicate-description","en\u002F6.rules\u002Fmeta\u002Fmeta-no-duplicate-description",{"title":287,"path":288,"stem":289},"meta:no-duplicate-title","\u002Fen\u002Frules\u002Fmeta\u002Fmeta-no-duplicate-title","en\u002F6.rules\u002Fmeta\u002Fmeta-no-duplicate-title",{"title":291,"path":292,"stem":293},"meta:og-required","\u002Fen\u002Frules\u002Fmeta\u002Fmeta-og-required","en\u002F6.rules\u002Fmeta\u002Fmeta-og-required",{"title":295,"path":296,"stem":297},"meta:title-length","\u002Fen\u002Frules\u002Fmeta\u002Fmeta-title-length","en\u002F6.rules\u002Fmeta\u002Fmeta-title-length",{"title":299,"path":300,"stem":301},"meta:title-required","\u002Fen\u002Frules\u002Fmeta\u002Fmeta-title-required","en\u002F6.rules\u002Fmeta\u002Fmeta-title-required",{"title":303,"path":304,"stem":305},"meta:twitter-card","\u002Fen\u002Frules\u002Fmeta\u002Fmeta-twitter-card","en\u002F6.rules\u002Fmeta\u002Fmeta-twitter-card",{"title":38,"path":307,"stem":308,"children":309,"page":22},"\u002Fen\u002Frules\u002Frobots","en\u002F6.rules\u002Frobots",[310,314,318,322,326],{"title":311,"path":312,"stem":313},"robots:env-policy","\u002Fen\u002Frules\u002Frobots\u002Frobots-env-policy","en\u002F6.rules\u002Frobots\u002Frobots-env-policy",{"title":315,"path":316,"stem":317},"robots:expected-disallow","\u002Fen\u002Frules\u002Frobots\u002Frobots-expected-disallow","en\u002F6.rules\u002Frobots\u002Frobots-expected-disallow",{"title":319,"path":320,"stem":321},"robots:reachable","\u002Fen\u002Frules\u002Frobots\u002Frobots-reachable","en\u002F6.rules\u002Frobots\u002Frobots-reachable",{"title":323,"path":324,"stem":325},"robots:sitemap-declared","\u002Fen\u002Frules\u002Frobots\u002Frobots-sitemap-declared","en\u002F6.rules\u002Frobots\u002Frobots-sitemap-declared",{"title":327,"path":328,"stem":329},"robots:zone-not-blocked","\u002Fen\u002Frules\u002Frobots\u002Frobots-zone-not-blocked","en\u002F6.rules\u002Frobots\u002Frobots-zone-not-blocked",{"title":331,"path":332,"stem":333,"children":334,"page":22},"Structured Data","\u002Fen\u002Frules\u002Fstructured-data","en\u002F6.rules\u002Fstructured-data",[335,339],{"title":336,"path":337,"stem":338},"jsonld:parseable","\u002Fen\u002Frules\u002Fstructured-data\u002Fjsonld-parseable","en\u002F6.rules\u002Fstructured-data\u002Fjsonld-parseable",{"title":340,"path":341,"stem":342},"jsonld:valid-schema","\u002Fen\u002Frules\u002Fstructured-data\u002Fjsonld-valid-schema","en\u002F6.rules\u002Fstructured-data\u002Fjsonld-valid-schema",{"title":344,"icon":345,"path":346,"stem":347,"children":348,"page":22},"Guides","i-lucide-book-open","\u002Fen\u002Fguides","en\u002F7.guides",[349],{"title":350,"path":351,"stem":352},"SEO checklist for a Nuxt project","\u002Fen\u002Fguides\u002Fseo-checklist-nuxt","en\u002F7.guides\u002F1.seo-checklist-nuxt",{"title":354,"path":355,"stem":356,"children":357,"icon":360},"Changelog","\u002Fen\u002Fchangelog","en\u002F8.changelog\u002Findex",[358],{"title":359,"path":355,"stem":356},"ranklint changelog and release notes","i-lucide-history",{"id":362,"title":64,"body":363,"description":1646,"extension":1647,"links":1648,"meta":1649,"navigation":555,"path":65,"seo":1650,"stem":66,"__hash__":1651},"docs_en\u002Fen\u002F3.cli\u002F3.monitor.md",{"type":364,"value":365,"toc":1642},"minimark",[366,383,437,492,497,500,510,774,781,933,939,1039,1070,1074,1087,1250,1253,1331,1334,1354,1364,1367,1381,1389,1397,1403,1420,1466,1626,1638],[367,368,369,373,374,378,379,382],"p",{},[370,371,372],"code",{},"ranklint audit --url https:\u002F\u002Fprod --mode monitor"," — for cron\u002Fschedules. ",[375,376,377],"strong",{},"Exit is always 0",": prod monitoring never fails the pipeline, it alerts instead. Flow: audit → enrichment → diff against the last stored report → save by timestamp → alerts only when ",[370,380,381],{},"newIssues > 0",".",[384,385,386,397,411,424],"ul",{},[387,388,389,392,393,396],"li",{},[375,390,391],{},"CrUX"," (",[370,394,395],{},"RANKLINT_CRUX_API_KEY",") — field Core Web Vitals of the origin: LCP, CLS, INP of real users.",[387,398,399,402,403,406,407,410],{},[375,400,401],{},"Search Console URL Inspection"," — up to 10 pages: verdict, coverageState, indexingState, rich-results issues. Auth: a ready token ",[370,404,405],{},"RANKLINT_GSC_TOKEN"," or a service account ",[370,408,409],{},"RANKLINT_GSC_KEY_FILE"," (an RS256 JWT built on node:crypto with zero dependencies, iat shifted −30 s for clock skew).",[387,412,413,416,417,420,421,382],{},[375,414,415],{},"Alerts",": Slack webhook and\u002For Telegram (bot token + chat id) — payloads built by ",[370,418,419],{},"slackPayload","\u002F",[370,422,423],{},"telegramText",[387,425,426,429,430,433,434,382],{},[375,427,428],{},"Storage",": fs (default) or s3 with ",[370,431,432],{},"keep"," rotation; trend — ",[370,435,436],{},"ranklint history",[367,438,439,442,443,392,446,449,450,392,453,456,457,456,460,463,464,467,468,471,472,475,476,479,480,483,484,487,488,491],{},[375,440,441],{},"Standalone repo, any stack."," The CLI has no Nuxt dependency: a repo with ",[370,444,445],{},"package.json",[370,447,448],{},"ranklint"," devDependency), ",[370,451,452],{},"ranklint.config.ts",[370,454,455],{},"site.url",", ",[370,458,459],{},"robots.mode: 'external'",[370,461,462],{},"monitor",") and a scheduled job monitors the whole domain. GitHub: ",[370,465,466],{},"uses: aakazancev\u002Franklint\u002F.github\u002Fworkflows\u002Fmonitor.yml@main"," with ",[370,469,470],{},"pages: true"," publishes the html report to GitHub Pages; GitLab: ",[370,473,474],{},"extends: .ranklint-monitor"," + a ",[370,477,478],{},"pages"," job extending ",[370,481,482],{},".ranklint-pages"," on a pipeline schedule. ",[370,485,486],{},"--html-output"," \u002F ",[370,489,490],{},"--json-output"," write the full report next to the diff.",[493,494,496],"h2",{"id":495},"standalone-monitor-repo-any-stack","Standalone monitor repo (any stack)",[367,498,499],{},"The CLI does not depend on Nuxt: a tiny repo with a config and a scheduled job monitors a whole domain, whatever it is built with, and publishes the latest report to Pages.",[501,502,507],"pre",{"className":503,"code":505,"language":506},[504],"language-text","seo-monitor\u002F\n  package.json          { \"devDependencies\": { \"ranklint\": \"^0.5.0\" } }\n  ranklint.config.ts\n  .github\u002Fworkflows\u002Fmonitor.yml   or   .gitlab-ci.yml\n","text",[370,508,505],{"__ignoreMap":509},"",[501,511,515],{"className":512,"code":513,"language":514,"meta":509,"style":509},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { defineRanklintConfig } from '@ranklint\u002Fcore'\n\nexport default defineRanklintConfig({\n  site: { url: 'https:\u002F\u002Fexample.com' },\n  crawl: { maxPages: 2000, ignore: ['\u002Fadmin\u002F**', '\u002Fapi\u002F**'] },\n  robots: { mode: 'external', expect: { indexable: true, sitemaps: ['https:\u002F\u002Fexample.com\u002Fsitemap.xml'] } },\n  monitor: { storage: 'fs', dir: '.ranklint\u002Freports', keep: 60 },\n})\n","ts",[370,516,517,550,557,575,603,655,718,766],{"__ignoreMap":509},[518,519,522,526,530,534,537,540,543,547],"span",{"class":520,"line":521},"line",1,[518,523,525],{"class":524},"s7zQu","import",[518,527,529],{"class":528},"sMK4o"," {",[518,531,533],{"class":532},"sTEyZ"," defineRanklintConfig",[518,535,536],{"class":528}," }",[518,538,539],{"class":524}," from",[518,541,542],{"class":528}," '",[518,544,546],{"class":545},"sfazB","@ranklint\u002Fcore",[518,548,549],{"class":528},"'\n",[518,551,553],{"class":520,"line":552},2,[518,554,556],{"emptyLinePlaceholder":555},true,"\n",[518,558,560,563,566,569,572],{"class":520,"line":559},3,[518,561,562],{"class":524},"export",[518,564,565],{"class":524}," default",[518,567,533],{"class":568},"s2Zo4",[518,570,571],{"class":532},"(",[518,573,574],{"class":528},"{\n",[518,576,578,582,585,587,590,592,594,597,600],{"class":520,"line":577},4,[518,579,581],{"class":580},"swJcz","  site",[518,583,584],{"class":528},":",[518,586,529],{"class":528},[518,588,589],{"class":580}," url",[518,591,584],{"class":528},[518,593,542],{"class":528},[518,595,596],{"class":545},"https:\u002F\u002Fexample.com",[518,598,599],{"class":528},"'",[518,601,602],{"class":528}," },\n",[518,604,606,609,611,613,616,618,622,625,628,630,633,635,638,640,642,644,647,649,652],{"class":520,"line":605},5,[518,607,608],{"class":580},"  crawl",[518,610,584],{"class":528},[518,612,529],{"class":528},[518,614,615],{"class":580}," maxPages",[518,617,584],{"class":528},[518,619,621],{"class":620},"sbssI"," 2000",[518,623,624],{"class":528},",",[518,626,627],{"class":580}," ignore",[518,629,584],{"class":528},[518,631,632],{"class":532}," [",[518,634,599],{"class":528},[518,636,637],{"class":545},"\u002Fadmin\u002F**",[518,639,599],{"class":528},[518,641,624],{"class":528},[518,643,542],{"class":528},[518,645,646],{"class":545},"\u002Fapi\u002F**",[518,648,599],{"class":528},[518,650,651],{"class":532},"] ",[518,653,654],{"class":528},"},\n",[518,656,658,661,663,665,668,670,672,675,677,679,682,684,686,689,691,695,697,700,702,704,706,709,711,713,716],{"class":520,"line":657},6,[518,659,660],{"class":580},"  robots",[518,662,584],{"class":528},[518,664,529],{"class":528},[518,666,667],{"class":580}," mode",[518,669,584],{"class":528},[518,671,542],{"class":528},[518,673,674],{"class":545},"external",[518,676,599],{"class":528},[518,678,624],{"class":528},[518,680,681],{"class":580}," expect",[518,683,584],{"class":528},[518,685,529],{"class":528},[518,687,688],{"class":580}," indexable",[518,690,584],{"class":528},[518,692,694],{"class":693},"sfNiH"," true",[518,696,624],{"class":528},[518,698,699],{"class":580}," sitemaps",[518,701,584],{"class":528},[518,703,632],{"class":532},[518,705,599],{"class":528},[518,707,708],{"class":545},"https:\u002F\u002Fexample.com\u002Fsitemap.xml",[518,710,599],{"class":528},[518,712,651],{"class":532},[518,714,715],{"class":528},"}",[518,717,602],{"class":528},[518,719,721,724,726,728,731,733,735,738,740,742,745,747,749,752,754,756,759,761,764],{"class":520,"line":720},7,[518,722,723],{"class":580},"  monitor",[518,725,584],{"class":528},[518,727,529],{"class":528},[518,729,730],{"class":580}," storage",[518,732,584],{"class":528},[518,734,542],{"class":528},[518,736,737],{"class":545},"fs",[518,739,599],{"class":528},[518,741,624],{"class":528},[518,743,744],{"class":580}," dir",[518,746,584],{"class":528},[518,748,542],{"class":528},[518,750,751],{"class":545},".ranklint\u002Freports",[518,753,599],{"class":528},[518,755,624],{"class":528},[518,757,758],{"class":580}," keep",[518,760,584],{"class":528},[518,762,763],{"class":620}," 60",[518,765,602],{"class":528},[518,767,769,771],{"class":520,"line":768},8,[518,770,715],{"class":528},[518,772,773],{"class":532},")\n",[367,775,776,777,780],{},"GitHub Actions (report at ",[370,778,779],{},"https:\u002F\u002F\u003Cowner>.github.io\u002F\u003Crepo>\u002F",", enable Pages → Source: GitHub Actions once):",[501,782,786],{"className":783,"code":784,"language":785,"meta":509,"style":509},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","on:\n  schedule: [{ cron: '0 6 * * *' }]\n  workflow_dispatch:\npermissions:\n  contents: read\n  pages: write\n  id-token: write\njobs:\n  seo:\n    uses: aakazancev\u002Franklint\u002F.github\u002Fworkflows\u002Fmonitor.yml@main\n    with: { url: 'https:\u002F\u002Fexample.com', pages: true }\n    secrets: inherit\n","yaml",[370,787,788,796,821,828,835,845,855,864,871,879,890,922],{"__ignoreMap":509},[518,789,790,793],{"class":520,"line":521},[518,791,792],{"class":693},"on",[518,794,795],{"class":528},":\n",[518,797,798,801,803,806,809,811,813,816,818],{"class":520,"line":552},[518,799,800],{"class":580},"  schedule",[518,802,584],{"class":528},[518,804,805],{"class":528}," [{",[518,807,808],{"class":580}," cron",[518,810,584],{"class":528},[518,812,542],{"class":528},[518,814,815],{"class":545},"0 6 * * *",[518,817,599],{"class":528},[518,819,820],{"class":528}," }]\n",[518,822,823,826],{"class":520,"line":559},[518,824,825],{"class":580},"  workflow_dispatch",[518,827,795],{"class":528},[518,829,830,833],{"class":520,"line":577},[518,831,832],{"class":580},"permissions",[518,834,795],{"class":528},[518,836,837,840,842],{"class":520,"line":605},[518,838,839],{"class":580},"  contents",[518,841,584],{"class":528},[518,843,844],{"class":545}," read\n",[518,846,847,850,852],{"class":520,"line":657},[518,848,849],{"class":580},"  pages",[518,851,584],{"class":528},[518,853,854],{"class":545}," write\n",[518,856,857,860,862],{"class":520,"line":720},[518,858,859],{"class":580},"  id-token",[518,861,584],{"class":528},[518,863,854],{"class":545},[518,865,866,869],{"class":520,"line":768},[518,867,868],{"class":580},"jobs",[518,870,795],{"class":528},[518,872,874,877],{"class":520,"line":873},9,[518,875,876],{"class":580},"  seo",[518,878,795],{"class":528},[518,880,882,885,887],{"class":520,"line":881},10,[518,883,884],{"class":580},"    uses",[518,886,584],{"class":528},[518,888,889],{"class":545}," aakazancev\u002Franklint\u002F.github\u002Fworkflows\u002Fmonitor.yml@main\n",[518,891,893,896,898,900,902,904,906,908,910,912,915,917,919],{"class":520,"line":892},11,[518,894,895],{"class":580},"    with",[518,897,584],{"class":528},[518,899,529],{"class":528},[518,901,589],{"class":580},[518,903,584],{"class":528},[518,905,542],{"class":528},[518,907,596],{"class":545},[518,909,599],{"class":528},[518,911,624],{"class":528},[518,913,914],{"class":580}," pages",[518,916,584],{"class":528},[518,918,694],{"class":693},[518,920,921],{"class":528}," }\n",[518,923,925,928,930],{"class":520,"line":924},12,[518,926,927],{"class":580},"    secrets",[518,929,584],{"class":528},[518,931,932],{"class":545}," inherit\n",[367,934,935,936,938],{},"GitLab CI (report at the project's Pages URL; the job must be named ",[370,937,478],{},"):",[501,940,942],{"className":783,"code":941,"language":785,"meta":509,"style":509},"include:\n  - remote: 'https:\u002F\u002Fraw.githubusercontent.com\u002Faakazancev\u002Franklint\u002Fmain\u002Fpresets\u002Fgitlab-ci\u002Fseo.yml'\n\nseo:monitor:\n  extends: .ranklint-monitor\n  variables:\n    RANKLINT_URL: https:\u002F\u002Fexample.com\n\npages:\n  extends: .ranklint-pages\n  needs: [seo:monitor]\n",[370,943,944,951,968,972,979,989,996,1006,1010,1016,1025],{"__ignoreMap":509},[518,945,946,949],{"class":520,"line":521},[518,947,948],{"class":580},"include",[518,950,795],{"class":528},[518,952,953,956,959,961,963,966],{"class":520,"line":552},[518,954,955],{"class":528},"  -",[518,957,958],{"class":580}," remote",[518,960,584],{"class":528},[518,962,542],{"class":528},[518,964,965],{"class":545},"https:\u002F\u002Fraw.githubusercontent.com\u002Faakazancev\u002Franklint\u002Fmain\u002Fpresets\u002Fgitlab-ci\u002Fseo.yml",[518,967,549],{"class":528},[518,969,970],{"class":520,"line":559},[518,971,556],{"emptyLinePlaceholder":555},[518,973,974,977],{"class":520,"line":577},[518,975,976],{"class":580},"seo:monitor",[518,978,795],{"class":528},[518,980,981,984,986],{"class":520,"line":605},[518,982,983],{"class":580},"  extends",[518,985,584],{"class":528},[518,987,988],{"class":545}," .ranklint-monitor\n",[518,990,991,994],{"class":520,"line":657},[518,992,993],{"class":580},"  variables",[518,995,795],{"class":528},[518,997,998,1001,1003],{"class":520,"line":720},[518,999,1000],{"class":580},"    RANKLINT_URL",[518,1002,584],{"class":528},[518,1004,1005],{"class":545}," https:\u002F\u002Fexample.com\n",[518,1007,1008],{"class":520,"line":768},[518,1009,556],{"emptyLinePlaceholder":555},[518,1011,1012,1014],{"class":520,"line":873},[518,1013,478],{"class":580},[518,1015,795],{"class":528},[518,1017,1018,1020,1022],{"class":520,"line":881},[518,1019,983],{"class":580},[518,1021,584],{"class":528},[518,1023,1024],{"class":545}," .ranklint-pages\n",[518,1026,1027,1030,1032,1034,1036],{"class":520,"line":892},[518,1028,1029],{"class":580},"  needs",[518,1031,584],{"class":528},[518,1033,632],{"class":528},[518,1035,976],{"class":545},[518,1037,1038],{"class":528},"]\n",[367,1040,1041,1042,1045,1046,456,1049,1052,1053,1056,1057,487,1059,1061,1062,1065,1066,1069],{},"Add a pipeline schedule (CI\u002FCD → Schedules) — both jobs run only on ",[370,1043,1044],{},"schedule",". Monitor mode never fails the pipeline: it diffs against the previous stored report and alerts (Slack\u002FTelegram via ",[370,1047,1048],{},"RANKLINT_SLACK_WEBHOOK",[370,1050,1051],{},"RANKLINT_TELEGRAM_BOT_TOKEN"," + ",[370,1054,1055],{},"RANKLINT_TELEGRAM_CHAT_ID",") only on new issues. ",[370,1058,486],{},[370,1060,490],{}," write the full report next to the diff; ",[370,1063,1064],{},"ranklint history --dir .ranklint\u002Freports"," prints the trend. ",[370,1067,1068],{},"ranklint dashboard"," builds a trend site with charts, see below.",[493,1071,1073],{"id":1072},"trend-dashboard","Trend dashboard",[367,1075,1076,1078,1079,1082,1083,1086],{},[370,1077,1068],{}," turns the stored monitor reports into a static site: ",[370,1080,1081],{},"\u003Cout>\u002Findex.html"," with the trend and ",[370,1084,1085],{},"\u003Cout>\u002Fruns\u002F\u003Ckey>.html"," with the full html report of every run. One file per page with data, styles and script inline; the only external resource is the Google Fonts stylesheet, and without it the pages fall back to system fonts. Dark theme, works at phone width without horizontal scrolling.",[1088,1089,1090,1106],"table",{},[1091,1092,1093],"thead",{},[1094,1095,1096,1100,1103],"tr",{},[1097,1098,1099],"th",{},"Flag",[1097,1101,1102],{},"Default",[1097,1104,1105],{},"What it does",[1107,1108,1109,1128,1143,1156,1169,1201,1213,1235],"tbody",{},[1094,1110,1111,1117,1125],{},[1112,1113,1114],"td",{},[370,1115,1116],{},"--dir",[1112,1118,1119,1122,1123],{},[370,1120,1121],{},"monitor.dir"," or ",[370,1124,751],{},[1112,1126,1127],{},"stored reports (fs storage)",[1094,1129,1130,1135,1140],{},[1112,1131,1132],{},[370,1133,1134],{},"--out",[1112,1136,1137],{},[370,1138,1139],{},"ranklint-dashboard",[1112,1141,1142],{},"output directory",[1094,1144,1145,1150,1153],{},[1112,1146,1147],{},[370,1148,1149],{},"--limit",[1112,1151,1152],{},"all",[1112,1154,1155],{},"use only the N latest reports",[1094,1157,1158,1163,1166],{},[1112,1159,1160],{},[370,1161,1162],{},"--run-url",[1112,1164,1165],{},"—",[1112,1167,1168],{},"adds a \"Run audit\" button, e.g. the CI page that starts a pipeline",[1094,1170,1171,1176,1178],{},[1112,1172,1173],{},[370,1174,1175],{},"--logo",[1112,1177,1165],{},[1112,1179,1180,1181,456,1184,456,1187,456,1190,1122,1193,1196,1197,1200],{},"your logo instead of the ranklint wordmark: a local ",[370,1182,1183],{},".png",[370,1185,1186],{},".svg",[370,1188,1189],{},".jpg",[370,1191,1192],{},".jpeg",[370,1194,1195],{},".webp"," file up to 200 KB (embedded as a data URI) or an ",[370,1198,1199],{},"http(s)"," URL. A small \"powered by ranklint\" link then appears at the bottom",[1094,1202,1203,1208,1210],{},[1112,1204,1205],{},[370,1206,1207],{},"--brand-name",[1112,1209,1165],{},[1112,1211,1212],{},"name shown next to the logo, also used as its alt text",[1094,1214,1215,1220,1225],{},[1112,1216,1217],{},[370,1218,1219],{},"--accent",[1112,1221,1222],{},[370,1223,1224],{},"#b4f13c",[1112,1226,1227,1228,1122,1231,1234],{},"accent color as ",[370,1229,1230],{},"#rgb",[370,1232,1233],{},"#rrggbb",": buttons, active filters, links, chart lines and fix hints. Severity colors stay the same; the button text turns black or white for contrast",[1094,1236,1237,1242,1244],{},[1112,1238,1239],{},[370,1240,1241],{},"--cwd",[1112,1243,1165],{},[1112,1245,1246,1247],{},"where to look up ",[370,1248,1249],{},"ranklint.config",[367,1251,1252],{},"With your own brand and a button that starts the CI pipeline:",[501,1254,1258],{"className":1255,"code":1256,"language":1257,"meta":509,"style":509},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","ranklint dashboard --dir public\u002Freports --out public \\\n  --logo brand\u002Flogo.svg --brand-name \"Example Inc.\" --accent \"#3b82f6\" \\\n  --run-url \"$CI_PROJECT_URL\u002F-\u002Fpipelines\u002Fnew\"\n","bash",[370,1259,1260,1283,1315],{"__ignoreMap":509},[518,1261,1262,1265,1268,1271,1274,1277,1280],{"class":520,"line":521},[518,1263,448],{"class":1264},"sBMFI",[518,1266,1267],{"class":545}," dashboard",[518,1269,1270],{"class":545}," --dir",[518,1272,1273],{"class":545}," public\u002Freports",[518,1275,1276],{"class":545}," --out",[518,1278,1279],{"class":545}," public",[518,1281,1282],{"class":532}," \\\n",[518,1284,1285,1288,1291,1294,1297,1300,1303,1306,1308,1311,1313],{"class":520,"line":552},[518,1286,1287],{"class":545},"  --logo",[518,1289,1290],{"class":545}," brand\u002Flogo.svg",[518,1292,1293],{"class":545}," --brand-name",[518,1295,1296],{"class":528}," \"",[518,1298,1299],{"class":545},"Example Inc.",[518,1301,1302],{"class":528},"\"",[518,1304,1305],{"class":545}," --accent",[518,1307,1296],{"class":528},[518,1309,1310],{"class":545},"#3b82f6",[518,1312,1302],{"class":528},[518,1314,1282],{"class":532},[518,1316,1317,1320,1322,1325,1328],{"class":520,"line":559},[518,1318,1319],{"class":545},"  --run-url",[518,1321,1296],{"class":528},[518,1323,1324],{"class":532},"$CI_PROJECT_URL",[518,1326,1327],{"class":545},"\u002F-\u002Fpipelines\u002Fnew",[518,1329,1330],{"class":528},"\"\n",[367,1332,1333],{},"The left rail shows the site, the time of the last run, the \"Run audit\" button and the readouts: errors, warnings, info, pages and average Lighthouse performance, each with the delta to the previous run and a bar with a tick at the previous value. The panels to the right are:",[384,1335,1336,1339,1345,1348,1351],{},[387,1337,1338],{},"new and fixed issues since the previous run, grouped by rule, errors first;",[387,1340,1341,1342,1344],{},"charts over time: errors and warnings, average Lighthouse scores, CrUX LCP and INP. Without CrUX data the panel explains how to enable it with ",[370,1343,395],{},";",[387,1346,1347],{},"the top rules and Lighthouse performance by page;",[387,1349,1350],{},"the issues explorer for the last run;",[387,1352,1353],{},"the archive of runs with links to their reports.",[367,1355,1356],{},[1357,1358],"img",{"alt":1359,"height":1360,"loading":1361,"src":1362,"width":1363},"ranklint dashboard for example.com: readouts with deltas in the left rail, new and fixed issues since the previous run, error trend, Lighthouse scores and top rules",900,"lazy","\u002Fdashboard\u002Fdashboard-1440.webp",1440,[367,1365,1366],{},"Charts appear from the second run. A rule or page clicked in any panel opens in the explorer.",[367,1368,1369,1370,456,1373,1376,1377,1380],{},"The explorer groups issues by rule or by page and filters them by severity, text, site section, locale and \"only new\". A locale is the first path segment when it looks like a language code (",[370,1371,1372],{},"de",[370,1374,1375],{},"pt-br","). The section filter shows pages and issues per section. The \"Fix once\" block lists issues that repeat on at least 5 pages and cover at least 40% of the site or 80% of a section: these usually come from one template or component. A page card is a checklist of rules with how to fix, a docs link, NEW marks and the affected elements with a copy button. Without JavaScript the explorer is a static list of ",[370,1378,1379],{},"\u003Cdetails>"," blocks.",[367,1382,1383],{},[1357,1384],{"alt":1385,"height":1386,"loading":1361,"src":1387,"width":1388},"Fix once block: one error, og:image responds with 404, repeats on 26 of 28 pages across the whole site",238,"\u002Fdashboard\u002Fdashboard-fix-once.webp",1916,[367,1390,1391],{},[1357,1392],{"alt":1393,"height":1394,"loading":1361,"src":1395,"width":1396},"Page card in the \"By page\" view: three errors on \u002Fbugs\u002Fjsonld-broken with how to fix them, rule ids, docs links for built-in rules and a site-wide \"fix once in the template\" mark",1074,"\u002Fdashboard\u002Fdashboard-page.webp",2014,[367,1398,1399,1402],{},[370,1400,1401],{},"runs\u002F\u003Ckey>.html"," uses the same explorer, grouped by page by default. NEW marks and deltas there are counted against the previous stored run. The html report also shows CrUX p75 rated by the Google thresholds and Lighthouse by page.",[367,1404,1405,1406,1409,1410,1413,1414,1416,1417,1419],{},"GitLab Pages with history: reports live in ",[370,1407,1408],{},"public\u002Freports",", and before each run the job restores the previous ",[370,1411,1412],{},"public\u002F"," from the artifacts of the last ",[370,1415,478],{}," job, so the archive grows without extra storage. ",[370,1418,432],{}," caps it.",[501,1421,1423],{"className":512,"code":1422,"language":514,"meta":509,"style":509},"monitor: { storage: 'fs', dir: 'public\u002Freports', keep: 90 },\n",[370,1424,1425],{"__ignoreMap":509},[518,1426,1427,1429,1431,1433,1435,1437,1439,1441,1443,1445,1447,1449,1451,1453,1455,1457,1459,1461,1464],{"class":520,"line":521},[518,1428,462],{"class":1264},[518,1430,584],{"class":528},[518,1432,529],{"class":528},[518,1434,730],{"class":1264},[518,1436,584],{"class":528},[518,1438,542],{"class":528},[518,1440,737],{"class":545},[518,1442,599],{"class":528},[518,1444,624],{"class":528},[518,1446,744],{"class":1264},[518,1448,584],{"class":528},[518,1450,542],{"class":528},[518,1452,1408],{"class":545},[518,1454,599],{"class":528},[518,1456,624],{"class":528},[518,1458,758],{"class":1264},[518,1460,584],{"class":528},[518,1462,1463],{"class":620}," 90",[518,1465,602],{"class":528},[501,1467,1469],{"className":783,"code":1468,"language":785,"meta":509,"style":509},"include:\n  - remote: 'https:\u002F\u002Fraw.githubusercontent.com\u002Faakazancev\u002Franklint\u002Fmain\u002Fpresets\u002Fgitlab-ci\u002Fseo.yml'\n\npages:\n  extends: .ranklint-base\n  rules:\n    - if: $CI_PIPELINE_SOURCE == \"schedule\"\n    - if: $CI_PIPELINE_SOURCE == \"web\"\n  script:\n    - command -v unzip > \u002Fdev\u002Fnull || (apt-get update -qq && apt-get install -y -qq unzip)\n    - >\n      curl --fail --silent --location --output public.zip\n      --header \"JOB-TOKEN: $CI_JOB_TOKEN\"\n      \"$CI_API_V4_URL\u002Fprojects\u002F$CI_PROJECT_ID\u002Fjobs\u002Fartifacts\u002F$CI_DEFAULT_BRANCH\u002Fdownload?job=pages\"\n      && unzip -q -o public.zip || true\n    - ranklint audit --url https:\u002F\u002Fexample.com --mode monitor\n    - ranklint dashboard --dir public\u002Freports --out public --run-url \"$CI_PROJECT_URL\u002F-\u002Fpipelines\u002Fnew\"\n  artifacts:\n    paths:\n      - public\n",[370,1470,1471,1477,1491,1495,1501,1510,1517,1530,1541,1548,1555,1562,1567,1573,1579,1585,1593,1601,1609,1617],{"__ignoreMap":509},[518,1472,1473,1475],{"class":520,"line":521},[518,1474,948],{"class":580},[518,1476,795],{"class":528},[518,1478,1479,1481,1483,1485,1487,1489],{"class":520,"line":552},[518,1480,955],{"class":528},[518,1482,958],{"class":580},[518,1484,584],{"class":528},[518,1486,542],{"class":528},[518,1488,965],{"class":545},[518,1490,549],{"class":528},[518,1492,1493],{"class":520,"line":559},[518,1494,556],{"emptyLinePlaceholder":555},[518,1496,1497,1499],{"class":520,"line":577},[518,1498,478],{"class":580},[518,1500,795],{"class":528},[518,1502,1503,1505,1507],{"class":520,"line":605},[518,1504,983],{"class":580},[518,1506,584],{"class":528},[518,1508,1509],{"class":545}," .ranklint-base\n",[518,1511,1512,1515],{"class":520,"line":657},[518,1513,1514],{"class":580},"  rules",[518,1516,795],{"class":528},[518,1518,1519,1522,1525,1527],{"class":520,"line":720},[518,1520,1521],{"class":528},"    -",[518,1523,1524],{"class":580}," if",[518,1526,584],{"class":528},[518,1528,1529],{"class":545}," $CI_PIPELINE_SOURCE == \"schedule\"\n",[518,1531,1532,1534,1536,1538],{"class":520,"line":768},[518,1533,1521],{"class":528},[518,1535,1524],{"class":580},[518,1537,584],{"class":528},[518,1539,1540],{"class":545}," $CI_PIPELINE_SOURCE == \"web\"\n",[518,1542,1543,1546],{"class":520,"line":873},[518,1544,1545],{"class":580},"  script",[518,1547,795],{"class":528},[518,1549,1550,1552],{"class":520,"line":881},[518,1551,1521],{"class":528},[518,1553,1554],{"class":545}," command -v unzip > \u002Fdev\u002Fnull || (apt-get update -qq && apt-get install -y -qq unzip)\n",[518,1556,1557,1559],{"class":520,"line":892},[518,1558,1521],{"class":528},[518,1560,1561],{"class":524}," >\n",[518,1563,1564],{"class":520,"line":924},[518,1565,1566],{"class":545},"      curl --fail --silent --location --output public.zip\n",[518,1568,1570],{"class":520,"line":1569},13,[518,1571,1572],{"class":545},"      --header \"JOB-TOKEN: $CI_JOB_TOKEN\"\n",[518,1574,1576],{"class":520,"line":1575},14,[518,1577,1578],{"class":545},"      \"$CI_API_V4_URL\u002Fprojects\u002F$CI_PROJECT_ID\u002Fjobs\u002Fartifacts\u002F$CI_DEFAULT_BRANCH\u002Fdownload?job=pages\"\n",[518,1580,1582],{"class":520,"line":1581},15,[518,1583,1584],{"class":545},"      && unzip -q -o public.zip || true\n",[518,1586,1588,1590],{"class":520,"line":1587},16,[518,1589,1521],{"class":528},[518,1591,1592],{"class":545}," ranklint audit --url https:\u002F\u002Fexample.com --mode monitor\n",[518,1594,1596,1598],{"class":520,"line":1595},17,[518,1597,1521],{"class":528},[518,1599,1600],{"class":545}," ranklint dashboard --dir public\u002Freports --out public --run-url \"$CI_PROJECT_URL\u002F-\u002Fpipelines\u002Fnew\"\n",[518,1602,1604,1607],{"class":520,"line":1603},18,[518,1605,1606],{"class":580},"  artifacts",[518,1608,795],{"class":528},[518,1610,1612,1615],{"class":520,"line":1611},19,[518,1613,1614],{"class":580},"    paths",[518,1616,795],{"class":528},[518,1618,1620,1623],{"class":520,"line":1619},20,[518,1621,1622],{"class":528},"      -",[518,1624,1625],{"class":545}," public\n",[367,1627,1628,1631,1632,1635,1636,382],{},[370,1629,1630],{},"|| true"," covers the first run, when there are no artifacts yet. The \"Run audit\" link opens the GitLab \"Run pipeline\" page; the ",[370,1633,1634],{},"web"," rule lets a manually started pipeline run the job. The page holds only the link, no tokens. The stored JSON reports are published along with the dashboard under ",[370,1637,1408],{},[1639,1640,1641],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":509,"searchDepth":552,"depth":552,"links":1643},[1644,1645],{"id":495,"depth":552,"text":496},{"id":1072,"depth":552,"text":1073},"Run scheduled audits against production, enrich them with field data and alert on new issues.","md",null,{},{"title":64,"description":1646},"OhavvkbAhVFvn04jOjIFdPU-K42SHa9nBK70EqutRkE",[1653,1655],{"title":60,"path":61,"stem":62,"description":1654,"children":-1},"Compare a report against a base one and wire ranklint into GitLab or GitHub pipelines.",{"title":68,"path":69,"stem":70,"description":1656,"children":-1},"A separate Chrome run with per-metric aggregation and route-pattern thresholds.",1791750393017]