Technical seo geo audit
Skill ezzatmakar/ai-code-skills/skills/technical-seo-geo-audit
Agent Skills for Claude Code, Codex & OpenCode that review code for security, performance & clean code — Next.js & Laravel PR reviewers plus a stack-agnostic pre-push reviewer with a Pass/Warn/Fail scorecard.
npx -y skills add ezzatmakar/ai-code-skills --skill technical-seo-geo-auditAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 2 stars2 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Run a developer-focused technical SEO and GEO (Generative Engine Optimization) audit on a live website or a codebase, and produce one per-page README report — covering crawlability, indexability, rendering/SSR, Core Web Vitals, structured data, metadata, semantic HTML, redirects/HTTP, AI-crawler access and llms.txt — with every finding rated by severity and carrying a concrete code-level fix. Use when asked to audit SEO, check technical SEO, run an SEO health check, audit AI/LLM visibility, GEO, generative engine optimization, answer engine optimization, Core Web Vitals, render-blocking, indexability, crawlability, structured data, or "why isn't this page ranking / showing up in AI answers." Technical only — do not use for content, keyword, or editorial advice.
The file declares its own license as MIT. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.
SKILL.md
9.5 KB, as published. Nobody here has run it
Technical SEO & GEO Audit
Audit a website's technical SEO and GEO (Generative Engine Optimization) and write all results to exactly one README-style Markdown report, with findings grouped per page. Scope is strictly technical and developer-actionable:
- SEO — crawlability, indexability, rendering/SSR, Core Web Vitals, structured data, metadata, semantic HTML, HTTP/redirects, internal linking.
- GEO — how well AI assistants (ChatGPT, Claude, Perplexity, Gemini) can crawl, parse,
and cite the site: AI-crawler access,
llms.txt, SSR delivery to non-JS bots, machine- readable structured data, clean attribution.
No content, keyword, or editorial recommendations. If a check would drift into copywriting, drop it.
This is a hybrid skill: deterministic checks run in scripts/ (a Node engine) and emit
structured findings plus a baseline report; you orchestrate the rendered-DOM capture,
interpret results, and finalize the report. The single most important defect to catch is
raw-vs-rendered divergence — content that only exists after JS hydration is invisible to
non-JS search and AI crawlers.
Non-negotiable output
- Produce one report. Default path
SEO-GEO-AUDIT.mdat the working-directory root, unless the user gives another. - Group findings per page, labeled by route (
### \/pricing` — Pricing`). This is a hard requirement. - Every finding carries a severity, a technical description (what + why), the evidence found, and a copy-pasteable code-level fix.
- Mark anything a check could not verify as
Info/ "not measured" — never assert a pass/fail the checks did not actually confirm. - No content/keyword/editorial advice. Never reproduce secrets found in headers or markup.
Use assets/SEO_GEO_AUDIT_REPORT_TEMPLATE.md as the required structure and references/severity-rubric.md for severities and scoring.
Phase 0: Resolve inputs and mode
Determine these first, then echo them into the report's run-metadata table.
- Mode (auto-detect): Live URL if a base URL is given (
--url), Codebase (static) if a repo path is given (--path). URL mode is primary and the only mode that can measure rendering, headers, and Core Web Vitals. Both may be combined. - Pages. Pin specific routes with
--routes /a,/b,/c, otherwise discover viasitemap.xml+ robotsSitemap:directives, falling back to a same-origin link crawl. Cap with--max-pages(default 25). - Report path.
--out(defaultSEO-GEO-AUDIT.md). - Depth. Default Standard. Quick = homepage + a few key routes, raw + metadata + crawlability only. Deep = full page set, rendered-DOM diff on every page, CWV on all, plus a self-audit pass.
- Optional CWV source.
--psi-key <key>for PageSpeed Insights (degrade gracefully if absent — chrome-devtools MCP Lighthouse is preferred).
Phase 1: Discover pages and capture raw HTML
Resolve <skill-directory> from the loaded skill path.
- URL mode: run the crawler to discover pages and capture the raw HTML (what a non-JS
bot / AI crawler sees) plus status, redirect chain, and headers:
This writesnode <skill-directory>/scripts/crawl.mjs --url <base> [--routes /a,/b] [--max-pages 25] --out <work-dir><work-dir>/crawl.jsonand<work-dir>/raw/<slug>.html. (run.mjsin Phase 3 re-runs discovery itself, so you may skip this and go straight to Phase 2 + 3.) - Codebase mode: run
bash <skill-directory>/scripts/detect-stack.sh <repo>to identify the framework, router (Next.js App vs Pages), and SEO source files for static analysis.
Phase 2: Capture the rendered DOM (prefer MCP) — highest priority
For each discovered page, obtain the fully rendered DOM so the engine can diff it against the raw HTML. Order of preference:
- chrome-devtools MCP (preferred, no install):
navigate_pageto the URL, thenevaluate_scriptreturningdocument.documentElement.outerHTML. Save each result to<work-dir>/rendered/<slug>.htmlwhere<slug>matches the crawler's slug (the path with/→-, home →home). Capture Core Web Vitals withlighthouse_auditand write them to<work-dir>/cwv.jsonas{ "/route": { "lcp": ms, "cls": n, "inp": ms, "ttfb": ms, "source": "lighthouse" } }. - Playwright fallback (if MCP is unavailable and Playwright is installed): pass
--playwrighttorun.mjsand it renders each page itself. - Neither available: skip rendered checks. The engine still runs every raw-HTML check and
marks rendering/CWV as not measured (
Info). Warn the user that SSR parity was not confirmed.
Phase 3: Run the check engine
node <skill-directory>/scripts/run.mjs \
--url <base> [--routes …] [--max-pages 25] \
--rendered-dir <work-dir>/rendered \
[--cwv-file <work-dir>/cwv.json] [--psi-key <key>] [--playwright] \
--out SEO-GEO-AUDIT.md --work <work-dir>
Codebase mode: node <skill-directory>/scripts/run.mjs --path <repo> --out SEO-GEO-AUDIT.md.
The engine runs all checks (catalogs: references/seo-checks.md,
references/geo-checks.md), writes <work-dir>/findings.json, and
renders a baseline SEO-GEO-AUDIT.md. Check categories:
- A. Crawlability & indexability — robots, sitemap, canonical, noindex, redirects, status.
- B. Rendering / SSR — raw-vs-rendered diff (the top defect for SEO and GEO).
- C. Performance / Core Web Vitals — LCP/CLS/INP/TTFB, render-blocking, images, fonts.
- D. Metadata & structured data — title/description, OG/Twitter, viewport, JSON-LD, attrs.
- E. Semantic HTML & linking — one
<h1>, heading order, landmarks, orphan pages. - F. GEO — AI-crawler access,
llms.txt, SSR-to-non-JS-bots, machine-extractable answers.
Phase 4: Core Web Vitals
Map each metric to severity against Google's thresholds (in
references/severity-rubric.md). Prefer chrome-devtools
lighthouse_audit; PSI is the fallback. When no CWV source is available, the metric is
reported as Info ("not measured") — do not guess values.
Phase 5: Interpret and verify (guidance layer)
Read <work-dir>/findings.json and refine, do not rubber-stamp:
- Drop false positives (e.g. a heuristic flag the source disproves) and anything that drifts into content/keyword advice.
- Confirm each kept finding's evidence is real (the selector/header/measurement exists).
- Add findings the static engine cannot see but the rendered DOM reveals, keeping the same deterministic ID scheme.
- For codebase mode, label findings as static and note that URL mode is needed for rendering/CWV/live HTTP.
Phase 6: Score
The engine computes two deterministic 0–100 scores (SEO and GEO) per the rubric. Confirm they follow the evidence, then write the 5–8 line executive verdict, keyed off the lower score and any critical/high counts.
Phase 7: Write and validate the report
- Finalize
SEO-GEO-AUDIT.mdfrom assets/SEO_GEO_AUDIT_REPORT_TEMPLATE.md: run-metadata → executive summary (both scores) → site-wide findings → per-page sections labeled by route → quick-win checklist → appendix/methodology. - Validate the structure:
Fix any structural errors before finishing.python3 <skill-directory>/scripts/validate-report.py SEO-GEO-AUDIT.md - Self-audit (always in Deep, briefly in Standard): every finding has a concrete location,
real evidence, and a code-level fix; nothing asserts an unverified pass; not-measured items
are
Info; no content/keyword advice slipped in; no secrets reproduced. - In chat, return only a concise summary: the two scores, counts by severity, the top fixes, and the report path. Do not paste the whole report.
Guardrails
- The report must be trustworthy: never claim a status a check did not verify. Missing optional deps (Playwright, PSI, MCP) reduce coverage with a clear warning — they never fabricate a result and never crash the run.
- Every recommendation ships a concrete code/config snippet, not "improve X."
- Deterministic IDs (stable strings) so reports diff cleanly across runs.
- Do not modify the audited project's code unless the user explicitly asks for fixes afterward.