seo-geo
Skill0 starsChanged 8 months agoMITView on GitHub
Full SEO and GEO (Generative Engine Optimization) workflow for any project. Use when optimizing website content for search engines AND AI citation (ChatGPT, Perplexity, Google AI Overviews). Covers keyword research via DataForSEO API, competitor analysis, on-page audits, meta tag optimization, content gap analysis, GEO content optimization (quotable definitions, FAQ schema, structured data), and rank monitoring. Trigger on: SEO, GEO, keywords, search rankings, AI citations, meta tags, structured data, schema markup, content optimization, SERP analysis.
- Sends data out
55 other projects use a version of this.
Adopted by
Most recently taken up by
- seranking/seo-skillstheir own version, first seen Nov 8, 2026
- whyashthakker/estacktheir own version, first seen Nov 8, 2026
- julianosirtori/skillstheir own version, first seen Nov 8, 2026
- alpit-patel/seo-aeo-geo-kittheir own version, first seen Nov 8, 2026
- figueroaignacio/ignaciofigueroa.devtheir own version, first seen Nov 8, 2026
- theexperiencecompany/gaiatheir own version, first seen Nov 3, 2026
Used with
Projects with it also use seo-agentic, seo-competitor-pages and 10 more.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
AgriciDanielSkillseo-agentic
Audit and fix agent readiness: the Lighthouse Agentic Browsing fraction, accessibility tree for agents, robots.txt and Content-Signal for AI agents, WAF treatment of agent traffic, llms.txt, Markdown delivery, ai-catalog.json, /.well-known discovery files, and WebMCP tools. Use when the user asks whether AI agents can use or browse the site, or about llms.txt or WebMCP. Exclude AI citability and brand signals (seo-geo) and commerce protocol depth (seo-ecommerce).
Also in 5 projects that use this
megastepSkillseo-competitor-pages
Generate SEO-optimized competitor comparison and alternatives pages. Covers "X vs Y" layouts, "alternatives to X" pages, feature matrices, schema markup, and conversion optimization. Use when user says "comparison page", "vs page", "alternatives page", "competitor comparison", or "X vs Y".
Also in 21 projects that use this
megastepSkillseo-images
Image optimization analysis for SEO and performance. Checks alt text, file sizes, formats, responsive images, lazy loading, and CLS prevention. Use when user says "image optimization", "alt text", "image SEO", "image size", or "image audit".
Also in 20 projects that use this
timruebenachSkillseo-google
Google SEO APIs: Search Console (Search Analytics, URL Inspection, Sitemaps), PageSpeed Insights v5, CrUX field data with 25-week history, Indexing API v3, and GA4 organic traffic. Provides real Google field data for Core Web Vitals, indexation status, search performance, and organic traffic trends. Use when user says "search console", "GSC", "PageSpeed", "CrUX", "field data", "indexing API", "GA4 organic", "URL inspection", "google api setup", "real CWV data", "impressions", "clicks", "CTR", "position data", "LCP", "INP", "CLS", "FCP", "TTFB", or "Lighthouse scores".
Also in 13 projects that use this
timruebenachSkillseo-image-gen
AI image generation for SEO assets: OG/social preview images, blog hero images, schema images, product photography, infographics. Powered by Gemini via nanobanana-mcp. Requires banana extension installed. Use when user says \"generate image\", \"OG image\", \"social preview\", \"hero image\", \"blog image\", \"product photo\", \"infographic\", \"seo image\", \"create visual\", \"image-gen\", \"favicon\", \"schema image\", \"pinterest pin\", \"generate visual\", \"banner\", or \"thumbnail\".
Also in 12 projects that use this
- +3 more from megastep
- +4 more from timruebenach
Other versions55 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 55
- AgriciDaniel/claude-seo★ 20ksame name
- ReScienceLab/opc-skills★ 1.9ksame name
- theexperiencecompany/gaia★ 325same name
- eunomia-bpf/eunomia.dev★ 244same name
- seranking/seo-skills★ 201same name
- zhtyyx/codex-seo★ 152same name
- PostPlusAI/postplus-skills★ 27same name
- chuhaiqu/skills★ 22same name
- coopersimson96/ai-content-system★ 17same name
- whyashthakker/agent-skills-marketing★ 15same name
45 more not listed
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 repository5 other files it gives its agents.
- analytics-reviewSkill
- deep-researchSkill
- linkedin-from-meetingsSkill
- opportunity-analysisSkill
- storyline-synthesisSkill
The file
Show its rules and text
We split this skill into the rules it gives an agent
20 rules. 0 are common, 12 are distinctive, and 8 are very specific to this project.
0
Common
Most of the 50 edited versions we read keep these.
12
Distinctive
This author's own choices. Worth a look.
8
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 8
Run /seo-geo with an argument to jump to a specific phase, or run without arguments for the full workflow.
- Distinctive: line 14
Before running, detect the project context automatically:
- Very specific: line 16
Site domain: Read from the codebase (look for metadataBase, canonical URLs, or NEXT_PUBLIC_ env vars).
- Distinctive: line 17
Repo: Use the current working directory.
- Very specific: line 18
Keyword data: Look for SEO_KEYWORDS.md in the project root.
- Distinctive: line 22
Ask the user for:
- Very specific: line 28
If any of these are already documented in CLAUDE.md, SEO_KEYWORDS.md, or memory, use those instead of asking.
- Very specific: line 34
Read SEO_KEYWORDS.md first.
- Very specific: line 107
Output: Update SEO_KEYWORDS.md with fresh data.
- Distinctive: line 117
Explore competitor ecosystems: Use DataForSEO keyword suggestions seeded with competitor brand names (not just your own):
- Distinctive: line 124
Run this for each major competitor.
- Distinctive: line 135
Explore adjacent communities: Use WebSearch to find what forums, subreddits, and communities discuss topics adjacent to your product.
- Distinctive: line 137
Check non-English markets: If your product works internationally, run keyword suggestions in other languages (zh, es, ja, de, ko).
- Very specific: line 212
Read SEO_KEYWORDS.md and compare against existing pages.
- Distinctive: line 216
Look for high-volume, low-difficulty keywords with no targeting page.
- Distinctive: line 257
Every key concept needs a standalone definition block:
- Distinctive: line 318
Quotable blocks: Every 300 words, include a bold statistic or definition AI can extract.
- Distinctive: line 333
Search for the brand in ChatGPT, Perplexity, Google AI Overviews using target keywords.
- Very specific: line 337
Update SEO_KEYWORDS.md with fresh data
- Distinctive: line 341
Write new content targeting gaps
“Common” is measured: kept by at least 6 in 10 of the 50 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 Optimization
Run /seo-geo with an argument to jump to a specific phase, or run without arguments for the full workflow.
Arguments: research, audit, gaps, geo, content, monitor, or a specific page path like /pricing.
Setup
Before running, detect the project context automatically:
- Site domain: Read from the codebase (look for
metadataBase, canonical URLs, orNEXT_PUBLIC_env vars). Ask the user if unclear. - Repo: Use the current working directory.
- Keyword data: Look for
SEO_KEYWORDS.mdin the project root. Create if missing. - Framework: Detect from package.json (Next.js, Nuxt, Astro, etc.)
- DataForSEO credentials: Set
DATAFORSEO_CREDENTIALSenv var with your Base64-encodedemail:password. Get an account at dataforseo.com. Example:export DATAFORSEO_CREDENTIALS=$(echo -n 'you@email.com:yourpassword' | base64)
Ask the user for:
- Voice/tone description (if not in CLAUDE.md)
- Key competitors (domains)
- Seed keywords for research
- Brand concerns (name conflicts, etc.)
If any of these are already documented in CLAUDE.md, SEO_KEYWORDS.md, or memory, use those instead of asking.
Phase 1: Research
Read SEO_KEYWORDS.md first. If it's stale (>30 days) or doesn't exist, run these API calls.
1a. Keyword research
Pull search volume for target keywords via DataForSEO:
curl -s -X POST "https://api.dataforseo.com/v3/keywords_data/google_ads/search_volume/live" \
-H "Authorization: Basic $DATAFORSEO_CREDENTIALS" \
-H "Content-Type: application/json" \
-d '[{"keywords": [LIST], "location_code": 2840, "language_code": "en"}]'Expand with keyword suggestions:
curl -s -X POST "https://api.dataforseo.com/v3/dataforseo_labs/google/keyword_suggestions/live" \
-H "Authorization: Basic $DATAFORSEO_CREDENTIALS" \
-H "Content-Type: application/json" \
-d '[{"keyword": "SEED", "location_code": 2840, "language_code": "en", "limit": 50, "order_by": ["keyword_info.search_volume,desc"]}]'Get difficulty scores:
curl -s -X POST "https://api.dataforseo.com/v3/dataforseo_labs/google/bulk_keyword_difficulty/live" \
-H "Authorization: Basic $DATAFORSEO_CREDENTIALS" \
-H "Content-Type: application/json" \
-d '[{"keywords": [LIST], "location_code": 2840, "language_code": "en"}]'Classify intent:
curl -s -X POST "https://api.dataforseo.com/v3/dataforseo_labs/google/search_intent/live" \
-H "Authorization: Basic $DATAFORSEO_CREDENTIALS" \
-H "Content-Type: application/json" \
-d '[{"keywords": [LIST], "language_code": "en"}]'1b. Competitor keyword theft
Pull non-brand keywords from competitors:
curl -s -X POST "https://api.dataforseo.com/v3/dataforseo_labs/google/ranked_keywords/live" \
-H "Authorization: Basic $DATAFORSEO_CREDENTIALS" \
-H "Content-Type: application/json" \
-d '[{"target": "COMPETITOR_DOMAIN", "location_code": 2840, "language_code": "en", "limit": 80, "order_by": ["keyword_data.keyword_info.search_volume,desc"]}]'Filter out brand terms in post-processing.
1c. Check current rankings
curl -s -X POST "https://api.dataforseo.com/v3/dataforseo_labs/google/ranked_keywords/live" \
-H "Authorization: Basic $DATAFORSEO_CREDENTIALS" \
-H "Content-Type: application/json" \
-d '[{"target": "SITE_DOMAIN", "location_code": 2840, "language_code": "en", "limit": 50, "order_by": ["ranked_serp_element.serp_item.rank_group,asc"]}]'1d. SERP analysis for top targets
curl -s -X POST "https://api.dataforseo.com/v3/serp/google/organic/task_post" \
-H "Authorization: Basic $DATAFORSEO_CREDENTIALS" \
-H "Content-Type: application/json" \
-d '[{"keyword":"TARGET","location_code":2840,"language_code":"en","depth":20}]'Retrieve after ~60s:
curl -s "https://api.dataforseo.com/v3/serp/google/organic/task_get/advanced/TASK_ID" \
-H "Authorization: Basic $DATAFORSEO_CREDENTIALS"Output: Update SEO_KEYWORDS.md with fresh data. Summarize top opportunities.
1e. Adjacent keyword brainstorming
The steps above find keywords you already know about. This step finds keywords you haven't thought of — adjacent topics, competitor ecosystems, and broader search intents that your product intersects with but doesn't directly target.
Process:
- Map value props to broader intents. For each core feature, ask: what problem does this solve? What else do people searching for that problem also search for? Example: if your product adds iMessage to AI agents, the broader intents include "ai agent messaging", "chatbot platforms", "ai phone number", "conversational AI", "ai assistant framework comparison".
- Explore competitor ecosystems. Use DataForSEO keyword suggestions seeded with competitor brand names (not just your own):
curl -s -X POST "https://api.dataforseo.com/v3/dataforseo_labs/google/keyword_suggestions/live" \
-H "Authorization: Basic $DATAFORSEO_CREDENTIALS" \
-H "Content-Type: application/json" \
-d '[{"keyword": "COMPETITOR_NAME", "location_code": 2840, "language_code": "en", "limit": 40, "order_by": ["keyword_info.search_volume,desc"]}]'Run this for each major competitor. Look for "[competitor] alternative", "[competitor] vs", "[competitor] setup", "[competitor] pricing" patterns. These are high-intent keywords where you can insert yourself.
- Check "alternative to" and "vs" keywords. These are comparison shoppers — the highest-intent SEO traffic:
# Search volume for "[product] alternative" and "[product] vs [competitor]"
curl -s -X POST "https://api.dataforseo.com/v3/keywords_data/google_ads/search_volume/live" \
-H "Authorization: Basic $DATAFORSEO_CREDENTIALS" \
-H "Content-Type: application/json" \
-d '[{"keywords": ["PRODUCT alternative", "PRODUCT alternatives", "PRODUCT vs COMPETITOR1", "PRODUCT vs COMPETITOR2", "COMPETITOR1 alternative", "best CATEGORY 2026"], "location_code": 2840, "language_code": "en"}]'- Explore adjacent communities. Use WebSearch to find what forums, subreddits, and communities discuss topics adjacent to your product. Look for recurring questions that nobody has a good answer for — those are content opportunities.
- Check non-English markets. If your product works internationally, run keyword suggestions in other languages (zh, es, ja, de, ko). Chinese, Japanese, and Korean tech communities often search in their own language for tools that only have English documentation — creating a zero-competition content opportunity:
curl -s -X POST "https://api.dataforseo.com/v3/dataforseo_labs/google/keyword_suggestions/live" \
-H "Authorization: Basic $DATAFORSEO_CREDENTIALS" \
-H "Content-Type: application/json" \
-d '[{"keyword": "PRODUCT_NAME", "location_code": 2392, "language_code": "ja", "limit": 30, "order_by": ["keyword_info.search_volume,desc"]}]'Location codes: 2156 (China), 2392 (Japan), 2410 (South Korea), 2276 (Germany), 2724 (Spain).
Output: A "lateral opportunities" section in SEO_KEYWORDS.md with:
- Adjacent keyword clusters not covered by existing content
- Competitor ecosystem keywords you can target
- Non-English keyword opportunities
- Recommended blog posts or pages for each cluster
Phase 2: Technical SEO Audit
2a. On-page crawl
curl -s -X POST "https://api.dataforseo.com/v3/on_page/task_post" \
-H "Authorization: Basic $DATAFORSEO_CREDENTIALS" \
-H "Content-Type: application/json" \
-d '[{"target": "SITE_DOMAIN", "max_crawl_pages": 50, "max_crawl_depth": 3, "load_resources": true, "enable_javascript": true, "calculate_keyword_density": true, "validate_micromarkup": true, "check_spell": true}]'Get summary:
curl -s -X POST "https://api.dataforseo.com/v3/on_page/summary" \
-H "Authorization: Basic $DATAFORSEO_CREDENTIALS" \
-H "Content-Type: application/json" \
-d '[{"id": "TASK_ID"}]'Get page-level issues:
curl -s -X POST "https://api.dataforseo.com/v3/on_page/pages" \
-H "Authorization: Basic $DATAFORSEO_CREDENTIALS" \
-H "Content-Type: application/json" \
-d '[{"id": "TASK_ID", "limit": 50}]'2b. Codebase audit (no API needed)
For each page in the codebase, check:
| Check | What to verify |
<title> | 50-60 chars, primary keyword + brand, unique per page |
<meta description> | 140-160 chars, includes primary + secondary keyword |
| OG tags | og:title, og:description, og:image set and unique |
| Twitter card | twitter:card, twitter:title, twitter:description |
| Canonical URL | Set via alternates.canonical or <link rel="canonical"> |
| H1 | Exactly one per page |
| JSON-LD | Structured data present (Organization, FAQPage, SoftwareApplication, Article) |
| Internal links | Blog posts link to sign-up, pages cross-link |
| Image alt text | All images have descriptive alt attributes |
| robots.txt | Exists at public/robots.txt |
| Sitemap | Exists or generated by framework |
2c. Fix meta tags
Rules:
- Title: 50-60 chars, primary keyword + brand. Format:
[Page Name] — [Keyword Phrase] | Brand - Description: 140-160 chars, include primary + secondary keyword naturally
- H1 can stay editorial — meta title does the SEO work
Phase 3: Content Gap Analysis
3a. Map keywords to pages
Read SEO_KEYWORDS.md and compare against existing pages. For each keyword cluster, identify whether a page targets it.
3b. Identify missing content
Look for high-volume, low-difficulty keywords with no targeting page. Common gaps:
- Missing /blog index page
- Missing /pricing page (if pricing exists but isn't a standalone page)
- Missing comparison pages (vs. competitors)
- Missing "how to" / tutorial content
- Missing /about page
3c. Plan new content
For each gap, define: target keyword, page title, audience, word count, internal links.
Phase 4: GEO Optimization
GEO = Generative Engine Optimization. Making content appear in AI-generated answers (ChatGPT, Perplexity, Google AI Overviews, Claude).
4a. GEO audit of existing pages
For each page, score these factors (1-10):
| Factor | What to check |
| Clear definitions | Key terms defined in 25-50 word standalone blocks? |
| Quotable statements | Specific, citeable facts with sources? |
| Factual density | Stats with numbers, units, sources? |
| Q&A format | Content answers "What is X?" / "How does X work?" directly? |
| Authority signals | Expert credentials, citations, first-party data? |
| Structure | Tables, numbered lists, clear headings matching query intent? |
AI engine preferences:
| Engine | Priorities |
| Google AI Overview | Direct answer in first 150 words, tables, FAQ schema, JSON-LD |
| ChatGPT Browse | Specific facts, expert quotes, freshness, .edu/.gov trust |
| Perplexity | Freshness bias, quotable standalone statements, primary sources |
| Claude | Authoritative definitions, verifiable facts, reasoning transparency |
4b. Add quotable definitions
Every key concept needs a standalone definition block:
Template: **[Term]** is [clear category] that [primary function], [key characteristic].
4c. Add FAQ schema
For pages targeting commercial/informational keywords:
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "What is [term]?",
"acceptedAnswer": {
"@type": "Answer",
"text": "[25-50 word definition from the page]"
}
}
]
}4d. Add Organization schema
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "BRAND_NAME",
"url": "https://SITE_DOMAIN",
"description": "DESCRIPTION",
"email": "CONTACT_EMAIL"
}4e. CORE-EEAT GEO checklist
| ID | Standard | Check |
| C02 | Direct answer in first 150 words | Does the page answer its primary query immediately? |
| C04 | Key terms defined on first use | Are technical terms defined inline? |
| C09 | Structured FAQ | Does the page have a Q&A section? |
| O02 | Summary box / key takeaways | Is there a TL;DR? |
| O03 | Data in tables, not prose | Are comparisons in table format? |
| O05 | JSON-LD schema markup | Is structured data present? |
| R01 | 5+ precise data points with units | Are there specific numbers? |
| R04 | Claims backed by evidence | Is every claim sourced? |
| R07 | Full entity names | No "a company" — always use the brand name |
| E01 | Original first-party data | Are own benchmarks/stats shared? |
| Exp10 | Limitations acknowledged | Is scope stated honestly? |
| Ept08 | Reasoning transparency | Are choices explained? |
Phase 5: Content Creation
Writing SEO+GEO optimized content
- First 150 words: Direct answer to the primary query. Include target keyword and standalone definition.
- Body: H2 headings matching question-format queries. Each section 3-5 sentences. Comparisons in tables, processes in numbered lists.
- Quotable blocks: Every 300 words, include a bold statistic or definition AI can extract.
- Citations: At least 1 external citation per 500 words.
- FAQ section: 3-5 questions matching long-tail keywords.
- Internal links: Descriptive anchor text (not "click here").
Phase 6: Monitor
6a. Track rankings
Re-run ranked_keywords query monthly. Compare against previous SEO_KEYWORDS.md.
6b. Check AI citations
Search for the brand in ChatGPT, Perplexity, Google AI Overviews using target keywords.
6c. Iterate
- Update SEO_KEYWORDS.md with fresh data
- Identify keywords moving up/down
- Find new long-tail opportunities
- Refresh stale content (update dates, stats)
- Write new content targeting gaps
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.

