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
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
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
Individual skills in this repository
- seo-audit
seo-audit - seo-audit-full
seo-audit-full
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 tokensAlways available to the agent
SKILL.md
4,241 tokensWhen the skill is activated
Reference documents
1,453 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- When to Use This Skill
- Input Expected
- Output
- Scripts
- Recommended Workflow
- Report Detail Writing Rules
- Mandatory Finding Format
- Upgrade Prompt
- Reference Files
Scripts executed separately
scripts/check-page.pyscripts/check-schema.pyscripts/check-site.pyscripts/fetch-page.py
Files
SKILL.mdcore17,656 bytesSKILL.mdcore17,656 bytesSKILL.mdcore17,656 bytesSKILL.mdcore17,656 bytesSKILL.mdcore17,656 bytesSKILL.mdcore17,656 bytesassets/report-template.htmlasset34,709 bytesreferences/REFERENCE.mddoc6,244 bytesscripts/check-page.pyruns29,178 bytesscripts/check-schema.pyruns14,291 bytesscripts/check-site.pyruns13,144 bytesscripts/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 GitHubseo-audit-full
When your agent uses it
Advanced full SEO audit skill. Runs its own full workflow from local scripts, including the basic SEO checks plus PageSpeed, social metadata, and advanced review modules when available.
What it loads into context
Frontmatter
64 tokensAlways available to the agent
SKILL.md
4,535 tokensWhen the skill is activated
Reference documents
2,083 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- When to Use This Skill
- Input Expected
- Architecture: Full = Core + Performance + Advanced
- Output
- Scripts
- Scope — Full Audit Check Whitelist
- How to Use Script JSON Output
- LLM Review Instructions
- Recommended Workflow
- Report Detail Writing Rules
- Mandatory Finding Format
- Reference Files
Scripts executed separately
scripts/check-page.pyscripts/check-pagespeed.pyscripts/check-schema.pyscripts/check-site.pyscripts/check-social.pyscripts/fetch-page.py
Files
SKILL.mdcore20,450 bytesSKILL.mdcore20,450 bytesSKILL.mdcore20,450 bytesassets/report-template.htmlasset48,877 bytesreferences/REFERENCE.mddoc9,028 bytesscripts/check-page.pyruns29,178 bytesscripts/check-pagespeed.pyruns19,023 bytesscripts/check-schema.pyruns20,637 bytesscripts/check-site.pyruns27,097 bytesscripts/check-social.pyruns13,886 bytesscripts/fetch-page.pyruns6,639 bytes
Read SKILL.md
# seo-audit-full — Advanced Full SEO Audit
This skill runs a full single-page SEO audit from the `seo-audit-full` directory.
It does not route to `seo-audit` when only a URL is provided.
---
## When to Use This Skill
Use `seo-audit-full` when the user asks for:
- "seo-audit-full"
- "full SEO audit"
- "advanced SEO audit"View the complete source on GitHubSkills 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
- #817 on Oct 11
- #848 on Oct 13
- #860 on Oct 14
- #885 on Oct 20
- #898 on Oct 21
- #883 since Oct 23
34 earlier periods
- #722 on Aug 2
- #680 on Aug 8
- #712 on Aug 10
- #718 on Aug 12
- #708 on Aug 13
- #701 on Aug 14
- #675 on Aug 15
- #697 on Aug 16
- #710 on Aug 20
- #718 on Aug 21
- #742 on Aug 24
- #749 on Aug 25
- #731 on Aug 26
- #771 on Aug 28
- #705 on Aug 29
- #711 on Aug 30
- #747 on Aug 31
- #760 on Sep 1
- #752 on Sep 3
- #729 on Sep 4
- #713 on Sep 5
- #755 on Sep 7
- #775 on Sep 10
- #748 on Sep 11
- #747 on Sep 12
- #778 on Sep 14
- #768 on Sep 15
- #759 on Sep 20
- #744 on Sep 25
- #748 on Sep 26
- #782 on Sep 27
- #802 on Sep 28
- #810 on Oct 6
- #869 on Oct 8
Before you install
Network or broad shellAutomated 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:1Analysis incomplete: Referenced executable target unavailable; not analyzedseo-audit/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedseo-audit/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedseo-audit/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedseo-audit/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedseo-audit-full/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedseo-audit-full/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzed
- No broad tool permissions
- No dangerous shell commands
- 201 network referencesin 14 files: seo-audit-full/assets/report-template.html:683 seo-audit-full/SKILL.md:50 seo-audit-full/scripts/check-site.py:7 and 11 more
- No hidden or obfuscated text
- No instruction overrides
- 10 executable scriptsin 10 files: seo-audit-full/scripts/check-page.py:1 seo-audit-full/scripts/check-pagespeed.py:1 seo-audit-full/scripts/check-schema.py:1 and 7 more
- 14 references to secretsin 3 files: seo-audit-full/scripts/check-pagespeed.py:12 seo-audit-full/SKILL.md:58 seo-audit-full/assets/report-template.html:677
- No requests to vote in Hot
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
- Contacts www.googleapis.com, which SKILL.md, the README and the plugin manifest do not mentionseo-audit-full/scripts/check-pagespeed.py:40High confidence
- Contacts dns.google, which SKILL.md, the README and the plugin manifest do not mentionseo-audit-full/scripts/check-pagespeed.py:114High confidence
Signal confidence: 176 facts
- Network access in code of the SKILL.mdseo-audit-full/SKILL.md:50High confidence
- Network access in code of the SKILL.mdseo-audit-full/SKILL.md:51High confidence
- Access to secrets in prose of the SKILL.mdseo-audit-full/SKILL.md:58Low confidence
- Network access in code of the SKILL.mdseo-audit-full/SKILL.md:104High confidence
- Network access in code of the SKILL.mdseo-audit-full/SKILL.md:105High confidence
- Network access in code of the SKILL.mdseo-audit-full/SKILL.md:142High confidence
- Network access in code of the SKILL.mdseo-audit-full/SKILL.md:143High confidence
- Network access in code of the SKILL.mdseo-audit-full/SKILL.md:145High confidence
- Network access in code of the SKILL.mdseo-audit-full/SKILL.md:146High confidence
- Network access in code of the SKILL.mdseo-audit-full/SKILL.md:148High confidence
- Network access in code of the SKILL.mdseo-audit-full/SKILL.md:149High confidence
- Network access in code of the SKILL.mdseo-audit-full/SKILL.md:158High confidence
- Network access in code of the SKILL.mdseo-audit-full/SKILL.md:159High confidence
- Network access in code of the SKILL.mdseo-audit-full/SKILL.md:163High confidence
- Network access in code of the SKILL.mdseo-audit-full/SKILL.md:165High confidence
- Network access in prose of the SKILL.mdseo-audit-full/SKILL.md:174Low confidence
- Network access in prose of the SKILL.mdseo-audit-full/SKILL.md:176Low confidence
- Network access in prose of the SKILL.mdseo-audit-full/SKILL.md:334Low confidence
- Network access in prose of the SKILL.mdseo-audit-full/SKILL.md:335Low confidence
- Executable script in code of a file that runsseo-audit-full/scripts/check-page.py:1High confidence
- Network access in prose of a file that runsseo-audit-full/scripts/check-page.py:7Low confidence
- Network access in prose of a file that runsseo-audit-full/scripts/check-page.py:8Low confidence
- Network access in prose of a file that runsseo-audit-full/scripts/check-page.py:9Low confidence
- Network access in prose of a file that runsseo-audit-full/scripts/check-page.py:11Low confidence
- Network access in prose of a file that runsseo-audit-full/scripts/check-page.py:12Low confidence
- Network access in prose of a file that runsseo-audit-full/scripts/check-page.py:13Low confidence
- Network access in prose of a file that runsseo-audit-full/scripts/check-page.py:14Low confidence
- Network access in prose of a file that runsseo-audit-full/scripts/check-page.py:35Low confidence
- Network access in prose of a file that runsseo-audit-full/scripts/check-page.py:36Low confidence
- Network access in prose of a file that runsseo-audit-full/scripts/check-page.py:37Low confidence
- Network access in code of a file that runsseo-audit-full/scripts/check-page.py:102High confidence
- Network access in code of a file that runsseo-audit-full/scripts/check-page.py:103High confidence
- Network access in code of a file that runsseo-audit-full/scripts/check-page.py:737High confidence
- Network access in code of a file that runsseo-audit-full/scripts/check-page.py:739High confidence
- Executable script in code of a file that runsseo-audit-full/scripts/check-pagespeed.py:1High confidence
- Network access in prose of a file that runsseo-audit-full/scripts/check-pagespeed.py:8Low confidence
- Network access in prose of a file that runsseo-audit-full/scripts/check-pagespeed.py:9Low confidence
- Network access in prose of a file that runsseo-audit-full/scripts/check-pagespeed.py:10Low confidence
- Network access in prose of a file that runsseo-audit-full/scripts/check-pagespeed.py:11Low confidence
- Network access in prose of a file that runsseo-audit-full/scripts/check-pagespeed.py:12Low confidence
- Access to secrets in prose of a file that runs: a variable, placeholder or call, not a stored valueseo-audit-full/scripts/check-pagespeed.py:12Low confidence
- Network access in code of a file that runsseo-audit-full/scripts/check-pagespeed.py:40High confidence
- Network access in code of a file that runsseo-audit-full/scripts/check-pagespeed.py:42High confidence
- Network access in code of a file that runsseo-audit-full/scripts/check-pagespeed.py:111High confidence
- Network access in code of a file that runsseo-audit-full/scripts/check-pagespeed.py:112High confidence
- Network access in code of a file that runsseo-audit-full/scripts/check-pagespeed.py:113High confidence
- Network access in code of a file that runsseo-audit-full/scripts/check-pagespeed.py:114High confidence
- Network access in code of a file that runsseo-audit-full/scripts/check-pagespeed.py:137High confidence
- Network access in code of a file that runsseo-audit-full/scripts/check-pagespeed.py:139High confidence
- Access to secrets in code of a file that runsseo-audit-full/scripts/check-pagespeed.py:144High confidence
and 126 more
Works with
| Agent | Status | Evidence | Install to |
|---|---|---|---|
| Claude Code | Compatible | Standard SKILL.md seo-audit/SKILL.md | .claude/skills/<skill-name>/ |
| Codex | Compatible | Standard SKILL.md seo-audit/SKILL.md | .agents/skills/<skill-name>/ |
| Cursor | Compatible | Standard SKILL.md seo-audit/SKILL.md | .cursor/skills/<skill-name>/ |
| Gemini CLI | Compatible | Standard SKILL.md seo-audit/SKILL.md | .gemini/skills/<skill-name>/ |
| GitHub Copilot | Compatible | Standard SKILL.md seo-audit/SKILL.md | .github/skills/<skill-name>/ |
| OpenCode | Compatible | Standard 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.