#903 by GitHub stars

tigerless-labs/seo-ops

SEO foundation checks as an Agent Skill: give it a URL, get a crawler's-eye pass/fail report with evidence. 26 structural checks, zero LLM, deterministic.

History

Review weekly changes to SKILL.md before updating. Dates mark the weeks in which we observed each version; checks apply to the recorded commits.

View weekly changes

SKILL.md

Week of Oct 26, 2026 · Line counts unavailable

Before Not checked yet → After Network or broad shell

First observation → 777bde405d2d

No earlier version was observed for comparison.

Compare on GitHub

skills/seo-ops/SKILL.md

Week of Oct 26, 2026 · Line counts unavailable

Before Not checked yet → After Network or broad shell

First observation → 777bde405d2d

No earlier version was observed for comparison.

Compare on GitHub

View on GitHubAdd to my skills

Verified commit 777bde405d2d6d248937600dfcfbaca46586695d

git clone --filter=blob:none --no-checkout https://github.com/tigerless-labs/seo-ops.git .hotskills/tigerless-labs-seo-ops && git -C .hotskills/tigerless-labs-seo-ops checkout --detach 777bde405d2d6d248937600dfcfbaca46586695d # Copy each selected skill directory from .hotskills/tigerless-labs-seo-ops into .claude/skills/<skill-name>/
986GitHub stars
0stars in 7 days
2skills in this repository
2commits in 30 days

Heat

1.1
  • Star growth, last 7 daysAhead of 6% of tracked repositories
  • Star growth, last 24 hoursAhead of 3% of tracked repositories
  • Rank movement, last 7 daysAhead of 3% of tracked repositories
  • Commits, last 30 daysAhead of 60% of tracked repositories
  • Accounts asking about it through MCP, last 7 daysNot available
  • Hot votes this weekAhead of 0% of tracked repositories

Heat never changes the order by stars, and sponsorship never touches it. How heat works

Stars over time

Aug 23, 2026Oct 30, 2026986

Individual skills in this repository

How it works

seo-ops

When your agent uses it

Structural checklist and checker script for SEO foundation engineering. Use when reviewing or accepting a site/page for SEO/GEO structural compliance (robots, sitemap, canonical, 301 canonicalization, JSON-LD, OG, hreflang, CWV, AI crawler access, rendering strategy), when running the machine checks to produce a report, or when judging whether a frontend change will affect indexing and citation. Also for answering "what exactly does this check require" and "why does it exist".

What it loads into context

Frontmatter

128 tokens

Always available to the agent

SKILL.md

3,208 tokens

When the skill is activated

Reference documents

41,836 tokens

Loaded on request

Token counts are estimates. Scripts run separately; they are not counted as reference context.

The playbook

  1. How to work
  2. Scope
  3. What's here
  4. Run the checker
  5. Read the report
  6. Configuration

Scripts executed separately

  • scripts/config.py
  • scripts/run.py

Files

  • .agents/plugins/marketplace.jsonasset182 bytes
  • .claude-plugin/marketplace.jsonasset275 bytes
  • .claude-plugin/plugin.jsonasset322 bytes
  • .codex-plugin/plugin.jsonasset246 bytes
  • .github/workflows/ci.ymlasset4,776 bytes
  • .gitignoreasset228 bytes
  • README.mddoc3,289 bytes
  • SKILL.mdcore13,103 bytes
  • SKILL.mdcore13,103 bytes
  • SKILL.mdcore13,103 bytes
  • SKILL.mdcore13,103 bytes
  • SKILL.mdcore13,103 bytes
  • redlines.mddoc2,589 bytes
  • references/.env.exampleasset623 bytes
  • references/ai-crawlers.yamlasset3,209 bytes
  • references/checklist/checklist.mddoc10,881 bytes
  • references/checklist/references/C1.mddoc3,040 bytes
  • references/checklist/references/C10.mddoc1,852 bytes
  • references/checklist/references/C11.mddoc1,748 bytes
  • references/checklist/references/C12.mddoc8,570 bytes
  • references/checklist/references/C13.mddoc2,098 bytes
  • references/checklist/references/C14.mddoc1,673 bytes
  • references/checklist/references/C15.mddoc1,731 bytes
  • references/checklist/references/C16.mddoc1,170 bytes
  • references/checklist/references/C17.mddoc1,630 bytes
  • references/checklist/references/C18.mddoc3,526 bytes
  • references/checklist/references/C19.mddoc2,826 bytes
  • references/checklist/references/C2.mddoc4,649 bytes
  • references/checklist/references/C20.mddoc1,364 bytes
  • references/checklist/references/C21.mddoc1,910 bytes
  • references/checklist/references/C22.mddoc2,484 bytes
  • references/checklist/references/C23.mddoc3,346 bytes
  • references/checklist/references/C24.mddoc2,391 bytes
  • references/checklist/references/C25.mddoc2,662 bytes
  • references/checklist/references/C26.mddoc3,634 bytes
  • references/checklist/references/C27.mddoc2,846 bytes
  • references/checklist/references/C28.mddoc2,707 bytes
  • references/checklist/references/C29.mddoc2,593 bytes
  • references/checklist/references/C3.mddoc2,111 bytes
  • references/checklist/references/C30.mddoc2,860 bytes
  • references/checklist/references/C4.mddoc2,996 bytes
  • references/checklist/references/C5.mddoc1,937 bytes
  • references/checklist/references/C6.mddoc9,047 bytes
  • references/checklist/references/C7.mddoc1,594 bytes
  • references/checklist/references/C8.mddoc2,594 bytes
  • references/checklist/references/C9.mddoc1,737 bytes
  • references/config.example.yamlasset3,485 bytes
  • references/content/content-checklist.mddoc5,314 bytes
  • references/content/page-doc-template.mddoc14,209 bytes
  • references/content/references/T1.mddoc2,858 bytes
  • references/content/references/T10.mddoc2,593 bytes
  • references/content/references/T12.mddoc3,366 bytes
  • references/content/references/T13.mddoc3,207 bytes
  • references/content/references/T14.mddoc3,103 bytes
  • references/content/references/T2.mddoc2,687 bytes
  • references/content/references/T3.mddoc2,493 bytes
  • references/content/references/T4.mddoc2,899 bytes
  • references/content/references/T5.mddoc2,736 bytes
  • references/content/references/T6.mddoc1,904 bytes
  • references/content/references/T7.mddoc3,237 bytes
  • references/content/references/T8.mddoc2,687 bytes
  • references/content/references/T9.mddoc2,779 bytes
  • references/decisions.mddoc3,770 bytes
  • references/report.example.mddoc10,509 bytes
  • references/sites.example.yamlasset796 bytes
  • scripts/config.pyruns29,700 bytes
  • scripts/requirements.txtdoc93 bytes
  • scripts/run.pyruns92,938 bytes

No excerpt is shown for this license. Read the source on GitHub.

View the complete source on GitHub

Skills included

  • seo-ops
  • seo-ops

Repository facts

License
No license detected
Created
Aug 25, 2026
Last pushed
Oct 30, 2026
Forks
45
Open issues
4
Project activity
Active

Rank over the last 12 weeks

Now #903 · best #755 · down 114 in 30 days

  1. #886 on Oct 31
  2. #888 on Nov 1
  3. #894 on Nov 2
  4. #900 on Nov 3
  5. #902 from Nov 4 to Nov 5
  6. #903 since Nov 6
44 earlier periods
  1. #927 on Aug 23
  2. #923 on Aug 26
  3. #900 on Sep 4
  4. #875 on Sep 5
  5. #912 on Sep 6
  6. #936 on Sep 7
  7. #948 on Sep 8
  8. #934 on Sep 9
  9. #928 on Sep 10
  10. #893 on Sep 11
  11. #890 on Sep 12
  12. #889 on Sep 13
  13. #926 on Sep 14
  14. #913 on Sep 15
  15. #925 on Sep 16
  16. #921 on Sep 17
  17. #905 on Sep 18
  18. #878 on Sep 19
  19. #840 on Sep 25
  20. #857 on Sep 26
  21. #874 on Sep 27
  22. #920 on Sep 28
  23. #943 on Sep 29
  24. #900 on Sep 30
  25. #830 on Oct 1
  26. #826 on Oct 2
  27. #789 on Oct 3
  28. #854 on Oct 10
  29. #884 on Oct 13
  30. #893 on Oct 14
  31. #873 on Oct 15
  32. #862 on Oct 16
  33. #832 on Oct 17
  34. #804 on Oct 18
  35. #837 on Oct 19
  36. #840 on Oct 20
  37. #842 on Oct 21
  38. #804 on Oct 22
  39. #805 on Oct 23
  40. #755 on Oct 24
  41. #909 on Oct 25
  42. #873 on Oct 28
  43. #878 on Oct 29
  44. #879 on Oct 30

Before you install

Network or broad shell

Automated signals, not a guarantee

Checked Nov 4, 2026

Not fully analyzed: some files were too long, unreadable or missing. This never lowers the level.

Show 4 notes
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
Show all 390 signals by file

.claude-plugin/plugin.json

  • Network accessline 4
    "description": "SEO foundation checks as an Agent Skill: give it a URL, get a crawler's-eye pass/fail report with evidence. 26 structural checks, zero LLM, deterministic.",   "author": { "name": "Tigerless Labs" },   "homepage": "https://gi
  • Network accessline 5
    "author": { "name": "Tigerless Labs" },   "homepage": "https://github.com/tigerless-labs/seo-ops" }
  • Network accessline 6
    "homepage": "https://github.com/tigerless-labs/seo-ops"

