Not in the top 1,000 by GitHub stars

JeffLi1993/seo-audit-skill

SEO agent skill for OpenClaw,Claude Code, and AI agents. Generate beginner SEO audits and advanced technical SEO reports for any page.

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

seo-audit/SKILL.md

Week of Oct 26, 2026 · +0 / −0 lines

Before Network or broad shell → After Network or broad shell

523bdfb2c94f → 523bdfb2c94f

Compare on GitHub

seo-audit-full/SKILL.md

Week of Oct 26, 2026 · +0 / −0 lines

Before Network or broad shell → After Network or broad shell

523bdfb2c94f → 523bdfb2c94f

Compare on GitHub

View on GitHubAdd to my skills

Verified commit 523bdfb2c94f4689408a5a344f4ea74ced49ff32

782GitHub stars
6stars in 7 days
2skills in this repository
0commits in 30 days

Heat

3.5
  • Star growth, last 7 daysNot available
  • Star growth, last 24 hoursNot available
  • Rank movement, last 7 daysNot available
  • Commits, last 30 daysNot available
  • Accounts asking about it through MCP, last 7 daysNot available
  • Hot votes this weekNot available

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

Stars over time

Aug 2, 2026Nov 4, 2026782

Individual skills in this repository

How it works

seo-audit

When your agent uses it

An SEO agent skill for quick, lightweight, default single-page SEO audits. Performs basic on-page and site-level checks and outputs a structured basic SEO audit report. Use when the user asks for "SEO audit", "SEO check", "check my page SEO", "page analysis", or wants a first-pass review of a URL. If the user requests "deep audit", "full report", "technical SEO audit", or "advanced SEO", use seo-audit-full instead.

What it loads into context

Frontmatter

128 tokens

Always available to the agent

SKILL.md

4,241 tokens

When the skill is activated

Reference documents

1,453 tokens

Loaded on request

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

The playbook

  1. When to Use This Skill
  2. Input Expected
  3. Output
  4. Scripts
  5. Recommended Workflow
  6. Report Detail Writing Rules
  7. Mandatory Finding Format
  8. Upgrade Prompt
  9. Reference Files

Scripts executed separately

  • scripts/check-page.py
  • scripts/check-schema.py
  • scripts/check-site.py
  • scripts/fetch-page.py

Files

  • SKILL.mdcore17,656 bytes
  • SKILL.mdcore17,656 bytes
  • SKILL.mdcore17,656 bytes
  • SKILL.mdcore17,656 bytes
  • SKILL.mdcore17,656 bytes
  • SKILL.mdcore17,656 bytes
  • assets/report-template.htmlasset34,709 bytes
  • references/REFERENCE.mddoc6,244 bytes
  • scripts/check-page.pyruns29,178 bytes
  • scripts/check-schema.pyruns14,291 bytes
  • scripts/check-site.pyruns13,144 bytes
  • scripts/fetch-page.pyruns6,639 bytes
Read SKILL.md

# seo-audit — Basic SEO Audit

A lightweight SEO agent skill designed for quick, default single-page SEO audits. Powered by OpenClaw. Suitable for first-time page checks or when a rapid assessment is needed without full technical depth.

---

## When to Use This Skill

Use `seo-audit` when:

- The user says: "audit this page", "check SEO", "analyze my URL", "quick SEO check", "what's wrong with my page"
- No specific depth is requested — this is the default entry point
- The user needs a fast, readable summary rather than a comprehensive technical breakdown
View the complete source on GitHub

Skills included

  • seo-audit
  • seo-audit-full

Repository facts

License
MIT
Created
Mar 10, 2026
Last pushed
Jun 17, 2026
Forks
102
Open issues
0
Project activity
Slowing

Rank over the last 12 weeks

Now #883 · best #675 · down 124 in 30 days

  1. #817 on Oct 11
  2. #848 on Oct 13
  3. #860 on Oct 14
  4. #885 on Oct 20
  5. #898 on Oct 21
  6. #883 since Oct 23
