seo-geo-audit
Skill0 starsChanged 19 days agoMITView on GitHub
Audit a frontend codebase for both classical SEO (meta tags, semantic HTML, structured data, sitemaps) and GEO (Generative Engine Optimization — how easily LLMs can extract, cite, and reason about your content). Reads HTML, JSX, TSX, MDX, Astro, Vue, and Svelte source files; produces a markdown report card with file:line citations and concrete fixes. Use when the user asks for an SEO audit, GEO audit, LLM-friendliness check, structured data review, or invokes /audit, /seo-geo, /seo-geo-audit.
8 other projects use a version of this.
Adopted by
Most recently taken up by
- FernandoGomes83/seo-geo-audittheir own version, first seen Nov 1, 2026
- ISOpeet/oosterwal-seo-geotheir own version, first seen Oct 25, 2026
- techsaurabh-394/claude-skillstheir own version, first seen Oct 25, 2026
- mfraunhofer/claude-skillstheir own version, first seen Oct 20, 2026
- Thibaultbm/claude-seo-geotheir own version, first seen Oct 13, 2026
- zeebees/seo-geo-audittheir own version, first seen Oct 3, 2026
Other versions8 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 8
- Thibaultbm/claude-seo-geo★ 18same name
- zeebees/seo-geo-audit★ 14same name
- jgoullet/seo-geo-audit★ 4same name
- techsaurabh-394/claude-skills★ 3same name
- tomimor/skills★ 2same name
- FernandoGomes83/seo-geo-audit★ 1same name
- ISOpeet/oosterwal-seo-geo★ 0same name
- mfraunhofer/claude-skills★ 0same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository8 other files it gives its agents.
- llms.txtllms.txt
- bpmnemonicSkill
- break-timeSkill
- llms-txtSkill
- memoriaSkill
- poet-commitSkill
- repo-badgesSkill
- vibeasfuncSkill
The file
We split this skill into the rules it gives an agent
5 rules. 0 are common, 1 is distinctive, and 4 are very specific to this project.
0
Common
Most of the 8 edited versions we read keep these.
1
Distinctive
This author's own choices. Worth a look.
4
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 51
Not session-based. One-shot.
- Very specific: line 70
If the llms-txt skill is installed, recommend running it when GEO findings include "missing llms.txt".
- Very specific: line 76
Read-only by default: Only fix mode proposes edits, and every edit needs confirmation.
- Very specific: line 78
Don't assume framework conventions: Check package.json first. A pages/ folder means different things in Next vs Nuxt vs Gatsby vs vanilla.
- Very specific: line 80
Skip generated/build artifacts: Don't audit dist/, build/, .next/, out/, .nuxt/.
“Common” is measured: kept by at least 6 in 10 of the 8 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
seo-geo-audit
Audit a frontend repository for classical SEO (the things Google's crawler cares about) and GEO — Generative Engine Optimization, the things LLMs care about when they read your content. Outputs a markdown report card with severities, file:line citations, and concrete fixes.
The novel value is GEO. Classical SEO scanners have existed for years. But "is your site easy for a language model to extract, cite, and reason about?" is a question only Claude can really answer — because Claude is the consumer.
Invocation
The only slash command is /seo-geo-audit. Claude Code derives it from the
skill's directory name, so /audit and /seo-geo do not exist as commands and
will not autocomplete. They do work as natural-language triggers — they are
listed in the description frontmatter, so "run an audit" or "check my
structured data" will reach this skill.
The argument is a mode, not a target
/seo-geo-audit audits the current working directory. It reads source from
disk and never fetches a URL, so a domain name is not a valid argument — see
Safety guardrails. To audit a different checkout, pass its path.
| Invocation | Behavior |
/seo-geo-audit | Standard audit of the cwd: SEO + GEO, root-level + key routes, ~30 files max |
/seo-geo-audit deep | Walk all routes/pages discoverable in the repo. Slower, more thorough |
/seo-geo-audit seo | Classical SEO only |
/seo-geo-audit geo | GEO only |
/seo-geo-audit fix | Audit, then propose concrete file edits for each high-severity finding (ask before each edit) |
/seo-geo-audit report.md | Write the report to a file instead of showing it inline |
/seo-geo-audit ../other-site | Audit that path instead of the cwd. Pass it through to every script as the repo-root argument they already accept |
/seo-geo-audit json | Also write seo-geo-audit.json — the canonical machine-readable result |
/seo-geo-audit csv | Also write seo-geo-audit.csv, one row per occurrence. Implies json |
/seo-geo-audit sarif | Also write seo-geo-audit.sarif for GitHub code scanning. Implies json |
| Natural language: "audit this site for SEO", "is this LLM-friendly", "check my structured data" | Same |
Modes combine where it makes sense: /seo-geo-audit deep geo report.md runs a
deep GEO-only audit and writes it to report.md, and the output formats stack
freely — /seo-geo-audit deep json csv sarif produces all three alongside the
markdown. The markdown report is always produced; formats are additive, never a
replacement for it. A token that is neither a
known mode nor an existing directory is an error — say so rather than silently
auditing the cwd, which is how a domain name ends up looking like a successful
run over the wrong repository.
Stop / disable
Not session-based. One-shot. Just don't invoke it.
Execution flow
Paths below (scripts/, playbook/, checks/ and the rest) are relative to this skill's directory, ${CLAUDE_SKILL_DIR}, not to the working directory, which is the user's project. Run a script as bash "${CLAUDE_SKILL_DIR}/scripts/<name>.sh" and read reference files from the same place.
- Detect framework by reading
package.json. Look fornext,astro,nuxt,svelte-kit,remix,gatsby,vite,vue, or fall back to plain HTML. The framework determines file globs and where pages live (pages/,app/,src/routes/,src/pages/,content/, etc.). - Discover content sources via
scripts/discover.sh <framework>. - Extract
<head>content and structured data viascripts/extract-head.shandscripts/find-jsonld.sh. For JSX/TSX, look for<Head>,<Helmet>,<Metadata>, or framework-specific patterns (Next.jsmetadataexports, Astro frontmatter, NuxtuseHead). Probe AI-discovery files viascripts/check-ai-files.sh. - Run checks. Each check from
checks/seo.mdandchecks/geo.mdis a piece of Claude reasoning over the extracted data — not a regex. That's the point: classical scanners can tell you the meta tag exists; only Claude can tell you whether the description is good. - Score citability of 3–5 representative content blocks per audited route using
checks/citability.md. Report median + per-block scores. - Score robots.txt against the AI crawler tiers in
checks/ai-crawlers.mdfor the GEO-003 finding. - Score per category using
checks/scoring.md. Letter grade + numeric score per category. - Render the report from
templates/report-card.md, filling in findings with file:line citations, severities, and fix suggestions. - If any format token was given, write the canonical JSON first, conforming to
schema/audit-result.schema.json, then derive the others withscripts/render-formats.py audit.json --csv --sarif. Never hand-write the CSV or SARIF — deriving them is what keeps the three from disagreeing. The script validates before writing and refuses on failure; a validation error means the audit is wrong (a deduction off the ladder, a score that does not reproduce from its own findings), so fix the JSON rather than reaching for--no-validate. - If
fixmode: for each high-severity finding, propose a concrete edit using the standard preview-then-apply pattern. For missing JSON-LD findings, start from the matching template inschema/, fill placeholders from page source, and never leave a{{PLACEHOLDER}}in inserted code. Never apply without user confirmation.
Cross-skill awareness
If the llms-txt skill is installed, recommend running it when GEO findings include "missing llms.txt".
Do not point at skills that may not exist. This audit covers SEO and GEO; say so plainly and leave it there. Accessibility overlaps at the edges — alt text carries SEO-015 and GEO-028 weight — but those are scored here on their own terms, and the report should not imply a companion audit is available.
Safety guardrails
- Read-only by default. Only
fixmode proposes edits, and every edit needs confirmation. - Don't fetch the live site. Audit the source repo. Live-site auditing is Lighthouse / PageSpeed territory — different tools, different concerns.
- Don't assume framework conventions. Check
package.jsonfirst. Apages/folder means different things in Next vs Nuxt vs Gatsby vs vanilla. - Never modify policy files (
robots.txt,noaimeta tags,llms.txt) without explicit user request — those are stakeholder decisions, not technical ones. - Skip generated/build artifacts. Don't audit
dist/,build/,.next/,out/,.nuxt/. Audit source. - Cap deep audits. Even in
deepmode, refuse to scan more than ~500 files without a--no-limitconfirmation.
Files in this skill
SKILL.md— this filechecks/seo.md— classical SEO checklist with severitieschecks/geo.md— GEO checklist (the novel checks)checks/citability.md— five-dimension scoring rubric for individual content blocks (referenced from GEO-CIT-* checks)checks/ai-crawlers.md— tier-based reference of 14 AI crawlers (GPTBot, ClaudeBot, PerplexityBot, etc.) with allow/block rationale (referenced from GEO-003)checks/scoring.md— how findings map to a 0–100 grade per categorytemplates/report-card.md— markdown template for the final reportschema/— JSON-LD templates (organization,article,local-business,product,software-application,website-searchaction,faqpage,howto) used byfixmode to insert structured datascripts/discover.sh— find frontend source files by frameworkscripts/extract-head.sh— pull<head>content from HTML/JSX/MDXscripts/find-jsonld.sh— extract<script type="application/ld+json">blocksscripts/render-formats.py— derive CSV and SARIF from the canonical audit JSON, validating the scoring rules first (Python 3.8+, stdlib only)schema/audit-result.schema.json— the canonical machine-readable result shapescripts/check-ai-files.sh— probe forllms.txt,llms-full.txt,ai-plugin.json,ai.txt,indexnow-key.txtexamples/good-site-report.md— example report on a well-optimized siteexamples/bad-site-report.md— example report on a typical greenfield site
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