.github/workflows/ci.yml

  • Network accessline 56
    set +e           python scripts/run.py --state-dir '${CLAUDE_PROJECT_DIR}/.seo-ops' \             --target http://127.0.0.1:9 >/dev/null 2>&1
  • Network accessline 58
    --target http://127.0.0.1:9 >/dev/null 2>&1
  • Network accessline 75
    <meta name="viewport" content="width=device-width,initial-scale=1">           <title>ci smoke</title><meta name="description" content="ci smoke page">           <link rel="canonical" href="http://127.0.0.1:8000/">
  • Network accessline 76
    <title>ci smoke</title><meta name="description" content="ci smoke page">           <link rel="canonical" href="http://127.0.0.1:8000/">           </head><body><h1>ci smoke</h1></body></html>
  • Network accessline 77
    <link rel="canonical" href="http://127.0.0.1:8000/">
  • Network accessline 80
    printf 'User-agent: *\nAllow: /\n' > "$SITE/robots.txt"           python -m http.server 8000 --directory "$SITE" &>/dev/null &           for i in $(seq 20); do curl -sf http://127.0.0.1:8000/ >/dev/null && break; sleep 0.5; done
  • Network accessline 82
    for i in $(seq 20); do curl -sf http://127.0.0.1:8000/ >/dev/null && break; sleep 0.5; done
  • Network accessline 84
    # Explicit --state-dir: CI wants an assertable landing spot, not the user default           python scripts/run.py --target http://127.0.0.1:8000 \
  • Network accessline 85
    python scripts/run.py --target http://127.0.0.1:8000 \

.gitignore

  • Access to secretsline 5
    [Credential-related source omitted]
  • Access to secretsline 6
    [Credential-related source omitted]