34 earlier periods
  1. #722 on Aug 2
  2. #680 on Aug 8
  3. #712 on Aug 10
  4. #718 on Aug 12
  5. #708 on Aug 13
  6. #701 on Aug 14
  7. #675 on Aug 15
  8. #697 on Aug 16
  9. #710 on Aug 20
  10. #718 on Aug 21
  11. #742 on Aug 24
  12. #749 on Aug 25
  13. #731 on Aug 26
  14. #771 on Aug 28
  15. #705 on Aug 29
  16. #711 on Aug 30
  17. #747 on Aug 31
  18. #760 on Sep 1
  19. #752 on Sep 3
  20. #729 on Sep 4
  21. #713 on Sep 5
  22. #755 on Sep 7
  23. #775 on Sep 10
  24. #748 on Sep 11
  25. #747 on Sep 12
  26. #778 on Sep 14
  27. #768 on Sep 15
  28. #759 on Sep 20
  29. #744 on Sep 25
  30. #748 on Sep 26
  31. #782 on Sep 27
  32. #802 on Sep 28
  33. #810 on Oct 6
  34. #869 on Oct 8

Before you install

Network or broad shell

Automated signals, not a guarantee

Checked Nov 6, 2026

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

Show 7 notes
  • seo-audit/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • seo-audit/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • seo-audit/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • seo-audit/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • seo-audit/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • seo-audit-full/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • seo-audit-full/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
Show all 225 signals by file

seo-audit-full/SKILL.md

  • Network accessline 50
    For PageSpeed checks, please provide a Google PageSpeed Insights API key. Get one here: https://developers.google.com/speed/docs/insights/v5/get-started
  • Network accessline 51
    Get one here: https://developers.google.com/speed/docs/insights/v5/get-started
  • Access to secretsline 58
    [Credential-related source omitted]
  • Network accessline 104
    https://example.com/blog/best-tools → reports/example-com-blog-best-tools-full-audit.html
  • Network accessline 105
    https://example.com/                → reports/example-com-full-audit.html
  • Network accessline 142
    # 1. site-level checks (robots.txt + sitemap.xml + 404 + URL canonicalization) python scripts/check-site.py https://example.com
  • Network accessline 143
    python scripts/check-site.py https://example.com
  • Network accessline 145
    # 2. page-level checks (H1, title, meta description, canonical, URL slug) python scripts/check-page.py https://example.com --keyword "primary keyword"
  • Network accessline 146
    python scripts/check-page.py https://example.com --keyword "primary keyword"
  • Network accessline 148
    # 3. fetch raw HTML for downstream scripts python scripts/fetch-page.py https://example.com --output /tmp/page.html
  • Network accessline 149
    python scripts/fetch-page.py https://example.com --output /tmp/page.html
  • Network accessline 158
    # 5. PageSpeed / Lighthouse checks python scripts/check-pagespeed.py https://example.com --strategy mobile --timeout 180 --api-key "USER_PROVIDED_KEY"
  • Network accessline 159
    python scripts/check-pagespeed.py https://example.com --strategy mobile --timeout 180 --api-key "USER_PROVIDED_KEY"
  • Network accessline 163
    python scripts/check-social.py --file /tmp/page.html # Or directly from URL: python scripts/check-social.py https://example.com
  • Network accessline 165
    python scripts/check-social.py https://example.com
  • Network accessline 174
    provided, keep the audit running and render the PageSpeed module as `error` with this instruction: `Get a PageSpeed API key at https://developers.google.com/speed/docs/insights/v5/get-started → "Acquiring and using an API key" → "Get a Key"
  • Network accessline 176
    `Get a PageSpeed API key at https://developers.google.com/speed/docs/insights/v5/get-started → "Acquiring and using an API key" → "Get a Key".`
  • Network accessline 334
    Always include the official diagnostic link: `https://pagespeed.web.dev/`
  • Network accessline 335
    `https://pagespeed.web.dev/`

