jeffli1993/seo-audit-skill/seo-audit
Claude Code and agent skill by jeffli1993/seo-audit-skill
- community
Checking that the SKILL.md file is still in the repository.
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.
Install
npx vskill@latest install jeffli1993/seo-audit-skill/seo-auditSKILL.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
If the user wants more depth, upgrade to seo-audit-full:
Tip: For deep technical audits, advanced on-page SEO, or full reports, use theseo-audit-fullskill.
Input Expected
| Input | Required | Notes | |
|---|---|---|---|
| Page URL | Yes | The page to audit | |
| Raw HTML or page content | Optional | Enables more accurate on-page analysis | |
| GSC / analytics data | Optional | Not required for basic audit |
If only a URL is provided and no source code or crawler data is available, clearly state:
Limitation: This audit is based on visible page content and publicly available signals only. Source code, GSC data, crawl logs, and performance metrics are not available for this audit.
Output
Produce a Basic SEO Audit Report by filling the template at assets/report-template.html, then save it to a file — never print raw HTML to the terminal.
File naming: reports/<hostname>-<slug>-audit.html
After saving, tell the user:
If yes → run: open reports/example-com-audit.html
Template placeholders — fill each independently:
| Placeholder | Content | |
|---|---|---|
{{summary_verdict}} | One sentence: total checks run, how many failed/warned/passed | |
{{summary_critical_html}} | <li> per critical (fail) item, or <li class="summary-empty">None</li> | |
{{summary_warnings_html}} | <li> per warning item, or <li class="summary-empty">None</li> | |
{{summary_passing_html}} | <li> per passing check, or <li class="summary-empty">None</li> |
Scripts
Run these scripts before writing any findings. They output structured JSON — use the JSON directly as evidence; do not re-fetch the same URLs manually.
Dependencies: pip install requests (html parsing uses Python stdlib)
Each script exits with code 0 (all pass/warn) or 1 (any fail/error).
STRICT SCOPE — do not add any check not listed below. No exceptions.
Allowed site-level checks (in {{site_checks_html}}):
- robots.txt · sitemap.xml · 404 Handling · URL Canonicalization · i18n / hreflang
Allowed E-E-A-T checks (in {{eeat_checks_html}}):
- About Us · Contact · Privacy Policy · Terms of Service · Media/Partners (only if present)
Contact logic (Contact row only):
- A dedicated
/contactpage is not required - Pass if contact is reachable via any of: dedicated contact page (HTTP 200) · About page with contact details · footer/nav mailto, email, social links, or contact form
- Fail only when no contact pathway exists anywhere on the site
- Missing
/contactalone is not a fail when About or footer/nav already expose contact info
Allowed page-level checks (in {{page_checks_html}}), output in this exact order: URL Slug · Title Tag · Meta Description · H1 Tag · Canonical Tag · Image Alt Text · Word Count · Keyword Placement · Heading Structure · Internal Links · Schema (JSON-LD)
Image Alt Text logic:
- Parse <img> tags from static HTML
- Pass: all images have non-empty alt (decorative images with alt="" are OK)
- Warn: any content image missing alt attribute
- Unverified (status-info): 0 images found in static HTML → likely JS-rendered, cannot verify
⛔ HARD RULE — Output ONLY the check rows defined in report-template.html. If a check is not in the allowed lists above, do NOT output it — not even if you find issues. No exceptions. No "bonus" checks. No improvisation. The template is the single source of truth. Treat it as a strict whitelist.
Still BANNED (belong to seo-audit-full): OG tags · Twitter Card · Social tags · Page Weight · Core Web Vitals · Robots Meta
How to use the JSON output:
- Map each field's
status→pass/warn/fail/errordirectly to the report check table - Use each field's
detailstring as the starting point for the Evidence line in findings - Do not contradict the script output unless you have additional observable evidence
- Separate check groups with
<div class="subsection-label">Label</div>inside{{site_checks_html}}:
Crawlability · URL Canonicalization · i18n / hreflang · Schema (JSON-LD) and <div class="subsection-label">E-E-A-T Trust Pages</div> before {{eeat_checks_html}}
LLM review — mandatory when `llm_review_required: true`:
The script flags fields that require semantic or quality judgment it cannot perform. Never leave llm_review_required: true unresolved — always make an explicit judgment call.
H1 — triggered when `keyword_match == "partial"`:
Title — triggered when `keyword_match == "partial"` OR `keyword_position != "start"`:
URL Slug — triggered when `keyword_match != "full"` or `is_homepage == false`:
Meta Description — always triggered when content is present:
Recommended Workflow
Follow these steps in order:
- Acknowledge scope — confirm this is a basic audit; note any missing data
- Infer primary keyword — fetch the page with
fetch-page.py, then determine the primary keyword:
- If the user explicitly provided a keyword → use it directly
- If not → read the page H1, title, and first paragraph, then infer the single most likely
target keyword phrase (what would a searcher type to find this page?)
- State the inferred keyword explicitly before running checks:
> "Inferred primary keyword: open source claude alternatives"
- Run `check-site.py` — parse the JSON output for robots, sitemap, 404 handling, and URL canonicalization
404 check: fetch <origin>/this-page-definitely-does-not-exist-seo-audit-check
- Returns 404 → Pass · Returns 200 (soft 404) → Fail · Returns 301 to homepage → Warn
URL Canonicalization checks (each is a separate sub-check):
- HTTP→HTTPS: fetch
http://<host>— must 301 tohttps://. Returns 200 → Fail. - www consistency: fetch both
https://www.<host>andhttps://<host>— one must 301 to the other. Both return 200 → Warn. - Trailing slash: compare the URL actually served vs the canonical tag on the page. Mismatch → Warn.
- Canonical match: canonical tag href must exactly match the final URL after all redirects. Mismatch → Warn.
- E-E-A-T infrastructure check — for each trust page below, check two layers:
- Layer 1 — Exists: fetch the URL, check HTTP status (200 = exists, 404/redirect = missing)
- Layer 2 — Reachable: fetch homepage HTML, check if footer or nav contains a link to this page
| Page | Required | |
|---|---|---|
| About Us | Yes | |
| Contact | Yes — see Contact-specific rules below | |
| Privacy Policy | Yes | |
| Terms of Service | Yes | |
| Media / Partners | No — include only if present |
Status rules (About, Privacy, Terms, Media/Partners):
- Page missing (non-200) → Fail
- Page exists but not linked in footer/nav → Warn
- Page exists and linked in footer/nav → Pass
- Optional page missing → skip, do not include row
Contact-specific rules — a dedicated /contact page is optional:
- Try common paths (
/contact,/contact-us) — HTTP 200 counts as Exists - If no contact page, check the About page body for email, social, or contact details
- Also scan homepage footer and nav for
mailto:, visible email, social links, or a contact form - Exists Pass if any contact pathway is found (dedicated page, About, or footer/nav contact details)
- Exists Fail only when no contact information is found anywhere
- Reachable Pass if a contact page link or contact details appear in footer/nav
- Reachable Warn if contact is only reachable inside About page content, not directly in footer/nav
- Do not recommend creating
/contactwhen About or footer already expose contact info — note the existing pathway instead
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 95 of 100Pattern checks on the skill's files.
- Model reviewPassed
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingseo-audit/SKILL.md
Popularity
- Repository stars
- 532
- Repository forks
- 69
- 7-day trend score
- 31
Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/jeffli1993/seo-audit-skill/seo-audit)