README.md

  • Network accessline 4
    <p align="center">   <img src="https://github.com/tigerless-labs/seo-ops/actions/workflows/ci.yml/badge.svg" alt="CI" /> <img src="https://img.shields.io/badge/python-3.9%2B-blue.svg" alt="python" /> <img src="https://img.shields.io/badge/p
  • Network accessline 5
    <img src="https://github.com/tigerless-labs/seo-ops/actions/workflows/ci.yml/badge.svg" alt="CI" /> <img src="https://img.shields.io/badge/python-3.9%2B-blue.svg" alt="python" /> <img src="https://img.shields.io/badge/platform-Linux%20%7C%2
  • Network accessline 33
    Install https://github.com/tigerless-labs/seo-ops as a skill.
  • Network accessline 64
    © Tigerless · [tigerless.ai](https://tigerless.ai) · [tigerless.com](https://www.tigerless.com)

SKILL.md

  • Network accessline 17
    > **What should I check?** > 1. **A URL** — live domain or local deployment (`http://localhost:<port>`), both fine; produces a report
  • Network accessline 17
    > **What should I check?** > 1. **A URL** — live domain or local deployment (`http://localhost:<port>`), both fine; produces a report
  • Network accessline 18
    > 1. **A URL** — live domain or local deployment (`http://localhost:<port>`), both fine; produces a report
  • Network accessline 18
    > 1. **A URL** — live domain or local deployment (`http://localhost:<port>`), both fine; produces a report
  • Network accessline 100
    python3 scripts/run.py --target https://example.com      # live site
  • Network accessline 100
    python3 scripts/run.py --target https://example.com      # live site
  • Network accessline 101
    python3 scripts/run.py --target http://localhost:3000    # local deployment, auto-detected as local mode
  • Network accessline 101
    python3 scripts/run.py --target http://localhost:3000    # local deployment, auto-detected as local mode
  • Network accessline 106
    **Public staging domains are not supported** — they'd be tested as production domains, and the canonicalization check (C3) would false-red for sure. To test before launch, pick one: run a local deployment at `http://localhost:<port>`, or wa
  • Network accessline 106
    **Public staging domains are not supported** — they'd be tested as production domains, and the canonicalization check (C3) would false-red for sure. To test before launch, pick one: run a local deployment at `http://localhost:<port>`, or wa
  • Network accessline 107
    To test before launch, pick one: run a local deployment at `http://localhost:<port>`, or wait and run against the production domain after launch.
  • Network accessline 107
    To test before launch, pick one: run a local deployment at `http://localhost:<port>`, or wait and run against the production domain after launch.

redlines.md

  • Network accessline 23
    | Rule | Reference | |---|---| | R3 (scaled content) / R6 (link spam) / R7 (cloaking, hidden text, stuffing) | [Google Spam Policies](https://developers.google.com/search/docs/essentials/spam-policies) — every red line has explicit text her
  • Network accessline 24
    |---|---| | R3 (scaled content) / R6 (link spam) / R7 (cloaking, hidden text, stuffing) | [Google Spam Policies](https://developers.google.com/search/docs/essentials/spam-policies) — every red line has explicit text here | | R5 (fake struct
  • Network accessline 25
    | R3 (scaled content) / R6 (link spam) / R7 (cloaking, hidden text, stuffing) | [Google Spam Policies](https://developers.google.com/search/docs/essentials/spam-policies) — every red line has explicit text here |
  • Network accessline 26
    | R5 (fake structured data, bought reviews) | [Google Structured Data policies](https://developers.google.com/search/docs/appearance/structured-data/sd-policies) |
  • Network accessline 27
    | The YMYL/E-E-A-T behind R2 | [Google Search Quality Rater Guidelines](https://static.googleusercontent.com/media/guidelines.raterhub.com/en//searchqualityevaluatorguidelines.pdf) (the rater handbook; the original definitions of E-E-A-T an

references/.env.example

  • Access to secretsline 2
    [Credential-related source omitted]
  • Access to secretsline 6
    [Credential-related source omitted]

references/checklist/checklist.md

  • Network accessline 12
    | C1 | P0 | robots.txt allows all AI crawler UAs | fetch + per-UA comparison | checker | | C2 | P0 | sitemap reachable, no 4xx/5xx entries, truthful lastmod, <=50k URLs per file | fetch + **no-redirect** sampling + lastmod coverage/dispersi
  • Network accessline 13
    | C2 | P0 | sitemap reachable, no 4xx/5xx entries, truthful lastmod, <=50k URLs per file | fetch + **no-redirect** sampling + lastmod coverage/dispersion/single-day cluster + per-shard entry count | checker | | C3 | P0 | URL canonicalizatio
  • Network accessline 14
    | C3 | P0 | URL canonicalization: www/apex, http/https, trailing slash all 301 to one canonical host | four-variant curl (**needs a real domain; staging/no-domain runs record N.A.**) | checker |
  • Network accessline 40
    | C19 | P2 | full Open Graph set + twitter:card: social preview cards complete and correct | fetch the page, check meta; image declared 1200×630; og:type × JSON-LD article types cross-checked | checker | | C20 | P2 | redirect hops <=1: no c
  • Network accessline 41
    | C20 | P2 | redirect hops <=1: no chained redirects | count redirect chain length while fetching | checker | | C15 | P2 | render cost not per-request: SSR needs CDN caching (s-maxage + SWR), SSG exempt | curl response headers × the declare
  • Network accessline 42
    | C15 | P2 | render cost not per-request: SSR needs CDN caching (s-maxage + SWR), SSG exempt | curl response headers × the declared rendering strategy | checker |
  • Network accessline 64
    | Rule | Source | |---|---| | C set overall | [Google Search Essentials](https://developers.google.com/search/docs/essentials) (formerly Webmaster Guidelines) |
  • Network accessline 65
    |---|---| | C set overall | [Google Search Essentials](https://developers.google.com/search/docs/essentials) (formerly Webmaster Guidelines) | | C12 structured data | [Google Structured Data policies](https://developers.google.com/search/do
  • Network accessline 66
    | C set overall | [Google Search Essentials](https://developers.google.com/search/docs/essentials) (formerly Webmaster Guidelines) |
  • Network accessline 67
    | C12 structured data | [Google Structured Data policies](https://developers.google.com/search/docs/appearance/structured-data/sd-policies) + [schema.org](https://schema.org) |
  • Network accessline 68
    | C8 canonical / C2 sitemap / robots | [Google Crawling & Indexing docs](https://developers.google.com/search/docs/crawling-indexing), [sitemaps.org](https://www.sitemaps.org) (the protocol itself) |
  • Network accessline 69
    | C22 hreflang / C26 language redirects | [Google localized-versions guide](https://developers.google.com/search/docs/specialty/international/localized-versions) (explicit: don't auto-redirect by guessed language; declare with hreflang + le
  • Network accessline 70
    | C4 CWV | [web.dev/vitals](https://web.dev/articles/vitals) (Chrome team; the source of metric definitions and thresholds) |
  • Network accessline 71
    | C1 AI crawler UAs | [OpenAI bots](https://platform.openai.com/docs/bots), [Perplexity crawlers](https://docs.perplexity.ai/guides/bots), Anthropic support's ClaudeBot page, [Google crawler list](https://developers.google.com/search/docs/c
  • Network accessline 72
    | C16 / C23 robots directives | [Google robots meta tag docs](https://developers.google.com/search/docs/crawling-indexing/robots-meta-tag) (`max-snippet`/`noindex` and `X-Robots-Tag` share one source) |
  • Network accessline 73
    | C18 image alt | [Google image SEO best practices](https://developers.google.com/search/docs/appearance/google-images) |
  • Network accessline 74
    | C24 viewport | [Google: mobile-friendly](https://developers.google.com/search/docs/appearance/mobile-friendly) |
  • Network accessline 75
    | C25 mixed content | [MDN: Mixed content](https://developer.mozilla.org/docs/Web/Security/Mixed_content) (the normative description of browser blocking behavior) |
  • Network accessline 76
    | C19 OG | [ogp.me](https://ogp.me) (The Open Graph protocol) + each social platform's card docs |
  • Network accessline 77
    | C5 IndexNow (C2's companion) | [indexnow.org](https://www.indexnow.org) (the open protocol led by Microsoft/Bing) |
  • Network accessline 78
    | C7 llms.txt | [llmstxt.org](https://llmstxt.org) (a community convention, not an official standard — the only item with no big-vendor backing) |
  • Network accessline 79
    | C10/C20 | Search Essentials anti-cloaking / redirect guidance (under the C-set overall link) | | C27 head validity | [Google: use valid HTML in the head](https://developers.google.com/search/docs/crawling-indexing/valid-page-metadata) (ex
  • Network accessline 80
    | C27 head validity | [Google: use valid HTML in the head](https://developers.google.com/search/docs/crawling-indexing/valid-page-metadata) (explicit: an invalid element ends head processing, everything after it is ignored) + [WHATWG HTML s
  • Network accessline 81
    | C28 security headers | [OWASP Secure Headers Project](https://owasp.org/www-project-secure-headers/) + [MDN HTTP headers](https://developer.mozilla.org/docs/Web/HTTP/Headers) (per-header semantics) |
  • Network accessline 82
    | C29 URL hygiene | [Google: URL structure best practices](https://developers.google.com/search/docs/crawling-indexing/url-structure) (hyphens over underscores, lowercase, percent-encode non-ASCII) |
  • Network accessline 83
    | C30 link hygiene | [Google SEO Starter Guide: use good anchor text](https://developers.google.com/search/docs/fundamentals/seo-starter-guide) + [MDN: rel=noopener](https://developer.mozilla.org/docs/Web/HTML/Attributes/rel/noopener) |

references/checklist/references/C1.md

  • Network accessline 34
    Sitemap: https://www.example.com/sitemap.xml
  • Network accessline 43
    - Don't use the "Disallow everything, then whitelist" style -- miss one new UA and you've blocked it entirely - Under `policy: allow`, unlisted UAs are allowed by default (robots.txt's default semantics); the point of the list is **explicit
  • Network accessline 45
    - Self-check: `curl <root>/robots.txt`, then confirm each UA against the yaml is allowed
  • Network accessline 49
    - [RFC 9309 -- Robots Exclusion Protocol](https://www.rfc-editor.org/rfc/rfc9309.html): the formal robots.txt standard (source for syntax, matching rules, and the allow-by-default semantics)
  • Network accessline 50
    - [Google: intro to robots.txt and how to write it](https://developers.google.com/search/docs/crawling-indexing/robots/intro): the biggest consumer's authoritative account of parsing behavior
  • Network accessline 51
    - Official crawler docs from each AI vendor (source of the UA list, verified 2026-08-24): [OpenAI bots](https://developers.openai.com/api/docs/bots) · [Anthropic crawlers](https://support.claude.com/en/articles/8896518-does-anthropic-crawl-
  • Network accessline 52
    - [Next.js `app/robots.ts`](https://nextjs.org/docs/app/api-reference/file-conventions/metadata/robots): an example of the framework-side generation pattern

references/checklist/references/C10.md

  • Network accessline 17
    </header> <script>   fetch('/api/me', {credentials:'include'})
  • Network accessline 18
    <script>   fetch('/api/me', {credentials:'include'})     .then(r => r.ok ? r.json() : null)
  • Network accessline 19
    fetch('/api/me', {credentials:'include'})
  • Network accessline 32
    - [MDN: Cache-Control](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control) -- shared-cache semantics authority
  • Network accessline 33
    - [Cloudflare: cache best practices](https://developers.cloudflare.com/cache/concepts/customize-cache/) -- the CDN-layer engineering line on "which responses are cacheable"

references/checklist/references/C11.md

  • Network accessline 24
    - [Google: how title links are generated and controlled](https://developers.google.com/search/docs/appearance/title-link)
  • Network accessline 25
    - [Google: meta descriptions and snippets](https://developers.google.com/search/docs/appearance/snippet)

references/checklist/references/C12.md

  • Network accessline 35
    // example (for reference only; vocabulary source: schema.org, policy source: Google structured data docs) {   "@context": "https://schema.org",
  • Network accessline 36
    {   "@context": "https://schema.org",   "@graph": [
  • Network accessline 37
    "@context": "https://schema.org",
  • Network accessline 38
    "@graph": [     { "@type": "Organization", "@id": "https://www.example.com/#org",       "name": "...", "url": "...", "logo": "...",
  • Network accessline 39
    { "@type": "Organization", "@id": "https://www.example.com/#org",
  • Network accessline 40
    "name": "...", "url": "...", "logo": "...",       "sameAs": ["...official social media...", "...the other two sites..."] },     { "@type": "WebSite", "@id": "https://www.example.com/#website",
  • Network accessline 41
    "sameAs": ["...official social media...", "...the other two sites..."] },     { "@type": "WebSite", "@id": "https://www.example.com/#website",       "name": "...", "url": "...",
  • Network accessline 42
    { "@type": "WebSite", "@id": "https://www.example.com/#website",
  • Network accessline 43
    "name": "...", "url": "...",       "publisher": { "@id": "https://www.example.com/#org" } },     { "...this page's main entity type, see the table below...": "..." }
  • Network accessline 44
    "publisher": { "@id": "https://www.example.com/#org" } },
  • Network accessline 100
    - [Google: general structured data policies](https://developers.google.com/search/docs/appearance/structured-data/sd-policies) (general requirements: markup must reflect visible content; includes the self-serving review ban -- that item now
  • Network accessline 101
    - Per-type feature docs: [Article](https://developers.google.com/search/docs/appearance/structured-data/article) · [FAQPage](https://developers.google.com/search/docs/appearance/structured-data/faqpage) · [Breadcrumb](https://developers.goo
  • Network accessline 102
    - [schema.org](https://schema.org) -- the vocabulary itself; [Rich Results Test](https://search.google.com/test/rich-results)

references/checklist/references/C13.md

  • Network accessline 31
    - [Google: causes and fixes for soft 404s](https://developers.google.com/search/docs/crawling-indexing/http-network-errors#soft-404-errors)
  • Network accessline 32
    - [MDN: HTTP status code semantics](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status)

references/checklist/references/C14.md

  • Network accessline 22
    - [web.dev: A/B testing and performance/flicker](https://web.dev/articles/optimize-cls#ab-test) — the official discussion of anti-flicker cost

references/checklist/references/C15.md

  • Network accessline 20
    - Precondition: satisfy C10 (public version) before enabling caching, or caching turns into an incident - Cloudflare note: HTML is not cached by default; a Cache Rule must explicitly enable "Eligible for cache" - Self-check: `curl -I` and i
  • Network accessline 22
    - Self-check: `curl -I` and inspect the response headers; the second request should show `cf-cache-status: HIT` (or your CDN's hit marker)
  • Network accessline 26
    - [MDN: Cache-Control (s-maxage / SWR)](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control)
  • Network accessline 27
    - [RFC 5861: stale-while-revalidate](https://www.rfc-editor.org/rfc/rfc5861)
  • Network accessline 28
    - [Cloudflare: caching HTML (Cache Rules)](https://developers.cloudflare.com/cache/how-to/cache-rules/)

references/checklist/references/C16.md

  • Network accessline 22
    - [Google: robots meta tag and directive list](https://developers.google.com/search/docs/crawling-indexing/robots-meta-tag) — the authority for all directive semantics

references/checklist/references/C17.md

  • Network accessline 26
    - [MDN: `<h1>`-`<h6>` semantics](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/Heading_Elements)
  • Network accessline 27
    - [W3C/WAI: page structure and headings](https://www.w3.org/WAI/tutorials/page-structure/headings/) — the accessibility source for level-by-level, no skipping (engines cite the same)

references/checklist/references/C18.md

  • Network accessline 38
    360px viewport), **lossy compression** at build time (squoosh/sharp in the pipeline, not by hand), `loading="lazy"` for   below-the-fold images (doesn't shrink the file, but takes it off the LCP path) - Self-check: grep templates for `<img`
  • Network accessline 40
    - Self-check: grep templates for `<img`; missing width/height or a **missing alt attribute** is red (the site's CI can add the same rule as a second safety net); `curl -sI <img-url> | grep -i content-length` for the weight
  • Network accessline 44
    - [web.dev: optimize CLS (images-without-dimensions section)](https://web.dev/articles/optimize-cls#images-without-dimensions)
  • Network accessline 45
    - [Google: image SEO best practices](https://developers.google.com/search/docs/appearance/google-images) — the standard for what alt does and how to write it
  • Network accessline 46
    - [Next.js `next/image`](https://nextjs.org/docs/app/api-reference/components/image)

references/checklist/references/C19.md

  • Network accessline 25
    <meta property="og:description" content="The three gap scenarios explained in one chart"> <meta property="og:type"        content="article"> <meta property="og:url"         content="https://www.example.com/guide/f1-to-h1b">
  • Network accessline 26
    <meta property="og:type"        content="article"> <meta property="og:url"         content="https://www.example.com/guide/f1-to-h1b"> <meta property="og:image"       content="https://www.example.com/og/f1-h1b.png">
  • Network accessline 27
    <meta property="og:url"         content="https://www.example.com/guide/f1-to-h1b">
  • Network accessline 28
    <meta property="og:image"       content="https://www.example.com/og/f1-h1b.png">
  • Network accessline 41
    - [ogp.me](https://ogp.me) — The Open Graph protocol itself
  • Network accessline 42
    - [X: Cards markup docs](https://developer.x.com/en/docs/x-for-websites/cards/overview/markup)

references/checklist/references/C2.md

  • Network accessline 17
    <!-- example (for reference only; format source: the sitemaps.org protocol) --> <sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  • Network accessline 18
    <sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  • Network accessline 19
    <sitemap><loc>https://www.example.com/sitemap-core.xml</loc></sitemap>
  • Network accessline 20
    <sitemap><loc>https://www.example.com/sitemap-blog.xml</loc></sitemap>
  • Network accessline 21
    <sitemap><loc>https://www.example.com/sitemap-pseo.xml</loc></sitemap>
  • Network accessline 26
    <!-- example entry inside a shard (for reference only; source: sitemaps.org) --> <url>   <loc>https://www.example.com/guide/f1-to-h1b</loc>
  • Network accessline 27
    <url>   <loc>https://www.example.com/guide/f1-to-h1b</loc>   <lastmod>2026-08-20</lastmod>
  • Network accessline 28
    <loc>https://www.example.com/guide/f1-to-h1b</loc>
  • Network accessline 62
    - [sitemaps.org](https://www.sitemaps.org/protocol.html) -- the protocol itself (format authority)
  • Network accessline 63
    - [Google: build and submit a sitemap](https://developers.google.com/search/docs/crawling-indexing/sitemaps/build-sitemap)

references/checklist/references/C20.md

  • Network accessline 19
    - Merge canonicalization (C3) and path migration into a single hop: `http://example.com/old` should reach `https://www.example.com/new` in one hop, not canonicalize first and migrate after
  • Network accessline 25
    - [Google: redirects and Google Search](https://developers.google.com/search/docs/crawling-indexing/301-redirects) — includes the stated processing cap on redirect chains

references/checklist/references/C21.md

  • Network accessline 30
    - [Google: creating helpful content and E-E-A-T](https://developers.google.com/search/docs/fundamentals/creating-helpful-content) — the official account of Experience/Expertise/Authoritativeness/Trust
  • Network accessline 31
    - [Google Search Quality Rater Guidelines (PDF)](https://services.google.com/fh/files/misc/hsw-sqrg.pdf) — where YMYL and E-E-A-T are defined

references/checklist/references/C22.md

  • Network accessline 17
    <!-- Example (for reference only; source: Google localized versions docs) — the en page and the zh page output the same group --> <link rel="alternate" hreflang="en" href="https://www.example.com/guide/f1-to-h1b">
  • Network accessline 18
    <link rel="alternate" hreflang="en" href="https://www.example.com/guide/f1-to-h1b">
  • Network accessline 19
    <link rel="alternate" hreflang="zh" href="https://www.example.com/cn/guide/f1-to-h1b">
  • Network accessline 20
    <link rel="alternate" hreflang="x-default" href="https://www.example.com/guide/f1-to-h1b">
  • Network accessline 31
    - [Google: telling Search about localized versions of your page](https://developers.google.com/search/docs/specialty/international/localized-versions) — the authority on hreflang rules and common mistakes

references/checklist/references/C23.md

  • Network accessline 42
    - Pages that genuinely should not be indexed (logged-in, admin, pure business pages) should never be in the sitemap in the first place;   **the two verdicts stay conflict-free only because these two sets are mutually exclusive** - Self-chec
  • Network accessline 43
    **the two verdicts stay conflict-free only because these two sets are mutually exclusive** - Self-check: fetch the page and grep the robots/googlebot metas + `curl -I` for `X-Robots-Tag`;   after launch confirm index status with GSC URL Ins
  • Network accessline 44
    - Self-check: fetch the page and grep the robots/googlebot metas + `curl -I` for `X-Robots-Tag`;
  • Network accessline 49
    - [Google: robots meta tag, data-nosnippet, and X-Robots-Tag specification](https://developers.google.com/search/docs/crawling-indexing/robots-meta-tag) — the authority for all directive semantics and both channels
  • Network accessline 50
    - [Google: the right way to block indexing](https://developers.google.com/search/docs/crawling-indexing/block-indexing)

references/checklist/references/C24.md

  • Network accessline 34
    - [Google: mobile-friendly](https://developers.google.com/search/docs/appearance/mobile-friendly) — the verdict criterion
  • Network accessline 35
    - [Google: mobile-first indexing best practices](https://developers.google.com/search/docs/crawling-indexing/mobile/mobile-sites-mobile-first-indexing)
  • Network accessline 36
    - [MDN: viewport meta tag](https://developer.mozilla.org/docs/Web/HTML/Viewport_meta_tag) — attribute semantics

references/checklist/references/C25.md

  • Network accessline 5
    An HTTPS page referencing `http://` subresources (images, scripts, styles, iframes) = mixed content.
  • Network accessline 22
    **`<a href="http://...">` does not count** — that is a navigational outlink; it fires only when the user clicks, triggers no mixed-content blocking,
  • Network accessline 29
    - Write all in-site resources as **protocol-relative or absolute https**; never hard-code `http://` in templates
  • Network accessline 33
    - Backstop (not a fix): `Content-Security-Policy: upgrade-insecure-requests`   makes the browser auto-upgrade — it can save production, but it **masks the problem**; the checker should still scan the source and judge red - Self-check: fetch
  • Network accessline 35
    - Self-check: fetch the page and grep `="http://` (excluding `<a`); the browser console's Mixed Content warnings
  • Network accessline 39
    - [MDN: mixed content](https://developer.mozilla.org/docs/Web/Security/Mixed_content) — the active/passive tiers and browser blocking behavior
  • Network accessline 40
    - [MDN: auto-upgrading mixed content](https://developer.mozilla.org/docs/Web/Security/Mixed_content/How_to_fix_website_with_mixed_content)

references/checklist/references/C26.md

  • Network accessline 5
    Auto-jumping users to a "guessed language version" based on the browser's `Accept-Language` (or IP geolocation) is an anti-pattern Google's [localized versions guide](https://developers.google.com/search/docs/specialty/international/localiz
  • Network accessline 6
    [localized versions guide](https://developers.google.com/search/docs/specialty/international/localized-versions)
  • Network accessline 35
    # Anti-pattern (measured on a production site, 2026-08-25) Accept-Language: en-US   →  302 → 200  https://www.example.com/          English
  • Network accessline 36
    Accept-Language: en-US   →  302 → 200  https://www.example.com/          English
  • Network accessline 37
    Accept-Language: zh-CN   →  302 → 302 → 200  https://www.example.com/cn  Chinese
  • Network accessline 38
    (no Accept-Language)     →  302 → 302 → 200  https://www.example.com/cn  ← what the crawler sees
  • Network accessline 41
    - Self-check: `curl -sI -H 'Accept-Language: en-US' <url>` once and again with `zh-CN`; compare `Location`;
  • Network accessline 48
    - [Google: managing localized versions](https://developers.google.com/search/docs/specialty/international/localized-versions) — the anti-pattern statement on auto-redirects and the hreflang fix
  • Network accessline 49
    - [Google: multi-regional and multilingual sites](https://developers.google.com/search/docs/specialty/international/managing-multi-regional-sites)

references/checklist/references/C27.md

  • Network accessline 32
    - Order matters within the head anyway: put the critical machine-read tags (charset, title, canonical, robots)   **first**, so even a truncation bug downstream costs the least - Self-check: `curl -s URL | sed -n '/<head/,/<\/head>/p'` and e
  • Network accessline 33
    **first**, so even a truncation bug downstream costs the least - Self-check: `curl -s URL | sed -n '/<head/,/<\/head>/p'` and eyeball for the eight allowed tags; or the   checker's C27 row
  • Network accessline 34
    - Self-check: `curl -s URL | sed -n '/<head/,/<\/head>/p'` and eyeball for the eight allowed tags; or the
  • Network accessline 39
    - [Google: use valid HTML in the head](https://developers.google.com/search/docs/crawling-indexing/valid-page-metadata) — the explicit "invalid element ends head processing" statement this check is built on
  • Network accessline 40
    - [WHATWG HTML spec: the head element](https://html.spec.whatwg.org/multipage/semantics.html#the-head-element) — the normative content model (metadata content only)

references/checklist/references/C28.md

  • Network accessline 45
    - [OWASP Secure Headers Project](https://owasp.org/www-project-secure-headers/) — the canonical list, recommended values, and per-header rationale
  • Network accessline 46
    - [MDN: Strict-Transport-Security](https://developer.mozilla.org/docs/Web/HTTP/Headers/Strict-Transport-Security) / [CSP](https://developer.mozilla.org/docs/Web/HTTP/CSP) — normative semantics per header

references/checklist/references/C29.md

  • Network accessline 36
    - [Google: URL structure best practices](https://developers.google.com/search/docs/crawling-indexing/url-structure) — hyphens over underscores, encode non-ASCII, avoid parameter sprawl; the direct source of all four rules
  • Network accessline 37
    - [WHATWG URL spec](https://url.spec.whatwg.org/) — why raw non-ASCII is invalid and what encoding is normative

references/checklist/references/C3.md

  • Network accessline 21
    listen 80;  listen 443 ssl;     server_name example.com;              # apex (including http)     return 301 https://www.example.com$request_uri;   # one hop straight to the final form
  • Network accessline 22
    server_name example.com;              # apex (including http)     return 301 https://www.example.com$request_uri;   # one hop straight to the final form }
  • Network accessline 23
    return 301 https://www.example.com$request_uri;   # one hop straight to the final form
  • Network accessline 27
    - Trailing slash: pick one (no trailing slash recommended), 301 the other over; configure at the framework layer (Next `trailingSlash`, nginx `rewrite`) - Self-check: `curl -I` the four variants (http/https x www/apex); all must 301 with an
  • Network accessline 28
    - Self-check: `curl -I` the four variants (http/https x www/apex); all must 301 with an identical Location and hop=1
  • Network accessline 32
    - [Google: URL canonicalization and duplicate consolidation](https://developers.google.com/search/docs/crawling-indexing/canonicalization) -- the authoritative account of how engines handle variants
  • Network accessline 33
    - [Google: redirects and search](https://developers.google.com/search/docs/crawling-indexing/301-redirects)

references/checklist/references/C30.md

  • Network accessline 39
    - [Google SEO Starter Guide: use good anchor text](https://developers.google.com/search/docs/fundamentals/seo-starter-guide) — anchor text as target-page signal
  • Network accessline 40
    - [MDN: rel=noopener](https://developer.mozilla.org/docs/Web/HTML/Attributes/rel/noopener) — the window.opener mechanics and the browser-default timeline
  • Network accessline 41
    - [web.dev: links to cross-origin destinations](https://web.dev/articles/external-anchors-use-rel-noopener) — the reverse-tabnabbing writeup

references/checklist/references/C4.md

  • Access to secretsline 24
    [Credential-related source omitted]
  • Network accessline 31
    - [web.dev/vitals](https://web.dev/articles/vitals) -- source of the metric definitions and thresholds (Chrome team)
  • Network accessline 32
    - Per-metric optimization guides: [LCP](https://web.dev/articles/optimize-lcp) · [INP](https://web.dev/articles/optimize-inp) · [CLS](https://web.dev/articles/optimize-cls)
  • Network accessline 33
    - [CrUX docs](https://developer.chrome.com/docs/crux) -- how field data is collected and scoped

references/checklist/references/C5.md

  • Network accessline 18
    // example (for reference only; source: the indexnow.org protocol docs) POST https://api.indexnow.org/indexnow
  • Network accessline 19
    POST https://api.indexnow.org/indexnow
  • Network accessline 22
    "host": "www.example.com",   "key": "a1b2c3d4e5f6",   "keyLocation": "https://www.example.com/a1b2c3d4e5f6.txt",
  • Network accessline 23
    "key": "a1b2c3d4e5f6",   "keyLocation": "https://www.example.com/a1b2c3d4e5f6.txt",   "urlList": ["https://www.example.com/blog/new-post"]
  • Network accessline 24
    "keyLocation": "https://www.example.com/a1b2c3d4e5f6.txt",
  • Network accessline 25
    "urlList": ["https://www.example.com/blog/new-post"]
  • Network accessline 34
    - [indexnow.org protocol docs](https://www.indexnow.org/documentation) -- protocol and API authority
  • Network accessline 35
    - [Bing: IndexNow onboarding](https://www.bing.com/indexnow)

references/checklist/references/C6.md

  • Network accessline 101
    - [Google SEO Starter Guide: internal links and site structure](https://developers.google.com/search/docs/fundamentals/seo-starter-guide) -- the authoritative account of internal links as a discovery and comprehension channel
  • Network accessline 102
    - [Google: managing crawl budget](https://developers.google.com/search/docs/crawling-indexing/large-site-managing-crawl-budget) -- the framing for bad outlinks consuming budget
  • Network accessline 103
    - [Google: robots.txt usage](https://developers.google.com/search/docs/crawling-indexing/robots/intro) -- source for `Disallow` and `noindex` not stacking
  • Network accessline 104
    - [Cloudflare: verified bots](https://developers.cloudflare.com/bots/concepts/bot/#verified-bots) -- the WAF allowance criterion (reverse DNS, not UA)

references/checklist/references/C7.md

  • Network accessline 17
    ## Core pages - [F1 to H1B insurance guide](https://www.example.com/guide/f1-to-h1b): the complete walkthrough of insurance continuity across the status change
  • Network accessline 18
    - [F1 to H1B insurance guide](https://www.example.com/guide/f1-to-h1b): the complete walkthrough of insurance continuity across the status change
  • Network accessline 19
    - [Insurance comparison](https://www.example.com/compare): mainstream plans side by side
  • Network accessline 21
    ## Blog - [Blog home](https://www.example.com/blog): all guides and updates
  • Network accessline 22
    - [Blog home](https://www.example.com/blog): all guides and updates
  • Network accessline 30
    - [llmstxt.org](https://llmstxt.org) -- the format proposal itself (community convention; note: not an official standard, and engine support keeps shifting)

references/checklist/references/C8.md

  • Network accessline 19
    <!-- example (for reference only; source: Google's canonical docs) --> <link rel="canonical" href="https://www.example.com/guide/f1-to-h1b">
  • Network accessline 20
    <link rel="canonical" href="https://www.example.com/guide/f1-to-h1b">
  • Network accessline 30
    # Anti-example: a CDN rule added a header canonical site-wide, inconsistent with the one in HTML Link: <https://example.com/guide>; rel="canonical"      <- apex
  • Network accessline 31
    Link: <https://example.com/guide>; rel="canonical"      <- apex
  • Network accessline 32
    <link rel="canonical" href="https://www.example.com/guide">  <- www
  • Network accessline 39
    - [Google: specify a canonical URL with rel="canonical"](https://developers.google.com/search/docs/crawling-indexing/consolidate-duplicate-urls) -- the authoritative account of the verdict and common mistakes

references/checklist/references/C9.md

  • Network accessline 20
    # visible text volume fetched without JS, compared against the browser-rendered version (>=90%) curl -s -A "<real browser UA>" <url> | python3 -c "import sys,re;h=sys.stdin.read();t=re.sub(r'<script.*?</script>|<style.*?</style>|<[^>]+>',' 
  • Dangerous shell operationline 21
    curl -s -A "<real browser UA>" <url> | python3 -c "import sys,re;h=sys.stdin.read();t=re.sub(r'<script.*?</script>|<style.*?</style>|<[^>]+>',' ',h,flags=re.S);print(len(' '.join(t.split())))"
  • Network accessline 21
    curl -s -A "<real browser UA>" <url> | python3 -c "import sys,re;h=sys.stdin.read();t=re.sub(r'<script.*?</script>|<style.*?</style>|<[^>]+>',' ',h,flags=re.S);print(len(' '.join(t.split())))"
  • Network accessline 26
    - [Google: JavaScript SEO basics](https://developers.google.com/search/docs/crawling-indexing/javascript/javascript-seo-basics) -- the authoritative account of rendering vs crawlers
  • Network accessline 27
    - [Next.js: Server & Client Components](https://nextjs.org/docs/app/getting-started/server-and-client-components)

references/config.example.yaml

  • Access to secretsline 8
    [Credential-related source omitted]
  • Network accessline 98
    # base URL for the report's Docs column; swap main for a commit SHA to pin a version DOC_BASE_URL: "https://github.com/tigerless-labs/seo-ops/blob/main/references/checklist/references"
  • Network accessline 99
    DOC_BASE_URL: "https://github.com/tigerless-labs/seo-ops/blob/main/references/checklist/references"

references/content/page-doc-template.md

  • Network accessline 54
    name_zh: {{Aikemei}}                               # if there is no Chinese name write "none" — don't invent one on the spot   alias: {{AIS}}                                       # short name / alias; leave blank if none   logo: {{https://
  • Network accessline 55
    alias: {{AIS}}                                       # short name / alias; leave blank if none   logo: {{https://www.example.com/logo.png}}   # logo hard requirements: >=112×112 px, PNG/JPG (not SVG), square or near-square, opaque backgroun
  • Network accessline 56
    logo: {{https://www.example.com/logo.png}}
  • Network accessline 59
    sameas:            # official accounts as full URLs, one per line, not handles; the three sites and the socials point at one entity   - {{https://www.linkedin.com/company/acme}}
  • Network accessline 60
    - {{https://www.linkedin.com/company/acme}}
  • Network accessline 61
    - {{https://x.com/acme}}
  • Network accessline 62
    - {{https://www.youtube.com/@acme}}
  • Network accessline 63
    - {{https://www.crunchbase.com/organization/acme}}
  • Network accessline 173
    citations:   - {{https://www.uscis.gov/…}}
  • Network accessline 174
    - {{https://www.uscis.gov/…}}
  • Network accessline 175
    - {{https://www.healthcare.gov/…}}

references/content/references/T1.md

  • Network accessline 34
    https://www.linkedin.com/company/acme
  • Network accessline 35
    https://x.com/acme
  • Network accessline 36
    https://www.youtube.com/@acme
  • Network accessline 37
    https://www.crunchbase.com/organization/acme
  • Network accessline 51
    - [Google: Organization structured data](https://developers.google.com/search/docs/appearance/structured-data/organization) — source of the logo size and format requirements
  • Network accessline 52
    - [schema.org `sameAs`](https://schema.org/sameAs) — property semantics

references/content/references/T10.md

  • Network accessline 50
    - [Google: structured data general policies (markup must match visible content)](https://developers.google.com/search/docs/appearance/structured-data/sd-policies)
  • Network accessline 51
    - [Google: date fields in Article structured data](https://developers.google.com/search/docs/appearance/structured-data/article)

references/content/references/T12.md

  • Network accessline 37
    citations:   - https://www.uscis.gov/…          # official sources
  • Network accessline 38
    - https://www.uscis.gov/…          # official sources
  • Network accessline 39
    - https://www.healthcare.gov/…
  • Network accessline 66
    - [Google Search Quality Rater Guidelines (YMYL and E-E-A-T definitions)](https://guidelines.raterhub.com/searchqualityevaluatorguidelines.pdf)
  • Network accessline 67
    - [Google: creating helpful, reliable, people-first content](https://developers.google.com/search/docs/fundamentals/creating-helpful-content)

references/content/references/T13.md

  • Network accessline 56
    - [Google: Product structured data](https://developers.google.com/search/docs/appearance/structured-data/product)
  • Network accessline 57
    - [Google: structured data policies (self-serving reviews forbidden)](https://developers.google.com/search/docs/appearance/structured-data/sd-policies)
  • Network accessline 58
    - [schema.org InsuranceProduct](https://schema.org/InsuranceProduct)

references/content/references/T14.md

  • Network accessline 57
    - [Google: image SEO best practices](https://developers.google.com/search/docs/appearance/google-images) — what alt does and how to write it
  • Network accessline 58
    - [W3C WAI: deciding what to write in alt](https://www.w3.org/WAI/tutorials/images/decision-tree) — the content-vs-decoration decision tree

references/content/references/T2.md

  • Network accessline 50
    - [llmstxt.org](https://llmstxt.org) — the format convention

references/content/references/T3.md

  • Network accessline 46
    - [Google: URL structure best practices](https://developers.google.com/search/docs/crawling-indexing/url-structure)

references/content/references/T4.md

  • Network accessline 53
    - [Google Search Quality Rater Guidelines (YMYL definition)](https://guidelines.raterhub.com/searchqualityevaluatorguidelines.pdf)

references/content/references/T5.md

  • Network accessline 49
    - [Google: control your title links in search results](https://developers.google.com/search/docs/appearance/title-link)
  • Network accessline 50
    - [Google: control your snippets](https://developers.google.com/search/docs/appearance/snippet)

references/content/references/T8.md

  • Network accessline 53
    - [Google: localized versions (hreflang)](https://developers.google.com/search/docs/specialty/international/localized-versions) — the authoritative word on reciprocity and x-default

references/decisions.md

  • Network accessline 33
    | C23 indexed pages carry no noindex | Template and deployment config; content expresses "should this page be indexed" through **sitemap membership**, not by writing meta | | C24 viewport meta | One line in the base template, unrelated to c
  • Network accessline 35
    | C25 no mixed content | Writers pasting `http://` external images into copy is indeed a common source, but **the real fix is frontend rewriting the protocol or re-hosting on our own CDN at ingest** (implementation guidance in [C25.md](chec

references/report.example.md

  • Network accessline 3
    - Target: https://www.example.com (domain mode)
  • Network accessline 11
    | ID | Priority | Check | Result | Evidence | Docs | |---|---|---|---|---|---| | C1 | P0 | robots.txt allows all AI crawler UAs | ✅ pass | all 18 UAs allowed | [C1 docs](https://github.com/tigerless-labs/seo-ops/blob/main/references/checkli
  • Network accessline 12
    |---|---|---|---|---|---| | C1 | P0 | robots.txt allows all AI crawler UAs | ✅ pass | all 18 UAs allowed | [C1 docs](https://github.com/tigerless-labs/seo-ops/blob/main/references/checklist/references/C1.md) | | C2 | P0 | sitemap reachable,
  • Network accessline 13
    | C1 | P0 | robots.txt allows all AI crawler UAs | ✅ pass | all 18 UAs allowed | [C1 docs](https://github.com/tigerless-labs/seo-ops/blob/main/references/checklist/references/C1.md) |
  • Network accessline 14
    | C2 | P0 | sitemap reachable, no 4xx/5xx entries, truthful lastmod, <=50k URLs per file | 🔴 fail | sitemap /<U+200B>sitemap.xml… [full ↓](#c2) | [C2 docs](https://github.com/tigerless-labs/seo-ops/blob/main/references/checklist/references/C2.md) 
  • Possible obfuscationline 14
    | C2 | P0 | sitemap reachable, no 4xx/5xx entries, truthful lastmod, <=50k URLs per file | 🔴 fail | sitemap /<U+200B>sitemap.xml… [full ↓](#c2) | [C2 docs](https://github.com/tigerless-labs/seo-ops/blob/main/references/checklist/references/C2.md) 
  • Network accessline 15
    | C3 | P0 | URL canonicalization: www/apex, http/https, trailing slash all 301 to one canonical host | 🔴 fail | http:<U+200B>/<U+200B>/<U+200B>www.frontend.… [full ↓](#c3) | [C3 docs](https://github.com/tigerless-labs/seo-ops/blob/main/references/checklist/refe
  • Possible obfuscationline 15
    | C3 | P0 | URL canonicalization: www/apex, http/https, trailing slash all 301 to one canonical host | 🔴 fail | http:<U+200B>/<U+200B>/<U+200B>www.frontend.… [full ↓](#c3) | [C3 docs](https://github.com/tigerless-labs/seo-ops/blob/main/references/checklist/refe
  • Network accessline 16
    | C26 | P0 | no Accept-Language redirects: every language version has its own fixed URL, no auto-jump | ✅ pass | sampled 1 page(s),… [full ↓](#c26) | [C26 docs](https://github.com/tigerless-labs/seo-ops/blob/main/references/checklist/refere
  • Network accessline 17
    | C4 | P1 | Core Web Vitals pass: LCP<2.5s / INP<200ms / CLS<0.1 | ⚪ N.A. | need-<U+200B>crux-<U+200B>data… [full ↓](#c4) | [C4 docs](https://github.com/tigerless-labs/seo-ops/blob/main/references/checklist/references/C4.md) |
  • Possible obfuscationline 17
    | C4 | P1 | Core Web Vitals pass: LCP<2.5s / INP<200ms / CLS<0.1 | ⚪ N.A. | need-<U+200B>crux-<U+200B>data… [full ↓](#c4) | [C4 docs](https://github.com/tigerless-labs/seo-ops/blob/main/references/checklist/references/C4.md) |
  • Network accessline 18
    | C5 | P1 | IndexNow key file reachable at the site root | ⚪ N.A. | need-<U+200B>key-<U+200B>declaration… [full ↓](#c5) | [C5 docs](https://github.com/tigerless-labs/seo-ops/blob/main/references/checklist/references/C5.md) |
  • Possible obfuscationline 18
    | C5 | P1 | IndexNow key file reachable at the site root | ⚪ N.A. | need-<U+200B>key-<U+200B>declaration… [full ↓](#c5) | [C5 docs](https://github.com/tigerless-labs/seo-ops/blob/main/references/checklist/references/C5.md) |
  • Network accessline 19
    | C6 | P1 | internal outlinks free of 4xx/5xx: links on pages don't point at broken pages | 🔴 fail | 1 dead internal… [full ↓](#c6) | [C6 docs](https://github.com/tigerless-labs/seo-ops/blob/main/references/checklist/references/C6.md) |
  • Network accessline 20
    | C7 | P2 | llms.txt exists: a site directory for AI engines at the root | 🔴 fail | /<U+200B>llms.txt → 404 | [C7 docs](https://github.com/tigerless-labs/seo-ops/blob/main/references/checklist/references/C7.md) |
  • Possible obfuscationline 20
    | C7 | P2 | llms.txt exists: a site directory for AI engines at the root | 🔴 fail | /<U+200B>llms.txt → 404 | [C7 docs](https://github.com/tigerless-labs/seo-ops/blob/main/references/checklist/references/C7.md) |
  • Network accessline 24
    | ID | Priority | Check | Result | Evidence | Docs | |---|---|---|---|---|---| | C8 | P0 | self-referencing canonical: every page names its own canonical URL, HTML and header agree | 🔴 fail | /<U+200B>(canonical=<U+200B>https:<U+200B>/<U+200B>/… [full ↓](#c8) | [C8 do
  • Network accessline 25
    |---|---|---|---|---|---| | C8 | P0 | self-referencing canonical: every page names its own canonical URL, HTML and header agree | 🔴 fail | /<U+200B>(canonical=<U+200B>https:<U+200B>/<U+200B>/… [full ↓](#c8) | [C8 docs](https://github.com/tigerless-labs/seo-ops/blob/ma
  • Network accessline 26
    | C8 | P0 | self-referencing canonical: every page names its own canonical URL, HTML and header agree | 🔴 fail | /<U+200B>(canonical=<U+200B>https:<U+200B>/<U+200B>/… [full ↓](#c8) | [C8 docs](https://github.com/tigerless-labs/seo-ops/blob/main/references/checklist/re
  • Possible obfuscationline 26
    | C8 | P0 | self-referencing canonical: every page names its own canonical URL, HTML and header agree | 🔴 fail | /<U+200B>(canonical=<U+200B>https:<U+200B>/<U+200B>/… [full ↓](#c8) | [C8 docs](https://github.com/tigerless-labs/seo-ops/blob/main/references/checklist/re
  • Network accessline 27
    | C9 | P0 | full body served server-side: readable without executing JS (no CSR shell) | ✅ pass | 1/<U+200B>1 pages pass;… [full ↓](#c9) | [C9 docs](https://github.com/tigerless-labs/seo-ops/blob/main/references/checklist/references/C9.md) |
  • Possible obfuscationline 27
    | C9 | P0 | full body served server-side: readable without executing JS (no CSR shell) | ✅ pass | 1/<U+200B>1 pages pass;… [full ↓](#c9) | [C9 docs](https://github.com/tigerless-labs/seo-ops/blob/main/references/checklist/references/C9.md) |
  • Network accessline 28
    | C10 | P0 | cached HTML is a public non-personalized version: nothing user-specific in it | 🔴 fail | /<U+200B>(two fetches diff… [full ↓](#c10) | [C10 docs](https://github.com/tigerless-labs/seo-ops/blob/main/references/checklist/references/C10.m
  • Possible obfuscationline 28
    | C10 | P0 | cached HTML is a public non-personalized version: nothing user-specific in it | 🔴 fail | /<U+200B>(two fetches diff… [full ↓](#c10) | [C10 docs](https://github.com/tigerless-labs/seo-ops/blob/main/references/checklist/references/C10.m
  • Network accessline 29
    | C23 | P0 | indexed pages carry no noindex: neither meta robots nor X-Robots-Tag blocks | ✅ pass | 1/<U+200B>1 pages pass | [C23 docs](https://github.com/tigerless-labs/seo-ops/blob/main/references/checklist/references/C23.md) |
  • Possible obfuscationline 29
    | C23 | P0 | indexed pages carry no noindex: neither meta robots nor X-Robots-Tag blocks | ✅ pass | 1/<U+200B>1 pages pass | [C23 docs](https://github.com/tigerless-labs/seo-ops/blob/main/references/checklist/references/C23.md) |
  • Network accessline 30
    | C11 | P1 | title / description unique per page and within limits (<=70 / <=160) | 🔴 fail | /<U+200B>(title 75 chars >… [full ↓](#c11) | [C11 docs](https://github.com/tigerless-labs/seo-ops/blob/main/references/checklist/references/C11.md) |
  • Possible obfuscationline 30
    | C11 | P1 | title / description unique per page and within limits (<=70 / <=160) | 🔴 fail | /<U+200B>(title 75 chars >… [full ↓](#c11) | [C11 docs](https://github.com/tigerless-labs/seo-ops/blob/main/references/checklist/references/C11.md) |
  • Network accessline 31
    | C12 | P1 | JSON-LD: blocks parse, required fields present, no rejected types | 🔴 fail | /<U+200B>(missing WebSite) | [C12 docs](https://github.com/tigerless-labs/seo-ops/blob/main/references/checklist/references/C12.md) |
  • Possible obfuscationline 31
    | C12 | P1 | JSON-LD: blocks parse, required fields present, no rejected types | 🔴 fail | /<U+200B>(missing WebSite) | [C12 docs](https://github.com/tigerless-labs/seo-ops/blob/main/references/checklist/references/C12.md) |
  • Network accessline 32
    | C13 | P1 | no soft 404s: never a 200 serving an empty or error page (retire via 301/410) | ✅ pass | 1/<U+200B>1 pages pass;… [full ↓](#c13) | [C13 docs](https://github.com/tigerless-labs/seo-ops/blob/main/references/checklist/references/C13.md) 
  • Possible obfuscationline 32
    | C13 | P1 | no soft 404s: never a 200 serving an empty or error page (retire via 301/410) | ✅ pass | 1/<U+200B>1 pages pass;… [full ↓](#c13) | [C13 docs](https://github.com/tigerless-labs/seo-ops/blob/main/references/checklist/references/C13.md) 
  • Network accessline 33
    | C14 | P1 | no anti-flicker script hiding the whole page (crawlers may get a blank) | ✅ pass | 1/<U+200B>1 pages pass | [C14 docs](https://github.com/tigerless-labs/seo-ops/blob/main/references/checklist/references/C14.md) |
  • Possible obfuscationline 33
    | C14 | P1 | no anti-flicker script hiding the whole page (crawlers may get a blank) | ✅ pass | 1/<U+200B>1 pages pass | [C14 docs](https://github.com/tigerless-labs/seo-ops/blob/main/references/checklist/references/C14.md) |
  • Network accessline 34
    | C16 | P1 | snippet controls: max-snippet:-1 + max-image-preview:large | 🔴 fail | /<U+200B>(robots meta:… [full ↓](#c16) | [C16 docs](https://github.com/tigerless-labs/seo-ops/blob/main/references/checklist/references/C16.md) |
  • Possible obfuscationline 34
    | C16 | P1 | snippet controls: max-snippet:-1 + max-image-preview:large | 🔴 fail | /<U+200B>(robots meta:… [full ↓](#c16) | [C16 docs](https://github.com/tigerless-labs/seo-ops/blob/main/references/checklist/references/C16.md) |
  • Network accessline 35
    | C24 | P1 | viewport meta includes width=device-width | ✅ pass | 1/<U+200B>1 pages pass | [C24 docs](https://github.com/tigerless-labs/seo-ops/blob/main/references/checklist/references/C24.md) |
  • Possible obfuscationline 35
    | C24 | P1 | viewport meta includes width=device-width | ✅ pass | 1/<U+200B>1 pages pass | [C24 docs](https://github.com/tigerless-labs/seo-ops/blob/main/references/checklist/references/C24.md) |
  • Network accessline 36
    | C17 | P2 | heading hierarchy: exactly one h1, h2->h3 with no skipped levels | 🔴 fail | /<U+200B>(skips h1→h4) | [C17 docs](https://github.com/tigerless-labs/seo-ops/blob/main/references/checklist/references/C17.md) |
  • Possible obfuscationline 36
    | C17 | P2 | heading hierarchy: exactly one h1, h2->h3 with no skipped levels | 🔴 fail | /<U+200B>(skips h1→h4) | [C17 docs](https://github.com/tigerless-labs/seo-ops/blob/main/references/checklist/references/C17.md) |
  • Network accessline 37
    | C18 | P2 | every img has explicit width/height + alt | 🔴 fail | /<U+200B>(3/<U+200B>20 imgs missing… [full ↓](#c18) | [C18 docs](https://github.com/tigerless-labs/seo-ops/blob/main/references/checklist/references/C18.md) |
  • Possible obfuscationline 37
    | C18 | P2 | every img has explicit width/height + alt | 🔴 fail | /<U+200B>(3/<U+200B>20 imgs missing… [full ↓](#c18) | [C18 docs](https://github.com/tigerless-labs/seo-ops/blob/main/references/checklist/references/C18.md) |
  • Network accessline 38
    | C19 | P2 | full Open Graph set + twitter:card: social preview cards complete and correct | ✅ pass | 1/<U+200B>1 pages pass | [C19 docs](https://github.com/tigerless-labs/seo-ops/blob/main/references/checklist/references/C19.md) |
  • Possible obfuscationline 38
    | C19 | P2 | full Open Graph set + twitter:card: social preview cards complete and correct | ✅ pass | 1/<U+200B>1 pages pass | [C19 docs](https://github.com/tigerless-labs/seo-ops/blob/main/references/checklist/references/C19.md) |
  • Network accessline 39
    | C20 | P2 | redirect hops <=1: no chained redirects | ✅ pass | 1/<U+200B>1 pages pass | [C20 docs](https://github.com/tigerless-labs/seo-ops/blob/main/references/checklist/references/C20.md) |
  • Possible obfuscationline 39
    | C20 | P2 | redirect hops <=1: no chained redirects | ✅ pass | 1/<U+200B>1 pages pass | [C20 docs](https://github.com/tigerless-labs/seo-ops/blob/main/references/checklist/references/C20.md) |
  • Network accessline 40
    | C15 | P2 | render cost not per-request: SSR needs CDN caching (s-maxage + SWR), SSG exempt | ⚪ N.A. | need-<U+200B>declaration… [full ↓](#c15) | [C15 docs](https://github.com/tigerless-labs/seo-ops/blob/main/references/checklist/references/C15.m
  • Possible obfuscationline 40
    | C15 | P2 | render cost not per-request: SSR needs CDN caching (s-maxage + SWR), SSG exempt | ⚪ N.A. | need-<U+200B>declaration… [full ↓](#c15) | [C15 docs](https://github.com/tigerless-labs/seo-ops/blob/main/references/checklist/references/C15.m
  • Network accessline 41
    | C25 | P2 | no mixed content: no http:// subresources on HTTPS pages | ✅ pass | 1/<U+200B>1 pages pass | [C25 docs](https://github.com/tigerless-labs/seo-ops/blob/main/references/checklist/references/C25.md) |
  • Possible obfuscationline 41
    | C25 | P2 | no mixed content: no http:// subresources on HTTPS pages | ✅ pass | 1/<U+200B>1 pages pass | [C25 docs](https://github.com/tigerless-labs/seo-ops/blob/main/references/checklist/references/C25.md) |
  • Network accessline 45
    | ID | Priority | Check | Result | Evidence | Docs | |---|---|---|---|---|---| | C21 | P0 | YMYL trust block: author, review attribution, authoritative citations | 👤 human review | before launch, walk… [full ↓](#c21) | [C21 docs](https://gi
  • Network accessline 46
    |---|---|---|---|---|---| | C21 | P0 | YMYL trust block: author, review attribution, authoritative citations | 👤 human review | before launch, walk… [full ↓](#c21) | [C21 docs](https://github.com/tigerless-labs/seo-ops/blob/main/references/
  • Network accessline 47
    | C21 | P0 | YMYL trust block: author, review attribution, authoritative citations | 👤 human review | before launch, walk… [full ↓](#c21) | [C21 docs](https://github.com/tigerless-labs/seo-ops/blob/main/references/checklist/references/C21.m
  • Network accessline 48
    | C22 | P1 | hreflang reciprocal pairs + x-default | 👤 human review | manually verify… [full ↓](#c22) | [C22 docs](https://github.com/tigerless-labs/seo-ops/blob/main/references/checklist/references/C22.md) |
  • Network accessline 71
    http://www.example.com/ → HTTPConnectionPool(host='www.example.com', port=80): Max retries exceeded with url: / (Caused by NameResolut
  • Network accessline 72
    https://www.example.com/ → HTTPSConnectionPool(host='www.example.com', port=443): Max retries exceeded with url: / (Caused by NameResol
  • Network accessline 122
    /(canonical=https://example.net/ ≠ /)

references/sites.example.yaml

  • Network accessline 1
    # Site roster — copy to sites.yaml, then fill in your own sites. # Not needed for a single site: python3 scripts/run.py --target https://example.com
  • Network accessline 2
    # Not needed for a single site: python3 scripts/run.py --target https://example.com
  • Network accessline 3
    sites:   - id: example-com                        # used for the report filename and the checks table's site column     production: https://www.example.com    # site root URL (origin), required
  • Network accessline 4
    - id: example-com                        # used for the report filename and the checks table's site column     production: https://www.example.com    # site root URL (origin), required     rendering: ssr                         # ssr / ssg 
  • Network accessline 5
    production: https://www.example.com    # site root URL (origin), required
  • Network accessline 6
    rendering: ssr                         # ssr / ssg / isr — C15 branches on it; N.A. if unset     sitemap: https://www.example.com/sitemap.xml   # defaults to <production>/sitemap.xml if unset     samples:                               # mus
  • Network accessline 7
    sitemap: https://www.example.com/sitemap.xml   # defaults to <production>/sitemap.xml if unset

scripts/config.py

  • Executable scriptline 1
    Executable file
  • Access to secretsline 5
    [Credential-related source omitted]
  • Access to secretsline 32
    [Credential-related source omitted]
  • Access to secretsline 83
    [Credential-related source omitted]
  • Access to secretsline 84
    [Credential-related source omitted]
  • Access to secretsline 101
    [Credential-related source omitted]
  • Access to secretsline 102
    [Credential-related source omitted]
  • Access to secretsline 106
    [Credential-related source omitted]
  • Access to secretsline 108
    [Credential-related source omitted]
  • Access to secretsline 109
    [Credential-related source omitted]
  • Access to secretsline 110
    [Credential-related source omitted]
  • Access to secretsline 125
    [Credential-related source omitted]
  • Access to secretsline 127
    [Credential-related source omitted]
  • Access to secretsline 128
    [Credential-related source omitted]
  • Access to secretsline 133
    [Credential-related source omitted]
  • Access to secretsline 135
    [Credential-related source omitted]
  • Network accessline 146
    # ── run target (one parameter, mode auto-detected) ──── # TARGET: the site's **root URL (origin)** = scheme + host[:port], no path/query/fragment #   (valid: "http://localhost:3000", "https://www.example.com";
  • Network accessline 147
    # TARGET: the site's **root URL (origin)** = scheme + host[:port], no path/query/fragment #   (valid: "http://localhost:3000", "https://www.example.com"; #    invalid: "…/blog", "…?x=1" — validated at startup, errors out, never guesses).
  • Network accessline 148
    #   (valid: "http://localhost:3000", "https://www.example.com";
  • Network accessline 160
    TARGET = ""    # e.g. "http://localhost:3000" or "https://www.example.com"
  • Access to secretsline 218
    [Credential-related source omitted]
  • Access to secretsline 225
    [Credential-related source omitted]
  • Access to secretsline 232
    [Credential-related source omitted]
  • Access to secretsline 233
    [Credential-related source omitted]
  • Access to secretsline 236
    [Credential-related source omitted]
  • Network accessline 261
    DOC_BASE_URL = "https://github.com/tigerless-labs/seo-ops/blob/main/references/checklist/references"
  • Access to secretsline 373
    [Credential-related source omitted]
  • Access to secretsline 432
    [Credential-related source omitted]
  • Access to secretsline 462
    [Credential-related source omitted]

scripts/run.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Executable scriptline 1
    #!/usr/bin/env python3
  • Network accessline 12
    python3 scripts/run.py                       # config.TARGET empty → run every site in sites.yaml   python3 scripts/run.py --site example-com    # run just one site from sites.yaml   python3 scripts/run.py --target http://localhost:3000   #
  • Network accessline 12
    python3 scripts/run.py                       # config.TARGET empty → run every site in sites.yaml   python3 scripts/run.py --site example-com    # run just one site from sites.yaml   python3 scripts/run.py --target http://localhost:3000   #
  • Network accessline 14
    python3 scripts/run.py --target http://localhost:3000   # single-site override (local mode auto-detected)
  • Network accessline 14
    python3 scripts/run.py --target http://localhost:3000   # single-site override (local mode auto-detected)
  • Access to secretsline 20
    [Credential-related source omitted]
  • Access to secretsline 20
    [Credential-related source omitted]
  • Network accessline 113
    s = getattr(self.local, "s", None)         if s is None:             s = requests.Session()
  • Network accessline 113
    s = getattr(self.local, "s", None)         if s is None:             s = requests.Session()
  • Network accessline 114
    if s is None:             s = requests.Session()             s.headers["User-Agent"] = CFG.UA
  • Network accessline 114
    if s is None:             s = requests.Session()             s.headers["User-Agent"] = CFG.UA
  • Network accessline 115
    s = requests.Session()
  • Network accessline 115
    s = requests.Session()
  • Network accessline 444
    else:         bare = host[4:] if host.startswith("www.") else host         variants = [f"http://{bare}/", f"http://www.{bare}/",
  • Network accessline 444
    else:         bare = host[4:] if host.startswith("www.") else host         variants = [f"http://{bare}/", f"http://www.{bare}/",
  • Network accessline 445
    bare = host[4:] if host.startswith("www.") else host         variants = [f"http://{bare}/", f"http://www.{bare}/",                     f"https://{bare}/", f"https://www.{bare}/"]
  • Network accessline 445
    bare = host[4:] if host.startswith("www.") else host         variants = [f"http://{bare}/", f"http://www.{bare}/",                     f"https://{bare}/", f"https://www.{bare}/"]
  • Network accessline 446
    variants = [f"http://{bare}/", f"http://www.{bare}/",
  • Network accessline 446
    variants = [f"http://{bare}/", f"http://www.{bare}/",
  • Network accessline 447
    f"https://{bare}/", f"https://www.{bare}/"]
  • Network accessline 447
    f"https://{bare}/", f"https://www.{bare}/"]
  • Access to secretsline 464
    [Credential-related source omitted]
  • Access to secretsline 464
    [Credential-related source omitted]
  • Network accessline 952
    sub_re = re.compile(r"<(?:%s)\s[^>]*\bsrc\s*=\s*[\"']http://([^\"']+)"
  • Network accessline 952
    sub_re = re.compile(r"<(?:%s)\s[^>]*\bsrc\s*=\s*[\"']http://([^\"']+)"
  • Network accessline 953
    % "|".join(CFG.SUBRESOURCE_TAGS), flags=re.I)     link_re = re.compile(r"<link\s[^>]*\bhref\s*=\s*[\"']http://([^\"']+)", flags=re.I)     st = []
  • Network accessline 953
    % "|".join(CFG.SUBRESOURCE_TAGS), flags=re.I)     link_re = re.compile(r"<link\s[^>]*\bhref\s*=\s*[\"']http://([^\"']+)", flags=re.I)     st = []
  • Network accessline 954
    link_re = re.compile(r"<link\s[^>]*\bhref\s*=\s*[\"']http://([^\"']+)", flags=re.I)
  • Network accessline 954
    link_re = re.compile(r"<link\s[^>]*\bhref\s*=\s*[\"']http://([^\"']+)", flags=re.I)
  • Network accessline 1157
    host = urlparse(site["origin"]).netloc     try:         r = requests.post(
  • Network accessline 1157
    host = urlparse(site["origin"]).netloc     try:         r = requests.post(
  • Network accessline 1158
    try:         r = requests.post(             f"https://chromeuxreport.googleapis.com/v1/records:queryRecord?key={CFG.CRUX_API_KEY}",
  • Network accessline 1158
    try:         r = requests.post(             f"https://chromeuxreport.googleapis.com/v1/records:queryRecord?key={CFG.CRUX_API_KEY}",
  • Network accessline 1159
    r = requests.post(
  • Network accessline 1159
    r = requests.post(
  • Network accessline 1160
    [Credential-related source omitted]
  • Network accessline 1160
    [Credential-related source omitted]
  • Access to secretsline 1160
    [Credential-related source omitted]
  • Access to secretsline 1160
    [Credential-related source omitted]
  • Network accessline 1161
    json={"origin": f"https://{host}"}, timeout=CFG.REQUEST_TIMEOUT)
  • Network accessline 1161
    json={"origin": f"https://{host}"}, timeout=CFG.REQUEST_TIMEOUT)
  • Network accessline 1629
    f"  mkdir -p {cd}\n"         f"  cp {ROOT / 'sites.example.yaml'} {cd / 'sites.yaml'}\n"         f"then edit it per its comments for your own sites. A single-site run doesn't need this file: --target https://example.com"
  • Network accessline 1629
    f"  mkdir -p {cd}\n"         f"  cp {ROOT / 'sites.example.yaml'} {cd / 'sites.yaml'}\n"         f"then edit it per its comments for your own sites. A single-site run doesn't need this file: --target https://example.com"
  • Network accessline 1630
    f"  cp {ROOT / 'sites.example.yaml'} {cd / 'sites.yaml'}\n"         f"then edit it per its comments for your own sites. A single-site run doesn't need this file: --target https://example.com"     )
  • Network accessline 1630
    f"  cp {ROOT / 'sites.example.yaml'} {cd / 'sites.yaml'}\n"         f"then edit it per its comments for your own sites. A single-site run doesn't need this file: --target https://example.com"     )
  • Network accessline 1631
    f"then edit it per its comments for your own sites. A single-site run doesn't need this file: --target https://example.com"
  • Network accessline 1631
    f"then edit it per its comments for your own sites. A single-site run doesn't need this file: --target https://example.com"
  • Access to secretsline 1677
    [Credential-related source omitted]
  • Access to secretsline 1677
    [Credential-related source omitted]

How the signals fit together

Facts from a static read of the files at the pinned commit. They describe what the code does, not why.

Some files could not be read; the facts below still hold.

Declared and executed: 1 fact
  • Contacts chromeuxreport.googleapis.com, which SKILL.md, the README and the plugin manifest do not mentionscripts/run.py:1160High confidence
Signal confidence: 364 facts

and 314 more

Works with

Agent compatibility, from the files in this repository
AgentStatusEvidenceInstall to
Claude CodeNativeManifest .claude-plugin/marketplace.json.claude/skills/<skill-name>/
CodexCompatibleStandard SKILL.md SKILL.md.agents/skills/<skill-name>/
CursorCompatibleStandard SKILL.md SKILL.md.cursor/skills/<skill-name>/
Gemini CLICompatibleStandard SKILL.md SKILL.md.gemini/skills/<skill-name>/
GitHub CopilotCompatibleStandard SKILL.md SKILL.md.github/skills/<skill-name>/
OpenCodeCompatibleStandard SKILL.md SKILL.md.opencode/skills/<skill-name>/
  • Native The repository ships a manifest, folder or frontmatter field for this agent.
  • Compatible A standard SKILL.md that this agent can read.
  • Unknown No evidence either way.

Derived automatically from paths, manifests and frontmatter. Not tested on each agent.

Add this badge to your README

It updates every night and links to this page.

tigerless-labs/seo-ops: #903 on hotskills, 986 stars

[![tigerless-labs/seo-ops on hotskills](https://hotskills.dev/badge/tigerless-labs-seo-ops.svg)](https://hotskills.dev/skill/tigerless-labs-seo-ops/)