seo-audit-full
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.
By jeffli1993 · 454 installs
npx skills add jeffli1993/seo-audit-skill --skill seo-audit-full
Source repository · Upstream listing
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"
"technical SEO audit"
"deep audit"
"comprehensive SEO review"
"audit everything"
URL only requests are valid. When external datasets are not supplied, run the
full public signal workflow and clearly note missing data sources in the report.
Input Expected
Input Required Notes
Page URL Yes The primary page to audit
Primary keyword Recommended Improves content relevance scoring
PageSpeed API key Yes Required for full audit PageSpeed checks. Ask at the start and do not run PageSpeed without it.
Raw HTML or page content Optional Enables more accurate content checks when supplied
GSC / crawl / analytics data Optional Include when supplied, otherwise mark unavailable
Competitor benchmark data Optional Include when supplied
At the start of a full audit, ask the user for a PageSpeed Insights API key:
Do not run seo audit full PageSpeed checks without a PageSpeed API key supplied
by api key , PAGESPEED API KEY , or GOOGLE PAGESPEED API KEY . If the key is
missing, stop and ask the user to configure it instead of rendering a full report
with missing PageSpeed data.
Architecture: Full = Core + Performance + Advanced
Output
Produce an Advanced Full SEO Audit Report by filling the template at
[assets/report template.html](assets/report template.html),
then save it to a file — never print raw HTML to the terminal .
File naming: reports/<hostname <slug full audit.html
After saving, tell the user:
If yes → run: open reports/example com full 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 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
{{pagespeed checks html}} Full PageSpeed module using check pagespeed.py output
{{site checks html}} Site level check tables
{{eeat checks html}} E E A T trust page table
{{page checks html}} Page level check tables, including full only additions
{{priority actions html}} Ordered priority action list
{{insights html}} Optional finding walkthrough cards
Scripts
Run full scripts from this directory. All output is structured JSON — use it
directly as evidence.
Dependencies: pip install requests
Phase 1: Core scripts
Phase 2: Full only scripts
Each script exits with code 0 (all pass/warn) or 1 (any fail/error).
PageSpeed can take 200 seconds. Use a 180 second timeout by default. If it
still times out, mark the Page Speed module as error and state that the
PageSpeed API timed out; do not treat that as confirmed page performance failure.
If PageSpeed fails because Google returns a quota/API key error after a key was
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".
Scope — Full Audit Check Whitelist
Full runs its own core checks plus the full only items marked ★ below.
Site Level Checks (in {{site checks html}} )
Core checks:
Sitemap URL Inventory · Staging Subdomain Indexation · robots.txt · sitemap.xml · 404 Handling · URL Canonicalization · i18n / hreflang
Staging Subdomain Indexation rules:
Check common staging/test hosts before robots.txt: test. , staging. , dev. , preview. , beta. , uat.
Fail when a staging/test subdomain is publicly accessible, closely mirrors the production site, and is not protected by authentication, noindex , or a blocking robots.txt .
Warn when a staging/test subdomain is publicly accessible but similarity or index protection cannot be confirmed.
Pass when no public staging/test subdomain is detected, or detected staging hosts are protected by authentication, non 200 access, noindex , or Disallow: / .
Explain the impact as duplicate indexable pages: Google may treat test.example.com and www.example.com as separate but near identical URLs, splitting ranking signals and competing with the production site.
Recommended fixes: add Basic Auth/password protection first; also block crawlers on the staging host with User agent: + Disallow: / ; add page level noindex if pages can still be accessed.
Sitemap URL Inventory rules:
Place this as the first module in {{site checks html}} , before the Crawlability table.
Render it as its own table with columns: Directory · URL Count · Page Type · Example Page.
Use check site.py sitemap inventory output to summarize first level directories, URL counts, inferred page types, and one representative example URL.
Treat this as a site level map, not a pass/fail single page SEO audit.
Use status info unless sitemap URLs cannot be parsed; do not penalize a site for having many or few URLs in a directory without deeper evidence.
Always include a next step note: the user can continue with deeper full audits by selecting representative sample URLs from major directories such as /blog/ , /tools/ , /alternatives/ , /templates/ , or /use cases/ .
Page Speed Checks (in {{pagespeed checks html}} )
Full only:
Lighthouse category scores: Performance · Accessibility · Best Practices · SEO
Lab metrics: FCP · LCP · TBT · CLS · Speed Index
Final URL and screenshot availability
E E A T Checks (in {{eeat checks html}} )
Core checks:
About Us · Contact · Privacy Policy · Terms of Service · Media/Partners (only if present)
Contact logic (Contact row only):
A dedicated /contact page 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 /contact alone is not a fail when About or footer/nav already expose contact info
E E A T infrastructure rules — two layers per trust page:
Layer 1 — Exists: HTTP 200 for the trust page URL (Contact uses Contact specific rules above)
Layer 2 — Reachable: linked from footer or main nav
Page Required
About Us Yes
Contact Yes — dedicated page optional; About or footer/nav contact details satisfy this
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:
1. Try common paths ( /contact , /contact us ) — HTTP 200 counts as Exists
2. If no contact page, check the About page body for email, social, or contact details
3. Also scan homepage footer and nav for mailto: , visible email, social links, or a contact form
4. Exists Pass if any contact pathway is found
5. Exists Fail only when no contact information is found anywhere
6. Reachable Pass if a contact page link or contact details appear in footer/nav
7. Reachable Warn if contact is only reachable inside About page content, not directly in footer/nav
8. Do not recommend creating /contact when About or footer already expose contact info
Page Level Checks (in {{page checks html}} ), output in this exact order:
Core checks:
URL Slug · Title Tag · Meta Description · H1 Tag · Canonical Tag · Image Alt Text ·
Word Count · Keyword Placement · Heading Structure · Internal Links · Schema (JSON LD)
Schema (JSON LD) rules:
Treat Schema as a quality check, not only a presence check.
Validate JSON LD parseability, expected @type , required fields, recommended rich result fields, nested fields, and primary type conflicts.
Fail when JSON LD is invalid, the expected schema type is missing, required fields are missing, or localized schema clearly points to the wrong language/URL.
Warn when recommended fields are missing, nested fields are incomplete, multilingual pages lack inLanguage , or localized schema cannot be fully confirmed.
Pass only when the expected schema type is present, required fields are present, no conflicts are found, and localized schema matches the current page language/URL when applicable.
For multilingual pages, each language version should have its own schema with matching inLanguage , language specific headline/description where present, and url / mainEntityOfPage pointing to the current localized canonical URL.
★ Full only additions:
OG Tags — og:title, og:description, og:image, og:type, og:url presence and validity
Twitter Card — twitter:card type, title/description/image (with OG fallback detection)
How to Use Script JSON Output
Same rules across full audit modules — map each field's status directly to the report check table:
status → pass / warn / fail / error → badge in report
detail → starting point for Evidence line
Do not contradict script output unless you have additional observable evidence
For check site.py output:
staging subdomains.status → Staging Subdomain Indexation row status
staging subdomains.detail → Staging Subdomain Indexation row detail
staging subdomains.public hosts → evidence for public staging/test hosts
staging subdomains.similar hosts → fail evidence for production like staging duplicates
robots.status → robots.txt row status
sitemap.status → sitemap.xml row status
sitemap inventory.status → Sitemap URL Inventory module status
sitemap inventory.directories[] → table rows with path , url count , page type , and example url
sitemap inventory.detail → short explanatory note below the inventory table
For check schema.py output:
status → Schema (JSON LD) row status
detail → Schema (JSON LD) row detail
parse errors → fail evidence for malformed JSON LD
schemas[].fields missing → fail evidence for missing required schema fields
schemas[].recommended missing and schemas[].nested issues → warning evidence
localized schema.status → language/URL alignment status for multilingual schema
localized schema.issues → evidence for schema language or URL mismatch
For check social.py output:
og.status → OG Tags row status
twitter card.status → Twitter Card row status
og.fields. → individual field details for the detail cell
twitter card.fields. → individual field details, note fallback fields
For check pagespeed.py output:
status → overall Page Speed status
category status → Lighthouse Scores badge status
metric status → Core Lab Metrics badge status
final url → Final URL line
categories.performance.score → Performance score
categories.accessibility.score → Accessibility score
categories["best practices"].score → Best Practices score
categories.seo.score → SEO score
compact metrics.fcp.display value → FCP
compact metrics.lcp.display value → LCP
compact metrics.tbt.display value → TBT
compact metrics.cls.display value → CLS
compact metrics.si.display value → Speed Index
screenshot truthy → Screenshot available
Do not use overall status for the Lighthouse Scores badge. Category scores use
Lighthouse thresholds: 90–100 pass, 50–89 warn, 0–49 fail. Example: Performan