auditing-website-seo-geo

Audits a site's SEO and AI-search (GEO) readiness — meta tags, Open Graph/Twitter, JSON-LD, robots/llms conventions — and generates fixes. Use when reviewing search visibility, social previews, struct

SKILL.md

GitHub

Website SEO & GEO Audit

Target: $ARGUMENTS

Audits a site for traditional SEO and Generative-Engine Optimization (GEO — visibility in AI search such as ChatGPT, Perplexity, Gemini, and Google AI Overviews) and generates implementable fixes. Prefer configuring the site or static-site generator so tags are emitted once (DRY) over hand-stuffing meta into every page. No over-analysis.

Audit Areas

Core meta

  • <title> (30-60 chars, unique per page), <meta name="description"> (120-160 chars, entity-clear), lang on <html>, charset, viewport (no maximum-scale — it blocks zoom), robots, author, keywords, format-detection, and a canonical link.

Open Graph & Twitter Card

  • og:title, og:description, og:url, og:type, og:site_name, og:image.
  • twitter:card, twitter:title, twitter:description, twitter:image, twitter:site, twitter:creator.

Structured data (JSON-LD)

  • WebSite / Organization (name, url, logo, sameAs) and per-page Article / BlogPosting (headline, description, datePublished, author, publisher, image). Validate against the matching schema.org type.

GEO / AI-search

  • robots.txt AI user-agents (GPTBot, ClaudeBot, Google-Extended, CCBot, PerplexityBot, OAI-SearchBot) — the highest-leverage, best-honored lever.
  • llms.txt at root — cheap, uncertain adoption; fine to keep.
  • Entity clarity, key info in the first ~160 chars, Q&A-friendly phrasing, explicit brand / product / service names.

Static-site-generator pitfalls (verify, do not assume)

  • Do not double-emit. If an SSG plugin emits OG/Twitter/JSON-LD (e.g. jekyll-seo-tag, Next SEO), do NOT also hand-write those tags — duplicates result. Configure the plugin instead.
  • Plugins emit conditionally. Twitter Card tags often need a configured handle; twitter:description and og:image / twitter:image may not be emitted without explicit config or a per-page image. Fill only the genuine gaps in a single shared include.

Known-unwinnable conflicts (flag, do not chase)

Some checkers want mutually-exclusive lengths on a single shared tag:

  • og:title 25-35 vs twitter:title 50-70 — same tag, cannot satisfy both.
  • og:description 55-65 vs <meta name="description"> 120-160 — same tag.

Recommend the real-world optimum (Google limits plus GEO: a ~50-char title and a ~150-char description) and note the tradeoff rather than ping-ponging.

Reality check

  • ai.txt / /.well-known/ai.txt is not a recognized standard (competing vendor proposals, no IANA .well-known registration, no major adopter). Skip it; do not spend effort on /.well-known/ai.txt.
  • A complete robots.txt AI-agent policy plus a full OG/JSON-LD set are what actually move GEO and social previews.

Workflow

  1. Identify scope from $ARGUMENTS (URL, file, or directory). For a URL, fetch the rendered <head> — converting tools return markdown, so fetch raw HTML when you need the tags verbatim.
  2. Inventory the tags present versus the audit areas above; detect duplicates.
  3. Classify findings: HIGH (title, description, canonical, OG core), MEDIUM (Twitter, JSON-LD, keywords), LOW (format-detection, author).
  4. Generate fixes — prefer SSG config plus a single shared include over per-page tags.
  5. Verify by re-fetching the built output, not the raw templates.

Output Format

Findings

HIGH
- [Tag/issue] - Current: [value or "missing"] - Page: [url/path]
  Fix: [code/config snippet]

MEDIUM / LOW
- [Tag/issue] - Current: [value or "missing"]
  Fix: [code/config snippet]

Implementation Checklist

- [ ] [Fix] - Impact: [High/Medium/Low] - scope: [site-wide | per-page]

Rules

  • Configure once (DRY); do not hand-stuff tags an SSG already emits.
  • Flag mutually-exclusive checker targets instead of chasing impossible green.
  • Optimize for real engines and GEO, not vanity checker scores.
  • Every finding includes a concrete, implementable fix.
  • Keep output concise: findings + fixes + checklist only.

Further Reading