seo-audit-full/assets/report-template.html

  • Access to secretsline 677
    [Credential-related source omitted]
  • Network accessline 683
    <span class="status status-warn">Warning</span>             </div>             <div class="pagespeed-url">Final URL: https://tapvid.ai/</div>
  • Network accessline 684
    </div>             <div class="pagespeed-url">Final URL: https://tapvid.ai/</div>             <div class="score-grid">
  • Network accessline 685
    <div class="pagespeed-url">Final URL: https://tapvid.ai/</div>
  • Network accessline 739
    <li>Reduce Speed Index by deferring non-critical scripts and shipping less JavaScript above the fold.</li>               <li>Lower TBT by splitting long tasks and delaying third-party tags until after initial interaction readiness.</li>    
  • Network accessline 740
    <li>Lower TBT by splitting long tasks and delaying third-party tags until after initial interaction readiness.</li>               <li>Review more diagnostics in the official test: <a href="https://pagespeed.web.dev/" target="_blank" rel="no
  • Network accessline 741
    <li>Review more diagnostics in the official test: <a href="https://pagespeed.web.dev/" target="_blank" rel="noopener">PageSpeed Insights</a>.</li>
  • Network accessline 756
    - Add a short Priority Actions list based on failing or warning PageSpeed fields.         - Keep PageSpeed actions concise: 2–4 items, focused on LCP, Speed Index, TBT, image delivery, render-blocking resources, JS execution, or third-party
  • Network accessline 757
    - Keep PageSpeed actions concise: 2–4 items, focused on LCP, Speed Index, TBT, image delivery, render-blocking resources, JS execution, or third-party scripts.         - Include the official diagnostic link: https://pagespeed.web.dev/      
  • Network accessline 758
    - Include the official diagnostic link: https://pagespeed.web.dev/
  • Network accessline 784
    <td>300</td>               <td>Blog / Content Pages</td>               <td>https://xx.ai/blog/best-ai-video-tools</td>
  • Network accessline 785
    <td>Blog / Content Pages</td>               <td>https://xx.ai/blog/best-ai-video-tools</td>             </tr>
  • Network accessline 786
    <td>https://xx.ai/blog/best-ai-video-tools</td>
  • Network accessline 790
    <td>80</td>               <td>Tool Pages</td>               <td>https://xx.ai/tools/image-generator</td>
  • Network accessline 791
    <td>Tool Pages</td>               <td>https://xx.ai/tools/image-generator</td>             </tr>
  • Network accessline 792
    <td>https://xx.ai/tools/image-generator</td>
  • Network accessline 796
    <td>40</td>               <td>Alternative / Competitor Pages</td>               <td>https://xx.ai/alternatives/synthesia</td>
  • Network accessline 797
    <td>Alternative / Competitor Pages</td>               <td>https://xx.ai/alternatives/synthesia</td>             </tr>
  • Network accessline 798
    <td>https://xx.ai/alternatives/synthesia</td>
  • Network accessline 802
    <td>65</td>               <td>Template Pages</td>               <td>https://xx.ai/templates/tiktok-video</td>
  • Network accessline 803
    <td>Template Pages</td>               <td>https://xx.ai/templates/tiktok-video</td>             </tr>
  • Network accessline 804
    <td>https://xx.ai/templates/tiktok-video</td>
  • Network accessline 808
    <td>25</td>               <td>Use Case / Solution Pages</td>               <td>https://xx.ai/use-cases/ecommerce</td>
  • Network accessline 809
    <td>Use Case / Solution Pages</td>               <td>https://xx.ai/use-cases/ecommerce</td>             </tr>
  • Network accessline 810
    <td>https://xx.ai/use-cases/ecommerce</td>
  • Network accessline 857
    <td>                 <div class="detail-issue">· No Sitemap: directive — crawlers cannot auto-discover sitemap.</div>                 <div class="detail-fix">Add: Sitemap: https://example.com/sitemap.xml</div>
  • Network accessline 858
    <div class="detail-issue">· No Sitemap: directive — crawlers cannot auto-discover sitemap.</div>                 <div class="detail-fix">Add: Sitemap: https://example.com/sitemap.xml</div>               </td>
  • Network accessline 859
    <div class="detail-fix">Add: Sitemap: https://example.com/sitemap.xml</div>
  • Network accessline 898
    <td><span class="status status-fail">Fail</span></td>               <td>                 <div class="detail-issue">· http://example.com returns 200 instead of 301 → https — duplicate indexable version.</div>
  • Network accessline 899
    <td>                 <div class="detail-issue">· http://example.com returns 200 instead of 301 → https — duplicate indexable version.</div>                 <div class="detail-fix">Force 301 redirect from HTTP to HTTPS at server/CDN level.</
  • Network accessline 900
    <div class="detail-issue">· http://example.com returns 200 instead of 301 → https — duplicate indexable version.</div>
  • Network accessline 914
    <td><span class="status status-warn">Warning</span></td>               <td>                 <div class="detail-issue">· Canonical tag points to https://example.com/page but actual URL served is https://example.com/page/ — trailing slash mis
  • Network accessline 915
    <td>                 <div class="detail-issue">· Canonical tag points to https://example.com/page but actual URL served is https://example.com/page/ — trailing slash mismatch.</div>                 <div class="detail-fix">Align canonical ta
  • Network accessline 916
    <div class="detail-issue">· Canonical tag points to https://example.com/page but actual URL served is https://example.com/page/ — trailing slash mismatch.</div>
  • Network accessline 1305
    <footer>   <div class="inner">     Powered by OpenSource Project - <strong><a href="https://github.com/JeffLi1993/seo-audit-skill">seo-audit-skill</a></strong> · Full SEO Audit Report · {{generated_date}}
  • Network accessline 1306
    <div class="inner">     Powered by OpenSource Project - <strong><a href="https://github.com/JeffLi1993/seo-audit-skill">seo-audit-skill</a></strong> · Full SEO Audit Report · {{generated_date}}   </div>
  • Network accessline 1307
    Powered by OpenSource Project - <strong><a href="https://github.com/JeffLi1993/seo-audit-skill">seo-audit-skill</a></strong> · Full SEO Audit Report · {{generated_date}}

seo-audit-full/scripts/check-page.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Network accessline 7
    Usage:     python check-page.py https://example.com
  • Network accessline 8
    python check-page.py https://example.com
  • Network accessline 9
    python check-page.py https://example.com --timeout 20
  • Network accessline 11
    Output example (JSON):     {       "url": "https://example.com/",
  • Network accessline 12
    {       "url": "https://example.com/",       "final_url": "https://example.com/",
  • Network accessline 13
    "url": "https://example.com/",
  • Network accessline 14
    "final_url": "https://example.com/",
  • Network accessline 35
    "canonical": {         "status": "pass",         "value": "https://example.com/",
  • Network accessline 36
    "status": "pass",         "value": "https://example.com/",         "matches_final_url": true,
  • Network accessline 37
    "value": "https://example.com/",
  • Network accessline 102
    try:         session = requests.Session()
  • Network accessline 103
    session = requests.Session()
  • Network accessline 737
    url = args.url     if not url.startswith(("http://", "https://")):         url = f"https://{url}"
  • Network accessline 739
    url = f"https://{url}"

seo-audit-full/scripts/check-pagespeed.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Network accessline 8
    Usage:     python scripts/check-pagespeed.py https://example.com
  • Network accessline 9
    python scripts/check-pagespeed.py https://example.com
  • Network accessline 10
    python scripts/check-pagespeed.py https://example.com --strategy desktop
  • Network accessline 11
    python scripts/check-pagespeed.py https://example.com --category performance --category seo
  • Network accessline 12
    [Credential-related source omitted]
  • Access to secretsline 12
    [Credential-related source omitted]
  • Network accessline 40
    API_URL = "https://www.googleapis.com/pagespeedonline/v5/runPagespeed"
  • Network accessline 42
    _GET_API_KEY_URL = "https://developers.google.com/speed/docs/insights/v5/get-started"
  • Network accessline 111
    for record_type in ("A", "AAAA"):         try:             response = requests.get(
  • Network accessline 112
    try:             response = requests.get(                 "https://dns.google/resolve",
  • Network accessline 113
    response = requests.get(
  • Network accessline 114
    "https://dns.google/resolve",
  • Network accessline 137
    if url.startswith(("http://", "https://")):         return url     return f"https://{url}"
  • Network accessline 139
    return f"https://{url}"
  • Access to secretsline 144
    [Credential-related source omitted]
  • Access to secretsline 339
    [Credential-related source omitted]
  • Access to secretsline 356
    [Credential-related source omitted]
  • Access to secretsline 363
    [Credential-related source omitted]
  • Access to secretsline 396
    [Credential-related source omitted]
  • Access to secretsline 397
    [Credential-related source omitted]
  • Network accessline 399
    try:         response = requests.get(API_URL, params=params, timeout=timeout)
  • Network accessline 400
    response = requests.get(API_URL, params=params, timeout=timeout)
  • Access to secretsline 426
    [Credential-related source omitted]
  • Access to secretsline 546
    [Credential-related source omitted]
  • Access to secretsline 547
    [Credential-related source omitted]
  • Access to secretsline 549
    [Credential-related source omitted]
  • Access to secretsline 572
    [Credential-related source omitted]

seo-audit-full/scripts/check-schema.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Network accessline 9
    Usage:     python scripts/check-schema.py https://example.com
  • Network accessline 10
    python scripts/check-schema.py https://example.com
  • Network accessline 106
    try:         resp = requests.get(
  • Network accessline 107
    resp = requests.get(
  • Network accessline 560
    url = args.url or ""         if not url.startswith(("http://", "https://")):             url = f"https://{url}"
  • Network accessline 561
    if not url.startswith(("http://", "https://")):             url = f"https://{url}"         status_code, html, error = _safe_fetch(url, args.timeout)
  • Network accessline 562
    url = f"https://{url}"

seo-audit-full/scripts/check-site.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Network accessline 7
    Usage:     python check-site.py https://example.com
  • Network accessline 8
    python check-site.py https://example.com
  • Network accessline 9
    python check-site.py https://example.com --timeout 15
  • Network accessline 11
    Output example (JSON):     {       "origin": "https://example.com",
  • Network accessline 12
    {       "origin": "https://example.com",       "staging_subdomains": {
  • Network accessline 13
    "origin": "https://example.com",
  • Network accessline 23
    "disallow_all": false,         "googlebot_blocked": false,         "sitemap_directive": "https://example.com/sitemap.xml",
  • Network accessline 24
    "googlebot_blocked": false,         "sitemap_directive": "https://example.com/sitemap.xml",         "detail": "robots.txt found. No critical blocking rules detected."
  • Network accessline 25
    "sitemap_directive": "https://example.com/sitemap.xml",
  • Network accessline 94
    try:         resp = requests.get(url, headers=_DEFAULT_HEADERS, timeout=timeout, allow_redirects=True)
  • Network accessline 95
    resp = requests.get(url, headers=_DEFAULT_HEADERS, timeout=timeout, allow_redirects=True)
  • Network accessline 125
    try:         resp = requests.get(url, headers=_DEFAULT_HEADERS, timeout=timeout, allow_redirects=False)
  • Network accessline 126
    resp = requests.get(url, headers=_DEFAULT_HEADERS, timeout=timeout, allow_redirects=False)
  • Network accessline 667
    if not url.startswith(("http://", "https://")):         url = f"https://{url}"
  • Network accessline 668
    url = f"https://{url}"
  • Network accessline 675
    description="Run site-level SEO checks (robots.txt + sitemap.xml) and output JSON."     )     parser.add_argument("url", help="Target URL or domain (e.g. https://example.com)")
  • Network accessline 676
    )     parser.add_argument("url", help="Target URL or domain (e.g. https://example.com)")     parser.add_argument("--timeout", "-t", type=int, default=15, help="Request timeout in seconds")
  • Network accessline 677
    parser.add_argument("url", help="Target URL or domain (e.g. https://example.com)")

seo-audit-full/scripts/check-social.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Network accessline 8
    Usage:     python scripts/check-social.py https://example.com
  • Network accessline 9
    python scripts/check-social.py https://example.com
  • Network accessline 78
    try:         resp = requests.get(
  • Network accessline 79
    resp = requests.get(
  • Network accessline 386
    url = args.url or ""         if not url.startswith(("http://", "https://")):             url = f"https://{url}"
  • Network accessline 387
    if not url.startswith(("http://", "https://")):             url = f"https://{url}"         status_code, html, error = _safe_fetch(url, args.timeout)
  • Network accessline 388
    url = f"https://{url}"

seo-audit-full/scripts/fetch-page.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Network accessline 5
    Usage:     python fetch-page.py https://example.com
  • Network accessline 6
    python fetch-page.py https://example.com
  • Network accessline 7
    python fetch-page.py https://example.com --output page.html
  • Network accessline 8
    python fetch-page.py https://example.com --googlebot
  • Network accessline 35
    GOOGLEBOT_USER_AGENT = (     "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
  • Network accessline 36
    "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
  • Network accessline 80
    parsed = urlparse(url)     if not parsed.scheme:         url = f"https://{url}"
  • Network accessline 81
    if not parsed.scheme:         url = f"https://{url}"         parsed = urlparse(url)
  • Network accessline 82
    url = f"https://{url}"
  • Network accessline 100
    try:         session = requests.Session()
  • Network accessline 101
    session = requests.Session()

seo-audit/SKILL.md

  • Network accessline 56
    https://example.com/blog/best-tools → reports/example-com-blog-best-tools-audit.html
  • Network accessline 57
    https://example.com/                → reports/example-com-audit.html
  • Network accessline 87
    # Step 1: site-level checks (robots.txt + sitemap.xml) python scripts/check-site.py https://example.com
  • Network accessline 88
    python scripts/check-site.py https://example.com
  • Network accessline 90
    # Step 2: page-level checks (H1, title, meta description, canonical) python scripts/check-page.py https://example.com
  • Network accessline 91
    python scripts/check-page.py https://example.com
  • Network accessline 93
    python scripts/check-page.py https://example.com --keyword "running shoes"
  • Network accessline 95
    # Optional: fetch raw page HTML for further inspection python scripts/fetch-page.py https://example.com --output page.html
  • Network accessline 96
    python scripts/fetch-page.py https://example.com --output page.html
  • Network accessline 98
    # Step 3: JSON-LD schema validation python scripts/check-schema.py https://example.com # Or from previously fetched HTML (avoids redundant fetch):
  • Network accessline 99
    python scripts/check-schema.py https://example.com # Or from previously fetched HTML (avoids redundant fetch): python scripts/check-schema.py --file page.html
  • Network accessline 235
    **URL Canonicalization checks** (each is a separate sub-check):    - **HTTP→HTTPS:** fetch `http://<host>` — must 301 to `https://`. Returns 200 → Fail.
  • Network accessline 236
    - **HTTP→HTTPS:** fetch `http://<host>` — must 301 to `https://`. Returns 200 → Fail.
  • Network accessline 237
    - **www consistency:** fetch both `https://www.<host>` and `https://<host>` — one must 301 to the other. Both return 200 → Warn.
  • Network accessline 288
    python scripts/check-schema.py https://example.com

seo-audit/assets/report-template.html

  • Network accessline 467
    <td>                 <div class="detail-issue">· No Sitemap: directive — crawlers cannot auto-discover sitemap.</div>                 <div class="detail-fix">Add: Sitemap: https://example.com/sitemap.xml</div>
  • Network accessline 468
    <div class="detail-issue">· No Sitemap: directive — crawlers cannot auto-discover sitemap.</div>                 <div class="detail-fix">Add: Sitemap: https://example.com/sitemap.xml</div>               </td>
  • Network accessline 469
    <div class="detail-fix">Add: Sitemap: https://example.com/sitemap.xml</div>
  • Network accessline 508
    <td><span class="status status-fail">Fail</span></td>               <td>                 <div class="detail-issue">· http://example.com returns 200 instead of 301 → https — duplicate indexable version.</div>
  • Network accessline 509
    <td>                 <div class="detail-issue">· http://example.com returns 200 instead of 301 → https — duplicate indexable version.</div>                 <div class="detail-fix">Force 301 redirect from HTTP to HTTPS at server/CDN level.</
  • Network accessline 510
    <div class="detail-issue">· http://example.com returns 200 instead of 301 → https — duplicate indexable version.</div>
  • Network accessline 524
    <td><span class="status status-warn">Warning</span></td>               <td>                 <div class="detail-issue">· Canonical tag points to https://example.com/page but actual URL served is https://example.com/page/ — trailing slash mis
  • Network accessline 525
    <td>                 <div class="detail-issue">· Canonical tag points to https://example.com/page but actual URL served is https://example.com/page/ — trailing slash mismatch.</div>                 <div class="detail-fix">Align canonical ta
  • Network accessline 526
    <div class="detail-issue">· Canonical tag points to https://example.com/page but actual URL served is https://example.com/page/ — trailing slash mismatch.</div>
  • Network accessline 912
    <footer>   <div class="inner">     Powered by OpenSource Project - <strong><a href="https://github.com/JeffLi1993/seo-audit-skill">seo-audit-skill</a></strong> · Basic SEO Audit Report · {{generated_date}}
  • Network accessline 913
    <div class="inner">     Powered by OpenSource Project - <strong><a href="https://github.com/JeffLi1993/seo-audit-skill">seo-audit-skill</a></strong> · Basic SEO Audit Report · {{generated_date}}   </div>
  • Network accessline 914
    Powered by OpenSource Project - <strong><a href="https://github.com/JeffLi1993/seo-audit-skill">seo-audit-skill</a></strong> · Basic SEO Audit Report · {{generated_date}}

seo-audit/scripts/check-page.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Network accessline 7
    Usage:     python check-page.py https://example.com
  • Network accessline 8
    python check-page.py https://example.com
  • Network accessline 9
    python check-page.py https://example.com --timeout 20
  • Network accessline 11
    Output example (JSON):     {       "url": "https://example.com/",
  • Network accessline 12
    {       "url": "https://example.com/",       "final_url": "https://example.com/",
  • Network accessline 13
    "url": "https://example.com/",
  • Network accessline 14
    "final_url": "https://example.com/",
  • Network accessline 35
    "canonical": {         "status": "pass",         "value": "https://example.com/",
  • Network accessline 36
    "status": "pass",         "value": "https://example.com/",         "matches_final_url": true,
  • Network accessline 37
    "value": "https://example.com/",
  • Network accessline 102
    try:         session = requests.Session()
  • Network accessline 103
    session = requests.Session()
  • Network accessline 737
    url = args.url     if not url.startswith(("http://", "https://")):         url = f"https://{url}"
  • Network accessline 739
    url = f"https://{url}"

seo-audit/scripts/check-schema.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Network accessline 9
    Usage:     python scripts/check-schema.py https://example.com
  • Network accessline 10
    python scripts/check-schema.py https://example.com
  • Network accessline 106
    try:         resp = requests.get(
  • Network accessline 107
    resp = requests.get(
  • Network accessline 398
    url = args.url or ""         if not url.startswith(("http://", "https://")):             url = f"https://{url}"
  • Network accessline 399
    if not url.startswith(("http://", "https://")):             url = f"https://{url}"         status_code, html, error = _safe_fetch(url, args.timeout)
  • Network accessline 400
    url = f"https://{url}"

seo-audit/scripts/check-site.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Network accessline 7
    Usage:     python check-site.py https://example.com
  • Network accessline 8
    python check-site.py https://example.com
  • Network accessline 9
    python check-site.py https://example.com --timeout 15
  • Network accessline 11
    Output example (JSON):     {       "origin": "https://example.com",
  • Network accessline 12
    {       "origin": "https://example.com",       "robots": {
  • Network accessline 13
    "origin": "https://example.com",
  • Network accessline 17
    "disallow_all": false,         "googlebot_blocked": false,         "sitemap_directive": "https://example.com/sitemap.xml",
  • Network accessline 18
    "googlebot_blocked": false,         "sitemap_directive": "https://example.com/sitemap.xml",         "detail": "robots.txt found. No critical blocking rules detected."
  • Network accessline 19
    "sitemap_directive": "https://example.com/sitemap.xml",
  • Network accessline 81
    try:         resp = requests.get(url, headers=_DEFAULT_HEADERS, timeout=timeout, allow_redirects=True)
  • Network accessline 82
    resp = requests.get(url, headers=_DEFAULT_HEADERS, timeout=timeout, allow_redirects=True)
  • Network accessline 355
    if not url.startswith(("http://", "https://")):         url = f"https://{url}"
  • Network accessline 356
    url = f"https://{url}"
  • Network accessline 363
    description="Run site-level SEO checks (robots.txt + sitemap.xml) and output JSON."     )     parser.add_argument("url", help="Target URL or domain (e.g. https://example.com)")
  • Network accessline 364
    )     parser.add_argument("url", help="Target URL or domain (e.g. https://example.com)")     parser.add_argument("--timeout", "-t", type=int, default=15, help="Request timeout in seconds")
  • Network accessline 365
    parser.add_argument("url", help="Target URL or domain (e.g. https://example.com)")

seo-audit/scripts/fetch-page.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Network accessline 5
    Usage:     python fetch-page.py https://example.com
  • Network accessline 6
    python fetch-page.py https://example.com
  • Network accessline 7
    python fetch-page.py https://example.com --output page.html
  • Network accessline 8
    python fetch-page.py https://example.com --googlebot
  • Network accessline 35
    GOOGLEBOT_USER_AGENT = (     "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
  • Network accessline 36
    "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
  • Network accessline 80
    parsed = urlparse(url)     if not parsed.scheme:         url = f"https://{url}"
  • Network accessline 81
    if not parsed.scheme:         url = f"https://{url}"         parsed = urlparse(url)
  • Network accessline 82
    url = f"https://{url}"
  • Network accessline 100
    try:         session = requests.Session()
  • Network accessline 101
    session = requests.Session()

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: 2 facts
Signal confidence: 176 facts

and 126 more

Works with

Agent compatibility, from the files in this repository
AgentStatusEvidenceInstall to
Claude CodeCompatibleStandard SKILL.md seo-audit/SKILL.md.claude/skills/<skill-name>/
CodexCompatibleStandard SKILL.md seo-audit/SKILL.md.agents/skills/<skill-name>/
CursorCompatibleStandard SKILL.md seo-audit/SKILL.md.cursor/skills/<skill-name>/
Gemini CLICompatibleStandard SKILL.md seo-audit/SKILL.md.gemini/skills/<skill-name>/
GitHub CopilotCompatibleStandard SKILL.md seo-audit/SKILL.md.github/skills/<skill-name>/
OpenCodeCompatibleStandard SKILL.md seo-audit/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.