Not in the top 1,000 by GitHub stars
Thibaultbm/claude-seo-geo
SEO & GEO skills for Claude Code, built with Claude Mythos 5. Rank in Google AND in LLMs (ChatGPT, Perplexity, Gemini): technical audits, backlinks, AI-optimized content, local SEO, and social amplification.
History
Review weekly changes to SKILL.md before updating. Dates mark the weeks in which we observed each version; checks apply to the recorded commits.
View weekly changes
skills/geo-tracking/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Network or broad shell
e5052284128d → 8100c788cab9
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → e5052284128d
No earlier version was observed for comparison.
skills/geo-visibility/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Network or broad shell
e5052284128d → 8100c788cab9
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → e5052284128d
No earlier version was observed for comparison.
skills/seo-ai-site-builders/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Network or broad shell
e5052284128d → 8100c788cab9
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → e5052284128d
No earlier version was observed for comparison.
skills/seo-audit-pdf/SKILL.md
Week of Nov 2, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 8100c788cab9
No earlier version was observed for comparison.
skills/seo-backlinks/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Network or broad shell
e5052284128d → 8100c788cab9
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → e5052284128d
No earlier version was observed for comparison.
skills/seo-content-blog/SKILL.md
Week of Nov 2, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
e5052284128d → 8100c788cab9
A local comparison is unavailable. You can inspect the recorded versions on GitHub.
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → e5052284128d
No earlier version was observed for comparison.
skills/seo-content-collection-page/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Network or broad shell
e5052284128d → 8100c788cab9
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → e5052284128d
No earlier version was observed for comparison.
skills/seo-content-comparison-page/SKILL.md
Week of Nov 2, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
e5052284128d → 8100c788cab9
A local comparison is unavailable. You can inspect the recorded versions on GitHub.
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → e5052284128d
No earlier version was observed for comparison.
skills/seo-content-homepage/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Network or broad shell
e5052284128d → 8100c788cab9
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → e5052284128d
No earlier version was observed for comparison.
skills/seo-content-product-page/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Network or broad shell
e5052284128d → 8100c788cab9
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → e5052284128d
No earlier version was observed for comparison.
skills/seo-content-service-page/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Network or broad shell
e5052284128d → 8100c788cab9
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → e5052284128d
No earlier version was observed for comparison.
skills/seo-geo-audit/SKILL.md
Week of Nov 2, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
e5052284128d → 8100c788cab9
A local comparison is unavailable. You can inspect the recorded versions on GitHub.
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → e5052284128d
No earlier version was observed for comparison.
skills/seo-internal-linking/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Network or broad shell
e5052284128d → 8100c788cab9
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → e5052284128d
No earlier version was observed for comparison.
skills/seo-keyword-research/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Network or broad shell
e5052284128d → 8100c788cab9
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → e5052284128d
No earlier version was observed for comparison.
skills/seo-local/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Network or broad shell
e5052284128d → 8100c788cab9
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → e5052284128d
No earlier version was observed for comparison.
skills/seo-page-sections/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Network or broad shell
e5052284128d → 8100c788cab9
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → e5052284128d
No earlier version was observed for comparison.
skills/seo-schema-markup/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Network or broad shell
e5052284128d → 8100c788cab9
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → e5052284128d
No earlier version was observed for comparison.
skills/seo-technical/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Network or broad shell
e5052284128d → 8100c788cab9
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → e5052284128d
No earlier version was observed for comparison.
skills/seo-traffic-drop/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Network or broad shell
e5052284128d → 8100c788cab9
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → e5052284128d
No earlier version was observed for comparison.
skills/social-amplification/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Network or broad shell
e5052284128d → 8100c788cab9
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → e5052284128d
No earlier version was observed for comparison.
Verified commit 8100c788cab93cb9148396ab520d0c7693d26ae3
git clone --filter=blob:none --no-checkout https://github.com/Thibaultbm/claude-seo-geo.git .hotskills/thibaultbm-claude-seo-geo && git -C .hotskills/thibaultbm-claude-seo-geo checkout --detach 8100c788cab93cb9148396ab520d0c7693d26ae3
# Copy each selected skill directory from .hotskills/thibaultbm-claude-seo-geo into .claude/skills/<skill-name>/git clone --filter=blob:none --no-checkout https://github.com/Thibaultbm/claude-seo-geo.git .hotskills/thibaultbm-claude-seo-geo && git -C .hotskills/thibaultbm-claude-seo-geo checkout --detach 8100c788cab93cb9148396ab520d0c7693d26ae3
# Copy each selected skill directory from .hotskills/thibaultbm-claude-seo-geo into .agents/skills/<skill-name>/Heat
3.1- Star growth, last 7 daysNot available
- Star growth, last 24 hoursNot available
- Rank movement, last 7 daysNot available
- Commits, last 30 daysNot available
- Accounts asking about it through MCP, last 7 daysNot available
- Hot votes this weekNot available
Heat never changes the order by stars, and sponsorship never touches it. How heat works
Stars over time
30-day change not yet available: not enough history.
Individual skills in this repository
- geo-tracking
skills/geo-tracking - geo-visibility
skills/geo-visibility - seo-ai-site-builders
skills/seo-ai-site-builders - seo-audit-pdf
skills/seo-audit-pdf - seo-backlinks
skills/seo-backlinks - seo-content-blog
skills/seo-content-blog - seo-content-collection-page
skills/seo-content-collection-page - seo-content-comparison-page
skills/seo-content-comparison-page - seo-content-homepage
skills/seo-content-homepage - seo-content-product-page
skills/seo-content-product-page - seo-content-service-page
skills/seo-content-service-page - seo-geo-audit
skills/seo-geo-audit - seo-internal-linking
skills/seo-internal-linking - seo-keyword-research
skills/seo-keyword-research - seo-local
skills/seo-local - seo-page-sections
skills/seo-page-sections - seo-schema-markup
skills/seo-schema-markup - seo-technical
skills/seo-technical - seo-traffic-drop
skills/seo-traffic-drop - social-amplification
skills/social-amplification
How it works
geo-tracking
When your agent uses it
Measure AI visibility without paid tools or API keys. Input: your site (GA4 and server logs) and a buyer prompt panel. Output: GA4 AI-traffic reporting (custom channel group plus referrer regex above Referral), monthly brand mention rate, citation rate, and share of voice versus competitors across ChatGPT, Perplexity, AI Overviews, Claude, and Gemini, plus verified AI-crawler hits from logs. Repo reference for measurement. Use to track AI traffic, monitor brand mentions, run prompt tracking, compute share of voice, or build a monthly GEO report.
What it loads into context
Frontmatter
156 tokensAlways available to the agent
SKILL.md
4,937 tokensWhen the skill is activated
Reference documents
186,115 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Company knowledge first (Obsidian)
- When to use this skill
- Workflow
- Reading the signals together
- Rules and thresholds
- Output format
- Common mistakes
- Cross-references
- Sources
Scripts executed separately
../seo-ai-site-builders/scripts/render_check.py../seo-audit-pdf/scripts/render_pdf.py../seo-geo-audit/scripts/page_benchmark.py../seo-geo-audit/scripts/seo_audit.py../seo-internal-linking/scripts/site_crawl.py../seo-page-sections/scripts/section_audit.py../seo-traffic-drop/scripts/content_decay.py../seo-traffic-drop/scripts/gsc_diff.py
Files
../../.claude-plugin/marketplace.jsonasset1,300 bytes../../.claude-plugin/plugin.jsonasset1,157 bytesSKILL.mdcore22,031 bytesSKILL.mdcore22,031 bytesSKILL.mdcore22,031 bytesevals/evals.jsonasset3,854 bytes../geo-visibility/SKILL.mddoc26,488 bytes../geo-visibility/evals/evals.jsonasset4,408 bytes../geo-visibility/evals/evals.jsonasset4,408 bytes../seo-ai-site-builders/SKILL.mddoc23,294 bytes../seo-ai-site-builders/evals/evals.jsonasset4,364 bytes../seo-ai-site-builders/references/builder-matrix.mddoc7,227 bytes../seo-ai-site-builders/references/prerender-recipes.mddoc8,511 bytes../seo-ai-site-builders/scripts/render_check.pyruns16,822 bytes../seo-audit-pdf/SKILL.mddoc7,525 bytes../seo-audit-pdf/assets/report-template.htmlasset12,182 bytes../seo-audit-pdf/scripts/render_pdf.pyruns5,152 bytes../seo-backlinks/SKILL.mddoc32,982 bytes../seo-backlinks/evals/evals.jsonasset3,575 bytes../seo-backlinks/evals/evals.jsonasset3,575 bytes../seo-backlinks/references/link-spot-categories.mddoc13,392 bytes../seo-content-blog/SKILL.mddoc48,163 bytes../seo-content-blog/evals/evals.jsonasset7,764 bytes../seo-content-blog/references/blog-templates.mddoc13,605 bytes../seo-content-collection-page/SKILL.mddoc40,169 bytes../seo-content-collection-page/evals/evals.jsonasset5,545 bytes../seo-content-collection-page/references/faceted-navigation-playbook.mddoc5,686 bytes../seo-content-comparison-page/SKILL.mddoc35,323 bytes../seo-content-comparison-page/evals/evals.jsonasset6,607 bytes../seo-content-comparison-page/evals/evals.jsonasset6,607 bytes../seo-content-comparison-page/references/comparison-page-patterns.mddoc11,496 bytes../seo-content-homepage/SKILL.mddoc35,078 bytes../seo-content-homepage/evals/evals.jsonasset4,334 bytes../seo-content-homepage/references/block-library.mddoc12,312 bytes../seo-content-product-page/SKILL.mddoc40,681 bytes../seo-content-product-page/evals/evals.jsonasset5,631 bytes../seo-content-product-page/references/product-page-blueprint.mddoc7,156 bytes../seo-content-service-page/SKILL.mddoc39,824 bytes../seo-content-service-page/evals/evals.jsonasset6,362 bytes../seo-content-service-page/references/service-page-wireframe.mddoc10,585 bytes../seo-geo-audit/SKILL.mddoc17,101 bytes../seo-geo-audit/evals/evals.jsonasset2,099 bytes../seo-geo-audit/references/audit-checklist.mddoc28,536 bytes../seo-geo-audit/references/common-page-spec.mddoc6,610 bytes../seo-geo-audit/references/output-templates.mddoc4,798 bytes../seo-geo-audit/scripts/page_benchmark.pyruns12,375 bytes../seo-geo-audit/scripts/seo_audit.pyruns82,831 bytes../seo-internal-linking/SKILL.mddoc20,877 bytes../seo-internal-linking/evals/evals.jsonasset5,086 bytes../seo-internal-linking/evals/evals.jsonasset5,086 bytes../seo-internal-linking/scripts/site_crawl.pyruns22,342 bytes../seo-keyword-research/SKILL.mddoc24,225 bytes../seo-keyword-research/evals/evals.jsonasset4,137 bytes../seo-local/SKILL.mddoc43,873 bytes../seo-local/evals/evals.jsonasset6,525 bytes../seo-local/references/gbp-reinstatement.mddoc3,426 bytes../seo-local/references/location-page-template.mddoc4,012 bytes../seo-page-sections/SKILL.mddoc29,308 bytes../seo-page-sections/evals/evals.jsonasset5,630 bytes../seo-page-sections/evals/evals.jsonasset5,630 bytes../seo-page-sections/references/page-type-matrix.mddoc21,306 bytes../seo-page-sections/references/section-library.mddoc21,028 bytes../seo-page-sections/references/site-archetypes.mddoc14,794 bytes../seo-page-sections/references/transverse-pages.mddoc9,615 bytes../seo-page-sections/scripts/section_audit.pyruns26,678 bytes../seo-schema-markup/SKILL.mddoc26,064 bytes../seo-schema-markup/evals/evals.jsonasset4,329 bytes../seo-schema-markup/evals/evals.jsonasset4,329 bytes../seo-schema-markup/evals/evals.jsonasset4,329 bytes../seo-schema-markup/references/jsonld-templates.mddoc8,737 bytes../seo-technical/SKILL.mddoc31,482 bytes../seo-technical/evals/evals.jsonasset5,771 bytes../seo-technical/evals/evals.jsonasset5,771 bytes../seo-technical/references/ai-crawlers.mddoc7,362 bytes../seo-traffic-drop/SKILL.mddoc22,767 bytes../seo-traffic-drop/evals/evals.jsonasset4,731 bytes../seo-traffic-drop/references/drop-patterns.mddoc8,569 bytes../seo-traffic-drop/references/investigation-protocol.mddoc6,287 bytes../seo-traffic-drop/scripts/content_decay.pyruns10,263 bytes../seo-traffic-drop/scripts/gsc_diff.pyruns25,207 bytes../social-amplification/SKILL.mddoc25,987 bytes../social-amplification/evals/evals.jsonasset5,105 bytes
Read SKILL.md
# GEO Tracking: Measuring AI Visibility
AI visibility is measurable today, for free, at three layers of the funnel. Each layer answers a different question:
| Layer | Data source | Question it answers | Lag |
|---|---|---|---|
| Traffic | GA4 | How many visits and conversions do AI assistants send? | Trailing (after the click) |
| Answers | Prompt panel | What do AI engines say about the brand when buyers ask? | Current state |
| Retrieval | Server logs | Are AI systems reading the pages right now? | Leading (before citations appear) |
Run all three. GA4 alone undercounts structurally, panels alone miss revenue proof, logs alone say nothing about what answers contain. The combination is the measurement system; paid platforms are an optional layer on top, never the starting point.
This skill is the canonical measurement reference in this repo. Build the prompt panel with seo-keyword-research; act on the gaps with geo-visibility.
View the complete source on GitHubgeo-visibility
When your agent uses it
Get cited and recommended by AI engines (ChatGPT, AI Overviews and AI Mode, Perplexity, Claude, Gemini). Input: a page or piece of content. Output: passage-level citability fixes (answer-first H2 blocks, self-contained chunks, definitions, sourced stats, comparison tables), a 5-pillar GEO score (0-100), an AI-crawler visibility check, and entity plus third-party consistency. Repo reference for citability. Use for GEO, AEO, LLM SEO, AI citations, citability, llms.txt, entity SEO, or why competitors appear in AI answers and you do not.
What it loads into context
Frontmatter
168 tokensAlways available to the agent
SKILL.md
6,059 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Company knowledge first (Obsidian)
- Definitions
- When to use this skill
- How each AI engine selects sources
- Workflow
- Rules and thresholds
- Dead tactics and myths
- Output format
- Common mistakes
- Cross-references
- Sources
Files
SKILL.mdcore26,488 bytesSKILL.mdcore26,488 bytesSKILL.mdcore26,488 bytesSKILL.mdcore26,488 bytesSKILL.mdcore26,488 bytesSKILL.mdcore26,488 bytesevals/evals.jsonasset4,408 bytes
Read SKILL.md
# GEO Visibility: Getting Cited by AI Engines
Generative Engine Optimization (GEO) is the work of becoming a source AI engines retrieve, quote, and recommend. This skill is the canonical reference in this repo for passage-level citability rules: when another skill needs "how to write so AI engines cite it", the rules live here.
One framing governs everything below: AI engines do not rank 1000 pages, they sample a short list of sources per subquery and quote passages from them. That changes the job from "rank the page" to "make every passage quotable and make the brand legible everywhere models look". GEO sits on top of SEO, never instead of it: a page that is not indexed cannot be retrieved, and a page that is not retrieved cannot be cited.
## Company knowledge first (Obsidian)
If the working environment contains an Obsidian vault or any local knowledge base (a folder of .md notes, often with a .obsidian directory), read the relevant notes before acting: brand and product facts, target keywords, competitors, and the SEO action log of what was already tried. Ground every recommendation in that context instead of asking the user for facts the vault already holds. At the end of the session, append the actions taken to the vault's SEO action log so the next session starts informed.
## Definitions
- GEO (Generative Engine Optimization): the practice of earning citations and recommendations inside AI-generated answers.
- AEO (Answer Engine Optimization): an earlier name for the same goal; treat the terms as interchangeable.View the complete source on GitHubseo-ai-site-builders
When your agent uses it
Turn a JavaScript-only site built by an AI website generator into indexable HTML. Input: a site made with Lovable, Base44, Bolt, v0, Replit, Firebase Studio, Framer, Wix, Durable, Softr, Bubble, Glide or any similar tool. Output: proof of what crawlers actually receive (bundled zero-dependency script), the right conversion route (native SSR, build-time prerendering or SSG, framework migration, or crawler-only prerendering as a last resort), the HTML each page must serve, and the routing, status code and hosting config that goes with it. Use when a vibe-coded or AI-generated site is not indexed, shows an empty page in view-source, has meta tags that only appear after JavaScript runs, is invisible to ChatGPT and Perplexity, or when picking a builder before starting.
What it loads into context
Frontmatter
218 tokensAlways available to the agent
SKILL.md
5,287 tokensWhen the skill is activated
Reference documents
3,516 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Company knowledge first (Obsidian)
- When to use this skill
- The fact that decides everything
- Workflow
- Rules and thresholds
- GEO layer
- Output format
- Common mistakes
- Sources
Scripts executed separately
scripts/render_check.py
Files
SKILL.mdcore23,294 bytesSKILL.mdcore23,294 bytesSKILL.mdcore23,294 bytesevals/evals.jsonasset4,364 bytesreferences/builder-matrix.mddoc7,227 bytesreferences/prerender-recipes.mddoc8,511 bytesscripts/render_check.pyruns16,822 bytes
Read SKILL.md
# AI-generated sites: rewrite the JavaScript into HTML
AI website generators produce a working site in minutes and, by default, most of them produce a client-rendered single page app: the server returns an almost empty HTML document plus a JavaScript bundle, and the browser builds the page afterwards. That is fine for a logged-in app and disqualifying for anything meant to be found.
The fix is never an SEO plugin or a meta tag component. It is changing what the server returns. This skill establishes what crawlers currently receive, picks the cheapest route to real HTML, and specifies the HTML those pages must serve.
One warning that shapes the whole workflow: the platforms move fast and their status changes. Lovable shipped server-side rendering for new apps in May 2026, Base44 started serving prerendered snapshots to crawlers in mid-2026. Never answer from a platform's reputation or from a blog post; fetch the URL and read the response. Step 1 exists for that reason.
## Company knowledge first (Obsidian)
If the working environment contains an Obsidian vault or any local knowledge base (a folder of .md notes, often with a .obsidian directory), read the relevant notes before acting: brand and product facts, the stack already in use, past migration decisions, and the SEO action log of what was already tried. Ground every recommendation in that context instead of asking the user for facts the vault already holds. At the end of the session, append the actions taken to the vault's SEO action log so the next session starts informed.
## When to use this skill
View the complete source on GitHubseo-audit-pdf
When your agent uses it
Turn a finished SEO + GEO audit into a client-ready PDF report with a fixed, polished layout. Input: the findings of an audit (usually from seo-geo-audit and the skills it hands off to). Output: one A4 PDF where no block is ever split across two pages, with a verdict, measured strengths, top priorities, every finding by category, an ordered action plan with no dates or delays, what was not verified, and the method. Use when an audit must be sent as a PDF, attached to an email, forwarded to a developer, or when the user asks for an audit report, a PDF audit, or a client deliverable.
What it loads into context
Frontmatter
175 tokensAlways available to the agent
SKILL.md
1,845 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Hard rules (a report that breaks one is not sent)
- Inputs
- Workflow
- Report structure
- Design system (already in the template)
- Common mistakes
Scripts executed separately
scripts/render_pdf.py
Files
SKILL.mdcore7,525 bytesassets/report-template.htmlasset12,182 bytesscripts/render_pdf.pyruns5,152 bytes
Read SKILL.md
# SEO + GEO audit report (PDF)
The audit skills find the problems. This skill packages them into the document the client actually reads, forwards to a developer, and judges the agency on. A correct audit in an ugly or confusing PDF loses the sale: the layout is part of the deliverable.
## Hard rules (a report that breaks one is not sent)
1. **No dates, no delays, no schedule.** Never write when an action will be done or how long it takes: no "week 1", "month 2", "in 3 weeks", "by Q1", no "When" or "Timeline" column, no Gantt, no effort-in-days. Fixes can be shipped very fast today (AI-assisted development, template-level changes), so any delay printed in the report is false and caps the client's ambition. Order replaces dates: the action plan is numbered by impact, and that order is the only sequencing. The only date allowed is the date the audit was run.
2. **Nothing is ever cut across two pages.** Every unit of meaning (a finding, a priority, a KPI row, an action, a section heading with its first block) is atomic: if it does not fit in the space left on the page, it moves whole to the next page. White space at the bottom of a page is fine; a finding split in two is not. The template enforces this with `break-inside: avoid` on every block and `break-after: avoid` on every heading; never put findings in a long `<table>` (rows split badly), use the card components.
3. **Every claim is measured.** Each number comes from the audit data (scripts, browser check, PageSpeed, Search Console, owner data). What was not measured goes in "Not verified", never in the findings.
4. **Writing rules:** language of the site; no em dash (U+2014) or en dash (U+2013), commas, colons or parentheses instead; compact numbers and amounts (3000€, 98/100, 45%); numbered lists written `1.` `2.`; every technical term explained in plain words the first time it appears (the PDF is forwarded to people who are not SEO experts); no acronym left unexplained.
5. **The owner's own recommendations are included.** If the user added recommendations to the email or notes that accompany the audit, they appear in the PDF too, in the right finding and in the action plan, so the email and the PDF never contradict each other.
## Inputs
View the complete source on GitHubseo-backlinks
When your agent uses it
Plan and run off-page SEO to earn links and brand mentions, including for AI visibility. Input: a site, niche, and competitors. Output: a link strategy and 90-day plan, a profile review without paid tools, ninja linking, digital PR on proprietary data, broken-link building, linkable assets, and unlinked-mention conversion. Use for backlinks, link building, netlinking, domain authority, anchor text, guest posts, digital PR, disavow or toxic links, or evaluating a single link opportunity.
What it loads into context
Frontmatter
146 tokensAlways available to the agent
SKILL.md
7,197 tokensWhen the skill is activated
Reference documents
3,022 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Company knowledge first (Obsidian)
- When to use this skill
- Strategy doctrine
- Workflow
- What works in 2026, what is dead
- Ninja linking methodology
- GEO layer: mentions over links
- Output format
- Common mistakes
- Sources
Files
SKILL.mdcore32,982 bytesSKILL.mdcore32,982 bytesSKILL.mdcore32,982 bytesSKILL.mdcore32,982 bytesSKILL.mdcore32,982 bytesSKILL.mdcore32,982 bytesevals/evals.jsonasset3,575 bytesreferences/link-spot-categories.mddoc13,392 bytes
Read SKILL.md
# SEO Backlinks: Strategy, Acquisition, and Brand Mentions
Most SEO tooling stops at link analysis: it tells you what your profile looks like and leaves you alone for the hard part. This skill covers the hard part: how to actually acquire links and brand mentions, by hand, with a defensible strategy, without a paid tool subscription and without an outreach agency.
It operates on a dual objective that defines off-page SEO in 2026:
1. **Links for Google.** Backlinks remain a major ranking factor in classic organic search.
2. **Mentions everywhere for LLMs.** Brand mentions (linked or not) correlate roughly 3x more strongly with visibility in AI answers than backlinks do. Ahrefs measured this across 75,000 brands: correlation of 0.664 for brand mentions versus 0.218 for backlinks against AI Overview presence (https://ahrefs.com/blog/ai-overview-brand-correlation/).
Every action this skill recommends should serve at least one of those two objectives, and the best actions serve both: a profile on a well-known platform is a link for Google and a citation surface for ChatGPT.
## Company knowledge first (Obsidian)
If the working environment contains an Obsidian vault or any local knowledge base (a folder of .md notes, often with a .obsidian directory), read the relevant notes before acting: brand and product facts, target keywords, competitors, and the SEO action log of what was already tried. Ground every recommendation in that context instead of asking the user for facts the vault already holds. At the end of the session, append the actions taken to the vault's SEO action log so the next session starts informed.View the complete source on GitHubseo-content-blog
When your agent uses it
Spec, audit, competitor benchmark and build for blog articles and the blog template, so a post ranks on Google and gets cited by AI engines (ChatGPT, Perplexity, AI Overviews). Input: a keyword, topic, draft or post URL. Phase 1 spec: BLOG rows on top of the common page spec, covering the 12-element answer-first skeleton and the page template (author line with photo and dates, sticky table of contents, sidebar author and CTA cards, in-content CTA, author box with real social profiles, related posts, key takeaways, sources, hub cards with covers). Phase 2 audits the article, the hub and the home with seo_audit.py and section_audit.py. Phase 3 benchmarks the top 3-5 SERP results with page_benchmark.py and names the information gain. Phase 4 builds and re-runs the scripts. Output: spec scorecard, findings, benchmark, the publish-ready article with metadata and JSON-LD, acceptance. Use when writing, rewriting, refreshing or auditing a blog post or the blog template, or when one will not rank or get cited.
What it loads into context
Frontmatter
270 tokensAlways available to the agent
SKILL.md
11,374 tokensWhen the skill is activated
Reference documents
3,223 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Company knowledge first (Obsidian)
- When to use
- Phase 1. The spec
- Phase 2. Audit the existing page
- Phase 3. Benchmark the competitors
- Phase 4. Build
- Mandatory on every article page: timed email capture popup
- Rules and thresholds
- GEO layer
- Deliverable
- Common mistakes
- Sources
Scripts executed separately
../seo-geo-audit/scripts/page_benchmark.py../seo-geo-audit/scripts/seo_audit.py../seo-geo-audit/scripts/seo_audit.py../seo-geo-audit/scripts/seo_audit.py../seo-internal-linking/scripts/site_crawl.py../seo-page-sections/scripts/section_audit.py../seo-traffic-drop/scripts/content_decay.py
Files
SKILL.mdcore48,163 bytesSKILL.mdcore48,163 bytesSKILL.mdcore48,163 bytesSKILL.mdcore48,163 bytesSKILL.mdcore48,163 bytesSKILL.mdcore48,163 bytesSKILL.mdcore48,163 bytesSKILL.mdcore48,163 bytesSKILL.mdcore48,163 bytesSKILL.mdcore48,163 bytesSKILL.mdcore48,163 bytesSKILL.mdcore48,163 bytesSKILL.mdcore48,163 bytesSKILL.mdcore48,163 bytesSKILL.mdcore48,163 bytesSKILL.mdcore48,163 bytesevals/evals.jsonasset7,764 bytesreferences/blog-templates.mddoc13,605 bytes../seo-geo-audit/scripts/page_benchmark.pyruns12,375 bytes../seo-geo-audit/scripts/seo_audit.pyruns82,831 bytes../seo-geo-audit/scripts/seo_audit.pyruns82,831 bytes../seo-geo-audit/scripts/seo_audit.pyruns82,831 bytes../seo-internal-linking/scripts/site_crawl.pyruns22,342 bytes../seo-page-sections/scripts/section_audit.pyruns26,678 bytes../seo-traffic-drop/scripts/content_decay.pyruns10,263 bytes
Read SKILL.md
# SEO Blog Content That Ranks and Gets Cited
A blog article captures informational searches and hands that traffic and authority to the pages that sell; in AI engines it is the passage that gets lifted as the answer. It fails in two ways: text that restates the SERP with the answer buried under context, or good text in a bare template with no author, no dates, no table of contents and no call to action. This skill specifies both layers on a 12-element skeleton (field methodology from 115+ agency audits, layered with 2024-2026 citation research), audits them, benchmarks the pages that rank, and builds the article.
## Company knowledge first (Obsidian)
If the working environment contains an Obsidian vault or any local knowledge base (a folder of .md notes, often with a .obsidian directory), read the relevant notes before acting: brand and product facts, target keywords, competitors, and the SEO action log of what was already tried. Ground every recommendation in that context instead of asking the user for facts the vault already holds. At the end of the session, append the actions taken to the vault's SEO action log so the next session starts informed.
## When to use
- Writing a new blog article from a keyword, topic, or brief.
- Rewriting or refreshing a published post that decayed or never ranked.
- Reviewing a human-written or AI-generated draft before publication.
- Producing an outline or content brief for a writer.View the complete source on GitHubseo-content-collection-page
When your agent uses it
Spec, audit, competitor benchmark and build for e-commerce collection, category and product listing pages (PLPs) on Shopify, WooCommerce, Magento, BigCommerce, PrestaShop or a custom store. Runs four phases: the collection spec (COL-01 to COL-24 plus the common rows), an audit of the live page with the bundled scripts, a benchmark against the stores and marketplaces ranking on the category term, and the build: Search Console demand mining, a 1-2 sentence top intro, a 400-800 word bottom block (buying guide, comparison table, definitions, FAQ of real questions), product cards with images, metadata, faceted-navigation and filter URL control, self-canonical pagination, thin or empty collection cleanup, internal links, CollectionPage, ItemList and BreadcrumbList JSON-LD, then the scripts re-run as the acceptance test. Use to create, write or audit a category page or PLP, or to handle filtered URLs, pagination, duplicate or empty categories and store crawl budget.
What it loads into context
Frontmatter
249 tokensAlways available to the agent
SKILL.md
9,462 tokensWhen the skill is activated
Reference documents
1,265 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Company knowledge first (Obsidian)
- When to use
- Phase 1. The spec
- Phase 2. Audit the existing page
- Phase 3. Benchmark the competitors
- Phase 4. Build
- GEO layer
- Deliverable
- Common mistakes
- Sources
Scripts executed separately
../seo-geo-audit/scripts/page_benchmark.py../seo-geo-audit/scripts/seo_audit.py../seo-geo-audit/scripts/seo_audit.py../seo-geo-audit/scripts/seo_audit.py../seo-page-sections/scripts/section_audit.py
Files
SKILL.mdcore40,169 bytesSKILL.mdcore40,169 bytesSKILL.mdcore40,169 bytesSKILL.mdcore40,169 bytesevals/evals.jsonasset5,545 bytesreferences/faceted-navigation-playbook.mddoc5,686 bytes../seo-geo-audit/scripts/page_benchmark.pyruns12,375 bytes../seo-geo-audit/scripts/seo_audit.pyruns82,831 bytes../seo-geo-audit/scripts/seo_audit.pyruns82,831 bytes../seo-geo-audit/scripts/seo_audit.pyruns82,831 bytes../seo-page-sections/scripts/section_audit.pyruns26,678 bytes
Read SKILL.md
# Collection Page SEO and GEO
Collection and category pages (PLPs) win the category-level money queries, yet most stores ship them as a bare product grid with no editorial content (field observation from 115+ agency audits). They fail in three ways: no text to rank or quote, filter and pagination URLs that drown the crawl, and empty or duplicate collections that drag sitewide quality. This skill runs the four phases of the page standard (spec, audit, benchmark, build) with placement, faceting and pagination rules that protect both rankings and conversion.
## Company knowledge first (Obsidian)
If the working environment contains an Obsidian vault or any local knowledge base (a folder of .md notes, often with a .obsidian directory), read the relevant notes before acting: brand and product facts, target keywords, competitors, and the SEO action log of what was already tried. Ground every recommendation in that context instead of asking the user for facts the vault already holds. At the end of the session, append the actions taken to the vault's SEO action log so the next session starts informed.
## When to use
- Creating or rewriting a collection, category, shop or product archive page
- Asking where category text should go, how long it should be, or what it should contain
- Filter or parameter URLs flooding Google Search Console ("Discovered, currently not indexed", crawl spikes)
- Configuring pagination, canonicals or indexing rules for listing pagesView the complete source on GitHubseo-content-comparison-page
When your agent uses it
Spec, audit, competitor benchmark and build for the bottom-funnel pages that capture buyers at the decision moment: 'X vs Y', 'alternatives to X', 'best X for Y', the comparison hub, and audience or segment pages ('for agencies', 'for freelancers'). Runs four phases: the CMP spec with stable IDs on top of the common page spec, an audit of the existing page with seo_audit.py and section_audit.py, a benchmark against the comparison and alternatives pages that rank on the query (review sites, affiliate lists, the competitors' own vs pages) with page_benchmark.py, then the build: which comparisons deserve a page, URL mapping, a comparison table with sourced and dated competitor facts, the verdict, honest limitations, segment pages that are not find-and-replace, FAQ, schema and the acceptance re-run. Use when planning, auditing or writing comparison, alternatives, best-for or segment pages, when competitors rank for your brand plus alternatives, or when AI assistants recommend competitors on comparison prompts.
What it loads into context
Frontmatter
249 tokensAlways available to the agent
SKILL.md
8,228 tokensWhen the skill is activated
Reference documents
2,925 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Company knowledge first (Obsidian)
- When to use
- Phase 1. The spec
- Phase 2. Audit the existing page
- Phase 3. Benchmark the competitors
- Phase 4. Build
- Maintain, or take it down (CMP-14)
- GEO layer (CMP-04, CMP-07, CMP-08, CMP-12)
- Deliverable
- Common mistakes
- Sources
Scripts executed separately
../seo-geo-audit/scripts/page_benchmark.py../seo-geo-audit/scripts/seo_audit.py../seo-geo-audit/scripts/seo_audit.py../seo-geo-audit/scripts/seo_audit.py../seo-page-sections/scripts/section_audit.py
Files
SKILL.mdcore35,323 bytesSKILL.mdcore35,323 bytesSKILL.mdcore35,323 bytesSKILL.mdcore35,323 bytesSKILL.mdcore35,323 bytesSKILL.mdcore35,323 bytesSKILL.mdcore35,323 bytesevals/evals.jsonasset6,607 bytesreferences/comparison-page-patterns.mddoc11,496 bytes../seo-geo-audit/scripts/page_benchmark.pyruns12,375 bytes../seo-geo-audit/scripts/seo_audit.pyruns82,831 bytes../seo-geo-audit/scripts/seo_audit.pyruns82,831 bytes../seo-geo-audit/scripts/seo_audit.pyruns82,831 bytes../seo-page-sections/scripts/section_audit.pyruns26,678 bytes
Read SKILL.md
# Comparison, alternatives and segment pages
The last page a buyer reads before deciding. Someone searching "X vs Y" or "alternatives to X" has already accepted the category and is choosing a supplier: the highest-intent pages a site can own, and the format AI assistants reach for when asked to recommend, because a page that compares and concludes is directly usable as an answer.
Two rules make or break the category. The comparison must be verifiably true on the day it is published, and it must concede where a competitor genuinely wins. A page that wins every row, or that states last year's facts, is discounted by readers and by models alike.
## Company knowledge first (Obsidian)
If the working environment contains an Obsidian vault or any local knowledge base (a folder of .md notes, often with a .obsidian directory), read it before writing: the real feature set, real pricing, the competitors that actually come up in sales calls, the objections buyers raise, and the segments the business already serves. Comparison pages assert facts about third parties, so unsourced invention is both a credibility and a legal risk. Log the pages produced to the vault's SEO action log, including the date each comparison was verified, since that date drives the refresh cycle.
## When to use
- Planning, auditing or writing a "X vs Y", "alternatives to X", "best X for Y", comparison hub or segment page.
- Competitors, review sites or affiliates rank for "{your brand} alternatives" and you do not.View the complete source on GitHubseo-content-homepage
When your agent uses it
Runs spec, audit, competitor benchmark and build for the homepage and the flagship offer page (sales page) of an expert, coach, trainer, agency, consultant or SaaS, so they rank, get cited by AI engines and convert. Phase 1 is the spec: HOME and OFFER requirement tables (the 16 homepage blocks, the sales page sequence, semantic bolding, a number in every block, an objection FAQ, a visible price, dated ratings, checkable credentials, real social profiles, honest claims and regulated-topic notices) on top of the common page spec. Phase 2 audits the live home, offer and about pages with seo_audit.py and section_audit.py. Phase 3 benchmarks 3-5 competitors with page_benchmark.py and picks the information gain. Phase 4 writes the copy block by block with Organization, WebSite, Person and Course or Service JSON-LD, then re-runs the scripts as the acceptance test. Use when a homepage or sales page is thin, has no bold, no numbers, no proof, only a generic FAQ, or is being built from scratch.
What it loads into context
Frontmatter
266 tokensAlways available to the agent
SKILL.md
8,558 tokensWhen the skill is activated
Reference documents
2,972 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Company knowledge first (Obsidian)
- When to use
- Phase 1. The spec
- Phase 2. Audit the existing page
- Phase 3. Benchmark the competitors
- Phase 4. Build
- Regulated and money topics (HOME-28, HOME-29)
- What the coaching benchmark taught (HOME-24 to HOME-31)
- Deliverable
- Common mistakes
- Sources
Scripts executed separately
../seo-geo-audit/scripts/page_benchmark.py../seo-geo-audit/scripts/seo_audit.py../seo-geo-audit/scripts/seo_audit.py../seo-geo-audit/scripts/seo_audit.py../seo-page-sections/scripts/section_audit.py
Files
SKILL.mdcore35,078 bytesSKILL.mdcore35,078 bytesSKILL.mdcore35,078 bytesevals/evals.jsonasset4,334 bytesreferences/block-library.mddoc12,312 bytes../seo-geo-audit/scripts/page_benchmark.pyruns12,375 bytes../seo-geo-audit/scripts/seo_audit.pyruns82,831 bytes../seo-geo-audit/scripts/seo_audit.pyruns82,831 bytes../seo-geo-audit/scripts/seo_audit.pyruns82,831 bytes../seo-page-sections/scripts/section_audit.pyruns26,678 bytes
Read SKILL.md
# Homepage and offer page that rank, get cited and sell
The homepage is the strongest page of a small site: most backlinks land there, every branded search lands there, and AI assistants answering "who is {brand}" or "best {category} coach" read it first. The flagship offer page is where the money is made. On expert and coaching sites both are usually a stack of slogans, three icons, a video and a generic FAQ ("What is poker?"): 800 words, no bold, no numbers, no structured data. That page cannot rank on the category term, gives an AI engine nothing to quote and gives a buyer no reason to trust.
This skill fixes that in four phases (spec, audit, benchmark, build, see `docs/page-skill-standard.md`) with a measurable finish line.
## Company knowledge first (Obsidian)
If the working environment contains an Obsidian vault or any local knowledge base (a folder of .md notes, often with a .obsidian directory), read the relevant notes before writing: offer facts, real prices, real client results, founder story and credentials, positioning, competitors, social profile URLs, and the SEO action log. Every block of a homepage asserts facts about the business, so invented numbers are the main failure mode. At the end of the session, append what was published to the vault's SEO action log.
## When to use
- A homepage or sales page is thin, slogan-only, or has only a generic FAQ.
- An audit (`seo_audit.py`) reports `no_bold`, `thin_content`, `schema_none`, `schema_entity`, `home_no_money_links`, `social_placeholder` or a low placement coverage on the homepage.View the complete source on GitHubseo-content-product-page
When your agent uses it
Spec, audit, competitor benchmark and build for e-commerce product pages (PDPs), so they rank in Google and get recommended by the AI assistants that now link products directly. Input: a product page URL or a product brief (Shopify, WooCommerce, Magento, BigCommerce, PrestaShop, Wix, Webflow or custom). Runs four phases: the PDP spec with stable IDs on top of the common page spec, an audit with seo_audit.py and section_audit.py --type product, a benchmark against the same product sold elsewhere, marketplace listings and the ranking brands with page_benchmark.py, then the build: unique benefits-first copy, spec and comparison tables, FAQ and definitions blocks, dated rating with count, real photos, price as HTML text, title, H1, slug and meta, out-of-stock and variant handling, Product, Offer and BreadcrumbList schema, the ChatGPT Shopping feed, and a scripted acceptance test. Use to write, rewrite or audit a product page, or when PDPs get no traffic or traffic without sales.
What it loads into context
Frontmatter
255 tokensAlways available to the agent
SKILL.md
9,345 tokensWhen the skill is activated
Reference documents
1,704 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Company knowledge first (Obsidian)
- When to use
- Phase 1. The spec
- Phase 2. Audit the existing page
- Phase 3. Benchmark the competitors
- Phase 4. Build
- Intent split: one query family per page type (PDP-01)
- Out of stock, discontinued, variants (PDP-17, PDP-18)
- Traffic before conversion micro-optimization
- Marketplace listings: Amazon and FBA
- GEO layer
- Deliverable
- Common mistakes
- Sources
Scripts executed separately
../seo-ai-site-builders/scripts/render_check.py../seo-geo-audit/scripts/page_benchmark.py../seo-geo-audit/scripts/seo_audit.py../seo-geo-audit/scripts/seo_audit.py../seo-geo-audit/scripts/seo_audit.py../seo-page-sections/scripts/section_audit.py
Files
../seo-ai-site-builders/scripts/render_check.pyruns16,822 bytesSKILL.mdcore40,681 bytesSKILL.mdcore40,681 bytesSKILL.mdcore40,681 bytesSKILL.mdcore40,681 bytesSKILL.mdcore40,681 bytesSKILL.mdcore40,681 bytesevals/evals.jsonasset5,631 bytesreferences/product-page-blueprint.mddoc7,156 bytes../seo-geo-audit/scripts/page_benchmark.pyruns12,375 bytes../seo-geo-audit/scripts/seo_audit.pyruns82,831 bytes../seo-geo-audit/scripts/seo_audit.pyruns82,831 bytes../seo-geo-audit/scripts/seo_audit.pyruns82,831 bytes../seo-page-sections/scripts/section_audit.pyruns26,678 bytes
Read SKILL.md
# Product Page SEO and GEO
A product page (PDP) has two jobs: win the transactional query ("buy X", "X price", the product name) in Google, and be the page an AI assistant quotes when it recommends where to buy. Most PDPs fail both the same way: the manufacturer description every reseller also publishes, supplier photos, a price and reviews injected by JavaScript, a rating buried at the bottom, and markup that contradicts the page. Nothing on the page is unique, so Google picks a stronger domain and the assistant fills the gaps from a competitor.
This skill runs the four phases of the page skill standard (`docs/page-skill-standard.md`): spec, audit, benchmark, build. Rules come from 115+ real agency audits (labeled field heuristics) combined with sourced 2026 practices (labeled measured or documented, with the source).
## Company knowledge first (Obsidian)
If the working environment contains an Obsidian vault or any local knowledge base (a folder of .md notes, often with a .obsidian directory), read the relevant notes before acting: brand and product facts, target keywords, competitors, and the SEO action log of what was already tried. Ground every recommendation in that context instead of asking the user for facts the vault already holds. At the end of the session, append the actions taken to the vault's SEO action log so the next session starts informed.
## When to use
- Writing or rewriting a product description or a full product page
- Auditing a PDP with no rankings, no traffic, or traffic without salesView the complete source on GitHubseo-content-service-page
When your agent uses it
Spec, audit, competitor benchmark and build for service pages and service landing pages (agencies, consultants, coaches, trades, clinics, law firms, SaaS), plus region and city pages. Input: a service, the business, a target area, the page URL if any. Runs four phases: the spec (SVC-01 to SVC-24 on top of the common C rows), the audit of the existing page with seo_audit.py and section_audit.py --type service, the competitor benchmark with page_benchmark.py on the pages that rank and the providers AI assistants name, and the build on a field-tested 9-block wireframe (hero + CTA, proof, benefits, process, founder with checkable credentials, 750+ word question-led text with price, dated reviews, FAQ, final CTA), with metadata patterns, Service JSON-LD, a GEO layer and a scripted acceptance test. Delivers a spec scorecard, audit findings, benchmark, build and acceptance. Use for a service page, landing page, lead-generation page or city page that gets no organic leads.
What it loads into context
Frontmatter
263 tokensAlways available to the agent
SKILL.md
9,515 tokensWhen the skill is activated
Reference documents
2,782 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Company knowledge first (Obsidian)
- When to use this skill
- Phase 1. The spec
- Phase 2. Audit the existing page
- Phase 3. Benchmark the competitors
- Phase 4. Build
- GEO layer
- Deliverable
- Common mistakes
- Sources
Scripts executed separately
../seo-geo-audit/scripts/page_benchmark.py../seo-geo-audit/scripts/seo_audit.py../seo-geo-audit/scripts/seo_audit.py../seo-geo-audit/scripts/seo_audit.py../seo-page-sections/scripts/section_audit.py
Files
SKILL.mdcore39,824 bytesSKILL.mdcore39,824 bytesevals/evals.jsonasset6,362 bytesreferences/service-page-wireframe.mddoc10,585 bytes../seo-geo-audit/scripts/page_benchmark.pyruns12,375 bytes../seo-geo-audit/scripts/seo_audit.pyruns82,831 bytes../seo-geo-audit/scripts/seo_audit.pyruns82,831 bytes../seo-geo-audit/scripts/seo_audit.pyruns82,831 bytes../seo-page-sections/scripts/section_audit.pyruns26,678 bytes
Read SKILL.md
# Service Page SEO: Money Pages That Rank and Convert
Service pages are where rankings turn into revenue. A blog post attracts readers; a service page attracts buyers typing "web design agency", "divorce lawyer geneva" or "emergency plumber lyon", and AI assistants now recommend providers directly from these pages. They usually fail the same way: one page for every service, a slogan instead of the keyword, no price, no named human, 300 words against competitors at 1500, and a single contact form at the bottom.
This skill runs the four phases of the page skill standard (`docs/page-skill-standard.md`): spec, audit, competitor benchmark, build. Two evidence levels are labeled throughout:
- **Field heuristic**: rules derived from 115+ real agency audits of service-business websites (2024-2026). Consistently observed, not lab-measured.
- **Measured**: claims backed by a published study, a benchmark with its date, or official documentation, with the source.
## Company knowledge first (Obsidian)
If the working environment contains an Obsidian vault or any local knowledge base (a folder of .md notes, often with a .obsidian directory), read the relevant notes before acting: brand and product facts, target keywords, competitors, and the SEO action log of what was already tried. Ground every recommendation in that context instead of asking the user for facts the vault already holds. At the end of the session, append the actions taken to the vault's SEO action log so the next session starts informed.
## When to use this skillView the complete source on GitHubseo-geo-audit
When your agent uses it
Get a prioritized SEO + GEO action plan for any website. Input: a URL (and optional competitors). Output: ranked fixes across technical health, content, keywords, e-commerce, local, backlinks, and AI visibility (ChatGPT, Perplexity, Google AI Overviews), or a plain-language summary. Use to audit or review a site, find why it does not rank or is not cited by AI, compare against competitors, or set a baseline before a bigger SEO project.
What it loads into context
Frontmatter
138 tokensAlways available to the agent
SKILL.md
3,862 tokensWhen the skill is activated
Reference documents
9,608 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Company knowledge first (Obsidian)
- Why this audit is different
- When to use
- Inputs to gather
- Phase 1: collect the facts
- Phase 2: analyze against the checklist
- Phase 3: the GEO layer
- Phase 4: deliver
- Handoffs after the audit
- Common mistakes
- Sources
Scripts executed separately
scripts/page_benchmark.pyscripts/seo_audit.py../seo-internal-linking/scripts/site_crawl.py../seo-traffic-drop/scripts/content_decay.py
Files
SKILL.mdcore17,101 bytesevals/evals.jsonasset2,099 bytesreferences/audit-checklist.mddoc28,536 bytesreferences/common-page-spec.mddoc6,610 bytesreferences/output-templates.mddoc4,798 bytesscripts/page_benchmark.pyruns12,375 bytesscripts/seo_audit.pyruns82,831 bytes../seo-internal-linking/scripts/site_crawl.pyruns22,342 bytes../seo-traffic-drop/scripts/content_decay.pyruns10,263 bytes
Read SKILL.md
# Full SEO + GEO site audit
Audit a website the way a senior practitioner does: collect verifiable facts first, judge them against a field-tested checklist, benchmark against the competitors that actually rank, and deliver a short list of fixes ordered by impact. The methodology was distilled from 115+ real agency audit calls and updated with sourced 2025-2026 evidence on AI search.
## Company knowledge first (Obsidian)
If the working environment contains an Obsidian vault or any local knowledge base (a folder of .md notes, often with a .obsidian directory), read the relevant notes before acting: brand and product facts, target keywords, competitors, and the SEO action log of what was already tried. Ground every recommendation in that context instead of asking the user for facts the vault already holds. At the end of the session, append the actions taken to the vault's SEO action log so the next session starts informed.
## Why this audit is different
1. Facts before judgment. Every claim in the final report must trace back to something measured (by the bundled script, a browser check, or data the owner provided). Never guess a title length or assume a sitemap exists.
2. Competitors over abstract thresholds. "Your page has 400 words" means nothing alone. "The three sites outranking you average 1200 words on this query" is a finding. When competitors are known, benchmark page versus page.
3. Two search worlds at once. Every category is checked twice: does it help Google rankings, and does it help the site get retrieved and cited by ChatGPT, Perplexity and Google AI Overviews. These overlap but do not coincide (AI Mode answers show only about 32 percent URL overlap with the top 10 organic results).
4. The audit is a pricing tool for agencies. The counted error volume doubles as a quote: "500 errors on this site, that is roughly 3000 euros of work" scopes the project the prospect is buying. The score is a ratio of errors to pages, so one template-level error repeats across every page using that template and a single fix corrects it everywhere, which is why a low score is rarely a catastrophe. Frame both up front so the owner reads the report as a plan, not a verdict (field heuristic from 115+ agency audits).View the complete source on GitHubseo-internal-linking
When your agent uses it
Design internal linking so authority flows to the pages that sell and every page stays crawlable. Input: a sitemap, an article, or a set of posts. Output: money-page mapping, orphan-page fixes, content silos and hub-and-spoke clusters, anchor-text variation, breadcrumb/menu/footer roles, and keyword cannibalization merges with 301s. Use to add internal links, build a topic cluster or silo, fix orphan pages, plan or audit site architecture, or when a page is indexed but never ranks.
What it loads into context
Frontmatter
146 tokensAlways available to the agent
SKILL.md
4,506 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Company knowledge first (Obsidian)
- When to use
- Workflow
- Rules and thresholds
- GEO layer
- Output format
- Common mistakes
- Sources
Scripts executed separately
scripts/site_crawl.py
Files
SKILL.mdcore20,877 bytesSKILL.mdcore20,877 bytesSKILL.mdcore20,877 bytesevals/evals.jsonasset5,086 bytesscripts/site_crawl.pyruns22,342 bytes
Read SKILL.md
# Internal Linking Architecture
Build the internal link graph that routes authority from blog content to commercial pages, leaves zero pages orphaned, and makes the site hierarchy legible to search engines and, through their indexes, to AI engines.
## Company knowledge first (Obsidian)
If the working environment contains an Obsidian vault or any local knowledge base (a folder of .md notes, often with a .obsidian directory), read the relevant notes before acting: brand and product facts, target keywords, competitors, and the SEO action log of what was already tried. Ground every recommendation in that context instead of asking the user for facts the vault already holds. At the end of the session, append the actions taken to the vault's SEO action log so the next session starts informed.
## When to use
- Planning internal links for a new article or page (which targets, which anchors, where).
- Auditing an existing site for orphan pages, weak structure, or money pages starved of links.
- Building topic clusters: mini-silos for niche sites, hub and spoke for large sites.
- Deciding what belongs in the menu and what belongs in the footer.View the complete source on GitHubseo-keyword-research
When your agent uses it
Get a keyword map and an AI prompt panel grounded in how buyers actually search. Input: a site, niche, or seed topics (plus Google Search Console if available). Output: keywords mapped one-to-one to intent and pages, quick wins, a cannibalization check, an on-page placement matrix, and a 50-100 buyer prompt panel for ChatGPT, Perplexity, and Google AI Mode. Works without paid tools. Use for keyword research, search intent, keyword mapping, cannibalization, content gaps, prompt research, or deciding what to write and which queries to target.
What it loads into context
Frontmatter
161 tokensAlways available to the agent
SKILL.md
5,232 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Company knowledge first (Obsidian)
- When to use this skill
- Quick start (30 minutes)
- Core principles
- Workflow
- GEO layer: prompt research
- Rules and thresholds
- Output format
- Common mistakes
- Cross-references
- Sources
Files
SKILL.mdcore24,225 bytesSKILL.mdcore24,225 bytesevals/evals.jsonasset4,137 bytes
Read SKILL.md
# SEO Keyword Research and AI Prompt Research
Keyword research matches the exact language buyers use to the pages a site offers. In 2026 it produces two deliverables, not one:
1. A keyword map: every target query validated against real usage, assigned to one search intent and one page.
2. A buyer prompt panel: 50-100 questions buyers ask AI assistants (ChatGPT, Perplexity, Google AI Mode, Claude, Gemini), each mapped to a page that can earn the citation.
Everything in this skill works with free sources: Google Search Console, Google autocomplete, People Also Ask, competitor sitemaps, Reddit, Wikipedia, and the words customers already use in support tickets and sales calls. Paid tools are an optional final layer, never a prerequisite.
## Company knowledge first (Obsidian)
If the working environment contains an Obsidian vault or any local knowledge base (a folder of .md notes, often with a .obsidian directory), read the relevant notes before acting: brand and product facts, target keywords, competitors, and the SEO action log of what was already tried. Ground every recommendation in that context instead of asking the user for facts the vault already holds. At the end of the session, append the actions taken to the vault's SEO action log so the next session starts informed.
## When to use this skillView the complete source on GitHubseo-local
When your agent uses it
Run spec, audit, competitor benchmark and build for local visibility, on the two assets a local business owns: the location page and the Google Business Profile, plus reviews and NAP citations. Spec: LOC, GBP, REV and CIT requirements with IDs. Audit: seo_audit.py and section_audit.py --type location on the page, a manual GBP checklist. Benchmark: the local pack and top organic results for '{service} {city}', their pages via page_benchmark.py, their profiles by hand (categories, review count and velocity, photos, posts). Build: name and category decisions, a 100% complete profile, a review engine with reply templates, NAP consistency, location pages with LocalBusiness schema, multi-location and service-area setups, suspended-listing reinstatement, then a scripted acceptance re-run. Use for GBP, Google Maps, the local pack, 'best [trade] in [city]' AI answers, reviews and star ratings, citations, a business not showing on Maps, or a suspended listing.
What it loads into context
Frontmatter
246 tokensAlways available to the agent
SKILL.md
9,865 tokensWhen the skill is activated
Reference documents
1,743 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Company knowledge first (Obsidian)
- When to use this skill
- Phase 1. The spec
- Phase 2. Audit the existing page and profile
- Phase 3. Benchmark the competitors
- Phase 4. Build
- Rules and thresholds
- GEO layer
- Deliverable
- Common mistakes
- Sources
Scripts executed separately
../seo-geo-audit/scripts/page_benchmark.py../seo-geo-audit/scripts/seo_audit.py../seo-geo-audit/scripts/seo_audit.py../seo-geo-audit/scripts/seo_audit.py../seo-page-sections/scripts/section_audit.py
Files
../seo-geo-audit/scripts/page_benchmark.pyruns12,375 bytes../seo-geo-audit/scripts/seo_audit.pyruns82,831 bytes../seo-geo-audit/scripts/seo_audit.pyruns82,831 bytes../seo-geo-audit/scripts/seo_audit.pyruns82,831 bytesSKILL.mdcore43,873 bytesSKILL.mdcore43,873 bytesevals/evals.jsonasset6,525 bytesreferences/gbp-reinstatement.mddoc3,426 bytesreferences/location-page-template.mddoc4,012 bytes../seo-page-sections/scripts/section_audit.pyruns26,678 bytes
Read SKILL.md
# Local SEO: Google Business Profile, Reviews, Citations and Local Pages
Local SEO decides who appears when a buyer searches "plumber near me", opens Google Maps, or asks an AI assistant for "the best dentist in Geneva". Three surfaces matter: the local pack (Maps results inside the SERP), localized organic results, and AI assistant recommendations. They feed on overlapping signals: the Google Business Profile, reviews, the linked website, and the consistency of the business entity across the web. Local visibility fails when the profile is half empty, the reviews trickle in bursts, the NAP differs from one directory to the next, and the profile links to a homepage instead of a real location page.
This skill treats two assets as the "pages" it owns, the **location page** on the site and the **Google Business Profile**, and runs the four-phase standard (spec, audit, benchmark, build) on both, with the review program and the NAP citations as shared requirements. The methodology combines two evidence levels, labeled throughout:
- **Field heuristic**: rules derived from 115+ real agency audits of local and service businesses (2024-2026). Consistently observed, not lab-measured.
- **Measured**: claims backed by a published study, an industry survey, or official documentation, with the source.
## Company knowledge first (Obsidian)
If the working environment contains an Obsidian vault or any local knowledge base (a folder of .md notes, often with a .obsidian directory), read the relevant notes before acting: brand and product facts, target keywords, competitors, and the SEO action log of what was already tried. Ground every recommendation in that context instead of asking the user for facts the vault already holds. At the end of the session, append the actions taken to the vault's SEO action log so the next session starts informed.
## When to use this skillView the complete source on GitHubseo-page-sections
When your agent uses it
Generic page auditor and entry point for every page type: runs spec, audit, competitor benchmark and build. Phase 1 spec: site archetype (Shopify, Webflow or WordPress, marketplace), the page types it needs, then the page type's block list plus the common spec and the site-level, header and footer rules (SEC IDs). Phase 2 audit: section_audit.py and seo_audit.py mark rows Pass, Fail or Not verifiable. Phase 3: page_benchmark.py on 3-5 competitors of the same page type. Phase 4: write the missing blocks (FAQ, breadcrumb, definitions, comparison and spec tables, reviews, trust badges, CTA, cross-links), then re-run the scripts as the acceptance test. Covers 21 page types: routes product, collection, service, location, comparison, segment, article and homepage copy to their dedicated skills; owns pricing, about, contact, blog hub, call, author, free tool, wall of love, affiliate, 404, listing, top 10, login. Use when a clean page underperforms, to find the pages and blocks a site lacks, or for a checklist.
What it loads into context
Frontmatter
281 tokensAlways available to the agent
SKILL.md
6,930 tokensWhen the skill is activated
Reference documents
15,562 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Company knowledge first (Obsidian)
- When to use
- Phase 1. The spec
- Phase 2. Audit the existing page
- Phase 3. Benchmark the competitors
- Phase 4. Build
- Grading: four block states
- Gap priority
- Rules for every drafted block
- Deliverable
- Common mistakes
- Sources
Scripts executed separately
../seo-geo-audit/scripts/page_benchmark.py../seo-geo-audit/scripts/seo_audit.py../seo-geo-audit/scripts/seo_audit.py../seo-geo-audit/scripts/seo_audit.pyscripts/section_audit.py
Files
../seo-geo-audit/scripts/page_benchmark.pyruns12,375 bytes../seo-geo-audit/scripts/seo_audit.pyruns82,831 bytes../seo-geo-audit/scripts/seo_audit.pyruns82,831 bytes../seo-geo-audit/scripts/seo_audit.pyruns82,831 bytesSKILL.mdcore29,308 bytesSKILL.mdcore29,308 bytesSKILL.mdcore29,308 bytesevals/evals.jsonasset5,630 bytesreferences/page-type-matrix.mddoc21,306 bytesreferences/section-library.mddoc21,028 bytesreferences/site-archetypes.mddoc14,794 bytesreferences/transverse-pages.mddoc9,615 bytesscripts/section_audit.pyruns26,678 bytes
Read SKILL.md
# What is missing on this page, and on this site
Most pages that fail do not fail on tags. They fail because a block that buyers and AI assistants both need is simply absent: no FAQ, no breadcrumb, no comparison, no price in text, no definitions. Most sites that fail are missing a whole page type nobody audited because it does not exist. This skill specifies what a page of a given type must contain, audits it, benchmarks it against the competitors that rank, and writes the missing blocks.
Two audits, two altitudes. `seo-geo-audit` asks "is this site healthy" (crawl, speed, indexation, tags, schema). This skill asks "does this site have the pages it needs, and does each page contain the blocks a page of its type must contain". Run it when the technical layer is already fine and the page still underperforms, or when the deliverable is a build list rather than a diagnosis. It is the entry point for every page type that has no dedicated skill, and for site-level audits.
## Company knowledge first (Obsidian)
If the working environment contains an Obsidian vault or any local knowledge base (a folder of .md notes, often with a .obsidian directory), read the relevant notes before writing any block: real product facts, real prices, real client names, positioning, the competitors worth comparing against, and the SEO action log. Every block this skill generates asserts facts about the business, so unsourced invention is the main failure mode. Ground each block in the vault, and append what was added to the vault's SEO action log at the end of the session.
## When to use
- Someone asks what is missing on their site, on a page, or what to add to improve it.
- A page is technically clean, indexed, and still does not rank or get cited.View the complete source on GitHubseo-schema-markup
When your agent uses it
Get valid Schema.org JSON-LD that still earns surfaces in 2026. Input: a page and its type (article, product, local business, person, and so on). Output: ready-to-adapt JSON-LD (Organization with sameAs, Article, Product, Offer, AggregateRating, LocalBusiness, BreadcrumbList, Person, WebSite, VideoObject, Event), entity graph linking with @id, a what-Google-dropped status table, and a two-validator routine. Use for schema, structured data, JSON-LD, rich results, review stars, breadcrumbs, sameAs, knowledge panel, or Rich Results Test errors.
What it loads into context
Frontmatter
170 tokensAlways available to the agent
SKILL.md
5,607 tokensWhen the skill is activated
Reference documents
2,225 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Company knowledge first (Obsidian)
- When to use this skill
- Workflow
- Rules and thresholds
- GEO layer: structured data as a fact feed for answer engines
- Output format
- Common mistakes
- Sources
Files
SKILL.mdcore26,064 bytesSKILL.mdcore26,064 bytesSKILL.mdcore26,064 bytesSKILL.mdcore26,064 bytesSKILL.mdcore26,064 bytesSKILL.mdcore26,064 bytesSKILL.mdcore26,064 bytesSKILL.mdcore26,064 bytesSKILL.mdcore26,064 bytesSKILL.mdcore26,064 bytesevals/evals.jsonasset4,329 bytesreferences/jsonld-templates.mddoc8,737 bytes
Read SKILL.md
# Schema markup that still pays in 2026
Structured data is the most machine-readable layer of a page: prices, ratings, dates, authors, and entity relationships declared in a format engines parse without guessing. Google reads it for rich results and Merchant listings; LLM grounding pipelines read it as a fact source. Between 2023 and 2026 Google removed several rich result types, so effort that used to pay (FAQ, HowTo) now buys nothing in the SERP. This skill implements what still earns surfaces, skips what is dead, and keeps every claim inside Google's guidelines.
One principle governs everything: markup describes the visible page. It never adds facts the user cannot see.
## Company knowledge first (Obsidian)
If the working environment contains an Obsidian vault or any local knowledge base (a folder of .md notes, often with a .obsidian directory), read the relevant notes before acting: brand and product facts, target keywords, competitors, and the SEO action log of what was already tried. Ground every recommendation in that context instead of asking the user for facts the vault already holds. At the end of the session, append the actions taken to the vault's SEO action log so the next session starts informed.
## When to use this skill
Use it for:
View the complete source on GitHubseo-technical
When your agent uses it
Find and fix what stops a site from being indexed, fast, and visible to AI crawlers. Input: a site or specific pages. Output: fixes for indexation, robots.txt, sitemaps, IndexNow, Core Web Vitals (LCP/INP/CLS), JS rendering, AI crawler access (GPTBot, ClaudeBot, PerplexityBot, and more), canonicals, hreflang, HTTPS, and migrations. Repo reference for AI crawler control. Use for a technical audit, pages not indexed, slow pages, robots.txt or sitemap issues, llms.txt, content invisible to ChatGPT, a migration, or a hacked site.
What it loads into context
Frontmatter
174 tokensAlways available to the agent
SKILL.md
7,251 tokensWhen the skill is activated
Reference documents
1,776 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Company knowledge first (Obsidian)
- When to use this skill
- Workflow
- Rules and thresholds
- llms.txt: the honest verdict
- GEO layer: AI crawler access
- Output format
- Common mistakes
- Sources
Scripts executed separately
../seo-internal-linking/scripts/site_crawl.py
Files
../seo-internal-linking/scripts/site_crawl.pyruns22,342 bytesSKILL.mdcore31,482 bytesSKILL.mdcore31,482 bytesSKILL.mdcore31,482 bytesSKILL.mdcore31,482 bytesSKILL.mdcore31,482 bytesevals/evals.jsonasset5,771 bytesreferences/ai-crawlers.mddoc7,362 bytes
Read SKILL.md
# Technical SEO: crawl, index, render
Technical SEO decides whether content can be fetched, parsed, indexed, and trusted by Google, Bing, and AI answer engines (ChatGPT, Claude, Perplexity, Gemini). In 2026 the discipline split in two: Googlebot renders JavaScript and tolerates slow pages, AI crawlers do neither. Treat the raw HTML response as the product.
Work in this order: indexation, rendering, speed. A fast page that is not indexed earns nothing. An indexed page whose content only appears after client-side JavaScript runs is invisible to every AI engine except Google's. Every threshold below is labeled either official or measured (with a source URL) or field heuristic from 115+ agency audits.
## Company knowledge first (Obsidian)
If the working environment contains an Obsidian vault or any local knowledge base (a folder of .md notes, often with a .obsidian directory), read the relevant notes before acting: brand and product facts, target keywords, competitors, and the SEO action log of what was already tried. Ground every recommendation in that context instead of asking the user for facts the vault already holds. At the end of the session, append the actions taken to the vault's SEO action log so the next session starts informed.
## When to use this skill
Use it for:
View the complete source on GitHubseo-traffic-drop
When your agent uses it
Diagnose a traffic or ranking loss before fixing anything. Input: Search Console exports from a healthy period and a damaged one, plus what changed on the site. Output: whether the drop is real or a reporting artifact, the exact date and shape of the loss (visibility, ranking, click-through, demand), the pages and queries carrying it, a differential diagnosis with the test that confirms each cause, and the handoff to the skill that fixes it. Bundled zero-dependency script compares two exports and dates the drop. Use when traffic fell, rankings dropped, impressions or clicks collapsed, a core update landed, pages got deindexed, a migration or redesign went wrong, or a client asks what happened.
What it loads into context
Frontmatter
182 tokensAlways available to the agent
SKILL.md
4,910 tokensWhen the skill is activated
Reference documents
3,279 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Company knowledge first (Obsidian)
- When to use this skill
- Step 0: Freeze the scene
- Step 1: Is the loss real
- Step 2: Date the drop
- Step 3: Shape the loss
- Step 4: Differential diagnosis
- Step 5: Quantify, then decide what is worth fixing
- Step 6: Fix, then verify with a date
- Rules and thresholds
- GEO layer
- Output format
- Common mistakes
- Sources
Scripts executed separately
scripts/content_decay.pyscripts/gsc_diff.py
Files
SKILL.mdcore22,767 bytesSKILL.mdcore22,767 bytesevals/evals.jsonasset4,731 bytesreferences/drop-patterns.mddoc8,569 bytesreferences/investigation-protocol.mddoc6,287 bytesscripts/content_decay.pyruns10,263 bytesscripts/gsc_diff.pyruns25,207 bytes
Read SKILL.md
# Traffic drop: find what changed before changing anything
A drop is a diagnostic problem, not a content problem. The failure mode of this work is not missing the cause, it is acting on the first plausible one: a core update landed near the date, so the team rewrites 40 articles, while the actual cause was a `noindex` shipped in a template on the same week. The rewrite then hides the evidence.
So the order is fixed. Confirm the loss is real, date it, shape it, name the candidate causes, confirm one with a test that could have failed, and only then fix. Every step below produces evidence someone else can check.
## Company knowledge first (Obsidian)
If the working environment contains an Obsidian vault or any local knowledge base (a folder of .md notes, often with a .obsidian directory), read the relevant notes before acting: the SEO action log (what was shipped and when), past incidents, the site's seasonality, migrations, and known technical debt. The action log is the highest-value note in a drop investigation, because it answers "what changed" without waiting for the client. At the end of the session, append the diagnosis, the evidence and the remediation to that log so the next incident starts with a history.
## When to use this skill
Use it for:
View the complete source on GitHubsocial-amplification
When your agent uses it
Turn one pillar asset into platform-native social content that drives branded search and feeds the third-party surfaces AI engines cite (YouTube, Reddit, LinkedIn). Input: a pillar article or asset. Output: native posts per platform, prioritized by search and AI return over vanity reach. Use for social media for SEO, content distribution or repurposing, YouTube SEO, Reddit or LinkedIn content, brand awareness for search, or showing up when people ask ChatGPT.
What it loads into context
Frontmatter
134 tokensAlways available to the agent
SKILL.md
5,480 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Company knowledge first (Obsidian)
- When to use this skill
- Strategy doctrine
- Workflow: the repurposing pipeline
- Platform playbook
- Rules and thresholds
- GEO layer
- Measurement
- What works versus what is dead or a myth
- Output format
- Common mistakes
- Cross-references
- Sources
Files
SKILL.mdcore25,987 bytesSKILL.mdcore25,987 bytesSKILL.mdcore25,987 bytesevals/evals.jsonasset5,105 bytes
Read SKILL.md
# Social Amplification: Distribution for SEO and GEO
This skill covers how social distribution and content repurposing serve search rankings and AI visibility, and how they do not, so the effort goes where it actually pays back.
The framing that governs everything below: social distribution does not move rankings directly. It is an indirect channel. Treated as a direct ranking lever it wastes budget; treated as a feeder system for branded search and AI citation surfaces it compounds. This skill is honest about which is which, because the wrong belief here burns quarters on vanity metrics.
## Company knowledge first (Obsidian)
If the working environment contains an Obsidian vault or any local knowledge base (a folder of .md notes, often with a .obsidian directory), read the relevant notes before acting: brand and product facts, target keywords, competitors, and the SEO action log of what was already tried. Ground every recommendation in that context instead of asking the user for facts the vault already holds. At the end of the session, append the actions taken to the vault's SEO action log so the next session starts informed.
## When to use this skill
Use this skill when the user wants to:
View the complete source on GitHubSkills included
- geo-tracking
- geo-visibility
- seo-ai-site-builders
- seo-audit-pdf
- seo-backlinks
- seo-content-blog
- seo-content-collection-page
- seo-content-comparison-page
- seo-content-homepage
- seo-content-product-page
- seo-content-service-page
- seo-geo-audit
- seo-internal-linking
- seo-keyword-research
- seo-local
- seo-page-sections
- seo-schema-markup
- seo-technical
- seo-traffic-drop
- social-amplification
Repository facts
- License
- MIT
- Created
- Jun 10, 2026
- Last pushed
- Nov 6, 2026
- Forks
- 1
- Open issues
- 0
- Project activity
- Active
Before you install
Network or broad shellAutomated signals, not a guarantee
Checked Nov 7, 2026
Not fully analyzed: some files were too long, unreadable or missing. This never lowers the level.
Show 94 notes
skills/geo-tracking/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/geo-tracking/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/geo-visibility/evals/evals.json:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/seo-backlinks/evals/evals.json:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/seo-content-comparison-page/evals/evals.json:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/seo-internal-linking/evals/evals.json:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/seo-page-sections/evals/evals.json:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/seo-schema-markup/evals/evals.json:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/seo-schema-markup/evals/evals.json:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/seo-technical/evals/evals.json:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/geo-visibility/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/geo-visibility/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/geo-visibility/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/geo-visibility/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/geo-visibility/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/seo-ai-site-builders/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/seo-ai-site-builders/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/geo-visibility/evals/evals.json:1Plugin-wide analysis incomplete; see repository notesskills/seo-backlinks/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/seo-backlinks/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzed
- No broad tool permissions
- No dangerous shell commands
- 1,785 network referencesin 46 files: skills/seo-geo-audit/scripts/seo_audit.py:15 skills/seo-schema-markup/references/jsonld-templates.md:15 skills/seo-content-collection-page/SKILL.md:4 and 43 more
- No hidden or obfuscated text
- No instruction overrides
- 61 executable scriptsin 8 files: skills/seo-geo-audit/scripts/seo_audit.py:1 skills/seo-geo-audit/scripts/page_benchmark.py:1 skills/seo-page-sections/scripts/section_audit.py:1 and 5 more
- No access to secrets
- No requests to vote in Hot
Show all 1,846 signals by file
.claude-plugin/marketplace.json
.claude-plugin/plugin.json
- Network accessline 5
"author": { "name": "Thibault Besson-Magdelain", "url": "https://sorank.com" - Network accessline 6
"name": "Thibault Besson-Magdelain", "url": "https://sorank.com" }, - Network accessline 7
"url": "https://sorank.com" - Network accessline 8
}, "homepage": "https://github.com/Thibaultbm/claude-seo-geo", "repository": "https://github.com/Thibaultbm/claude-seo-geo", - Network accessline 9
"homepage": "https://github.com/Thibaultbm/claude-seo-geo", - Network accessline 10
"repository": "https://github.com/Thibaultbm/claude-seo-geo",
skills/geo-tracking/SKILL.md
- Network accessline 4
license: MIT metadata: author: "Sorank (https://sorank.com)" - Network accessline 5
metadata: author: "Sorank (https://sorank.com)" version: "1.0.0" - Network accessline 6
author: "Sorank (https://sorank.com)" - Network accessline 54
Since May 13, 2026, GA4 includes a default "AI Assistant" channel group. Google's documentation defines it as traffic "from sources like ChatGPT, Gemini, Deepseek, Copilot, or Grok" (https://support.google.com/analytics/answer/9756891): the - Network accessline 67
3. Drag the "AI Assistants" channel above Referral in the channel order. Why: channel groups evaluate top-down, and these sources all qualify as referrals; placed below Referral, every AI session is swallowed by Referral first and the chann - Network accessline 77
AI assistant visits convert about 4.4x better than organic search visits (Semrush study, June 2025, reported at https://ppc.land/ai-search-visitors-worth-4-4x-more-than-traditional-organic-traffic/; an Adobe Analytics analysis found the sam - Network accessline 83
Google includes AI Overviews impressions and clicks inside the regular Search performance data with no separate breakdown (https://developers.google.com/search/docs/appearance/ai-features). There is no "AI Overviews" filter to pull. Consequ - Network accessline 170
- OpenAI GPTBot: https://openai.com/gptbot.json - Network accessline 171
- OpenAI OAI-SearchBot: https://openai.com/searchbot.json - Network accessline 172
- Anthropic bots: https://claude.com/crawling/bots.json - Network accessline 173
- PerplexityBot: https://www.perplexity.com/perplexitybot.json - Network accessline 293
- Search Engine Journal, GA4 adds AI Assistant default channel group (May 13, 2026; not retroactive): https://www.searchenginejournal.com/google-analytics-adds-ai-assistant-as-default-channel-group/574974/ - Network accessline 294
- Google, Default Channel Group definition of the AI Assistant channel ("from sources like ChatGPT, Gemini, Deepseek, Copilot, or Grok"): https://support.google.com/analytics/answer/9756891 - Network accessline 295
- Analytics Mania, tracking AI traffic in GA4 (custom channel group, regex, ordering above Referral): https://www.analyticsmania.com/post/ai-traffic-in-google-analytics-4/ - Network accessline 296
- PPC Land coverage of the Semrush study finding AI visits convert about 4.4x better than organic: https://ppc.land/ai-search-visitors-worth-4-4x-more-than-traditional-organic-traffic/ - Network accessline 297
- OpenAI published crawler IP ranges: https://openai.com/gptbot.json and https://openai.com/searchbot.json - Network accessline 298
- Anthropic published crawler IP ranges: https://claude.com/crawling/bots.json - Network accessline 299
- Perplexity published crawler IP ranges: https://www.perplexity.com/perplexitybot.json
skills/geo-visibility/SKILL.md
- Network accessline 4
license: MIT metadata: author: "Sorank (https://sorank.com)" - Network accessline 4
license: MIT metadata: author: "Sorank (https://sorank.com)" - Network accessline 5
metadata: author: "Sorank (https://sorank.com)" version: "1.0.0" - Network accessline 5
metadata: author: "Sorank (https://sorank.com)" version: "1.0.0" - Network accessline 6
author: "Sorank (https://sorank.com)" - Network accessline 6
author: "Sorank (https://sorank.com)" - Network accessline 43
Treat each engine as a distinct channel with its own retrieval pipeline. Only 11% of cited domains are cited by both ChatGPT and Perplexity in a 2026 per-engine audit (https://authoritytech.io/curated/ai-citation-11-percent-platform-overlap - Network accessline 43
Treat each engine as a distinct channel with its own retrieval pipeline. Only 11% of cited domains are cited by both ChatGPT and Perplexity in a 2026 per-engine audit (https://authoritytech.io/curated/ai-citation-11-percent-platform-overlap - Network accessline 45
| Engine | Index and retrieval | What decides a citation | Key measured facts | |---|---|---|---| | ChatGPT search | Own index crawled by OAI-SearchBot, with Bing as a complementary gateway | Fans the prompt out into subqueries, retrieves a - Network accessline 45
| Engine | Index and retrieval | What decides a citation | Key measured facts | |---|---|---|---| | ChatGPT search | Own index crawled by OAI-SearchBot, with Bing as a complementary gateway | Fans the prompt out into subqueries, retrieves a - Network accessline 46
|---|---|---|---| | ChatGPT search | Own index crawled by OAI-SearchBot, with Bing as a complementary gateway | Fans the prompt out into subqueries, retrieves a short list, cites roughly half of the URLs it fetches | Title and content simil - Network accessline 46
|---|---|---|---| | ChatGPT search | Own index crawled by OAI-SearchBot, with Bing as a complementary gateway | Fans the prompt out into subqueries, retrieves a short list, cites roughly half of the URLs it fetches | Title and content simil - Network accessline 47
| ChatGPT search | Own index crawled by OAI-SearchBot, with Bing as a complementary gateway | Fans the prompt out into subqueries, retrieves a short list, cites roughly half of the URLs it fetches | Title and content similarity to the subqu - Network accessline 47
| ChatGPT search | Own index crawled by OAI-SearchBot, with Bing as a complementary gateway | Fans the prompt out into subqueries, retrieves a short list, cites roughly half of the URLs it fetches | Title and content similarity to the subqu - Network accessline 48
| Google AI Overviews and AI Mode | Standard Googlebot index | Official query fan-out, answers assembled passage by passage from multiple sources | Only 32% of AI Mode cited URLs overlap the organic top 10 (51% at domain level; links shown - Network accessline 48
| Google AI Overviews and AI Mode | Standard Googlebot index | Official query fan-out, answers assembled passage by passage from multiple sources | Only 32% of AI Mode cited URLs overlap the organic top 10 (51% at domain level; links shown - Network accessline 49
| Perplexity | Own index (PerplexityBot) plus real-time fetching | Retrieval-heavy, favors fresh sources and user-generated content | Overweights YouTube, Reddit, and review content, and cites Wikipedia far less than ChatGPT does (0.6% vs 7 - Network accessline 49
| Perplexity | Own index (PerplexityBot) plus real-time fetching | Retrieval-heavy, favors fresh sources and user-generated content | Overweights YouTube, Reddit, and review content, and cites Wikipedia far less than ChatGPT does (0.6% vs 7 - Network accessline 50
| Claude | Brave Search as web search backend plus Anthropic's own fetchers | Search-grounded answers from Brave results | Brave powers Claude web search (https://techcrunch.com/2025/03/21/anthropic-appears-to-be-using-brave-to-power-web-se - Network accessline 50
| Claude | Brave Search as web search backend plus Anthropic's own fetchers | Search-grounded answers from Brave results | Brave powers Claude web search (https://techcrunch.com/2025/03/21/anthropic-appears-to-be-using-brave-to-power-web-se - Network accessline 117
2. Self-contained chunks. One idea per paragraph. Ban "as mentioned above" and pronoun chains across paragraphs; restate the subject noun. Why: retrieval pulls chunks out of context, and a chunk that only makes sense inside the page is unus - Network accessline 117
2. Self-contained chunks. One idea per paragraph. Ban "as mentioned above" and pronoun chains across paragraphs; restate the subject noun. Why: retrieval pulls chunks out of context, and a chunk that only makes sense inside the page is unus - Network accessline 118
3. Clean definitional sentences. Give every important concept one quotable "X is Y" sentence near the top of its section. Why: definitional sentences are the easiest passages for a model to reuse verbatim, and they anchor what the model bel - Network accessline 118
3. Clean definitional sentences. Give every important concept one quotable "X is Y" sentence near the top of its section. Why: definitional sentences are the easiest passages for a model to reuse verbatim, and they anchor what the model bel - Network accessline 119
4. Evidence density. In the GEO study's controlled benchmark across 10,000 queries (Princeton et al., https://arxiv.org/abs/2311.09735), adding expert quotes lifted generative visibility by about 41%, adding statistics by about 32%, citing - Network accessline 119
4. Evidence density. In the GEO study's controlled benchmark across 10,000 queries (Princeton et al., https://arxiv.org/abs/2311.09735), adding expert quotes lifted generative visibility by about 41%, adding statistics by about 32%, citing - Network accessline 120
5. Tables and lists. Comparison tables are the most extractable format for "best X" and "X vs Y" prompts. Measured citation share by format: comparative listicles ("Best X for Y") 32.5% of citations, other listicles 21.9%, articles 16.7%, p - Network accessline 120
5. Tables and lists. Comparison tables are the most extractable format for "best X" and "X vs Y" prompts. Measured citation share by format: comparative listicles ("Best X for Y") 32.5% of citations, other listicles 21.9%, articles 16.7%, p - Network accessline 121
6. Descriptive natural-language slugs. Pages with descriptive slugs were cited at 89.78% vs 81.11% for non-descriptive ones in Ahrefs' dataset (https://ahrefs.com/blog/why-chatgpt-cites-pages/). Slug the page like the question it answers. - Network accessline 121
6. Descriptive natural-language slugs. Pages with descriptive slugs were cited at 89.78% vs 81.11% for non-descriptive ones in Ahrefs' dataset (https://ahrefs.com/blog/why-chatgpt-cites-pages/). Slug the page like the question it answers. - Network accessline 220
- Control the brand SERP: own page 1 for the brand query with the site plus profiles you control. Engines resolve "what is [brand]" from those results. - Wikipedia only if notability criteria are genuinely met; a deleted draft helps nobody. - Network accessline 220
- Control the brand SERP: own page 1 for the brand query with the site plus profiles you control. Engines resolve "what is [brand]" from those results. - Wikipedia only if notability criteria are genuinely met; a deleted draft helps nobody. - Network accessline 222
- Brand web mentions correlate with AI Overview brand visibility at 0.664 versus 0.218 for backlinks (https://ahrefs.com/blog/ai-overview-brand-correlation/). Correlation, not proven causation, but the gap is large enough to justify a menti - Network accessline 222
- Brand web mentions correlate with AI Overview brand visibility at 0.664 versus 0.218 for backlinks (https://ahrefs.com/blog/ai-overview-brand-correlation/). Correlation, not proven causation, but the gap is large enough to justify a menti - Network accessline 237
Volatility warning: Reddit's share of ChatGPT citations moved from roughly 60% to roughly 10% within about a month after platform shifts (https://www.semrush.com/blog/most-cited-domains-ai/). Any single-surface strategy can be erased by one - Network accessline 237
Volatility warning: Reddit's share of ChatGPT citations moved from roughly 60% to roughly 10% within about a month after platform shifts (https://www.semrush.com/blog/most-cited-domains-ai/). Any single-surface strategy can be erased by one - Network accessline 243
| Claim | Verdict | Reality | |---|---|---| | "Add llms.txt to get cited" | No evidence | No AI engine has announced reading it. Google's John Mueller: none of the AI services say they use it, and server logs show they do not even check for - Network accessline 243
| Claim | Verdict | Reality | |---|---|---| | "Add llms.txt to get cited" | No evidence | No AI engine has announced reading it. Google's John Mueller: none of the AI services say they use it, and server logs show they do not even check for - Network accessline 244
|---|---|---| | "Add llms.txt to get cited" | No evidence | No AI engine has announced reading it. Google's John Mueller: none of the AI services say they use it, and server logs show they do not even check for it (https://www.searchenginej - Network accessline 244
|---|---|---| | "Add llms.txt to get cited" | No evidence | No AI engine has announced reading it. Google's John Mueller: none of the AI services say they use it, and server logs show they do not even check for it (https://www.searchenginej - Network accessline 245
| "Add llms.txt to get cited" | No evidence | No AI engine has announced reading it. Google's John Mueller: none of the AI services say they use it, and server logs show they do not even check for it (https://www.searchenginejournal.com/goo - Network accessline 245
| "Add llms.txt to get cited" | No evidence | No AI engine has announced reading it. Google's John Mueller: none of the AI services say they use it, and server logs show they do not even check for it (https://www.searchenginejournal.com/goo - Network accessline 246
| "Block Google-Extended to exit AI Overviews" | False | Google-Extended controls Gemini model training, not AI Overviews. AI Overviews are built from normal Google Search indexing (https://developers.google.com/search/docs/appearance/ai-fe - Network accessline 246
| "Block Google-Extended to exit AI Overviews" | False | Google-Extended controls Gemini model training, not AI Overviews. AI Overviews are built from normal Google Search indexing (https://developers.google.com/search/docs/appearance/ai-fe - Network accessline 247
| "Keyword stuffing helps LLMs" | False | It reduced visibility in the GEO benchmark (https://arxiv.org/abs/2311.09735). Models reward answers, not token repetition. | - Network accessline 247
| "Keyword stuffing helps LLMs" | False | It reduced visibility in the GEO benchmark (https://arxiv.org/abs/2311.09735). Models reward answers, not token repetition. | - Network accessline 290
- Ahrefs, 1.4M prompt study on ChatGPT citation predictors (title similarity, slug rates, page age): https://ahrefs.com/blog/why-chatgpt-cites-pages/ - Network accessline 290
- Ahrefs, 1.4M prompt study on ChatGPT citation predictors (title similarity, slug rates, page age): https://ahrefs.com/blog/why-chatgpt-cites-pages/ - Network accessline 291
- Botify, OpenAI tripled web crawl since August 2025: https://www.botify.com/blog/openai-tripled-web-crawl - Network accessline 291
- Botify, OpenAI tripled web crawl since August 2025: https://www.botify.com/blog/openai-tripled-web-crawl - Network accessline 292
- Semrush, AI Mode vs organic results comparison study (32% overlap): https://www.semrush.com/blog/ai-mode-comparison-study/ - Network accessline 292
- Semrush, AI Mode vs organic results comparison study (32% overlap): https://www.semrush.com/blog/ai-mode-comparison-study/ - Network accessline 293
- Semrush, most cited domains in AI answers (Reddit volatility): https://www.semrush.com/blog/most-cited-domains-ai/ - Network accessline 293
- Semrush, most cited domains in AI answers (Reddit volatility): https://www.semrush.com/blog/most-cited-domains-ai/ - Network accessline 294
- Profound, AI platform citation patterns (Perplexity source bias): https://www.tryprofound.com/blog/ai-platform-citation-patterns - Network accessline 294
- Profound, AI platform citation patterns (Perplexity source bias): https://www.tryprofound.com/blog/ai-platform-citation-patterns - Network accessline 295
- TechCrunch, Brave powers Claude web search: https://techcrunch.com/2025/03/21/anthropic-appears-to-be-using-brave-to-power-web-searches-for-its-claude-chatbot/ - Network accessline 295
- TechCrunch, Brave powers Claude web search: https://techcrunch.com/2025/03/21/anthropic-appears-to-be-using-brave-to-power-web-searches-for-its-claude-chatbot/ - Network accessline 296
- AuthorityTech, per-engine citation audit, 11% domain overlap: https://authoritytech.io/curated/ai-citation-11-percent-platform-overlap-per-engine-audit-2026 - Network accessline 296
- AuthorityTech, per-engine citation audit, 11% domain overlap: https://authoritytech.io/curated/ai-citation-11-percent-platform-overlap-per-engine-audit-2026 - Network accessline 297
- GEO: Generative Engine Optimization, controlled benchmark on 10,000 queries (Princeton et al.): https://arxiv.org/abs/2311.09735 - Network accessline 297
- GEO: Generative Engine Optimization, controlled benchmark on 10,000 queries (Princeton et al.): https://arxiv.org/abs/2311.09735 - Network accessline 298
- ALM, citation share by content format: https://almcorp.com/blog/ai-citations-listicles-articles-product-pages/ - Network accessline 298
- ALM, citation share by content format: https://almcorp.com/blog/ai-citations-listicles-articles-product-pages/ - Network accessline 299
- Ahrefs, brand mentions vs backlinks correlation with AI Overview visibility (0.664 vs 0.218): https://ahrefs.com/blog/ai-overview-brand-correlation/ - Network accessline 299
- Ahrefs, brand mentions vs backlinks correlation with AI Overview visibility (0.664 vs 0.218): https://ahrefs.com/blog/ai-overview-brand-correlation/ - Network accessline 300
- Search Engine Journal, John Mueller on llms.txt (no engine uses it): https://www.searchenginejournal.com/google-says-llms-txt-comparable-to-keywords-meta-tag/544804/ - Network accessline 300
- Search Engine Journal, John Mueller on llms.txt (no engine uses it): https://www.searchenginejournal.com/google-says-llms-txt-comparable-to-keywords-meta-tag/544804/ - Network accessline 301
- Google Search Central, AI features documentation (query fan-out, Google-Extended scope): https://developers.google.com/search/docs/appearance/ai-features - Network accessline 301
- Google Search Central, AI features documentation (query fan-out, Google-Extended scope): https://developers.google.com/search/docs/appearance/ai-features
skills/seo-ai-site-builders/SKILL.md
- Network accessline 4
license: MIT metadata: author: "Sorank (https://sorank.com)" - Network accessline 4
license: MIT metadata: author: "Sorank (https://sorank.com)" - Network accessline 5
metadata: author: "Sorank (https://sorank.com)" version: "1.0.0" - Network accessline 5
metadata: author: "Sorank (https://sorank.com)" version: "1.0.0" - Network accessline 6
author: "Sorank (https://sorank.com)" - Network accessline 6
author: "Sorank (https://sorank.com)" - Network accessline 44
Googlebot renders JavaScript, on a deferred second pass. No AI crawler does. The Vercel and MERJ analysis of 500M+ crawler fetches found GPTBot, ClaudeBot and PerplexityBot download JavaScript files and execute none of them (https://vercel. - Network accessline 44
Googlebot renders JavaScript, on a deferred second pass. No AI crawler does. The Vercel and MERJ analysis of 500M+ crawler fetches found GPTBot, ClaudeBot and PerplexityBot download JavaScript files and execute none of them (https://vercel. - Network accessline 74
python3 scripts/render_check.py https://example.com/ https://example.com/pricing --soft404 - Network accessline 74
python3 scripts/render_check.py https://example.com/ https://example.com/pricing --soft404 - Network accessline 80
# Is a sentence from the page present in the HTML curl -sL https://example.com/page/ | grep -c "a sentence you can see on the page" - Network accessline 80
# Is a sentence from the page present in the HTML curl -sL https://example.com/page/ | grep -c "a sentence you can see on the page" - Network accessline 81
curl -sL https://example.com/page/ | grep -c "a sentence you can see on the page" - Network accessline 81
curl -sL https://example.com/page/ | grep -c "a sentence you can see on the page" - Network accessline 83
# What the document actually contains curl -sL https://example.com/page/ | head -50 - Network accessline 83
# What the document actually contains curl -sL https://example.com/page/ | head -50 - Network accessline 84
curl -sL https://example.com/page/ | head -50 - Network accessline 84
curl -sL https://example.com/page/ | head -50 - Network accessline 86
# As an AI crawler curl -sL -A "Mozilla/5.0 (compatible; GPTBot/1.2; +https://openai.com/gptbot)" https://example.com/page/ | wc -w - Network accessline 86
# As an AI crawler curl -sL -A "Mozilla/5.0 (compatible; GPTBot/1.2; +https://openai.com/gptbot)" https://example.com/page/ | wc -w - Network accessline 87
curl -sL -A "Mozilla/5.0 (compatible; GPTBot/1.2; +https://openai.com/gptbot)" https://example.com/page/ | wc -w - Network accessline 87
curl -sL -A "Mozilla/5.0 (compatible; GPTBot/1.2; +https://openai.com/gptbot)" https://example.com/page/ | wc -w - Network accessline 117
- A platform-side fix disappears with the platform. Treat "SSR on Lovable hosting" and "snapshots on Base44 hosting" as hosting features. Write that down before anyone plans an export. - Prerendering that is served only to crawlers is dynam - Network accessline 117
- A platform-side fix disappears with the platform. Treat "SSR on Lovable hosting" and "snapshots on Base44 hosting" as hosting features. Write that down before anyone plans an export. - Prerendering that is served only to crawlers is dynam - Network accessline 118
- Prerendering that is served only to crawlers is dynamic rendering, whatever the vendor calls it. It works, and Google classes it as a workaround rather than a long-term solution (https://developers.google.com/search/docs/crawling-indexing - Network accessline 118
- Prerendering that is served only to crawlers is dynamic rendering, whatever the vendor calls it. It works, and Google classes it as a workaround rather than a long-term solution (https://developers.google.com/search/docs/crawling-indexing - Network accessline 267
- AI crawlers do not execute JavaScript, 500M+ fetches analyzed: https://vercel.com/blog/the-rise-of-the-ai-crawler - Network accessline 267
- AI crawlers do not execute JavaScript, 500M+ fetches analyzed: https://vercel.com/blog/the-rise-of-the-ai-crawler - Network accessline 268
- AI search and JavaScript rendering: https://www.gsqi.com/marketing-blog/ai-search-javascript-rendering/ - Network accessline 268
- AI search and JavaScript rendering: https://www.gsqi.com/marketing-blog/ai-search-javascript-rendering/ - Network accessline 269
- Google on dynamic rendering as a workaround, not a long-term solution: https://developers.google.com/search/docs/crawling-indexing/javascript/dynamic-rendering - Network accessline 269
- Google on dynamic rendering as a workaround, not a long-term solution: https://developers.google.com/search/docs/crawling-indexing/javascript/dynamic-rendering - Network accessline 270
- Google no longer recommends dynamic rendering: https://searchengineland.com/google-no-longer-recommends-using-dynamic-rendering-for-google-search-387054 - Network accessline 270
- Google no longer recommends dynamic rendering: https://searchengineland.com/google-no-longer-recommends-using-dynamic-rendering-for-google-search-387054 - Network accessline 271
- Lovable rendering and SSR status: https://docs.lovable.dev/features/upgrade-to-tanstack-start and https://lovable.dev/seo-aeo - Base44 product changelog (SEO and crawler snapshots): https://docs.base44.com/changelog/product - Base44 SSR a - Network accessline 271
- Lovable rendering and SSR status: https://docs.lovable.dev/features/upgrade-to-tanstack-start and https://lovable.dev/seo-aeo - Base44 product changelog (SEO and crawler snapshots): https://docs.base44.com/changelog/product - Base44 SSR a - Network accessline 272
- Base44 product changelog (SEO and crawler snapshots): https://docs.base44.com/changelog/product - Base44 SSR and SSG feature requests, platform status in the open: https://feedback.base44.com/p/add-ssr-server-side-rendering-support - Stat - Network accessline 272
- Base44 product changelog (SEO and crawler snapshots): https://docs.base44.com/changelog/product - Base44 SSR and SSG feature requests, platform status in the open: https://feedback.base44.com/p/add-ssr-server-side-rendering-support - Stat - Network accessline 273
- Base44 SSR and SSG feature requests, platform status in the open: https://feedback.base44.com/p/add-ssr-server-side-rendering-support - Network accessline 273
- Base44 SSR and SSG feature requests, platform status in the open: https://feedback.base44.com/p/add-ssr-server-side-rendering-support - Network accessline 274
- Static generation for Vite React apps: https://github.com/Daydreamer-riri/vite-react-ssg - Network accessline 274
- Static generation for Vite React apps: https://github.com/Daydreamer-riri/vite-react-ssg
skills/seo-ai-site-builders/scripts/render_check.py
- Executable scriptline 1
#!/usr/bin/env python3 - Executable scriptline 1
#!/usr/bin/env python3 - Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 12
Usage: python3 render_check.py https://example.com - Network accessline 12
Usage: python3 render_check.py https://example.com - Network accessline 12
Usage: python3 render_check.py https://example.com - Network accessline 13
python3 render_check.py https://example.com - Network accessline 13
python3 render_check.py https://example.com - Network accessline 13
python3 render_check.py https://example.com - Network accessline 14
python3 render_check.py https://example.com/ https://example.com/pricing - Network accessline 14
python3 render_check.py https://example.com/ https://example.com/pricing - Network accessline 14
python3 render_check.py https://example.com/ https://example.com/pricing - Network accessline 15
python3 render_check.py --sitemap https://example.com/sitemap.xml --limit 10 - Network accessline 15
python3 render_check.py --sitemap https://example.com/sitemap.xml --limit 10 - Network accessline 15
python3 render_check.py --sitemap https://example.com/sitemap.xml --limit 10 - Network accessline 16
python3 render_check.py https://example.com --ua-compare - Network accessline 16
python3 render_check.py https://example.com --ua-compare - Network accessline 16
python3 render_check.py https://example.com --ua-compare - Network accessline 17
python3 render_check.py https://example.com --json - Network accessline 17
python3 render_check.py https://example.com --json - Network accessline 17
python3 render_check.py https://example.com --json - Network accessline 42
) GOOGLEBOT_UA = ( "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" - Network accessline 42
) GOOGLEBOT_UA = ( "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" - Network accessline 42
) GOOGLEBOT_UA = ( "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" - Network accessline 43
GOOGLEBOT_UA = ( "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" ) - Network accessline 43
GOOGLEBOT_UA = ( "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" ) - Network accessline 43
GOOGLEBOT_UA = ( "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" ) - Network accessline 44
"Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" - Network accessline 44
"Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" - Network accessline 44
"Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" - Network accessline 46
GPTBOT_UA = "Mozilla/5.0 (compatible; GPTBot/1.2; +https://openai.com/gptbot)" - Network accessline 46
GPTBOT_UA = "Mozilla/5.0 (compatible; GPTBot/1.2; +https://openai.com/gptbot)" - Network accessline 46
GPTBOT_UA = "Mozilla/5.0 (compatible; GPTBot/1.2; +https://openai.com/gptbot)" - Network accessline 103
def fetch(url, ua, timeout): - Network accessline 103
def fetch(url, ua, timeout): - Network accessline 103
def fetch(url, ua, timeout): - Network accessline 105
req = urllib.request.Request(url, headers={"User-Agent": ua, "Accept": "text/html"}) - Network accessline 105
req = urllib.request.Request(url, headers={"User-Agent": ua, "Accept": "text/html"}) - Network accessline 105
req = urllib.request.Request(url, headers={"User-Agent": ua, "Accept": "text/html"}) - Network accessline 106
try: with urllib.request.urlopen(req, timeout=timeout) as resp: raw = resp.read(3_000_000) - Network accessline 106
try: with urllib.request.urlopen(req, timeout=timeout) as resp: raw = resp.read(3_000_000) - Network accessline 106
try: with urllib.request.urlopen(req, timeout=timeout) as resp: raw = resp.read(3_000_000) - Network accessline 107
with urllib.request.urlopen(req, timeout=timeout) as resp: - Network accessline 107
with urllib.request.urlopen(req, timeout=timeout) as resp: - Network accessline 107
with urllib.request.urlopen(req, timeout=timeout) as resp: - Network accessline 178
def analyze(url, timeout, ua=BROWSER_UA): status, final_url, html, error = fetch(url, ua, timeout) - Network accessline 178
def analyze(url, timeout, ua=BROWSER_UA): status, final_url, html, error = fetch(url, ua, timeout) - Network accessline 178
def analyze(url, timeout, ua=BROWSER_UA): status, final_url, html, error = fetch(url, ua, timeout) - Network accessline 179
status, final_url, html, error = fetch(url, ua, timeout) - Network accessline 179
status, final_url, html, error = fetch(url, ua, timeout) - Network accessline 179
status, final_url, html, error = fetch(url, ua, timeout) - Network accessline 315
status, _, body, error = fetch(url, BROWSER_UA, timeout) - Network accessline 315
status, _, body, error = fetch(url, BROWSER_UA, timeout) - Network accessline 315
status, _, body, error = fetch(url, BROWSER_UA, timeout) - Network accessline 324
if len(pages) >= limit: break _, _, child, child_error = fetch(index, BROWSER_UA, timeout) - Network accessline 324
if len(pages) >= limit: break _, _, child, child_error = fetch(index, BROWSER_UA, timeout) - Network accessline 324
if len(pages) >= limit: break _, _, child, child_error = fetch(index, BROWSER_UA, timeout) - Network accessline 325
break _, _, child, child_error = fetch(index, BROWSER_UA, timeout) if child_error: - Network accessline 325
break _, _, child, child_error = fetch(index, BROWSER_UA, timeout) if child_error: - Network accessline 325
break _, _, child, child_error = fetch(index, BROWSER_UA, timeout) if child_error: - Network accessline 326
_, _, child, child_error = fetch(index, BROWSER_UA, timeout) - Network accessline 326
_, _, child, child_error = fetch(index, BROWSER_UA, timeout) - Network accessline 326
_, _, child, child_error = fetch(index, BROWSER_UA, timeout) - Network accessline 340
(parsed.scheme, parsed.netloc, "/render-check-404-probe-zzz", "", "", "") ) status, _, _, error = fetch(probe, BROWSER_UA, timeout) - Network accessline 340
(parsed.scheme, parsed.netloc, "/render-check-404-probe-zzz", "", "", "") ) status, _, _, error = fetch(probe, BROWSER_UA, timeout) - Network accessline 340
(parsed.scheme, parsed.netloc, "/render-check-404-probe-zzz", "", "", "") ) status, _, _, error = fetch(probe, BROWSER_UA, timeout) - Network accessline 341
) status, _, _, error = fetch(probe, BROWSER_UA, timeout) if error: - Network accessline 341
) status, _, _, error = fetch(probe, BROWSER_UA, timeout) if error: - Network accessline 341
) status, _, _, error = fetch(probe, BROWSER_UA, timeout) if error: - Network accessline 342
status, _, _, error = fetch(probe, BROWSER_UA, timeout) - Network accessline 342
status, _, _, error = fetch(probe, BROWSER_UA, timeout) - Network accessline 342
status, _, _, error = fetch(probe, BROWSER_UA, timeout)
skills/seo-audit-pdf/SKILL.md
- Network accessline 4
license: MIT metadata: author: "Sorank (https://sorank.com)" - Network accessline 4
license: MIT metadata: author: "Sorank (https://sorank.com)" - Network accessline 5
metadata: author: "Sorank (https://sorank.com)" version: "1.0.0" - Network accessline 5
metadata: author: "Sorank (https://sorank.com)" version: "1.0.0" - Network accessline 6
author: "Sorank (https://sorank.com)" - Network accessline 6
author: "Sorank (https://sorank.com)"
skills/seo-audit-pdf/assets/report-template.html
- Network accessline 4
<meta charset="utf-8"> <title>Audit SEO GEO example.com</title> <link rel="preconnect" href="https://fonts.googleapis.com"> - Network accessline 4
<meta charset="utf-8"> <title>Audit SEO GEO example.com</title> <link rel="preconnect" href="https://fonts.googleapis.com"> - Network accessline 5
<title>Audit SEO GEO example.com</title> <link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> - Network accessline 5
<title>Audit SEO GEO example.com</title> <link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> - Network accessline 6
<link rel="preconnect" href="https://fonts.googleapis.com"> - Network accessline 6
<link rel="preconnect" href="https://fonts.googleapis.com"> - Network accessline 7
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> - Network accessline 7
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> - Network accessline 8
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet"> - Network accessline 8
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
skills/seo-audit-pdf/scripts/render_pdf.py
skills/seo-backlinks/SKILL.md
- Network accessline 4
license: MIT metadata: author: "Sorank (https://sorank.com)" - Network accessline 4
license: MIT metadata: author: "Sorank (https://sorank.com)" - Network accessline 5
metadata: author: "Sorank (https://sorank.com)" version: "1.0.0" - Network accessline 5
metadata: author: "Sorank (https://sorank.com)" version: "1.0.0" - Network accessline 6
author: "Sorank (https://sorank.com)" - Network accessline 6
author: "Sorank (https://sorank.com)" - Network accessline 16
1. **Links for Google.** Backlinks remain a major ranking factor in classic organic search. 2. **Mentions everywhere for LLMs.** Brand mentions (linked or not) correlate roughly 3x more strongly with visibility in AI answers than backlinks - Network accessline 16
1. **Links for Google.** Backlinks remain a major ranking factor in classic organic search. 2. **Mentions everywhere for LLMs.** Brand mentions (linked or not) correlate roughly 3x more strongly with visibility in AI answers than backlinks - Network accessline 17
2. **Mentions everywhere for LLMs.** Brand mentions (linked or not) correlate roughly 3x more strongly with visibility in AI answers than backlinks do. Ahrefs measured this across 75,000 brands: correlation of 0.664 for brand mentions versu - Network accessline 17
2. **Mentions everywhere for LLMs.** Brand mentions (linked or not) correlate roughly 3x more strongly with visibility in AI answers than backlinks do. Ahrefs measured this across 75,000 brands: correlation of 0.664 for brand mentions versu - Network accessline 71
Since 2019, Google treats nofollow as a hint, not a directive, and added rel="sponsored" and rel="ugc" (https://developers.google.com/search/blog/2019/09/evolving-nofollow-new-ways-to-identify). Practical consequences: - Network accessline 71
Since 2019, Google treats nofollow as a hint, not a directive, and added rel="sponsored" and rel="ugc" (https://developers.google.com/search/blog/2019/09/evolving-nofollow-new-ways-to-identify). Practical consequences: - Network accessline 175
| Tactic | Why it works | Evidence | |---|---|---| | Digital PR on proprietary data (annual study, benchmark, survey) | Journalists need numbers; a real dataset earns coverage no budget can buy. Links from press coverage of genuine studies - Network accessline 175
| Tactic | Why it works | Evidence | |---|---|---| | Digital PR on proprietary data (annual study, benchmark, survey) | Journalists need numbers; a real dataset earns coverage no budget can buy. Links from press coverage of genuine studies - Network accessline 176
|---|---|---| | Digital PR on proprietary data (annual study, benchmark, survey) | Journalists need numbers; a real dataset earns coverage no budget can buy. Links from press coverage of genuine studies passed the March 2026 spam update und - Network accessline 176
|---|---|---| | Digital PR on proprietary data (annual study, benchmark, survey) | Journalists need numbers; a real dataset earns coverage no budget can buy. Links from press coverage of genuine studies passed the March 2026 spam update und - Network accessline 177
| Digital PR on proprietary data (annual study, benchmark, survey) | Journalists need numbers; a real dataset earns coverage no budget can buy. Links from press coverage of genuine studies passed the March 2026 spam update undamaged. | http - Network accessline 177
| Digital PR on proprietary data (annual study, benchmark, survey) | Journalists need numbers; a real dataset earns coverage no budget can buy. Links from press coverage of genuine studies passed the March 2026 spam update undamaged. | http - Network accessline 180
| Broken link building | You offer the webmaster a fix, not a favor. Find dead links on resource pages in your topic, propose your equivalent page. | Field heuristic from 115+ agency audits | | Partnerships and integrations | Partner pages, - Network accessline 180
| Broken link building | You offer the webmaster a fix, not a favor. Find dead links on resource pages in your topic, propose your equivalent page. | Field heuristic from 115+ agency audits | | Partnerships and integrations | Partner pages, - Network accessline 181
| Partnerships and integrations | Partner pages, integration marketplaces, and co-marketing produce relevant dofollow links with real traffic. | Field heuristic from 115+ agency audits | | Expert quotes (HARO-style source requests) | One go - Network accessline 181
| Partnerships and integrations | Partner pages, integration marketplaces, and co-marketing produce relevant dofollow links with real traffic. | Field heuristic from 115+ agency audits | | Expert quotes (HARO-style source requests) | One go - Network accessline 182
| Expert quotes (HARO-style source requests) | One good quote earns an editorial link, and quotes feed GEO directly: adding quotations measured up to +41% generative engine visibility in the Princeton GEO study. | https://arxiv.org/abs/2311 - Network accessline 182
| Expert quotes (HARO-style source requests) | One good quote earns an editorial link, and quotes feed GEO directly: adding quotations measured up to +41% generative engine visibility in the Princeton GEO study. | https://arxiv.org/abs/2311 - Network accessline 212
**Explicit risk warning: undisclosed paid links violate Google's spam policies.** Links that pass ranking credit in exchange for payment must carry rel="sponsored" to be compliant (https://developers.google.com/search/blog/2019/09/evolving- - Network accessline 212
**Explicit risk warning: undisclosed paid links violate Google's spam policies.** Links that pass ranking credit in exchange for payment must carry rel="sponsored" to be compliant (https://developers.google.com/search/blog/2019/09/evolving- - Network accessline 277
Answer engines cite pages where the brand appears, linked or not. Recall the headline numbers: mentions correlate at 0.664 with AI answer presence versus 0.218 for backlinks (Ahrefs, 75,000 brands, https://ahrefs.com/blog/ai-overview-brand- - Network accessline 277
Answer engines cite pages where the brand appears, linked or not. Recall the headline numbers: mentions correlate at 0.664 with AI answer presence versus 0.218 for backlinks (Ahrefs, 75,000 brands, https://ahrefs.com/blog/ai-overview-brand- - Network accessline 283
| Review platforms | G2, Capterra, Trustpilot | Massively cited in "best X" and "X alternatives" answers; structured, comparative, regularly updated. | | Third-party "best of" lists | Blog roundups, trade press rankings | LLMs synthesize co - Network accessline 283
| Review platforms | G2, Capterra, Trustpilot | Massively cited in "best X" and "X alternatives" answers; structured, comparative, regularly updated. | | Third-party "best of" lists | Blog roundups, trade press rankings | LLMs synthesize co - Network accessline 284
| Third-party "best of" lists | Blog roundups, trade press rankings | LLMs synthesize consensus from list pages; absence from the lists means absence from the answer. | | Reddit and community threads | Subreddits, Hacker News, niche forums - Network accessline 284
| Third-party "best of" lists | Blog roundups, trade press rankings | LLMs synthesize consensus from list pages; absence from the lists means absence from the answer. | | Reddit and community threads | Subreddits, Hacker News, niche forums - Network accessline 285
| Reddit and community threads | Subreddits, Hacker News, niche forums | Feeds model training and retrieval as authentic user consensus. Extreme volatility: Reddit's share of AI citations moved from roughly 60% to roughly 10% in a single mo - Network accessline 285
| Reddit and community threads | Subreddits, Hacker News, niche forums | Feeds model training and retrieval as authentic user consensus. Extreme volatility: Reddit's share of AI citations moved from roughly 60% to roughly 10% in a single mo - Network accessline 334
- Ahrefs, brand mentions vs backlinks correlation with AI Overview presence, 75,000 brands: https://ahrefs.com/blog/ai-overview-brand-correlation/ - Network accessline 334
- Ahrefs, brand mentions vs backlinks correlation with AI Overview presence, 75,000 brands: https://ahrefs.com/blog/ai-overview-brand-correlation/ - Network accessline 335
- Google, evolution of nofollow and introduction of rel="sponsored" and rel="ugc" (2019): https://developers.google.com/search/blog/2019/09/evolving-nofollow-new-ways-to-identify - Network accessline 335
- Google, evolution of nofollow and introduction of rel="sponsored" and rel="ugc" (2019): https://developers.google.com/search/blog/2019/09/evolving-nofollow-new-ways-to-identify - Network accessline 336
- Digital Applied, link building outcomes after the March 2026 spam update: https://digitalapplied.com/blog/link-building-after-march-2026-strategies-post-update - Network accessline 336
- Digital Applied, link building outcomes after the March 2026 spam update: https://digitalapplied.com/blog/link-building-after-march-2026-strategies-post-update - Network accessline 337
- Aggarwal et al., GEO: Generative Engine Optimization (Princeton et al.), quotation impact on generative visibility: https://arxiv.org/abs/2311.09735 - Network accessline 337
- Aggarwal et al., GEO: Generative Engine Optimization (Princeton et al.), quotation impact on generative visibility: https://arxiv.org/abs/2311.09735 - Network accessline 338
- Semrush, most cited domains in AI answers and Reddit citation volatility: https://www.semrush.com/blog/most-cited-domains-ai/ - Network accessline 338
- Semrush, most cited domains in AI answers and Reddit citation volatility: https://www.semrush.com/blog/most-cited-domains-ai/ - Network accessline 339
- Reporter Outreach, earned media share of AI citations (single source, medium confidence): https://www.reporteroutreach.com/blog/unlinked-brand-mentions - Network accessline 339
- Reporter Outreach, earned media share of AI citations (single source, medium confidence): https://www.reporteroutreach.com/blog/unlinked-brand-mentions
skills/seo-content-blog/SKILL.md
- Network accessline 4
license: MIT metadata: author: "Sorank (https://sorank.com)" - Network accessline 4
license: MIT metadata: author: "Sorank (https://sorank.com)" - Network accessline 5
metadata: author: "Sorank (https://sorank.com)" version: "2.0.0" - Network accessline 5
metadata: author: "Sorank (https://sorank.com)" version: "2.0.0" - Network accessline 6
author: "Sorank (https://sorank.com)" - Network accessline 6
author: "Sorank (https://sorank.com)" - Network accessline 110
python3 skills/seo-geo-audit/scripts/seo_audit.py https://example.com/ /blog/ /blog/<post>/ /author/<name>/ - Network accessline 110
python3 skills/seo-geo-audit/scripts/seo_audit.py https://example.com/ /blog/ /blog/<post>/ /author/<name>/ - Network accessline 111
python3 skills/seo-page-sections/scripts/section_audit.py --type blog https://example.com/blog/<post>/ - Network accessline 111
python3 skills/seo-page-sections/scripts/section_audit.py --type blog https://example.com/blog/<post>/ - Network accessline 142
python3 skills/seo-internal-linking/scripts/site_crawl.py https://example.com --out crawl.json - Network accessline 142
python3 skills/seo-internal-linking/scripts/site_crawl.py https://example.com --out crawl.json - Network accessline 155
python3 skills/seo-geo-audit/scripts/page_benchmark.py --type blog https://client.com/blog/<post>/ https://rival1.com/a/ https://rival2.com/b/ https://rival3.com/c/ - Network accessline 155
python3 skills/seo-geo-audit/scripts/page_benchmark.py --type blog https://client.com/blog/<post>/ https://rival1.com/a/ https://rival2.com/b/ https://rival3.com/c/ - Network accessline 311
Google Discover lane: for most publishers Discover is a bigger organic surface than Google News. It cannot be targeted with keywords; it rewards the same fundamentals plus its documented specifics: large images (1200px+, enabled via max-ima - Network accessline 311
Google Discover lane: for most publishers Discover is a bigger organic surface than Google News. It cannot be targeted with keywords; it rewards the same fundamentals plus its documented specifics: large images (1200px+, enabled via max-ima - Network accessline 455
- Princeton GEO study, "GEO: Generative Engine Optimization" (KDD 2024): https://arxiv.org/abs/2311.09735 - Network accessline 455
- Princeton GEO study, "GEO: Generative Engine Optimization" (KDD 2024): https://arxiv.org/abs/2311.09735 - Network accessline 456
- Ahrefs, analysis of 1.4M ChatGPT prompts and citation patterns: https://ahrefs.com/blog/why-chatgpt-cites-pages/ - Network accessline 456
- Ahrefs, analysis of 1.4M ChatGPT prompts and citation patterns: https://ahrefs.com/blog/why-chatgpt-cites-pages/ - Network accessline 457
- ALM Corp, listicle share of AI citations (single-source study, not independently replicated): https://almcorp.com/blog/ai-citations-listicles-articles-product-pages/ - Network accessline 457
- ALM Corp, listicle share of AI citations (single-source study, not independently replicated): https://almcorp.com/blog/ai-citations-listicles-articles-product-pages/ - Network accessline 458
- Search Engine Land, query fan-out optimization guide: https://searchengineland.com/guide/how-to-optimize-for-query-fan-out - Network accessline 458
- Search Engine Land, query fan-out optimization guide: https://searchengineland.com/guide/how-to-optimize-for-query-fan-out - Network accessline 459
- Google patent US 11,354,342 (contextual estimation of link information gain): https://patents.google.com/patent/US11354342B2/en - Network accessline 459
- Google patent US 11,354,342 (contextual estimation of link information gain): https://patents.google.com/patent/US11354342B2/en - Network accessline 460
- Google Search Central, guidance on AI-generated content: https://developers.google.com/search/blog/2023/02/google-search-and-ai-content - Network accessline 460
- Google Search Central, guidance on AI-generated content: https://developers.google.com/search/blog/2023/02/google-search-and-ai-content - Network accessline 461
- Google spam policies (scaled content abuse): https://developers.google.com/search/docs/essentials/spam-policies - Network accessline 461
- Google spam policies (scaled content abuse): https://developers.google.com/search/docs/essentials/spam-policies - Network accessline 462
- Google, FAQ and HowTo rich result deprecation: https://developers.google.com/search/blog/2023/08/howto-faq-changes - Network accessline 462
- Google, FAQ and HowTo rich result deprecation: https://developers.google.com/search/blog/2023/08/howto-faq-changes - Network accessline 463
- Google, title link guidance: https://developers.google.com/search/docs/appearance/title-link - Network accessline 463
- Google, title link guidance: https://developers.google.com/search/docs/appearance/title-link - Network accessline 464
- Google, Discover documentation: https://developers.google.com/search/docs/appearance/google-discover - Network accessline 464
- Google, Discover documentation: https://developers.google.com/search/docs/appearance/google-discover
skills/seo-content-blog/evals/evals.json
- Network accessline 4
{ "id": 1, "prompt": "Write a blog article for our site. We sell water treatment equipment to homeowners at https://flowfixsupplies.com. Target keyword: \"how to descale a tankless water heater\". The article must support our de - Network accessline 4
{ "id": 1, "prompt": "Write a blog article for our site. We sell water treatment equipment to homeowners at https://flowfixsupplies.com. Target keyword: \"how to descale a tankless water heater\". The article must support our de - Network accessline 5
"id": 1, "prompt": "Write a blog article for our site. We sell water treatment equipment to homeowners at https://flowfixsupplies.com. Target keyword: \"how to descale a tankless water heater\". The article must support our descaling - Network accessline 5
"id": 1, "prompt": "Write a blog article for our site. We sell water treatment equipment to homeowners at https://flowfixsupplies.com. Target keyword: \"how to descale a tankless water heater\". The article must support our descaling - Network accessline 6
"prompt": "Write a blog article for our site. We sell water treatment equipment to homeowners at https://flowfixsupplies.com. Target keyword: \"how to descale a tankless water heater\". The article must support our descaling kit product pag - Network accessline 6
"prompt": "Write a blog article for our site. We sell water treatment equipment to homeowners at https://flowfixsupplies.com. Target keyword: \"how to descale a tankless water heater\". The article must support our descaling kit product pag - Network accessline 10
{ "id": 2, "prompt": "hey, our post \"best crm for real estate agents\" dropped from #4 to #12 over the last 3 months and chatgpt never mentions us when people ask for crm recommendations. it's at https://propelcrm.io/blog/best- - Network accessline 10
{ "id": 2, "prompt": "hey, our post \"best crm for real estate agents\" dropped from #4 to #12 over the last 3 months and chatgpt never mentions us when people ask for crm recommendations. it's at https://propelcrm.io/blog/best- - Network accessline 11
"id": 2, "prompt": "hey, our post \"best crm for real estate agents\" dropped from #4 to #12 over the last 3 months and chatgpt never mentions us when people ask for crm recommendations. it's at https://propelcrm.io/blog/best-crm-real - Network accessline 11
"id": 2, "prompt": "hey, our post \"best crm for real estate agents\" dropped from #4 to #12 over the last 3 months and chatgpt never mentions us when people ask for crm recommendations. it's at https://propelcrm.io/blog/best-crm-real - Network accessline 12
"prompt": "hey, our post \"best crm for real estate agents\" dropped from #4 to #12 over the last 3 months and chatgpt never mentions us when people ask for crm recommendations. it's at https://propelcrm.io/blog/best-crm-real-estate-agents, - Network accessline 12
"prompt": "hey, our post \"best crm for real estate agents\" dropped from #4 to #12 over the last 3 months and chatgpt never mentions us when people ask for crm recommendations. it's at https://propelcrm.io/blog/best-crm-real-estate-agents, - Network accessline 16
{ "id": 3, "prompt": "Our content writer produced a draft with ChatGPT and wants to publish it tomorrow at https://lendelio.com/blog/what-is-invoice-factoring. It is 430 words, defines invoice factoring, lists 3 generic benefits - Network accessline 16
{ "id": 3, "prompt": "Our content writer produced a draft with ChatGPT and wants to publish it tomorrow at https://lendelio.com/blog/what-is-invoice-factoring. It is 430 words, defines invoice factoring, lists 3 generic benefits - Network accessline 17
"id": 3, "prompt": "Our content writer produced a draft with ChatGPT and wants to publish it tomorrow at https://lendelio.com/blog/what-is-invoice-factoring. It is 430 words, defines invoice factoring, lists 3 generic benefits, has no - Network accessline 17
"id": 3, "prompt": "Our content writer produced a draft with ChatGPT and wants to publish it tomorrow at https://lendelio.com/blog/what-is-invoice-factoring. It is 430 words, defines invoice factoring, lists 3 generic benefits, has no - Network accessline 18
"prompt": "Our content writer produced a draft with ChatGPT and wants to publish it tomorrow at https://lendelio.com/blog/what-is-invoice-factoring. It is 430 words, defines invoice factoring, lists 3 generic benefits, has no sources, no im - Network accessline 18
"prompt": "Our content writer produced a draft with ChatGPT and wants to publish it tomorrow at https://lendelio.com/blog/what-is-invoice-factoring. It is 430 words, defines invoice factoring, lists 3 generic benefits, has no sources, no im
skills/seo-content-blog/references/blog-templates.md
- Network accessline 56
| Related articles | 3 cards with cover image, title, one-line excerpt, same category first | Internal links within the silo, pages per session | | Final CTA banner | Full-width block before the footer: promise, social proof (client avatars - Network accessline 56
| Related articles | 3 cards with cover image, title, one-line excerpt, same category first | Internal links within the silo, pages per session | | Final CTA banner | Full-width block before the footer: promise, social proof (client avatars - Network accessline 58
| Social profiles in the footer | Real profile URLs, never a network homepage (`https://www.instagram.com/` is a placeholder, not a profile) | Entity consistency across platforms, and the `sameAs` list must point to the same profiles | - Network accessline 58
| Social profiles in the footer | Real profile URLs, never a network homepage (`https://www.instagram.com/` is a placeholder, not a profile) | Entity consistency across platforms, and the `sameAs` list must point to the same profiles | - Network accessline 109
{ "@context": "https://schema.org", - Network accessline 109
{ "@context": "https://schema.org", - Network accessline 110
"@context": "https://schema.org", - Network accessline 110
"@context": "https://schema.org", - Network accessline 112
{ "@type": "BlogPosting", "@id": "https://example.com/blog/slug/#article", - Network accessline 112
{ "@type": "BlogPosting", "@id": "https://example.com/blog/slug/#article", - Network accessline 113
"@type": "BlogPosting", "@id": "https://example.com/blog/slug/#article", "headline": "Article title, 110 characters max", - Network accessline 113
"@type": "BlogPosting", "@id": "https://example.com/blog/slug/#article", "headline": "Article title, 110 characters max", - Network accessline 114
"@id": "https://example.com/blog/slug/#article", - Network accessline 114
"@id": "https://example.com/blog/slug/#article", - Network accessline 115
"headline": "Article title, 110 characters max", "description": "Meta description", "image": "https://example.com/images/cover-1200.webp", - Network accessline 115
"headline": "Article title, 110 characters max", "description": "Meta description", "image": "https://example.com/images/cover-1200.webp", - Network accessline 116
"description": "Meta description", "image": "https://example.com/images/cover-1200.webp", "datePublished": "2026-10-01", - Network accessline 116
"description": "Meta description", "image": "https://example.com/images/cover-1200.webp", "datePublished": "2026-10-01", - Network accessline 117
"image": "https://example.com/images/cover-1200.webp", - Network accessline 117
"image": "https://example.com/images/cover-1200.webp", - Network accessline 118
"datePublished": "2026-10-01", "dateModified": "2026-10-08", "author": { "@id": "https://example.com/auteur/firstname-lastname/#person" }, - Network accessline 118
"datePublished": "2026-10-01", "dateModified": "2026-10-08", "author": { "@id": "https://example.com/auteur/firstname-lastname/#person" }, - Network accessline 119
"dateModified": "2026-10-08", "author": { "@id": "https://example.com/auteur/firstname-lastname/#person" }, "publisher": { "@id": "https://example.com/#organization" }, - Network accessline 119
"dateModified": "2026-10-08", "author": { "@id": "https://example.com/auteur/firstname-lastname/#person" }, "publisher": { "@id": "https://example.com/#organization" }, - Network accessline 120
"author": { "@id": "https://example.com/auteur/firstname-lastname/#person" }, - Network accessline 120
"author": { "@id": "https://example.com/auteur/firstname-lastname/#person" }, - Network accessline 121
"publisher": { "@id": "https://example.com/#organization" }, - Network accessline 121
"publisher": { "@id": "https://example.com/#organization" }, - Network accessline 122
"mainEntityOfPage": "https://example.com/blog/slug/" - Network accessline 122
"mainEntityOfPage": "https://example.com/blog/slug/" - Network accessline 124
{ "@type": "Person", "@id": "https://example.com/auteur/firstname-lastname/#person", - Network accessline 124
{ "@type": "Person", "@id": "https://example.com/auteur/firstname-lastname/#person", - Network accessline 125
"@type": "Person", "@id": "https://example.com/auteur/firstname-lastname/#person", "name": "Firstname Lastname", - Network accessline 125
"@type": "Person", "@id": "https://example.com/auteur/firstname-lastname/#person", "name": "Firstname Lastname", - Network accessline 126
"@id": "https://example.com/auteur/firstname-lastname/#person", - Network accessline 126
"@id": "https://example.com/auteur/firstname-lastname/#person", - Network accessline 127
"name": "Firstname Lastname", "jobTitle": "Role", "image": "https://example.com/images/author.webp", - Network accessline 127
"name": "Firstname Lastname", "jobTitle": "Role", "image": "https://example.com/images/author.webp", - Network accessline 128
"jobTitle": "Role", "image": "https://example.com/images/author.webp", "url": "https://example.com/auteur/firstname-lastname/", - Network accessline 128
"jobTitle": "Role", "image": "https://example.com/images/author.webp", "url": "https://example.com/auteur/firstname-lastname/", - Network accessline 129
"image": "https://example.com/images/author.webp", - Network accessline 129
"image": "https://example.com/images/author.webp", - Network accessline 130
"url": "https://example.com/auteur/firstname-lastname/", - Network accessline 130
"url": "https://example.com/auteur/firstname-lastname/", - Network accessline 131
"sameAs": [ "https://www.linkedin.com/in/real-profile/", "https://www.youtube.com/@realchannel", - Network accessline 131
"sameAs": [ "https://www.linkedin.com/in/real-profile/", "https://www.youtube.com/@realchannel", - Network accessline 132
"https://www.linkedin.com/in/real-profile/", - Network accessline 132
"https://www.linkedin.com/in/real-profile/", - Network accessline 133
"https://www.youtube.com/@realchannel", - Network accessline 133
"https://www.youtube.com/@realchannel", - Network accessline 134
"https://www.instagram.com/realprofile/" - Network accessline 134
"https://www.instagram.com/realprofile/" - Network accessline 138
"@type": "BreadcrumbList", "itemListElement": [ { "@type": "ListItem", "position": 1, "name": "Accueil", "item": "https://example.com/" }, - Network accessline 138
"@type": "BreadcrumbList", "itemListElement": [ { "@type": "ListItem", "position": 1, "name": "Accueil", "item": "https://example.com/" }, - Network accessline 139
"itemListElement": [ { "@type": "ListItem", "position": 1, "name": "Accueil", "item": "https://example.com/" }, { "@type": "ListItem", "position": 2, "name": "Blog", "item": "https://example.com/blog/" }, - Network accessline 139
"itemListElement": [ { "@type": "ListItem", "position": 1, "name": "Accueil", "item": "https://example.com/" }, { "@type": "ListItem", "position": 2, "name": "Blog", "item": "https://example.com/blog/" }, - Network accessline 140
{ "@type": "ListItem", "position": 1, "name": "Accueil", "item": "https://example.com/" }, - Network accessline 140
{ "@type": "ListItem", "position": 1, "name": "Accueil", "item": "https://example.com/" }, - Network accessline 141
{ "@type": "ListItem", "position": 2, "name": "Blog", "item": "https://example.com/blog/" }, - Network accessline 141
{ "@type": "ListItem", "position": 2, "name": "Blog", "item": "https://example.com/blog/" },
skills/seo-content-collection-page/SKILL.md
- Network accessline 4
license: MIT metadata: author: "Sorank (https://sorank.com)" - Network accessline 4
license: MIT metadata: author: "Sorank (https://sorank.com)" - Network accessline 5
metadata: author: "Sorank (https://sorank.com)" version: "2.0.0" - Network accessline 5
metadata: author: "Sorank (https://sorank.com)" version: "2.0.0" - Network accessline 6
author: "Sorank (https://sorank.com)" - Network accessline 6
author: "Sorank (https://sorank.com)" - Network accessline 59
| COL-13 | Keyword placement, bolding and density applied to the two text zones (applies C-09, C-10, C-11) | category keyword + the most important secondary keywords bolded; placement coverage 60%+; no term above 2.5% | no_bold, kw_not_bold - Network accessline 59
| COL-13 | Keyword placement, bolding and density applied to the two text zones (applies C-09, C-10, C-11) | category keyword + the most important secondary keywords bolded; placement coverage 60%+; no term above 2.5% | no_bold, kw_not_bold - Network accessline 60
| COL-14 | Product cards with real images (alt text), name, price as HTML text, link to the PDP | every card on page 1 | section_audit images, price_in_text; alt_missing; manual | The reason the page exists; images and prices are what shopp - Network accessline 60
| COL-14 | Product cards with real images (alt text), name, price as HTML text, link to the PDP | every card on page 1 | section_audit images, price_in_text; alt_missing; manual | The reason the page exists; images and prices are what shopp - Network accessline 61
| COL-15 | H1, intro, first page of product links and the bottom block present in the raw server HTML | all four, without JavaScript | likely_js_rendered, curl | Major AI crawlers do not execute JavaScript (measured, Vercel; applies C-21) | - Network accessline 61
| COL-15 | H1, intro, first page of product links and the bottom block present in the raw server HTML | all four, without JavaScript | likely_js_rendered, curl | Major AI crawlers do not execute JavaScript (measured, Vercel; applies C-21) | - Network accessline 62
| COL-16 | One block per collection, written for it | 0 boilerplate paragraphs rotated across collections | manual (compare 2-3 sister collections) | Templated filler gives nothing to rank or quote | | COL-17 | Filter, sort and parameter UR - Network accessline 62
| COL-16 | One block per collection, written for it | 0 boilerplate paragraphs rotated across collections | manual (compare 2-3 sister collections) | Templated filler gives nothing to rank or quote | | COL-17 | Filter, sort and parameter UR - Network accessline 63
| COL-17 | Filter, sort and parameter URLs controlled, mechanism chosen by goal (section 4.7) | canonical to the clean URL by default; never robots.txt Disallow and noindex on the same URL at the same time; sort, view, session parameters ou - Network accessline 63
| COL-17 | Filter, sort and parameter URLs controlled, mechanism chosen by goal (section 4.7) | canonical to the clean URL by default; never robots.txt Disallow and noindex on the same URL at the same time; sort, view, session parameters ou - Network accessline 77
curl -sL -A "Mozilla/5.0" https://store.com/collections/linen-dresses | grep -c 'href="/products/' - Network accessline 77
curl -sL -A "Mozilla/5.0" https://store.com/collections/linen-dresses | grep -c 'href="/products/' - Network accessline 78
python3 skills/seo-geo-audit/scripts/seo_audit.py https://store.com/collections/linen-dresses "/collections/linen-dresses?page=2" "/collections/linen-dresses?filter.v.option.color=red" - Network accessline 78
python3 skills/seo-geo-audit/scripts/seo_audit.py https://store.com/collections/linen-dresses "/collections/linen-dresses?page=2" "/collections/linen-dresses?filter.v.option.color=red" - Network accessline 79
python3 skills/seo-page-sections/scripts/section_audit.py --type collection https://store.com/collections/linen-dresses - Network accessline 79
python3 skills/seo-page-sections/scripts/section_audit.py --type collection https://store.com/collections/linen-dresses - Network accessline 90
| thin_content, word count, no_question_h2, no_table | COL-08 to COL-10, C-08, C-13 | | section_audit faq, definitions, comparison_table, images, price_in_text | COL-10 to COL-12, COL-14 | | likely_js_rendered, curl product-link count | COL - Network accessline 90
| thin_content, word count, no_question_h2, no_table | COL-08 to COL-10, C-08, C-13 | | section_audit faq, definitions, comparison_table, images, price_in_text | COL-10 to COL-12, COL-14 | | likely_js_rendered, curl product-link count | COL - Network accessline 91
| section_audit faq, definitions, comparison_table, images, price_in_text | COL-10 to COL-12, COL-14 | | likely_js_rendered, curl product-link count | COL-15, C-21 | | canonical on the filter URL (should point to the clean URL) | COL-17 | - Network accessline 91
| section_audit faq, definitions, comparison_table, images, price_in_text | COL-10 to COL-12, COL-14 | | likely_js_rendered, curl product-link count | COL-15, C-21 | | canonical on the filter URL (should point to the clean URL) | COL-17 | - Network accessline 92
| likely_js_rendered, curl product-link count | COL-15, C-21 | - Network accessline 92
| likely_js_rendered, curl product-link count | COL-15, C-21 | - Network accessline 111
python3 skills/seo-geo-audit/scripts/page_benchmark.py --type collection https://store.com/collections/linen-dresses https://rival1.com/category/linen-dresses https://rival2.com/c/linen-dresses https://marketplace.com/linen-dresses - Network accessline 111
python3 skills/seo-geo-audit/scripts/page_benchmark.py --type collection https://store.com/collections/linen-dresses https://rival1.com/category/linen-dresses https://rival2.com/c/linen-dresses https://marketplace.com/linen-dresses - Network accessline 155
Why the bottom: a text block at the top pushes the products below the fold, and visitors who came to browse bounce before seeing a single item, so the block costs sales. Placed at the bottom, the same text feeds Google and AI assistants wit - Network accessline 155
Why the bottom: a text block at the top pushes the products below the fold, and visitors who came to browse bounce before seeing a single item, so the block costs sales. Placed at the bottom, the same text feeds Google and AI assistants wit - Network accessline 197
Why unique titles matter here specifically: collection templates generate titles mechanically, so stores routinely ship dozens of near-identical titles, and Google then rewrites them unpredictably (https://developers.google.com/search/docs/ - Network accessline 197
Why unique titles matter here specifically: collection templates generate titles mechanically, so stores routinely ship dozens of near-identical titles, and Google then rewrites them unpredictably (https://developers.google.com/search/docs/ - Network accessline 203
Faceted navigation is the largest crawl trap in e-commerce: 200 collections times a handful of filters, values and sort orders generate millions of parameter URLs (?color=red&size=m&sort=price) that are near-duplicates of each other. Google - Network accessline 203
Faceted navigation is the largest crawl trap in e-commerce: 200 collections times a handful of filters, values and sort orders generate millions of parameter URLs (?color=red&size=m&sort=price) that are near-duplicates of each other. Google - Network accessline 216
The interaction that burns teams: robots.txt blocking and noindex are mutually exclusive on the same URL at the same time, because a blocked page is never fetched, so its noindex is never seen (https://developers.google.com/search/docs/craw - Network accessline 216
The interaction that burns teams: robots.txt blocking and noindex are mutually exclusive on the same URL at the same time, because a blocked page is never fetched, so its noindex is never seen (https://developers.google.com/search/docs/craw - Network accessline 224
Guideline risk to flag: mass-generating facet landing pages without demand or unique content matches Google's doorway page definition (https://developers.google.com/search/docs/essentials/spam-policies). Create facet pages one by one, by de - Network accessline 224
Guideline risk to flag: mass-generating facet landing pages without demand or unique content matches Google's doorway page definition (https://developers.google.com/search/docs/essentials/spam-policies). Create facet pages one by one, by de - Network accessline 239
Why "canonical to page 1" is the classic self-inflicted wound: it declares every paginated page a duplicate of page 1, so Google consolidates to page 1 and stops crawling deep pages. Products linked only from page 3+ lose their only crawl p - Network accessline 239
Why "canonical to page 1" is the classic self-inflicted wound: it declares every paginated page a duplicate of page 1, so Google consolidates to page 1 and stops crawling deep pages. Products linked only from page 3+ lose their only crawl p - Network accessline 277
{"@context": "https://schema.org", "@graph": [ - Network accessline 277
{"@context": "https://schema.org", "@graph": [ - Network accessline 278
{"@type": "CollectionPage", "@id": "https://store.com/collections/linen-dresses#page", - Network accessline 278
{"@type": "CollectionPage", "@id": "https://store.com/collections/linen-dresses#page", - Network accessline 279
"url": "https://store.com/collections/linen-dresses", "name": "Linen Dresses", - Network accessline 279
"url": "https://store.com/collections/linen-dresses", "name": "Linen Dresses", - Network accessline 280
"mainEntity": {"@id": "https://store.com/collections/linen-dresses#list"}, - Network accessline 280
"mainEntity": {"@id": "https://store.com/collections/linen-dresses#list"}, - Network accessline 281
"breadcrumb": {"@id": "https://store.com/collections/linen-dresses#breadcrumb"}}, - Network accessline 281
"breadcrumb": {"@id": "https://store.com/collections/linen-dresses#breadcrumb"}}, - Network accessline 282
{"@type": "ItemList", "@id": "https://store.com/collections/linen-dresses#list", - Network accessline 282
{"@type": "ItemList", "@id": "https://store.com/collections/linen-dresses#list", - Network accessline 283
"itemListElement": [ {"@type": "ListItem", "position": 1, "url": "https://store.com/products/{product-1}"}, {"@type": "ListItem", "position": 2, "url": "https://store.com/products/{product-2}"}]}, - Network accessline 283
"itemListElement": [ {"@type": "ListItem", "position": 1, "url": "https://store.com/products/{product-1}"}, {"@type": "ListItem", "position": 2, "url": "https://store.com/products/{product-2}"}]}, - Network accessline 284
{"@type": "ListItem", "position": 1, "url": "https://store.com/products/{product-1}"}, - Network accessline 284
{"@type": "ListItem", "position": 1, "url": "https://store.com/products/{product-1}"}, - Network accessline 285
{"@type": "ListItem", "position": 2, "url": "https://store.com/products/{product-2}"}]}, - Network accessline 285
{"@type": "ListItem", "position": 2, "url": "https://store.com/products/{product-2}"}]}, - Network accessline 286
{"@type": "BreadcrumbList", "@id": "https://store.com/collections/linen-dresses#breadcrumb", - Network accessline 286
{"@type": "BreadcrumbList", "@id": "https://store.com/collections/linen-dresses#breadcrumb", - Network accessline 287
"itemListElement": [ {"@type": "ListItem", "position": 1, "name": "Home", "item": "https://store.com/"}, {"@type": "ListItem", "position": 2, "name": "Linen Dresses", "item": "https://store.com/collections/linen-dresses"}]} - Network accessline 287
"itemListElement": [ {"@type": "ListItem", "position": 1, "name": "Home", "item": "https://store.com/"}, {"@type": "ListItem", "position": 2, "name": "Linen Dresses", "item": "https://store.com/collections/linen-dresses"}]} - Network accessline 288
{"@type": "ListItem", "position": 1, "name": "Home", "item": "https://store.com/"}, - Network accessline 288
{"@type": "ListItem", "position": 1, "name": "Home", "item": "https://store.com/"}, - Network accessline 289
{"@type": "ListItem", "position": 2, "name": "Linen Dresses", "item": "https://store.com/collections/linen-dresses"}]} - Network accessline 289
{"@type": "ListItem", "position": 2, "name": "Linen Dresses", "item": "https://store.com/collections/linen-dresses"}]} - Network accessline 293
Do not attach full Product + Offer markup to every grid item: Google's Product structured data targets pages about a single product, and category pages should use ItemList instead (https://developers.google.com/search/docs/appearance/struct - Network accessline 293
Do not attach full Product + Offer markup to every grid item: Google's Product structured data targets pages about a single product, and category pages should use ItemList instead (https://developers.google.com/search/docs/appearance/struct - Network accessline 300
- section_audit finds faq, comparison_table (or any_table), definitions, breadcrumb, images and price_in_text - schema shows CollectionPage, ItemList and BreadcrumbList with no `schema_fields` finding - curl shows the H1, the bottom block a - Network accessline 300
- section_audit finds faq, comparison_table (or any_table), definitions, breadcrumb, images and price_in_text - schema shows CollectionPage, ItemList and BreadcrumbList with no `schema_fields` finding - curl shows the H1, the bottom block a - Network accessline 301
- schema shows CollectionPage, ItemList and BreadcrumbList with no `schema_fields` finding - curl shows the H1, the bottom block and the first page of product links in the raw HTML - page 2 is self-canonical; the filter URL canonicalizes to - Network accessline 301
- schema shows CollectionPage, ItemList and BreadcrumbList with no `schema_fields` finding - curl shows the H1, the bottom block and the first page of product links in the raw HTML - page 2 is self-canonical; the filter URL canonicalizes to - Network accessline 302
- curl shows the H1, the bottom block and the first page of product links in the raw HTML - Network accessline 302
- curl shows the H1, the bottom block and the first page of product links in the raw HTML - Network accessline 313
AI assistants favor list-format content: an analysis of AI citations in commerce contexts found listicles taking the largest share of citations, with product pages at about 13.7 percent (single-source study, not independently replicated: ht - Network accessline 313
AI assistants favor list-format content: an analysis of AI citations in commerce contexts found listicles taking the largest share of citations, with product pages at about 13.7 percent (single-source study, not independently replicated: ht - Network accessline 325
Many storefront themes render the product grid, filters and even the text block client-side. Major AI crawlers fetch but do not execute JavaScript (measured by Vercel across GPTBot, ClaudeBot and others: https://vercel.com/blog/the-rise-of- - Network accessline 325
Many storefront themes render the product grid, filters and even the text block client-side. Major AI crawlers fetch but do not execute JavaScript (measured by Vercel across GPTBot, ClaudeBot and others: https://vercel.com/blog/the-rise-of- - Network accessline 349
## 2. Audit findings (seo_audit.py SEO and GEO scores and high or medium findings for the clean URL, ?page=2 and a filter URL; section_audit.py blocks; curl raw-HTML result; GSC indexing symptoms; or "new page") - Network accessline 349
## 2. Audit findings (seo_audit.py SEO and GEO scores and high or medium findings for the clean URL, ?page=2 and a filter URL; section_audit.py blocks; curl raw-HTML result; GSC indexing symptoms; or "new page") - Network accessline 350
(seo_audit.py SEO and GEO scores and high or medium findings for the clean URL, ?page=2 and a filter URL; section_audit.py blocks; curl raw-HTML result; GSC indexing symptoms; or "new page") - Network accessline 350
(seo_audit.py SEO and GEO scores and high or medium findings for the clean URL, ?page=2 and a filter URL; section_audit.py blocks; curl raw-HTML result; GSC indexing symptoms; or "new page") - Network accessline 390
- https://developers.google.com/search/docs/crawling-indexing/crawling-managing-faceted-navigation (faceted navigation crawl management) - Network accessline 390
- https://developers.google.com/search/docs/crawling-indexing/crawling-managing-faceted-navigation (faceted navigation crawl management) - Network accessline 391
- https://developers.google.com/search/docs/specialty/ecommerce/pagination-and-incremental-page-loading (self-canonical pagination, rel=prev/next status, infinite scroll) - Network accessline 391
- https://developers.google.com/search/docs/specialty/ecommerce/pagination-and-incremental-page-loading (self-canonical pagination, rel=prev/next status, infinite scroll) - Network accessline 392
- https://developers.google.com/search/docs/crawling-indexing/robots/intro (robots.txt does not deindex) - Network accessline 392
- https://developers.google.com/search/docs/crawling-indexing/robots/intro (robots.txt does not deindex) - Network accessline 393
- https://developers.google.com/search/blog/2022/03/url-parameters-tool-deprecated (URL Parameters tool retirement) - Network accessline 393
- https://developers.google.com/search/blog/2022/03/url-parameters-tool-deprecated (URL Parameters tool retirement) - Network accessline 394
- https://developers.google.com/search/docs/essentials/spam-policies (doorway pages, cloaking) - Network accessline 394
- https://developers.google.com/search/docs/essentials/spam-policies (doorway pages, cloaking) - Network accessline 395
- https://developers.google.com/search/docs/appearance/structured-data/product (Product markup is for single-product pages) - Network accessline 395
- https://developers.google.com/search/docs/appearance/structured-data/product (Product markup is for single-product pages) - Network accessline 396
- https://developers.google.com/search/docs/appearance/title-link (title rewriting behavior) - Network accessline 396
- https://developers.google.com/search/docs/appearance/title-link (title rewriting behavior) - Network accessline 397
- https://ahrefs.com/blog/why-chatgpt-cites-pages/ (descriptive slugs, 89.78 vs 81.11 percent citation correlation) - Network accessline 397
- https://ahrefs.com/blog/why-chatgpt-cites-pages/ (descriptive slugs, 89.78 vs 81.11 percent citation correlation) - Network accessline 398
- https://almcorp.com/blog/ai-citations-listicles-articles-product-pages/ (listicle and product page shares of AI citations) - Network accessline 398
- https://almcorp.com/blog/ai-citations-listicles-articles-product-pages/ (listicle and product page shares of AI citations) - Network accessline 399
- https://vercel.com/blog/the-rise-of-the-ai-crawler (AI crawlers do not execute JavaScript, measured) - Network accessline 399
- https://vercel.com/blog/the-rise-of-the-ai-crawler (AI crawlers do not execute JavaScript, measured)
skills/seo-content-collection-page/evals/evals.json
- Network accessline 4
{ "id": 1, "prompt": "My Shopify collection page https://example-store.com/collections/linen-dresses is just a product grid with zero text. Write the SEO content for it and tell me exactly where each block goes on the page.", - Network accessline 4
{ "id": 1, "prompt": "My Shopify collection page https://example-store.com/collections/linen-dresses is just a product grid with zero text. Write the SEO content for it and tell me exactly where each block goes on the page.", - Network accessline 5
"id": 1, "prompt": "My Shopify collection page https://example-store.com/collections/linen-dresses is just a product grid with zero text. Write the SEO content for it and tell me exactly where each block goes on the page.", "exp - Network accessline 5
"id": 1, "prompt": "My Shopify collection page https://example-store.com/collections/linen-dresses is just a product grid with zero text. Write the SEO content for it and tell me exactly where each block goes on the page.", "exp - Network accessline 6
"prompt": "My Shopify collection page https://example-store.com/collections/linen-dresses is just a product grid with zero text. Write the SEO content for it and tell me exactly where each block goes on the page.", "expected_output": - Network accessline 6
"prompt": "My Shopify collection page https://example-store.com/collections/linen-dresses is just a product grid with zero text. Write the SEO content for it and tell me exactly where each block goes on the page.", "expected_output": - Network accessline 7
"expected_output": "Runs the four phases and delivers the standard five-part deliverable (1. Spec scorecard by ID, 2. Audit findings, 3. Competitor benchmark, 4. Build, 5. Acceptance). Phase 1: scores the page against the COL spec rows plus - Network accessline 7
"expected_output": "Runs the four phases and delivers the standard five-part deliverable (1. Spec scorecard by ID, 2. Audit findings, 3. Competitor benchmark, 4. Build, 5. Acceptance). Phase 1: scores the page against the COL spec rows plus
skills/seo-content-collection-page/references/faceted-navigation-playbook.md
- Network accessline 34
- robots.txt removes crawling, not indexing. Already-indexed URLs stay indexed (without content) until they decay. For removal, use noindex first. - Over-blocking is the classic failure: a pattern like `Disallow: /*?` also kills legitimate - Network accessline 34
- robots.txt removes crawling, not indexing. Already-indexed URLs stay indexed (without content) until they decay. For removal, use noindex first. - Over-blocking is the classic failure: a pattern like `Disallow: /*?` also kills legitimate - Network accessline 36
- Google retired the Search Console URL Parameters tool in 2022 (https://developers.google.com/search/blog/2022/03/url-parameters-tool-deprecated). robots.txt, canonicals, and noindex are the only levers left. - Network accessline 36
- Google retired the Search Console URL Parameters tool in 2022 (https://developers.google.com/search/blog/2022/03/url-parameters-tool-deprecated). robots.txt, canonicals, and noindex are the only levers left. - Network accessline 89
Source: https://developers.google.com/search/docs/specialty/ecommerce/pagination-and-incremental-page-loading - Network accessline 89
Source: https://developers.google.com/search/docs/specialty/ecommerce/pagination-and-incremental-page-loading
skills/seo-content-comparison-page/SKILL.md
- Network accessline 4
license: MIT metadata: author: "Sorank (https://sorank.com)" - Network accessline 4
license: MIT metadata: author: "Sorank (https://sorank.com)" - Network accessline 5
metadata: author: "Sorank (https://sorank.com)" version: "2.0.0" - Network accessline 5
metadata: author: "Sorank (https://sorank.com)" version: "2.0.0" - Network accessline 6
author: "Sorank (https://sorank.com)" - Network accessline 6
author: "Sorank (https://sorank.com)" - Network accessline 105
python3 skills/seo-geo-audit/scripts/seo_audit.py https://example.com/you-vs-competitor/ /competitor-alternatives/ - Network accessline 105
python3 skills/seo-geo-audit/scripts/seo_audit.py https://example.com/you-vs-competitor/ /competitor-alternatives/ - Network accessline 106
python3 skills/seo-page-sections/scripts/section_audit.py --type comparison https://example.com/you-vs-competitor/ - Network accessline 106
python3 skills/seo-page-sections/scripts/section_audit.py --type comparison https://example.com/you-vs-competitor/ - Network accessline 107
python3 skills/seo-page-sections/scripts/section_audit.py --type audience https://example.com/for-agencies/ - Network accessline 107
python3 skills/seo-page-sections/scripts/section_audit.py --type audience https://example.com/for-agencies/ - Network accessline 124
python3 skills/seo-geo-audit/scripts/page_benchmark.py --type comparison https://example.com/you-vs-competitor/ https://competitor.com/competitor-vs-you/ https://review-site.com/you-vs-competitor https://publisher.com/best-category-tools/ - Network accessline 124
python3 skills/seo-geo-audit/scripts/page_benchmark.py --type comparison https://example.com/you-vs-competitor/ https://competitor.com/competitor-vs-you/ https://review-site.com/you-vs-competitor https://publisher.com/best-category-tools/ - Network accessline 125
python3 skills/seo-geo-audit/scripts/page_benchmark.py --type audience https://example.com/for-agencies/ https://rival.com/agencies/ https://rival2.com/solutions/agencies/ - Network accessline 125
python3 skills/seo-geo-audit/scripts/page_benchmark.py --type audience https://example.com/for-agencies/ https://rival.com/agencies/ https://rival2.com/solutions/agencies/ - Network accessline 247
python3 skills/seo-geo-audit/scripts/seo_audit.py https://example.com/you-vs-competitor/ - Network accessline 247
python3 skills/seo-geo-audit/scripts/seo_audit.py https://example.com/you-vs-competitor/ - Network accessline 248
python3 skills/seo-page-sections/scripts/section_audit.py --type comparison https://example.com/you-vs-competitor/ - Network accessline 248
python3 skills/seo-page-sections/scripts/section_audit.py --type comparison https://example.com/you-vs-competitor/ - Network accessline 249
python3 skills/seo-geo-audit/scripts/page_benchmark.py --type comparison https://example.com/you-vs-competitor/ {the same competitor URLs} - Network accessline 249
python3 skills/seo-geo-audit/scripts/page_benchmark.py --type comparison https://example.com/you-vs-competitor/ {the same competitor URLs} - Network accessline 313
- Directive 2006/114/EC on misleading and comparative advertising (conditions under which comparison is lawful in the EU): https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX%3A32006L0114 - Network accessline 313
- Directive 2006/114/EC on misleading and comparative advertising (conditions under which comparison is lawful in the EU): https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX%3A32006L0114 - Network accessline 314
- Why ChatGPT cites pages (1.4M prompt study): https://ahrefs.com/blog/why-chatgpt-cites-pages/ - Network accessline 314
- Why ChatGPT cites pages (1.4M prompt study): https://ahrefs.com/blog/why-chatgpt-cites-pages/ - Network accessline 315
- Generative Engine Optimization: statistics, quotations and citations raise visibility (controlled study, KDD 2024): https://arxiv.org/abs/2311.09735 - Network accessline 315
- Generative Engine Optimization: statistics, quotations and citations raise visibility (controlled study, KDD 2024): https://arxiv.org/abs/2311.09735 - Network accessline 316
- AI Mode versus top 10 organic overlap (32 percent URL overlap): https://www.semrush.com/blog/ai-mode-comparison-study/ - Network accessline 316
- AI Mode versus top 10 organic overlap (32 percent URL overlap): https://www.semrush.com/blog/ai-mode-comparison-study/ - Network accessline 317
- Google guidance on AI features and structured data: https://developers.google.com/search/docs/appearance/ai-features - Network accessline 317
- Google guidance on AI features and structured data: https://developers.google.com/search/docs/appearance/ai-features - Network accessline 318
- Google structured data policies (markup must match visible content): https://developers.google.com/search/docs/appearance/structured-data/sd-policies - Network accessline 318
- Google structured data policies (markup must match visible content): https://developers.google.com/search/docs/appearance/structured-data/sd-policies
skills/seo-content-homepage/SKILL.md
- Network accessline 4
license: MIT metadata: author: "Sorank (https://sorank.com)" - Network accessline 4
license: MIT metadata: author: "Sorank (https://sorank.com)" - Network accessline 5
metadata: author: "Sorank (https://sorank.com)" version: "2.0.0" - Network accessline 5
metadata: author: "Sorank (https://sorank.com)" version: "2.0.0" - Network accessline 6
author: "Sorank (https://sorank.com)" - Network accessline 6
author: "Sorank (https://sorank.com)" - Network accessline 130
python3 skills/seo-geo-audit/scripts/seo_audit.py https://example.com/ /offer/ /about/ - Network accessline 130
python3 skills/seo-geo-audit/scripts/seo_audit.py https://example.com/ /offer/ /about/ - Network accessline 131
python3 skills/seo-page-sections/scripts/section_audit.py --type homepage https://example.com/ - Network accessline 131
python3 skills/seo-page-sections/scripts/section_audit.py --type homepage https://example.com/ - Network accessline 132
python3 skills/seo-page-sections/scripts/section_audit.py --type pricing https://example.com/offer/ - Network accessline 132
python3 skills/seo-page-sections/scripts/section_audit.py --type pricing https://example.com/offer/ - Network accessline 133
python3 skills/seo-page-sections/scripts/section_audit.py --type about https://example.com/about/ - Network accessline 133
python3 skills/seo-page-sections/scripts/section_audit.py --type about https://example.com/about/ - Network accessline 168
python3 skills/seo-geo-audit/scripts/page_benchmark.py --type homepage https://client.com/ https://rival1.com/ https://rival2.com/ https://rival3.com/ - Network accessline 168
python3 skills/seo-geo-audit/scripts/page_benchmark.py --type homepage https://client.com/ https://rival1.com/ https://rival2.com/ https://rival3.com/ - Network accessline 169
python3 skills/seo-geo-audit/scripts/page_benchmark.py --type pricing https://client.com/offer/ https://rival1.com/programme/ https://rival2.com/coaching/ https://rival3.com/formation/ - Network accessline 169
python3 skills/seo-geo-audit/scripts/page_benchmark.py --type pricing https://client.com/offer/ https://rival1.com/programme/ https://rival2.com/coaching/ https://rival3.com/formation/ - Network accessline 310
- Princeton GEO study, "GEO: Generative Engine Optimization" (KDD 2024): https://arxiv.org/abs/2311.09735 - Network accessline 310
- Princeton GEO study, "GEO: Generative Engine Optimization" (KDD 2024): https://arxiv.org/abs/2311.09735 - Network accessline 311
- Google, Search Quality Rater Guidelines (YMYL and E-E-A-T): https://static.googleusercontent.com/media/guidelines.raterhub.com/en//searchqualityevaluatorguidelines.pdf - Network accessline 311
- Google, Search Quality Rater Guidelines (YMYL and E-E-A-T): https://static.googleusercontent.com/media/guidelines.raterhub.com/en//searchqualityevaluatorguidelines.pdf - Network accessline 312
- Google, Course info structured data: https://developers.google.com/search/docs/appearance/structured-data/course-info - Network accessline 312
- Google, Course info structured data: https://developers.google.com/search/docs/appearance/structured-data/course-info - Network accessline 313
- Google, Organization structured data: https://developers.google.com/search/docs/appearance/structured-data/organization - Network accessline 313
- Google, Organization structured data: https://developers.google.com/search/docs/appearance/structured-data/organization - Network accessline 314
- FTC, Endorsement Guides: https://www.ftc.gov/legal-library/browse/rules/guides-concerning-use-endorsements-testimonials-advertising - Network accessline 314
- FTC, Endorsement Guides: https://www.ftc.gov/legal-library/browse/rules/guides-concerning-use-endorsements-testimonials-advertising
skills/seo-content-product-page/SKILL.md
- Network accessline 4
license: MIT metadata: author: "Sorank (https://sorank.com)" - Network accessline 4
license: MIT metadata: author: "Sorank (https://sorank.com)" - Network accessline 5
metadata: author: "Sorank (https://sorank.com)" version: "2.0.0" - Network accessline 5
metadata: author: "Sorank (https://sorank.com)" version: "2.0.0" - Network accessline 6
author: "Sorank (https://sorank.com)" - Network accessline 6
author: "Sorank (https://sorank.com)" - Network accessline 60
| PDP-13 | Real reviews in server HTML | 2-3 story-format reviews (first name + situation + problem + result) near the buy box, full list lower, never fabricated, seeded or undisclosed-incentivized | section_audit reviews, manual | Google s - Network accessline 60
| PDP-13 | Real reviews in server HTML | 2-3 story-format reviews (first name + situation + problem + result) near the buy box, full list lower, never fabricated, seeded or undisclosed-incentivized | section_audit reviews, manual | Google s - Network accessline 61
| PDP-14 | Real product photos | Own photos (not supplier stock), multiple angles: front, back, detail, scale or in-use; not AI-generated; alt = product name + distinguishing attribute shown (C-15 for weight and format) | manual (reverse im - Network accessline 61
| PDP-14 | Real product photos | Own photos (not supplier stock), multiple angles: front, back, detail, scale or in-use; not AI-generated; alt = product name + distinguishing attribute shown (C-15 for weight and format) | manual (reverse im - Network accessline 62
| PDP-15 | Price as HTML text | Price and currency in the buy box as text in the server HTML, not in an image or injected by JavaScript; identical to the Offer markup | section_audit price_in_text, likely_js_rendered, curl | Measured: major - Network accessline 62
| PDP-15 | Price as HTML text | Price and currency in the buy box as text in the server HTML, not in an image or injected by JavaScript; identical to the Offer markup | section_audit price_in_text, likely_js_rendered, curl | Measured: major - Network accessline 65
| PDP-18 | Variants consolidated | One canonical parent for color and size variants, unless a variant has its own search demand (then an indexable URL with unique content) | canonical_other, manual | Google product variants guidance; avoids - Network accessline 65
| PDP-18 | Variants consolidated | One canonical parent for color and size variants, unless a variant has its own search demand (then an indexable URL with unique content) | canonical_other, manual | Google product variants guidance; avoids - Network accessline 66
| PDP-19 | Product + Offer markup, real values only | Product (name, image, description, sku, brand) with nested Offer (price, priceCurrency, availability, url); AggregateRating and Review only when real reviews are displayed; every value i - Network accessline 66
| PDP-19 | Product + Offer markup, real values only | Product (name, image, description, sku, brand) with nested Offer (price, priceCurrency, availability, url); AggregateRating and Review only when real reviews are displayed; every value i - Network accessline 67
| PDP-20 | Self-sufficient page in server HTML | Specs, price, shipping, returns, rating, 2-3 reviews, FAQ and comparison all present in the raw HTML (C-21) | likely_js_rendered, render_check.py, curl | The assistant quotes one page, not th - Network accessline 67
| PDP-20 | Self-sufficient page in server HTML | Specs, price, shipping, returns, rating, 2-3 reviews, FAQ and comparison all present in the raw HTML (C-21) | likely_js_rendered, render_check.py, curl | The assistant quotes one page, not th - Network accessline 94
curl -sL -A "Mozilla/5.0" https://store.com/products/ti-stove-2 -o raw.html - Network accessline 94
curl -sL -A "Mozilla/5.0" https://store.com/products/ti-stove-2 -o raw.html - Network accessline 95
python3 skills/seo-geo-audit/scripts/seo_audit.py https://store.com/products/ti-stove-2 - Network accessline 95
python3 skills/seo-geo-audit/scripts/seo_audit.py https://store.com/products/ti-stove-2 - Network accessline 96
python3 skills/seo-page-sections/scripts/section_audit.py --type product https://store.com/products/ti-stove-2 - Network accessline 96
python3 skills/seo-page-sections/scripts/section_audit.py --type product https://store.com/products/ti-stove-2 - Network accessline 97
python3 skills/seo-ai-site-builders/scripts/render_check.py https://store.com/products/ti-stove-2 - Network accessline 97
python3 skills/seo-ai-site-builders/scripts/render_check.py https://store.com/products/ti-stove-2 - Network accessline 129
python3 skills/seo-geo-audit/scripts/page_benchmark.py --type product https://store.com/products/ti-stove-2 https://brand.com/ti-stove-2 https://retailer.com/p/ti-stove-2 https://rival.com/products/ultralight-stove - Network accessline 129
python3 skills/seo-geo-audit/scripts/page_benchmark.py --type product https://store.com/products/ti-stove-2 https://brand.com/ti-stove-2 https://retailer.com/p/ti-stove-2 https://rival.com/products/ultralight-stove - Network accessline 382
- https://almcorp.com/blog/ai-citations-listicles-articles-product-pages/ (product pages at about 13.7 percent of AI citations) - Network accessline 382
- https://almcorp.com/blog/ai-citations-listicles-articles-product-pages/ (product pages at about 13.7 percent of AI citations) - Network accessline 383
- https://developers.openai.com/commerce/specs/file-upload/products (ChatGPT Shopping feed specification) - Network accessline 383
- https://developers.openai.com/commerce/specs/file-upload/products (ChatGPT Shopping feed specification) - Network accessline 384
- https://chatgpt.com/merchants (merchant enrollment) - Network accessline 384
- https://chatgpt.com/merchants (merchant enrollment) - Network accessline 385
- https://ahrefs.com/blog/why-chatgpt-cites-pages/ (descriptive slugs, 89.78 vs 81.11 percent citation correlation) - Network accessline 385
- https://ahrefs.com/blog/why-chatgpt-cites-pages/ (descriptive slugs, 89.78 vs 81.11 percent citation correlation) - Network accessline 386
- https://vercel.com/blog/the-rise-of-the-ai-crawler (AI crawlers do not execute JavaScript, measured) - Network accessline 386
- https://vercel.com/blog/the-rise-of-the-ai-crawler (AI crawlers do not execute JavaScript, measured) - Network accessline 387
- https://developers.google.com/search/docs/appearance/structured-data/product (Product markup reference) - Network accessline 387
- https://developers.google.com/search/docs/appearance/structured-data/product (Product markup reference) - Network accessline 388
- https://developers.google.com/search/docs/appearance/structured-data/sd-policies (markup must reflect visible content, manual actions) - Network accessline 388
- https://developers.google.com/search/docs/appearance/structured-data/sd-policies (markup must reflect visible content, manual actions) - Network accessline 389
- https://developers.google.com/search/docs/essentials/spam-policies (scaled content abuse, fake reviews) - Network accessline 389
- https://developers.google.com/search/docs/essentials/spam-policies (scaled content abuse, fake reviews) - Network accessline 390
- https://developers.google.com/search/blog/2023/08/howto-faq-changes (FAQ rich results removal) - Network accessline 390
- https://developers.google.com/search/blog/2023/08/howto-faq-changes (FAQ rich results removal) - Network accessline 391
- https://support.google.com/merchants/answer/6324350 (Merchant Center image requirements) - Network accessline 391
- https://support.google.com/merchants/answer/6324350 (Merchant Center image requirements) - Network accessline 392
- https://developers.google.com/search/docs/appearance/structured-data/product-variants (variant URL handling) - Network accessline 392
- https://developers.google.com/search/docs/appearance/structured-data/product-variants (variant URL handling) - Network accessline 393
- https://developers.google.com/search/docs/appearance/title-link (title rewriting behavior) - Network accessline 393
- https://developers.google.com/search/docs/appearance/title-link (title rewriting behavior)
skills/seo-content-product-page/evals/evals.json
- Network accessline 4
{ "id": 1, "prompt": "My Shopify product page for a titanium camping stove (https://example-store.com/products/ti-stove-2) uses the manufacturer's 60-word description, has no FAQ, and the price is injected by JavaScript. Rewrite - Network accessline 4
{ "id": 1, "prompt": "My Shopify product page for a titanium camping stove (https://example-store.com/products/ti-stove-2) uses the manufacturer's 60-word description, has no FAQ, and the price is injected by JavaScript. Rewrite - Network accessline 5
"id": 1, "prompt": "My Shopify product page for a titanium camping stove (https://example-store.com/products/ti-stove-2) uses the manufacturer's 60-word description, has no FAQ, and the price is injected by JavaScript. Rewrite and opt - Network accessline 5
"id": 1, "prompt": "My Shopify product page for a titanium camping stove (https://example-store.com/products/ti-stove-2) uses the manufacturer's 60-word description, has no FAQ, and the price is injected by JavaScript. Rewrite and opt - Network accessline 6
"prompt": "My Shopify product page for a titanium camping stove (https://example-store.com/products/ti-stove-2) uses the manufacturer's 60-word description, has no FAQ, and the price is injected by JavaScript. Rewrite and optimize the page - Network accessline 6
"prompt": "My Shopify product page for a titanium camping stove (https://example-store.com/products/ti-stove-2) uses the manufacturer's 60-word description, has no FAQ, and the price is injected by JavaScript. Rewrite and optimize the page - Network accessline 7
"expected_output": "Runs the four phases and delivers the standard 5-part deliverable (spec scorecard, audit findings, competitor benchmark, build, acceptance). Phase 1: a spec scorecard with the PDP IDs (PDP-01 onward) plus the failing com - Network accessline 7
"expected_output": "Runs the four phases and delivers the standard 5-part deliverable (spec scorecard, audit findings, competitor benchmark, build, acceptance). Phase 1: a spec scorecard with the PDP IDs (PDP-01 onward) plus the failing com
skills/seo-content-product-page/references/product-page-blueprint.md
- Network accessline 60
The OpenAI product feed spec (https://developers.openai.com/commerce/specs/file-upload/products) currently accepts UTF-8 TSV, CSV, or TXT files (gzip accepted), delivered by SFTP. Check the live spec for exact formats, delivery options, and - Network accessline 60
The OpenAI product feed spec (https://developers.openai.com/commerce/specs/file-upload/products) currently accepts UTF-8 TSV, CSV, or TXT files (gzip accepted), delivered by SFTP. Check the live spec for exact formats, delivery options, and - Network accessline 77
Merchant enrollment: https://chatgpt.com/merchants. - Network accessline 77
Merchant enrollment: https://chatgpt.com/merchants. - Network accessline 93
- [ ] Footer social icons point to real profiles - [ ] Zero em dashes and en dashes in every field - [ ] curl shows description, price, and reviews in raw HTML - Network accessline 93
- [ ] Footer social icons point to real profiles - [ ] Zero em dashes and en dashes in every field - [ ] curl shows description, price, and reviews in raw HTML - Network accessline 94
- [ ] Zero em dashes and en dashes in every field - [ ] curl shows description, price, and reviews in raw HTML - [ ] Feed entry consistent with the page - Network accessline 94
- [ ] Zero em dashes and en dashes in every field - [ ] curl shows description, price, and reviews in raw HTML - [ ] Feed entry consistent with the page - Network accessline 95
- [ ] curl shows description, price, and reviews in raw HTML - Network accessline 95
- [ ] curl shows description, price, and reviews in raw HTML
skills/seo-content-service-page/SKILL.md
- Network accessline 4
license: MIT metadata: author: "Sorank (https://sorank.com)" - Network accessline 4
license: MIT metadata: author: "Sorank (https://sorank.com)" - Network accessline 5
metadata: author: "Sorank (https://sorank.com)" version: "2.0.0" - Network accessline 5
metadata: author: "Sorank (https://sorank.com)" version: "2.0.0" - Network accessline 6
author: "Sorank (https://sorank.com)" - Network accessline 6
author: "Sorank (https://sorank.com)" - Network accessline 102
python3 skills/seo-geo-audit/scripts/seo_audit.py https://example.com/services/emergency-plumber-lyon/ - Network accessline 102
python3 skills/seo-geo-audit/scripts/seo_audit.py https://example.com/services/emergency-plumber-lyon/ - Network accessline 103
python3 skills/seo-page-sections/scripts/section_audit.py --type service https://example.com/services/emergency-plumber-lyon/ - Network accessline 103
python3 skills/seo-page-sections/scripts/section_audit.py --type service https://example.com/services/emergency-plumber-lyon/ - Network accessline 104
python3 skills/seo-page-sections/scripts/section_audit.py --type location https://example.com/emergency-plumber-villeurbanne/ - Network accessline 104
python3 skills/seo-page-sections/scripts/section_audit.py --type location https://example.com/emergency-plumber-villeurbanne/ - Network accessline 142
python3 skills/seo-geo-audit/scripts/page_benchmark.py --type service https://example.com/services/cro-agency/ https://rival1.com/cro/ https://rival2.com/services/cro/ https://rival3.com/shopify-cro/ - Network accessline 142
python3 skills/seo-geo-audit/scripts/page_benchmark.py --type service https://example.com/services/cro-agency/ https://rival1.com/cro/ https://rival2.com/services/cro/ https://rival3.com/shopify-cro/
skills/seo-content-service-page/references/service-page-wireframe.md
- Network accessline 133
{ "@context": "https://schema.org", - Network accessline 133
{ "@context": "https://schema.org", - Network accessline 134
"@context": "https://schema.org", - Network accessline 134
"@context": "https://schema.org", - Network accessline 136
{ "@type": "Service", "@id": "https://example.com/emergency-plumber-lyon/#service", - Network accessline 136
{ "@type": "Service", "@id": "https://example.com/emergency-plumber-lyon/#service", - Network accessline 137
"@type": "Service", "@id": "https://example.com/emergency-plumber-lyon/#service", "name": "Emergency plumber in Lyon", - Network accessline 137
"@type": "Service", "@id": "https://example.com/emergency-plumber-lyon/#service", "name": "Emergency plumber in Lyon", - Network accessline 138
"@id": "https://example.com/emergency-plumber-lyon/#service", - Network accessline 138
"@id": "https://example.com/emergency-plumber-lyon/#service", - Network accessline 140
"serviceType": "Emergency plumbing", "description": "{one-sentence description matching the page intro}", "url": "https://example.com/emergency-plumber-lyon/", - Network accessline 140
"serviceType": "Emergency plumbing", "description": "{one-sentence description matching the page intro}", "url": "https://example.com/emergency-plumber-lyon/", - Network accessline 141
"description": "{one-sentence description matching the page intro}", "url": "https://example.com/emergency-plumber-lyon/", "provider": { "@id": "https://example.com/#organization" }, - Network accessline 141
"description": "{one-sentence description matching the page intro}", "url": "https://example.com/emergency-plumber-lyon/", "provider": { "@id": "https://example.com/#organization" }, - Network accessline 142
"url": "https://example.com/emergency-plumber-lyon/", - Network accessline 142
"url": "https://example.com/emergency-plumber-lyon/", - Network accessline 143
"provider": { "@id": "https://example.com/#organization" }, - Network accessline 143
"provider": { "@id": "https://example.com/#organization" }, - Network accessline 151
{ "@type": "Organization", "@id": "https://example.com/#organization", - Network accessline 151
{ "@type": "Organization", "@id": "https://example.com/#organization", - Network accessline 152
"@type": "Organization", "@id": "https://example.com/#organization", "name": "Dupont Plomberie", - Network accessline 152
"@type": "Organization", "@id": "https://example.com/#organization", "name": "Dupont Plomberie", - Network accessline 153
"@id": "https://example.com/#organization", - Network accessline 153
"@id": "https://example.com/#organization", - Network accessline 154
"name": "Dupont Plomberie", "url": "https://example.com/", "sameAs": ["{real profile URL}", "{real profile URL}"], - Network accessline 154
"name": "Dupont Plomberie", "url": "https://example.com/", "sameAs": ["{real profile URL}", "{real profile URL}"], - Network accessline 155
"url": "https://example.com/", - Network accessline 155
"url": "https://example.com/", - Network accessline 156
"sameAs": ["{real profile URL}", "{real profile URL}"], "founder": { "@id": "https://example.com/about/#person" } }, - Network accessline 156
"sameAs": ["{real profile URL}", "{real profile URL}"], "founder": { "@id": "https://example.com/about/#person" } }, - Network accessline 157
"founder": { "@id": "https://example.com/about/#person" } - Network accessline 157
"founder": { "@id": "https://example.com/about/#person" } - Network accessline 159
{ "@type": "Person", "@id": "https://example.com/about/#person", - Network accessline 159
{ "@type": "Person", "@id": "https://example.com/about/#person", - Network accessline 160
"@type": "Person", "@id": "https://example.com/about/#person", "name": "{founder full name}", - Network accessline 160
"@type": "Person", "@id": "https://example.com/about/#person", "name": "{founder full name}", - Network accessline 161
"@id": "https://example.com/about/#person", - Network accessline 161
"@id": "https://example.com/about/#person", - Network accessline 162
"name": "{founder full name}", "jobTitle": "{role}", "url": "https://example.com/about/", - Network accessline 162
"name": "{founder full name}", "jobTitle": "{role}", "url": "https://example.com/about/", - Network accessline 163
"jobTitle": "{role}", "url": "https://example.com/about/", "sameAs": ["{LinkedIn profile URL}", "{registry or certification URL}"] - Network accessline 163
"jobTitle": "{role}", "url": "https://example.com/about/", "sameAs": ["{LinkedIn profile URL}", "{registry or certification URL}"] - Network accessline 164
"url": "https://example.com/about/", - Network accessline 164
"url": "https://example.com/about/", - Network accessline 168
"@type": "BreadcrumbList", "itemListElement": [ { "@type": "ListItem", "position": 1, "name": "Home", "item": "https://example.com/" }, - Network accessline 168
"@type": "BreadcrumbList", "itemListElement": [ { "@type": "ListItem", "position": 1, "name": "Home", "item": "https://example.com/" }, - Network accessline 169
"itemListElement": [ { "@type": "ListItem", "position": 1, "name": "Home", "item": "https://example.com/" }, { "@type": "ListItem", "position": 2, "name": "Services", "item": "https://example.com/services/" }, - Network accessline 169
"itemListElement": [ { "@type": "ListItem", "position": 1, "name": "Home", "item": "https://example.com/" }, { "@type": "ListItem", "position": 2, "name": "Services", "item": "https://example.com/services/" }, - Network accessline 170
{ "@type": "ListItem", "position": 1, "name": "Home", "item": "https://example.com/" }, - Network accessline 170
{ "@type": "ListItem", "position": 1, "name": "Home", "item": "https://example.com/" }, - Network accessline 171
{ "@type": "ListItem", "position": 2, "name": "Services", "item": "https://example.com/services/" }, - Network accessline 171
{ "@type": "ListItem", "position": 2, "name": "Services", "item": "https://example.com/services/" }, - Network accessline 172
{ "@type": "ListItem", "position": 3, "name": "Emergency plumber in Lyon", "item": "https://example.com/emergency-plumber-lyon/" } - Network accessline 172
{ "@type": "ListItem", "position": 3, "name": "Emergency plumber in Lyon", "item": "https://example.com/emergency-plumber-lyon/" }
skills/seo-geo-audit/SKILL.md
- Network accessline 4
license: MIT metadata: author: "Sorank (https://sorank.com)" - Network accessline 4
license: MIT metadata: author: "Sorank (https://sorank.com)" - Network accessline 5
metadata: author: "Sorank (https://sorank.com)" version: "1.0.0" - Network accessline 5
metadata: author: "Sorank (https://sorank.com)" version: "1.0.0" - Network accessline 6
author: "Sorank (https://sorank.com)" - Network accessline 6
author: "Sorank (https://sorank.com)" - Network accessline 50
python3 scripts/seo_audit.py https://example.com /services /blog/top-article - Network accessline 50
python3 scripts/seo_audit.py https://example.com /services /blog/top-article - Network accessline 58
python3 ../seo-internal-linking/scripts/site_crawl.py https://example.com --max-pages 500 --out crawl.json - Network accessline 58
python3 ../seo-internal-linking/scripts/site_crawl.py https://example.com --max-pages 500 --out crawl.json - Network accessline 66
python3 scripts/page_benchmark.py --type service https://example.com/service https://rival-a.com/service https://rival-b.com/service - Network accessline 66
python3 scripts/page_benchmark.py --type service https://example.com/service https://rival-a.com/service https://rival-b.com/service - Network accessline 87
| `likely_js_rendered: true` (client-side site) | Open the page in a browser to read the real content, and report that AI crawlers cannot see it (they do not execute JavaScript, see seo-technical) | | Images loaded as CSS backgrounds | Invi - Network accessline 87
| `likely_js_rendered: true` (client-side site) | Open the page in a browser to read the real content, and report that AI crawlers cannot see it (they do not execute JavaScript, see seo-technical) | | Images loaded as CSS backgrounds | Invi - Network accessline 88
| Images loaded as CSS backgrounds | Invisible to the parser (total may read 0); verify visually | | Real-world speed | Ask the user to run https://pagespeed.web.dev (free, no key) on mobile and desktop and share scores | | Backlink profile - Network accessline 88
| Images loaded as CSS backgrounds | Invisible to the parser (total may read 0); verify visually | | Real-world speed | Ask the user to run https://pagespeed.web.dev (free, no key) on mobile and desktop and share scores | | Backlink profile - Network accessline 89
| Real-world speed | Ask the user to run https://pagespeed.web.dev (free, no key) on mobile and desktop and share scores | - Network accessline 89
| Real-world speed | Ask the user to run https://pagespeed.web.dev (free, no key) on mobile and desktop and share scores | - Network accessline 177
- AI Mode versus top 10 organic overlap (32 percent URL overlap): https://www.semrush.com/blog/ai-mode-comparison-study/ - AI crawlers do not execute JavaScript (500M+ fetch analysis): https://vercel.com/blog/the-rise-of-the-ai-crawler - Network accessline 177
- AI Mode versus top 10 organic overlap (32 percent URL overlap): https://www.semrush.com/blog/ai-mode-comparison-study/ - AI crawlers do not execute JavaScript (500M+ fetch analysis): https://vercel.com/blog/the-rise-of-the-ai-crawler - Network accessline 178
- AI crawlers do not execute JavaScript (500M+ fetch analysis): https://vercel.com/blog/the-rise-of-the-ai-crawler - Network accessline 178
- AI crawlers do not execute JavaScript (500M+ fetch analysis): https://vercel.com/blog/the-rise-of-the-ai-crawler - Network accessline 179
- Why ChatGPT cites pages (1.4M prompt study): https://ahrefs.com/blog/why-chatgpt-cites-pages/ - Network accessline 179
- Why ChatGPT cites pages (1.4M prompt study): https://ahrefs.com/blog/why-chatgpt-cites-pages/ - Network accessline 180
- Generative Engine Optimization (controlled study, KDD 2024): https://arxiv.org/abs/2311.09735 - Network accessline 180
- Generative Engine Optimization (controlled study, KDD 2024): https://arxiv.org/abs/2311.09735 - Network accessline 181
- Google guidance on AI features and structured data: https://developers.google.com/search/docs/appearance/ai-features - Network accessline 181
- Google guidance on AI features and structured data: https://developers.google.com/search/docs/appearance/ai-features
skills/seo-geo-audit/evals/evals.json
- Network accessline 4
{ "id": 1, "prompt": "Can you audit my site https://atelier-verde.com? It's a small online store selling handmade ceramics, built on Shopify. We blog sometimes but traffic has been flat for a year and we never show up when peopl - Network accessline 4
{ "id": 1, "prompt": "Can you audit my site https://atelier-verde.com? It's a small online store selling handmade ceramics, built on Shopify. We blog sometimes but traffic has been flat for a year and we never show up when peopl - Network accessline 5
"id": 1, "prompt": "Can you audit my site https://atelier-verde.com? It's a small online store selling handmade ceramics, built on Shopify. We blog sometimes but traffic has been flat for a year and we never show up when people ask Ch - Network accessline 5
"id": 1, "prompt": "Can you audit my site https://atelier-verde.com? It's a small online store selling handmade ceramics, built on Shopify. We blog sometimes but traffic has been flat for a year and we never show up when people ask Ch - Network accessline 6
"prompt": "Can you audit my site https://atelier-verde.com? It's a small online store selling handmade ceramics, built on Shopify. We blog sometimes but traffic has been flat for a year and we never show up when people ask ChatGPT for ceram - Network accessline 6
"prompt": "Can you audit my site https://atelier-verde.com? It's a small online store selling handmade ceramics, built on Shopify. We blog sometimes but traffic has been flat for a year and we never show up when people ask ChatGPT for ceram
skills/seo-geo-audit/references/audit-checklist.md
- Network accessline 36
- 4.1 Mobile first: 80-90 percent of typical traffic is mobile, so judge mobile scores first. PageSpeed 75+ on desktop is acceptable; aim higher when competitors are faster. Free check: https://pagespeed.web.dev (field + measured) - Network accessline 36
- 4.1 Mobile first: 80-90 percent of typical traffic is mobile, so judge mobile scores first. PageSpeed 75+ on desktop is acceptable; aim higher when competitors are faster. Free check: https://pagespeed.web.dev (field + measured) - Network accessline 45
- 4.10 GSC and GA4 installed AND the owner actually has access. Audits regularly find neither, or an agency holding the keys. (field) - 4.11 Bing Webmaster Tools + IndexNow configured. Bing's index is a discovery door for ChatGPT, which mak - Network accessline 45
- 4.10 GSC and GA4 installed AND the owner actually has access. Audits regularly find neither, or an agency holding the keys. (field) - 4.11 Bing Webmaster Tools + IndexNow configured. Bing's index is a discovery door for ChatGPT, which mak - Network accessline 46
- 4.11 Bing Webmaster Tools + IndexNow configured. Bing's index is a discovery door for ChatGPT, which makes Bing a first-class citizen in 2026. (measured) - 4.12 JavaScript rendering gate: the visible content must exist in the raw HTML. No - Network accessline 46
- 4.11 Bing Webmaster Tools + IndexNow configured. Bing's index is a discovery door for ChatGPT, which makes Bing a first-class citizen in 2026. (measured) - 4.12 JavaScript rendering gate: the visible content must exist in the raw HTML. No - Network accessline 47
- 4.12 JavaScript rendering gate: the visible content must exist in the raw HTML. No AI crawler executes JavaScript (only Googlebot renders), so client-side content is invisible to ChatGPT, Claude and Perplexity. Test: curl the page or chec - Network accessline 47
- 4.12 JavaScript rendering gate: the visible content must exist in the raw HTML. No AI crawler executes JavaScript (only Googlebot renders), so client-side content is invisible to ChatGPT, Claude and Perplexity. Test: curl the page or chec
skills/seo-geo-audit/scripts/page_benchmark.py
- Executable scriptline 1
#!/usr/bin/env python3 - Executable scriptline 1
#!/usr/bin/env python3 - Executable scriptline 1
#!/usr/bin/env python3 - Executable scriptline 1
#!/usr/bin/env python3 - Executable scriptline 1
#!/usr/bin/env python3 - Executable scriptline 1
#!/usr/bin/env python3 - Executable scriptline 1
#!/usr/bin/env python3 - Executable scriptline 1
#!/usr/bin/env python3 - Executable scriptline 1
#!/usr/bin/env python3 - Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 20
Usage: python3 page_benchmark.py --type service https://client.com/page https://rival1.com/page https://rival2.com/page - Network accessline 20
Usage: python3 page_benchmark.py --type service https://client.com/page https://rival1.com/page https://rival2.com/page - Network accessline 20
Usage: python3 page_benchmark.py --type service https://client.com/page https://rival1.com/page https://rival2.com/page - Network accessline 20
Usage: python3 page_benchmark.py --type service https://client.com/page https://rival1.com/page https://rival2.com/page - Network accessline 20
Usage: python3 page_benchmark.py --type service https://client.com/page https://rival1.com/page https://rival2.com/page - Network accessline 20
Usage: python3 page_benchmark.py --type service https://client.com/page https://rival1.com/page https://rival2.com/page - Network accessline 20
Usage: python3 page_benchmark.py --type service https://client.com/page https://rival1.com/page https://rival2.com/page - Network accessline 20
Usage: python3 page_benchmark.py --type service https://client.com/page https://rival1.com/page https://rival2.com/page - Network accessline 20
Usage: python3 page_benchmark.py --type service https://client.com/page https://rival1.com/page https://rival2.com/page - Network accessline 20
Usage: python3 page_benchmark.py --type service https://client.com/page https://rival1.com/page https://rival2.com/page - Network accessline 21
python3 page_benchmark.py --type service https://client.com/page https://rival1.com/page https://rival2.com/page - Network accessline 21
python3 page_benchmark.py --type service https://client.com/page https://rival1.com/page https://rival2.com/page - Network accessline 21
python3 page_benchmark.py --type service https://client.com/page https://rival1.com/page https://rival2.com/page - Network accessline 21
python3 page_benchmark.py --type service https://client.com/page https://rival1.com/page https://rival2.com/page - Network accessline 21
python3 page_benchmark.py --type service https://client.com/page https://rival1.com/page https://rival2.com/page - Network accessline 21
python3 page_benchmark.py --type service https://client.com/page https://rival1.com/page https://rival2.com/page - Network accessline 21
python3 page_benchmark.py --type service https://client.com/page https://rival1.com/page https://rival2.com/page - Network accessline 21
python3 page_benchmark.py --type service https://client.com/page https://rival1.com/page https://rival2.com/page - Network accessline 21
python3 page_benchmark.py --type service https://client.com/page https://rival1.com/page https://rival2.com/page - Network accessline 21
python3 page_benchmark.py --type service https://client.com/page https://rival1.com/page https://rival2.com/page - Network accessline 22
python3 page_benchmark.py --type homepage https://client.com/ https://rival.com/ --json - Network accessline 22
python3 page_benchmark.py --type homepage https://client.com/ https://rival.com/ --json - Network accessline 22
python3 page_benchmark.py --type homepage https://client.com/ https://rival.com/ --json - Network accessline 22
python3 page_benchmark.py --type homepage https://client.com/ https://rival.com/ --json - Network accessline 22
python3 page_benchmark.py --type homepage https://client.com/ https://rival.com/ --json - Network accessline 22
python3 page_benchmark.py --type homepage https://client.com/ https://rival.com/ --json - Network accessline 22
python3 page_benchmark.py --type homepage https://client.com/ https://rival.com/ --json - Network accessline 22
python3 page_benchmark.py --type homepage https://client.com/ https://rival.com/ --json - Network accessline 22
python3 page_benchmark.py --type homepage https://client.com/ https://rival.com/ --json - Network accessline 22
python3 page_benchmark.py --type homepage https://client.com/ https://rival.com/ --json - Network accessline 117
try: final, _, headers, body = SA.fetch(url) - Network accessline 117
try: final, _, headers, body = SA.fetch(url) - Network accessline 117
try: final, _, headers, body = SA.fetch(url) - Network accessline 117
try: final, _, headers, body = SA.fetch(url) - Network accessline 117
try: final, _, headers, body = SA.fetch(url) - Network accessline 117
try: final, _, headers, body = SA.fetch(url) - Network accessline 117
try: final, _, headers, body = SA.fetch(url) - Network accessline 117
try: final, _, headers, body = SA.fetch(url) - Network accessline 117
try: final, _, headers, body = SA.fetch(url) - Network accessline 117
try: final, _, headers, body = SA.fetch(url) - Network accessline 118
final, _, headers, body = SA.fetch(url) - Network accessline 118
final, _, headers, body = SA.fetch(url) - Network accessline 118
final, _, headers, body = SA.fetch(url) - Network accessline 118
final, _, headers, body = SA.fetch(url) - Network accessline 118
final, _, headers, body = SA.fetch(url) - Network accessline 118
final, _, headers, body = SA.fetch(url) - Network accessline 118
final, _, headers, body = SA.fetch(url) - Network accessline 118
final, _, headers, body = SA.fetch(url) - Network accessline 118
final, _, headers, body = SA.fetch(url) - Network accessline 118
final, _, headers, body = SA.fetch(url)
skills/seo-geo-audit/scripts/seo_audit.py
- Executable scriptline 1
#!/usr/bin/env python3 - Executable scriptline 1
#!/usr/bin/env python3 - Executable scriptline 1
Executable file; content unavailable - Executable scriptline 1
Executable file; content unavailable - Executable scriptline 1
#!/usr/bin/env python3 - Executable scriptline 1
Executable file; content unavailable - Executable scriptline 1
Executable file; content unavailable - Executable scriptline 1
#!/usr/bin/env python3 - Executable scriptline 1
Executable file; content unavailable - Executable scriptline 1
Executable file; content unavailable - Executable scriptline 1
#!/usr/bin/env python3 - Executable scriptline 1
Executable file; content unavailable - Executable scriptline 1
Executable file; content unavailable - Executable scriptline 1
#!/usr/bin/env python3 - Executable scriptline 1
Executable file; content unavailable - Executable scriptline 1
Executable file; content unavailable - Executable scriptline 1
#!/usr/bin/env python3 - Executable scriptline 1
Executable file; content unavailable - Executable scriptline 1
Executable file; content unavailable - Executable scriptline 1
#!/usr/bin/env python3 - Executable scriptline 1
#!/usr/bin/env python3 - Executable scriptline 1
Executable file; content unavailable - Executable scriptline 1
Executable file; content unavailable - Executable scriptline 1
#!/usr/bin/env python3 - Executable scriptline 1
Executable file; content unavailable - Executable scriptline 1
Executable file; content unavailable - Network accessline 15
Usage: python3 seo_audit.py https://example.com - Network accessline 15
Usage: python3 seo_audit.py https://example.com - Network accessline 15
Usage: python3 seo_audit.py https://example.com - Network accessline 15
Usage: python3 seo_audit.py https://example.com - Network accessline 15
Usage: python3 seo_audit.py https://example.com - Network accessline 15
Usage: python3 seo_audit.py https://example.com - Network accessline 15
Usage: python3 seo_audit.py https://example.com - Network accessline 15
Usage: python3 seo_audit.py https://example.com - Network accessline 15
Usage: python3 seo_audit.py https://example.com - Network accessline 15
Usage: python3 seo_audit.py https://example.com - Network accessline 16
python3 seo_audit.py https://example.com - Network accessline 16
python3 seo_audit.py https://example.com - Network accessline 16
python3 seo_audit.py https://example.com - Network accessline 16
python3 seo_audit.py https://example.com - Network accessline 16
python3 seo_audit.py https://example.com - Network accessline 16
python3 seo_audit.py https://example.com - Network accessline 16
python3 seo_audit.py https://example.com - Network accessline 16
python3 seo_audit.py https://example.com - Network accessline 16
python3 seo_audit.py https://example.com - Network accessline 16
python3 seo_audit.py https://example.com - Network accessline 17
python3 seo_audit.py https://example.com /about /services # extra pages - Network accessline 17
python3 seo_audit.py https://example.com /about /services # extra pages - Network accessline 17
python3 seo_audit.py https://example.com /about /services # extra pages - Network accessline 17
python3 seo_audit.py https://example.com /about /services # extra pages - Network accessline 17
python3 seo_audit.py https://example.com /about /services # extra pages - Network accessline 17
python3 seo_audit.py https://example.com /about /services # extra pages - Network accessline 17
python3 seo_audit.py https://example.com /about /services # extra pages - Network accessline 17
python3 seo_audit.py https://example.com /about /services # extra pages - Network accessline 17
python3 seo_audit.py https://example.com /about /services # extra pages - Network accessline 17
python3 seo_audit.py https://example.com /about /services # extra pages - Network accessline 18
python3 seo_audit.py https://example.com --no-images # skip image weight checks - Network accessline 18
python3 seo_audit.py https://example.com --no-images # skip image weight checks - Network accessline 18
python3 seo_audit.py https://example.com --no-images # skip image weight checks - Network accessline 18
python3 seo_audit.py https://example.com --no-images # skip image weight checks - Network accessline 18
python3 seo_audit.py https://example.com --no-images # skip image weight checks - Network accessline 18
python3 seo_audit.py https://example.com --no-images # skip image weight checks - Network accessline 18
python3 seo_audit.py https://example.com --no-images # skip image weight checks - Network accessline 18
python3 seo_audit.py https://example.com --no-images # skip image weight checks - Network accessline 18
python3 seo_audit.py https://example.com --no-images # skip image weight checks - Network accessline 18
python3 seo_audit.py https://example.com --no-images # skip image weight checks - Network accessline 52
def fetch(url, method="GET"): - Network accessline 52
def fetch(url, method="GET"): - Network accessline 52
def fetch(url, method="GET"): - Network accessline 52
def fetch(url, method="GET"): - Network accessline 52
def fetch(url, method="GET"): - Network accessline 52
def fetch(url, method="GET"): - Network accessline 52
def fetch(url, method="GET"): - Network accessline 52
def fetch(url, method="GET"): - Network accessline 52
def fetch(url, method="GET"): - Network accessline 52
def fetch(url, method="GET"): - Network accessline 75
try: _, _, headers, _ = fetch(url, method="HEAD") - Network accessline 75
try: _, _, headers, _ = fetch(url, method="HEAD") - Network accessline 75
try: _, _, headers, _ = fetch(url, method="HEAD") - Network accessline 75
try: _, _, headers, _ = fetch(url, method="HEAD") - Network accessline 75
try: _, _, headers, _ = fetch(url, method="HEAD") - Network accessline 75
try: _, _, headers, _ = fetch(url, method="HEAD") - Network accessline 75
try: _, _, headers, _ = fetch(url, method="HEAD") - Network accessline 75
try: _, _, headers, _ = fetch(url, method="HEAD") - Network accessline 75
try: _, _, headers, _ = fetch(url, method="HEAD") - Network accessline 75
try: _, _, headers, _ = fetch(url, method="HEAD") - Network accessline 76
_, _, headers, _ = fetch(url, method="HEAD") - Network accessline 76
_, _, headers, _ = fetch(url, method="HEAD") - Network accessline 76
_, _, headers, _ = fetch(url, method="HEAD") - Network accessline 76
_, _, headers, _ = fetch(url, method="HEAD") - Network accessline 76
_, _, headers, _ = fetch(url, method="HEAD") - Network accessline 76
_, _, headers, _ = fetch(url, method="HEAD") - Network accessline 76
_, _, headers, _ = fetch(url, method="HEAD") - Network accessline 76
_, _, headers, _ = fetch(url, method="HEAD") - Network accessline 76
_, _, headers, _ = fetch(url, method="HEAD") - Network accessline 76
_, _, headers, _ = fetch(url, method="HEAD") - Network accessline 1100
out = {"url": url} try: final, status, headers, body = fetch(url) - Network accessline 1100
out = {"url": url} try: final, status, headers, body = fetch(url) - Network accessline 1100
out = {"url": url} try: final, status, headers, body = fetch(url) - Network accessline 1100
out = {"url": url} try: final, status, headers, body = fetch(url) - Network accessline 1100
out = {"url": url} try: final, status, headers, body = fetch(url) - Network accessline 1100
out = {"url": url} try: final, status, headers, body = fetch(url) - Network accessline 1100
out = {"url": url} try: final, status, headers, body = fetch(url) - Network accessline 1100
out = {"url": url} try: final, status, headers, body = fetch(url) - Network accessline 1100
out = {"url": url} try: final, status, headers, body = fetch(url) - Network accessline 1100
out = {"url": url} try: final, status, headers, body = fetch(url) - Network accessline 1101
try: final, status, headers, body = fetch(url) except (HTTPError, URLError, ssl.SSLError, Exception) as e: - Network accessline 1101
try: final, status, headers, body = fetch(url) except (HTTPError, URLError, ssl.SSLError, Exception) as e: - Network accessline 1101
try: final, status, headers, body = fetch(url) except (HTTPError, URLError, ssl.SSLError, Exception) as e: - Network accessline 1101
try: final, status, headers, body = fetch(url) except (HTTPError, URLError, ssl.SSLError, Exception) as e: - Network accessline 1101
try: final, status, headers, body = fetch(url) except (HTTPError, URLError, ssl.SSLError, Exception) as e: - Network accessline 1101
try: final, status, headers, body = fetch(url) except (HTTPError, URLError, ssl.SSLError, Exception) as e: - Network accessline 1101
try: final, status, headers, body = fetch(url) except (HTTPError, URLError, ssl.SSLError, Exception) as e: - Network accessline 1101
try: final, status, headers, body = fetch(url) except (HTTPError, URLError, ssl.SSLError, Exception) as e: - Network accessline 1101
try: final, status, headers, body = fetch(url) except (HTTPError, URLError, ssl.SSLError, Exception) as e: - Network accessline 1101
try: final, status, headers, body = fetch(url) except (HTTPError, URLError, ssl.SSLError, Exception) as e: - Network accessline 1102
final, status, headers, body = fetch(url) - Network accessline 1102
final, status, headers, body = fetch(url) - Network accessline 1102
final, status, headers, body = fetch(url) - Network accessline 1102
final, status, headers, body = fetch(url) - Network accessline 1102
final, status, headers, body = fetch(url) - Network accessline 1102
final, status, headers, body = fetch(url) - Network accessline 1102
final, status, headers, body = fetch(url) - Network accessline 1102
final, status, headers, body = fetch(url) - Network accessline 1102
final, status, headers, body = fetch(url) - Network accessline 1102
final, status, headers, body = fetch(url) - Network accessline 1288
out = {} try: final, status, _, body = fetch(urljoin(base, "/robots.txt")) - Network accessline 1288
out = {} try: final, status, _, body = fetch(urljoin(base, "/robots.txt")) - Network accessline 1288
out = {} try: final, status, _, body = fetch(urljoin(base, "/robots.txt")) - Network accessline 1288
out = {} try: final, status, _, body = fetch(urljoin(base, "/robots.txt")) - Network accessline 1288
out = {} try: final, status, _, body = fetch(urljoin(base, "/robots.txt")) - Network accessline 1288
out = {} try: final, status, _, body = fetch(urljoin(base, "/robots.txt")) - Network accessline 1288
out = {} try: final, status, _, body = fetch(urljoin(base, "/robots.txt")) - Network accessline 1288
out = {} try: final, status, _, body = fetch(urljoin(base, "/robots.txt")) - Network accessline 1288
out = {} try: final, status, _, body = fetch(urljoin(base, "/robots.txt")) - Network accessline 1288
out = {} try: final, status, _, body = fetch(urljoin(base, "/robots.txt")) - Network accessline 1289
try: final, status, _, body = fetch(urljoin(base, "/robots.txt")) txt = body.decode("utf-8", errors="replace") - Network accessline 1289
try: final, status, _, body = fetch(urljoin(base, "/robots.txt")) txt = body.decode("utf-8", errors="replace") - Network accessline 1289
try: final, status, _, body = fetch(urljoin(base, "/robots.txt")) txt = body.decode("utf-8", errors="replace") - Network accessline 1289
try: final, status, _, body = fetch(urljoin(base, "/robots.txt")) txt = body.decode("utf-8", errors="replace") - Network accessline 1289
try: final, status, _, body = fetch(urljoin(base, "/robots.txt")) txt = body.decode("utf-8", errors="replace") - Network accessline 1289
try: final, status, _, body = fetch(urljoin(base, "/robots.txt")) txt = body.decode("utf-8", errors="replace") - Network accessline 1289
try: final, status, _, body = fetch(urljoin(base, "/robots.txt")) txt = body.decode("utf-8", errors="replace") - Network accessline 1289
try: final, status, _, body = fetch(urljoin(base, "/robots.txt")) txt = body.decode("utf-8", errors="replace") - Network accessline 1289
try: final, status, _, body = fetch(urljoin(base, "/robots.txt")) txt = body.decode("utf-8", errors="replace") - Network accessline 1289
try: final, status, _, body = fetch(urljoin(base, "/robots.txt")) txt = body.decode("utf-8", errors="replace") - Network accessline 1290
final, status, _, body = fetch(urljoin(base, "/robots.txt")) - Network accessline 1290
final, status, _, body = fetch(urljoin(base, "/robots.txt")) - Network accessline 1290
final, status, _, body = fetch(urljoin(base, "/robots.txt")) - Network accessline 1290
final, status, _, body = fetch(urljoin(base, "/robots.txt")) - Network accessline 1290
final, status, _, body = fetch(urljoin(base, "/robots.txt")) - Network accessline 1290
final, status, _, body = fetch(urljoin(base, "/robots.txt")) - Network accessline 1290
final, status, _, body = fetch(urljoin(base, "/robots.txt")) - Network accessline 1290
final, status, _, body = fetch(urljoin(base, "/robots.txt")) - Network accessline 1290
final, status, _, body = fetch(urljoin(base, "/robots.txt")) - Network accessline 1290
final, status, _, body = fetch(urljoin(base, "/robots.txt")) - Network accessline 1329
out = {} try: _, status, _, body = fetch(urljoin(base, "/llms.txt")) - Network accessline 1329
out = {} try: _, status, _, body = fetch(urljoin(base, "/llms.txt")) - Network accessline 1329
out = {} try: _, status, _, body = fetch(urljoin(base, "/llms.txt")) - Network accessline 1329
out = {} try: _, status, _, body = fetch(urljoin(base, "/llms.txt")) - Network accessline 1329
out = {} try: _, status, _, body = fetch(urljoin(base, "/llms.txt")) - Network accessline 1329
out = {} try: _, status, _, body = fetch(urljoin(base, "/llms.txt")) - Network accessline 1329
out = {} try: _, status, _, body = fetch(urljoin(base, "/llms.txt")) - Network accessline 1329
out = {} try: _, status, _, body = fetch(urljoin(base, "/llms.txt")) - Network accessline 1329
out = {} try: _, status, _, body = fetch(urljoin(base, "/llms.txt")) - Network accessline 1329
out = {} try: _, status, _, body = fetch(urljoin(base, "/llms.txt")) - Network accessline 1330
try: _, status, _, body = fetch(urljoin(base, "/llms.txt")) text = body.decode("utf-8", errors="replace") - Network accessline 1330
try: _, status, _, body = fetch(urljoin(base, "/llms.txt")) text = body.decode("utf-8", errors="replace") - Network accessline 1330
try: _, status, _, body = fetch(urljoin(base, "/llms.txt")) text = body.decode("utf-8", errors="replace") - Network accessline 1330
try: _, status, _, body = fetch(urljoin(base, "/llms.txt")) text = body.decode("utf-8", errors="replace") - Network accessline 1330
try: _, status, _, body = fetch(urljoin(base, "/llms.txt")) text = body.decode("utf-8", errors="replace") - Network accessline 1330
try: _, status, _, body = fetch(urljoin(base, "/llms.txt")) text = body.decode("utf-8", errors="replace") - Network accessline 1330
try: _, status, _, body = fetch(urljoin(base, "/llms.txt")) text = body.decode("utf-8", errors="replace") - Network accessline 1330
try: _, status, _, body = fetch(urljoin(base, "/llms.txt")) text = body.decode("utf-8", errors="replace") - Network accessline 1330
try: _, status, _, body = fetch(urljoin(base, "/llms.txt")) text = body.decode("utf-8", errors="replace") - Network accessline 1330
try: _, status, _, body = fetch(urljoin(base, "/llms.txt")) text = body.decode("utf-8", errors="replace") - Network accessline 1331
_, status, _, body = fetch(urljoin(base, "/llms.txt")) - Network accessline 1331
_, status, _, body = fetch(urljoin(base, "/llms.txt")) - Network accessline 1331
_, status, _, body = fetch(urljoin(base, "/llms.txt")) - Network accessline 1331
_, status, _, body = fetch(urljoin(base, "/llms.txt")) - Network accessline 1331
_, status, _, body = fetch(urljoin(base, "/llms.txt")) - Network accessline 1331
_, status, _, body = fetch(urljoin(base, "/llms.txt")) - Network accessline 1331
_, status, _, body = fetch(urljoin(base, "/llms.txt")) - Network accessline 1331
_, status, _, body = fetch(urljoin(base, "/llms.txt")) - Network accessline 1331
_, status, _, body = fetch(urljoin(base, "/llms.txt")) - Network accessline 1331
_, status, _, body = fetch(urljoin(base, "/llms.txt")) - Network accessline 1397
out["url"] = candidates[0] try: _, status, _, body = fetch(candidates[0]) - Network accessline 1397
out["url"] = candidates[0] try: _, status, _, body = fetch(candidates[0]) - Network accessline 1397
out["url"] = candidates[0] try: _, status, _, body = fetch(candidates[0]) - Network accessline 1397
out["url"] = candidates[0] try: _, status, _, body = fetch(candidates[0]) - Network accessline 1397
out["url"] = candidates[0] try: _, status, _, body = fetch(candidates[0]) - Network accessline 1397
out["url"] = candidates[0] try: _, status, _, body = fetch(candidates[0]) - Network accessline 1397
out["url"] = candidates[0] try: _, status, _, body = fetch(candidates[0]) - Network accessline 1397
out["url"] = candidates[0] try: _, status, _, body = fetch(candidates[0]) - Network accessline 1397
out["url"] = candidates[0] try: _, status, _, body = fetch(candidates[0]) - Network accessline 1397
out["url"] = candidates[0] try: _, status, _, body = fetch(candidates[0]) - Network accessline 1398
try: _, status, _, body = fetch(candidates[0]) xml = body.decode("utf-8", errors="replace") - Network accessline 1398
try: _, status, _, body = fetch(candidates[0]) xml = body.decode("utf-8", errors="replace") - Network accessline 1398
try: _, status, _, body = fetch(candidates[0]) xml = body.decode("utf-8", errors="replace") - Network accessline 1398
try: _, status, _, body = fetch(candidates[0]) xml = body.decode("utf-8", errors="replace") - Network accessline 1398
try: _, status, _, body = fetch(candidates[0]) xml = body.decode("utf-8", errors="replace") - Network accessline 1398
try: _, status, _, body = fetch(candidates[0]) xml = body.decode("utf-8", errors="replace") - Network accessline 1398
try: _, status, _, body = fetch(candidates[0]) xml = body.decode("utf-8", errors="replace") - Network accessline 1398
try: _, status, _, body = fetch(candidates[0]) xml = body.decode("utf-8", errors="replace") - Network accessline 1398
try: _, status, _, body = fetch(candidates[0]) xml = body.decode("utf-8", errors="replace") - Network accessline 1398
try: _, status, _, body = fetch(candidates[0]) xml = body.decode("utf-8", errors="replace") - Network accessline 1399
_, status, _, body = fetch(candidates[0]) - Network accessline 1399
_, status, _, body = fetch(candidates[0]) - Network accessline 1399
_, status, _, body = fetch(candidates[0]) - Network accessline 1399
_, status, _, body = fetch(candidates[0]) - Network accessline 1399
_, status, _, body = fetch(candidates[0]) - Network accessline 1399
_, status, _, body = fetch(candidates[0]) - Network accessline 1399
_, status, _, body = fetch(candidates[0]) - Network accessline 1399
_, status, _, body = fetch(candidates[0]) - Network accessline 1399
_, status, _, body = fetch(candidates[0]) - Network accessline 1399
_, status, _, body = fetch(candidates[0]) - Network accessline 1410
for child in children[:100]: try: _, _, _, b2 = fetch(child.strip()) - Network accessline 1410
for child in children[:100]: try: _, _, _, b2 = fetch(child.strip()) - Network accessline 1410
for child in children[:100]: try: _, _, _, b2 = fetch(child.strip()) - Network accessline 1410
for child in children[:100]: try: _, _, _, b2 = fetch(child.strip()) - Network accessline 1410
for child in children[:100]: try: _, _, _, b2 = fetch(child.strip()) - Network accessline 1410
for child in children[:100]: try: _, _, _, b2 = fetch(child.strip()) - Network accessline 1410
for child in children[:100]: try: _, _, _, b2 = fetch(child.strip()) - Network accessline 1410
for child in children[:100]: try: _, _, _, b2 = fetch(child.strip()) - Network accessline 1410
for child in children[:100]: try: _, _, _, b2 = fetch(child.strip()) - Network accessline 1410
for child in children[:100]: try: _, _, _, b2 = fetch(child.strip()) - Network accessline 1411
try: _, _, _, b2 = fetch(child.strip()) child_xml = b2.decode("utf-8", "replace") - Network accessline 1411
try: _, _, _, b2 = fetch(child.strip()) child_xml = b2.decode("utf-8", "replace") - Network accessline 1411
try: _, _, _, b2 = fetch(child.strip()) child_xml = b2.decode("utf-8", "replace") - Network accessline 1411
try: _, _, _, b2 = fetch(child.strip()) child_xml = b2.decode("utf-8", "replace") - Network accessline 1411
try: _, _, _, b2 = fetch(child.strip()) child_xml = b2.decode("utf-8", "replace") - Network accessline 1411
try: _, _, _, b2 = fetch(child.strip()) child_xml = b2.decode("utf-8", "replace") - Network accessline 1411
try: _, _, _, b2 = fetch(child.strip()) child_xml = b2.decode("utf-8", "replace") - Network accessline 1411
try: _, _, _, b2 = fetch(child.strip()) child_xml = b2.decode("utf-8", "replace") - Network accessline 1411
try: _, _, _, b2 = fetch(child.strip()) child_xml = b2.decode("utf-8", "replace") - Network accessline 1411
try: _, _, _, b2 = fetch(child.strip()) child_xml = b2.decode("utf-8", "replace") - Network accessline 1412
_, _, _, b2 = fetch(child.strip()) - Network accessline 1412
_, _, _, b2 = fetch(child.strip()) - Network accessline 1412
_, _, _, b2 = fetch(child.strip()) - Network accessline 1412
_, _, _, b2 = fetch(child.strip()) - Network accessline 1412
_, _, _, b2 = fetch(child.strip()) - Network accessline 1412
_, _, _, b2 = fetch(child.strip()) - Network accessline 1412
_, _, _, b2 = fetch(child.strip()) - Network accessline 1412
_, _, _, b2 = fetch(child.strip()) - Network accessline 1412
_, _, _, b2 = fetch(child.strip()) - Network accessline 1412
_, _, _, b2 = fetch(child.strip()) - Network accessline 1630
def main(): ap = argparse.ArgumentParser(description="On-page fact collection for SEO + GEO audits") ap.add_argument("url", help="homepage URL (https://...)") - Network accessline 1630
def main(): ap = argparse.ArgumentParser(description="On-page fact collection for SEO + GEO audits") ap.add_argument("url", help="homepage URL (https://...)") - Network accessline 1630
def main(): ap = argparse.ArgumentParser(description="On-page fact collection for SEO + GEO audits") ap.add_argument("url", help="homepage URL (https://...)") - Network accessline 1630
def main(): ap = argparse.ArgumentParser(description="On-page fact collection for SEO + GEO audits") ap.add_argument("url", help="homepage URL (https://...)") - Network accessline 1630
def main(): ap = argparse.ArgumentParser(description="On-page fact collection for SEO + GEO audits") ap.add_argument("url", help="homepage URL (https://...)") - Network accessline 1630
def main(): ap = argparse.ArgumentParser(description="On-page fact collection for SEO + GEO audits") ap.add_argument("url", help="homepage URL (https://...)") - Network accessline 1630
def main(): ap = argparse.ArgumentParser(description="On-page fact collection for SEO + GEO audits") ap.add_argument("url", help="homepage URL (https://...)") - Network accessline 1630
def main(): ap = argparse.ArgumentParser(description="On-page fact collection for SEO + GEO audits") ap.add_argument("url", help="homepage URL (https://...)") - Network accessline 1630
def main(): ap = argparse.ArgumentParser(description="On-page fact collection for SEO + GEO audits") ap.add_argument("url", help="homepage URL (https://...)") - Network accessline 1630
def main(): ap = argparse.ArgumentParser(description="On-page fact collection for SEO + GEO audits") ap.add_argument("url", help="homepage URL (https://...)") - Network accessline 1631
ap = argparse.ArgumentParser(description="On-page fact collection for SEO + GEO audits") ap.add_argument("url", help="homepage URL (https://...)") ap.add_argument("pages", nargs="*", help="extra pages (absolute or relative)") - Network accessline 1631
ap = argparse.ArgumentParser(description="On-page fact collection for SEO + GEO audits") ap.add_argument("url", help="homepage URL (https://...)") ap.add_argument("pages", nargs="*", help="extra pages (absolute or relative)") - Network accessline 1631
ap = argparse.ArgumentParser(description="On-page fact collection for SEO + GEO audits") ap.add_argument("url", help="homepage URL (https://...)") ap.add_argument("pages", nargs="*", help="extra pages (absolute or relative)") - Network accessline 1631
ap = argparse.ArgumentParser(description="On-page fact collection for SEO + GEO audits") ap.add_argument("url", help="homepage URL (https://...)") ap.add_argument("pages", nargs="*", help="extra pages (absolute or relative)") - Network accessline 1631
ap = argparse.ArgumentParser(description="On-page fact collection for SEO + GEO audits") ap.add_argument("url", help="homepage URL (https://...)") ap.add_argument("pages", nargs="*", help="extra pages (absolute or relative)") - Network accessline 1631
ap = argparse.ArgumentParser(description="On-page fact collection for SEO + GEO audits") ap.add_argument("url", help="homepage URL (https://...)") ap.add_argument("pages", nargs="*", help="extra pages (absolute or relative)") - Network accessline 1631
ap = argparse.ArgumentParser(description="On-page fact collection for SEO + GEO audits") ap.add_argument("url", help="homepage URL (https://...)") ap.add_argument("pages", nargs="*", help="extra pages (absolute or relative)") - Network accessline 1631
ap = argparse.ArgumentParser(description="On-page fact collection for SEO + GEO audits") ap.add_argument("url", help="homepage URL (https://...)") ap.add_argument("pages", nargs="*", help="extra pages (absolute or relative)") - Network accessline 1631
ap = argparse.ArgumentParser(description="On-page fact collection for SEO + GEO audits") ap.add_argument("url", help="homepage URL (https://...)") ap.add_argument("pages", nargs="*", help="extra pages (absolute or relative)") - Network accessline 1631
ap = argparse.ArgumentParser(description="On-page fact collection for SEO + GEO audits") ap.add_argument("url", help="homepage URL (https://...)") ap.add_argument("pages", nargs="*", help="extra pages (absolute or relative)") - Network accessline 1632
ap.add_argument("url", help="homepage URL (https://...)") - Network accessline 1632
ap.add_argument("url", help="homepage URL (https://...)") - Network accessline 1632
ap.add_argument("url", help="homepage URL (https://...)") - Network accessline 1632
ap.add_argument("url", help="homepage URL (https://...)") - Network accessline 1632
ap.add_argument("url", help="homepage URL (https://...)") - Network accessline 1632
ap.add_argument("url", help="homepage URL (https://...)") - Network accessline 1632
ap.add_argument("url", help="homepage URL (https://...)") - Network accessline 1632
ap.add_argument("url", help="homepage URL (https://...)") - Network accessline 1632
ap.add_argument("url", help="homepage URL (https://...)") - Network accessline 1632
ap.add_argument("url", help="homepage URL (https://...)")
skills/seo-internal-linking/SKILL.md
- Network accessline 4
license: MIT metadata: author: "Sorank (https://sorank.com)" - Network accessline 4
license: MIT metadata: author: "Sorank (https://sorank.com)" - Network accessline 5
metadata: author: "Sorank (https://sorank.com)" version: "1.0.0" - Network accessline 5
metadata: author: "Sorank (https://sorank.com)" version: "1.0.0" - Network accessline 6
author: "Sorank (https://sorank.com)" - Network accessline 6
author: "Sorank (https://sorank.com)" - Network accessline 53
python3 scripts/site_crawl.py https://example.com --max-pages 500 --out crawl.json - Network accessline 53
python3 scripts/site_crawl.py https://example.com --max-pages 500 --out crawl.json - Network accessline 272
- Google Search Central, how Google discovers and crawls through links: https://developers.google.com/search/docs/fundamentals/how-search-works - Network accessline 272
- Google Search Central, how Google discovers and crawls through links: https://developers.google.com/search/docs/fundamentals/how-search-works - Network accessline 273
- Google, link best practices and crawlable links: https://developers.google.com/search/docs/crawling-indexing/links-crawlable - Network accessline 273
- Google, link best practices and crawlable links: https://developers.google.com/search/docs/crawling-indexing/links-crawlable - Network accessline 274
- Google spam policies (link spam): https://developers.google.com/search/docs/essentials/spam-policies - Network accessline 274
- Google spam policies (link spam): https://developers.google.com/search/docs/essentials/spam-policies - Network accessline 275
- Google, breadcrumb structured data: https://developers.google.com/search/docs/appearance/structured-data/breadcrumb - Network accessline 275
- Google, breadcrumb structured data: https://developers.google.com/search/docs/appearance/structured-data/breadcrumb - Network accessline 276
- Google SEO starter guide, site organization: https://developers.google.com/search/docs/fundamentals/seo-starter-guide - Network accessline 276
- Google SEO starter guide, site organization: https://developers.google.com/search/docs/fundamentals/seo-starter-guide - Network accessline 277
- Google patent US 7,716,225 (reasonable surfer, link weighting by click probability; updated by US 9,305,099): https://patents.google.com/patent/US7716225B1/en - Network accessline 277
- Google patent US 7,716,225 (reasonable surfer, link weighting by click probability; updated by US 9,305,099): https://patents.google.com/patent/US7716225B1/en - Network accessline 278
- Ahrefs, median age of pages cited by ChatGPT (~500 days): https://ahrefs.com/blog/why-chatgpt-cites-pages/ - Network accessline 278
- Ahrefs, median age of pages cited by ChatGPT (~500 days): https://ahrefs.com/blog/why-chatgpt-cites-pages/
skills/seo-internal-linking/evals/evals.json
- Network accessline 4
{ "id": 1, "prompt": "Build an internal linking plan for our landscaping company site https://verdantyards.ie. We have 6 service pages (garden design, lawn care, tree surgery, patios, irrigation, maintenance contracts), about 30 - Network accessline 4
{ "id": 1, "prompt": "Build an internal linking plan for our landscaping company site https://verdantyards.ie. We have 6 service pages (garden design, lawn care, tree surgery, patios, irrigation, maintenance contracts), about 30 - Network accessline 5
"id": 1, "prompt": "Build an internal linking plan for our landscaping company site https://verdantyards.ie. We have 6 service pages (garden design, lawn care, tree surgery, patios, irrigation, maintenance contracts), about 30 blog po - Network accessline 5
"id": 1, "prompt": "Build an internal linking plan for our landscaping company site https://verdantyards.ie. We have 6 service pages (garden design, lawn care, tree surgery, patios, irrigation, maintenance contracts), about 30 blog po - Network accessline 6
"prompt": "Build an internal linking plan for our landscaping company site https://verdantyards.ie. We have 6 service pages (garden design, lawn care, tree surgery, patios, irrigation, maintenance contracts), about 30 blog posts published o - Network accessline 6
"prompt": "Build an internal linking plan for our landscaping company site https://verdantyards.ie. We have 6 service pages (garden design, lawn care, tree surgery, patios, irrigation, maintenance contracts), about 30 blog posts published o - Network accessline 10
{ "id": 2, "prompt": "quick one: https://nordicsupps.fi/collections/creatine-monohydrate is indexed in search console but gets basically zero impressions and zero clicks after 4 months live. it's in the sitemap. i checked and i - Network accessline 10
{ "id": 2, "prompt": "quick one: https://nordicsupps.fi/collections/creatine-monohydrate is indexed in search console but gets basically zero impressions and zero clicks after 4 months live. it's in the sitemap. i checked and i - Network accessline 11
"id": 2, "prompt": "quick one: https://nordicsupps.fi/collections/creatine-monohydrate is indexed in search console but gets basically zero impressions and zero clicks after 4 months live. it's in the sitemap. i checked and i don't th - Network accessline 11
"id": 2, "prompt": "quick one: https://nordicsupps.fi/collections/creatine-monohydrate is indexed in search console but gets basically zero impressions and zero clicks after 4 months live. it's in the sitemap. i checked and i don't th - Network accessline 12
"prompt": "quick one: https://nordicsupps.fi/collections/creatine-monohydrate is indexed in search console but gets basically zero impressions and zero clicks after 4 months live. it's in the sitemap. i checked and i don't think any page on - Network accessline 12
"prompt": "quick one: https://nordicsupps.fi/collections/creatine-monohydrate is indexed in search console but gets basically zero impressions and zero clicks after 4 months live. it's in the sitemap. i checked and i don't think any page on - Network accessline 16
{ "id": 3, "prompt": "Two questions. Our blog lives at blog.atlasproperty.io while the main site is atlasproperty.io, and we are debating moving it. Also we have two posts, \"property management fees explained\" (2022, has some - Network accessline 16
{ "id": 3, "prompt": "Two questions. Our blog lives at blog.atlasproperty.io while the main site is atlasproperty.io, and we are debating moving it. Also we have two posts, \"property management fees explained\" (2022, has some - Network accessline 17
"id": 3, "prompt": "Two questions. Our blog lives at blog.atlasproperty.io while the main site is atlasproperty.io, and we are debating moving it. Also we have two posts, \"property management fees explained\" (2022, has some backlink - Network accessline 17
"id": 3, "prompt": "Two questions. Our blog lives at blog.atlasproperty.io while the main site is atlasproperty.io, and we are debating moving it. Also we have two posts, \"property management fees explained\" (2022, has some backlink - Network accessline 18
"prompt": "Two questions. Our blog lives at blog.atlasproperty.io while the main site is atlasproperty.io, and we are debating moving it. Also we have two posts, \"property management fees explained\" (2022, has some backlinks) and \"how mu - Network accessline 18
"prompt": "Two questions. Our blog lives at blog.atlasproperty.io while the main site is atlasproperty.io, and we are debating moving it. Also we have two posts, \"property management fees explained\" (2022, has some backlinks) and \"how mu
skills/seo-internal-linking/scripts/site_crawl.py
- Executable scriptline 1
#!/usr/bin/env python3 - Executable scriptline 1
#!/usr/bin/env python3 - Executable scriptline 1
#!/usr/bin/env python3 - Executable scriptline 1
#!/usr/bin/env python3 - Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 27
Usage: python3 site_crawl.py https://example.com - Network accessline 27
Usage: python3 site_crawl.py https://example.com - Network accessline 27
Usage: python3 site_crawl.py https://example.com - Network accessline 27
Usage: python3 site_crawl.py https://example.com - Network accessline 27
Usage: python3 site_crawl.py https://example.com - Network accessline 28
python3 site_crawl.py https://example.com - Network accessline 28
python3 site_crawl.py https://example.com - Network accessline 28
python3 site_crawl.py https://example.com - Network accessline 28
python3 site_crawl.py https://example.com - Network accessline 28
python3 site_crawl.py https://example.com - Network accessline 29
python3 site_crawl.py https://example.com --max-pages 500 --out crawl.json - Network accessline 29
python3 site_crawl.py https://example.com --max-pages 500 --out crawl.json - Network accessline 29
python3 site_crawl.py https://example.com --max-pages 500 --out crawl.json - Network accessline 29
python3 site_crawl.py https://example.com --max-pages 500 --out crawl.json - Network accessline 29
python3 site_crawl.py https://example.com --max-pages 500 --out crawl.json - Network accessline 30
python3 site_crawl.py https://example.com --include-params --json - Network accessline 30
python3 site_crawl.py https://example.com --include-params --json - Network accessline 30
python3 site_crawl.py https://example.com --include-params --json - Network accessline 30
python3 site_crawl.py https://example.com --include-params --json - Network accessline 30
python3 site_crawl.py https://example.com --include-params --json - Network accessline 34
import datetime import importlib.util import http.client - Network accessline 34
import datetime import importlib.util import http.client - Network accessline 34
import datetime import importlib.util import http.client - Network accessline 34
import datetime import importlib.util import http.client - Network accessline 34
import datetime import importlib.util import http.client - Network accessline 35
import importlib.util import http.client import json - Network accessline 35
import importlib.util import http.client import json - Network accessline 35
import importlib.util import http.client import json - Network accessline 35
import importlib.util import http.client import json - Network accessline 35
import importlib.util import http.client import json - Network accessline 36
import http.client - Network accessline 36
import http.client - Network accessline 36
import http.client - Network accessline 36
import http.client - Network accessline 36
import http.client - Network accessline 107
continue return chain, cur, e.code, dict(e.headers or {}), b"" except (URLError, ssl.SSLError, OSError, ValueError, http.client.HTTPException) as e: - Network accessline 107
continue return chain, cur, e.code, dict(e.headers or {}), b"" except (URLError, ssl.SSLError, OSError, ValueError, http.client.HTTPException) as e: - Network accessline 107
continue return chain, cur, e.code, dict(e.headers or {}), b"" except (URLError, ssl.SSLError, OSError, ValueError, http.client.HTTPException) as e: - Network accessline 107
continue return chain, cur, e.code, dict(e.headers or {}), b"" except (URLError, ssl.SSLError, OSError, ValueError, http.client.HTTPException) as e: - Network accessline 107
continue return chain, cur, e.code, dict(e.headers or {}), b"" except (URLError, ssl.SSLError, OSError, ValueError, http.client.HTTPException) as e: - Network accessline 109
except (URLError, ssl.SSLError, OSError, ValueError, http.client.HTTPException) as e: - Network accessline 109
except (URLError, ssl.SSLError, OSError, ValueError, http.client.HTTPException) as e: - Network accessline 109
except (URLError, ssl.SSLError, OSError, ValueError, http.client.HTTPException) as e: - Network accessline 109
except (URLError, ssl.SSLError, OSError, ValueError, http.client.HTTPException) as e: - Network accessline 109
except (URLError, ssl.SSLError, OSError, ValueError, http.client.HTTPException) as e:
skills/seo-keyword-research/SKILL.md
- Network accessline 4
license: MIT metadata: author: "Sorank (https://sorank.com)" - Network accessline 4
license: MIT metadata: author: "Sorank (https://sorank.com)" - Network accessline 5
metadata: author: "Sorank (https://sorank.com)" version: "1.0.0" - Network accessline 5
metadata: author: "Sorank (https://sorank.com)" version: "1.0.0" - Network accessline 6
author: "Sorank (https://sorank.com)" - Network accessline 6
author: "Sorank (https://sorank.com)" - Network accessline 206
Prompt research is keyword research for AI assistants, and it is a separate discipline because assistants process queries differently: they explode one prompt into multiple subqueries, retrieve a small set of sources per subquery, and synth - Network accessline 206
Prompt research is keyword research for AI assistants, and it is a separate discipline because assistants process queries differently: they explode one prompt into multiple subqueries, retrieve a small set of sources per subquery, and synth - Network accessline 210
1. AI engines sample roughly 10-20 sources per answer instead of ranking 1000. A page that answers exactly one ultra-niche subquestion often wins its citation against a bigger generalist page (field heuristic from 115+ agency audits). Niche - Network accessline 210
1. AI engines sample roughly 10-20 sources per answer instead of ranking 1000. A page that answers exactly one ultra-niche subquestion often wins its citation against a bigger generalist page (field heuristic from 115+ agency audits). Niche - Network accessline 211
2. Semantic similarity between the page title and the fan-out subqueries is the strongest measured citation predictor in Ahrefs' study of 1.4M prompts (https://ahrefs.com/blog/why-chatgpt-cites-pages/). Title the page like the subquestion i - Network accessline 211
2. Semantic similarity between the page title and the fan-out subqueries is the strongest measured citation predictor in Ahrefs' study of 1.4M prompts (https://ahrefs.com/blog/why-chatgpt-cites-pages/). Title the page like the subquestion i - Network accessline 318
- Google Search Central, AI features and your website (official query fan-out documentation): https://developers.google.com/search/docs/appearance/ai-features - Network accessline 318
- Google Search Central, AI features and your website (official query fan-out documentation): https://developers.google.com/search/docs/appearance/ai-features - Network accessline 319
- Search Engine Land, How to optimize for query fan-out: https://searchengineland.com/guide/how-to-optimize-for-query-fan-out - Network accessline 319
- Search Engine Land, How to optimize for query fan-out: https://searchengineland.com/guide/how-to-optimize-for-query-fan-out - Network accessline 320
- Ahrefs, study of 1.4M prompts on why ChatGPT cites pages (title similarity as top predictor, measured): https://ahrefs.com/blog/why-chatgpt-cites-pages/ - Network accessline 320
- Ahrefs, study of 1.4M prompts on why ChatGPT cites pages (title similarity as top predictor, measured): https://ahrefs.com/blog/why-chatgpt-cites-pages/
skills/seo-local/SKILL.md
- Network accessline 4
license: MIT metadata: author: "Sorank (https://sorank.com)" - Network accessline 4
license: MIT metadata: author: "Sorank (https://sorank.com)" - Network accessline 5
metadata: author: "Sorank (https://sorank.com)" version: "2.0.0" - Network accessline 5
metadata: author: "Sorank (https://sorank.com)" version: "2.0.0" - Network accessline 6
author: "Sorank (https://sorank.com)" - Network accessline 6
author: "Sorank (https://sorank.com)" - Network accessline 122
python3 skills/seo-geo-audit/scripts/seo_audit.py https://example.com/plumber-lyon/ - Network accessline 122
python3 skills/seo-geo-audit/scripts/seo_audit.py https://example.com/plumber-lyon/ - Network accessline 123
python3 skills/seo-page-sections/scripts/section_audit.py --type location https://example.com/plumber-lyon/ - Network accessline 123
python3 skills/seo-page-sections/scripts/section_audit.py --type location https://example.com/plumber-lyon/ - Network accessline 163
python3 skills/seo-geo-audit/scripts/page_benchmark.py --type location https://client.com/plumber-lyon/ https://rival1.com/lyon/ https://rival2.com/plombier-lyon/ https://rival3.com/ - Network accessline 163
python3 skills/seo-geo-audit/scripts/page_benchmark.py --type location https://client.com/plumber-lyon/ https://rival1.com/lyon/ https://rival2.com/plombier-lyon/ https://rival3.com/ - Network accessline 303
python3 skills/seo-geo-audit/scripts/seo_audit.py https://example.com/plumber-lyon/ - Network accessline 303
python3 skills/seo-geo-audit/scripts/seo_audit.py https://example.com/plumber-lyon/ - Network accessline 304
python3 skills/seo-page-sections/scripts/section_audit.py --type location https://example.com/plumber-lyon/ - Network accessline 304
python3 skills/seo-page-sections/scripts/section_audit.py --type location https://example.com/plumber-lyon/
skills/seo-local/references/location-page-template.md
- Network accessline 37
{ "@context": "https://schema.org", - Network accessline 37
{ "@context": "https://schema.org", - Network accessline 38
"@context": "https://schema.org", - Network accessline 38
"@context": "https://schema.org", - Network accessline 39
"@type": "Plumber", "name": "Dupont Plomberie", "image": "https://example.com/photos/storefront-lyon.jpg", - Network accessline 39
"@type": "Plumber", "name": "Dupont Plomberie", "image": "https://example.com/photos/storefront-lyon.jpg", - Network accessline 40
"name": "Dupont Plomberie", "image": "https://example.com/photos/storefront-lyon.jpg", "url": "https://example.com/emergency-plumber-lyon/", - Network accessline 40
"name": "Dupont Plomberie", "image": "https://example.com/photos/storefront-lyon.jpg", "url": "https://example.com/emergency-plumber-lyon/", - Network accessline 41
"image": "https://example.com/photos/storefront-lyon.jpg", - Network accessline 41
"image": "https://example.com/photos/storefront-lyon.jpg", - Network accessline 42
"url": "https://example.com/emergency-plumber-lyon/", - Network accessline 42
"url": "https://example.com/emergency-plumber-lyon/", - Network accessline 64
"areaServed": ["Lyon", "Villeurbanne", "Caluire-et-Cuire"], "sameAs": [ "https://www.facebook.com/dupontplomberie", - Network accessline 64
"areaServed": ["Lyon", "Villeurbanne", "Caluire-et-Cuire"], "sameAs": [ "https://www.facebook.com/dupontplomberie", - Network accessline 65
"sameAs": [ "https://www.facebook.com/dupontplomberie", "https://www.linkedin.com/company/dupontplomberie" - Network accessline 65
"sameAs": [ "https://www.facebook.com/dupontplomberie", "https://www.linkedin.com/company/dupontplomberie" - Network accessline 66
"https://www.facebook.com/dupontplomberie", - Network accessline 66
"https://www.facebook.com/dupontplomberie", - Network accessline 67
"https://www.linkedin.com/company/dupontplomberie" - Network accessline 67
"https://www.linkedin.com/company/dupontplomberie"
skills/seo-page-sections/SKILL.md
- Network accessline 4
license: MIT metadata: author: "Sorank (https://sorank.com)" - Network accessline 4
license: MIT metadata: author: "Sorank (https://sorank.com)" - Network accessline 5
metadata: author: "Sorank (https://sorank.com)" version: "2.0.0" - Network accessline 5
metadata: author: "Sorank (https://sorank.com)" version: "2.0.0" - Network accessline 6
author: "Sorank (https://sorank.com)" - Network accessline 6
author: "Sorank (https://sorank.com)" - Network accessline 88
| SEC-02 | One intent, one page | no two pages carry the same primary keyword; a page mixing two types is split | manual | Cannibalization costs more than a missing block | | SEC-03 | Every indexable page reachable through header, footer or - Network accessline 88
| SEC-02 | One intent, one page | no two pages carry the same primary keyword; a page mixing two types is split | manual | Cannibalization costs more than a missing block | | SEC-03 | Every indexable page reachable through header, footer or - Network accessline 89
| SEC-03 | Every indexable page reachable through header, footer or body links | under 3 clicks from home, no orphan | manual (crawl) | Orphan pages do not rank | | SEC-04 | Unknown URLs return a real 404 page | HTTP 404 or 410, never 200; - Network accessline 89
| SEC-03 | Every indexable page reachable through header, footer or body links | under 3 clicks from home, no orphan | manual (crawl) | Orphan pages do not rank | | SEC-04 | Unknown URLs return a real 404 page | HTTP 404 or 410, never 200; - Network accessline 90
| SEC-04 | Unknown URLs return a real 404 page | HTTP 404 or 410, never 200; same header, footer and navigation; search box and links to the main sections; no noindex as the fix | manual (`curl -sI` on an invented URL), A-404 rows | A soft - Network accessline 90
| SEC-04 | Unknown URLs return a real 404 page | HTTP 404 or 410, never 200; same header, footer and navigation; search box and links to the main sections; no noindex as the fix | manual (`curl -sI` on an invented URL), A-404 rows | A soft - Network accessline 122
python3 skills/seo-page-sections/scripts/section_audit.py --type pricing https://example.com/pricing - Network accessline 122
python3 skills/seo-page-sections/scripts/section_audit.py --type pricing https://example.com/pricing - Network accessline 123
python3 skills/seo-page-sections/scripts/section_audit.py --type comparison https://example.com/a https://example.com/b python3 skills/seo-geo-audit/scripts/seo_audit.py https://example.com/pricing curl -sI https://example.com/this-page-doe - Network accessline 123
python3 skills/seo-page-sections/scripts/section_audit.py --type comparison https://example.com/a https://example.com/b python3 skills/seo-geo-audit/scripts/seo_audit.py https://example.com/pricing curl -sI https://example.com/this-page-doe - Network accessline 124
python3 skills/seo-geo-audit/scripts/seo_audit.py https://example.com/pricing - Network accessline 124
python3 skills/seo-geo-audit/scripts/seo_audit.py https://example.com/pricing - Network accessline 125
curl -sI https://example.com/this-page-does-not-exist-7f3a # SEC-04 - Network accessline 125
curl -sI https://example.com/this-page-does-not-exist-7f3a # SEC-04 - Network accessline 155
python3 skills/seo-geo-audit/scripts/page_benchmark.py --type pricing https://client.com/pricing https://rival1.com/pricing https://rival2.com/pricing https://rival3.com/pricing - Network accessline 155
python3 skills/seo-geo-audit/scripts/page_benchmark.py --type pricing https://client.com/pricing https://rival1.com/pricing https://rival2.com/pricing https://rival3.com/pricing - Network accessline 282
- AI crawlers do not execute JavaScript (500M+ fetch analysis): https://vercel.com/blog/the-rise-of-the-ai-crawler - Network accessline 282
- AI crawlers do not execute JavaScript (500M+ fetch analysis): https://vercel.com/blog/the-rise-of-the-ai-crawler - Network accessline 283
- Why ChatGPT cites pages (1.4M prompt study): https://ahrefs.com/blog/why-chatgpt-cites-pages/ - Network accessline 283
- Why ChatGPT cites pages (1.4M prompt study): https://ahrefs.com/blog/why-chatgpt-cites-pages/ - Network accessline 284
- Generative Engine Optimization, effect of statistics, quotations and citations on visibility (controlled study, KDD 2024): https://arxiv.org/abs/2311.09735 - Network accessline 284
- Generative Engine Optimization, effect of statistics, quotations and citations on visibility (controlled study, KDD 2024): https://arxiv.org/abs/2311.09735 - Network accessline 285
- Google structured data must match visible content: https://developers.google.com/search/docs/appearance/structured-data/sd-policies - Network accessline 285
- Google structured data must match visible content: https://developers.google.com/search/docs/appearance/structured-data/sd-policies - Network accessline 286
- Google guidance on AI features and structured data: https://developers.google.com/search/docs/appearance/ai-features - Network accessline 286
- Google guidance on AI features and structured data: https://developers.google.com/search/docs/appearance/ai-features
skills/seo-page-sections/evals/evals.json
- Network accessline 4
{ "id": 1, "prompt": "Here is my product page: https://example-store.com/products/ergonomic-chair. It is indexed, loads fast, the title and meta description are fine, and it still does not rank or get recommended by ChatGPT. Wha - Network accessline 4
{ "id": 1, "prompt": "Here is my product page: https://example-store.com/products/ergonomic-chair. It is indexed, loads fast, the title and meta description are fine, and it still does not rank or get recommended by ChatGPT. Wha - Network accessline 5
"id": 1, "prompt": "Here is my product page: https://example-store.com/products/ergonomic-chair. It is indexed, loads fast, the title and meta description are fine, and it still does not rank or get recommended by ChatGPT. What is mis - Network accessline 5
"id": 1, "prompt": "Here is my product page: https://example-store.com/products/ergonomic-chair. It is indexed, loads fast, the title and meta description are fine, and it still does not rank or get recommended by ChatGPT. What is mis - Network accessline 6
"prompt": "Here is my product page: https://example-store.com/products/ergonomic-chair. It is indexed, loads fast, the title and meta description are fine, and it still does not rank or get recommended by ChatGPT. What is missing on it?", - Network accessline 6
"prompt": "Here is my product page: https://example-store.com/products/ergonomic-chair. It is indexed, loads fast, the title and meta description are fine, and it still does not rank or get recommended by ChatGPT. What is missing on it?",
skills/seo-page-sections/scripts/section_audit.py
- Executable scriptline 1
#!/usr/bin/env python3 - Executable scriptline 1
#!/usr/bin/env python3 - Executable scriptline 1
#!/usr/bin/env python3 - Executable scriptline 1
#!/usr/bin/env python3 - Executable scriptline 1
#!/usr/bin/env python3 - Executable scriptline 1
#!/usr/bin/env python3 - Executable scriptline 1
#!/usr/bin/env python3 - Executable scriptline 1
#!/usr/bin/env python3 - Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 24
Usage: python3 section_audit.py https://example.com/products/thing - Network accessline 24
Usage: python3 section_audit.py https://example.com/products/thing - Network accessline 24
Usage: python3 section_audit.py https://example.com/products/thing - Network accessline 24
Usage: python3 section_audit.py https://example.com/products/thing - Network accessline 24
Usage: python3 section_audit.py https://example.com/products/thing - Network accessline 24
Usage: python3 section_audit.py https://example.com/products/thing - Network accessline 24
Usage: python3 section_audit.py https://example.com/products/thing - Network accessline 24
Usage: python3 section_audit.py https://example.com/products/thing - Network accessline 24
Usage: python3 section_audit.py https://example.com/products/thing - Network accessline 25
python3 section_audit.py https://example.com/products/thing - Network accessline 25
python3 section_audit.py https://example.com/products/thing - Network accessline 25
python3 section_audit.py https://example.com/products/thing - Network accessline 25
python3 section_audit.py https://example.com/products/thing - Network accessline 25
python3 section_audit.py https://example.com/products/thing - Network accessline 25
python3 section_audit.py https://example.com/products/thing - Network accessline 25
python3 section_audit.py https://example.com/products/thing - Network accessline 25
python3 section_audit.py https://example.com/products/thing - Network accessline 25
python3 section_audit.py https://example.com/products/thing - Network accessline 26
python3 section_audit.py https://example.com/p/a https://example.com/p/b - Network accessline 26
python3 section_audit.py https://example.com/p/a https://example.com/p/b - Network accessline 26
python3 section_audit.py https://example.com/p/a https://example.com/p/b - Network accessline 26
python3 section_audit.py https://example.com/p/a https://example.com/p/b - Network accessline 26
python3 section_audit.py https://example.com/p/a https://example.com/p/b - Network accessline 26
python3 section_audit.py https://example.com/p/a https://example.com/p/b - Network accessline 26
python3 section_audit.py https://example.com/p/a https://example.com/p/b - Network accessline 26
python3 section_audit.py https://example.com/p/a https://example.com/p/b - Network accessline 26
python3 section_audit.py https://example.com/p/a https://example.com/p/b - Network accessline 27
python3 section_audit.py https://example.com/x --type product - Network accessline 27
python3 section_audit.py https://example.com/x --type product - Network accessline 27
python3 section_audit.py https://example.com/x --type product - Network accessline 27
python3 section_audit.py https://example.com/x --type product - Network accessline 27
python3 section_audit.py https://example.com/x --type product - Network accessline 27
python3 section_audit.py https://example.com/x --type product - Network accessline 27
python3 section_audit.py https://example.com/x --type product - Network accessline 27
python3 section_audit.py https://example.com/x --type product - Network accessline 27
python3 section_audit.py https://example.com/x --type product - Network accessline 116
def fetch(url): - Network accessline 116
def fetch(url): - Network accessline 116
def fetch(url): - Network accessline 116
def fetch(url): - Network accessline 116
def fetch(url): - Network accessline 116
def fetch(url): - Network accessline 116
def fetch(url): - Network accessline 116
def fetch(url): - Network accessline 116
def fetch(url): - Network accessline 662
url = "https://" + url try: final_url, status, _, html = fetch(url) - Network accessline 662
url = "https://" + url try: final_url, status, _, html = fetch(url) - Network accessline 662
url = "https://" + url try: final_url, status, _, html = fetch(url) - Network accessline 662
url = "https://" + url try: final_url, status, _, html = fetch(url) - Network accessline 662
url = "https://" + url try: final_url, status, _, html = fetch(url) - Network accessline 662
url = "https://" + url try: final_url, status, _, html = fetch(url) - Network accessline 662
url = "https://" + url try: final_url, status, _, html = fetch(url) - Network accessline 662
url = "https://" + url try: final_url, status, _, html = fetch(url) - Network accessline 662
url = "https://" + url try: final_url, status, _, html = fetch(url) - Network accessline 663
try: final_url, status, _, html = fetch(url) except HTTPError as e: - Network accessline 663
try: final_url, status, _, html = fetch(url) except HTTPError as e: - Network accessline 663
try: final_url, status, _, html = fetch(url) except HTTPError as e: - Network accessline 663
try: final_url, status, _, html = fetch(url) except HTTPError as e: - Network accessline 663
try: final_url, status, _, html = fetch(url) except HTTPError as e: - Network accessline 663
try: final_url, status, _, html = fetch(url) except HTTPError as e: - Network accessline 663
try: final_url, status, _, html = fetch(url) except HTTPError as e: - Network accessline 663
try: final_url, status, _, html = fetch(url) except HTTPError as e: - Network accessline 663
try: final_url, status, _, html = fetch(url) except HTTPError as e: - Network accessline 664
final_url, status, _, html = fetch(url) - Network accessline 664
final_url, status, _, html = fetch(url) - Network accessline 664
final_url, status, _, html = fetch(url) - Network accessline 664
final_url, status, _, html = fetch(url) - Network accessline 664
final_url, status, _, html = fetch(url) - Network accessline 664
final_url, status, _, html = fetch(url) - Network accessline 664
final_url, status, _, html = fetch(url) - Network accessline 664
final_url, status, _, html = fetch(url) - Network accessline 664
final_url, status, _, html = fetch(url)
skills/seo-schema-markup/SKILL.md
- Network accessline 4
license: MIT metadata: author: "Sorank (https://sorank.com)" - Network accessline 4
license: MIT metadata: author: "Sorank (https://sorank.com)" - Network accessline 5
metadata: author: "Sorank (https://sorank.com)" version: "1.0.0" - Network accessline 5
metadata: author: "Sorank (https://sorank.com)" version: "1.0.0" - Network accessline 6
author: "Sorank (https://sorank.com)" - Network accessline 6
author: "Sorank (https://sorank.com)" - Network accessline 50
# How many JSON-LD blocks does the server actually send curl -sL https://example.com/page/ | grep -c 'application/ld+json' - Network accessline 50
# How many JSON-LD blocks does the server actually send curl -sL https://example.com/page/ | grep -c 'application/ld+json' - Network accessline 51
curl -sL https://example.com/page/ | grep -c 'application/ld+json' - Network accessline 51
curl -sL https://example.com/page/ | grep -c 'application/ld+json' - Network accessline 53
# Legacy microdata that may conflict with JSON-LD curl -sL https://example.com/page/ | grep -c 'itemscope' - Network accessline 53
# Legacy microdata that may conflict with JSON-LD curl -sL https://example.com/page/ | grep -c 'itemscope' - Network accessline 54
curl -sL https://example.com/page/ | grep -c 'itemscope' - Network accessline 54
curl -sL https://example.com/page/ | grep -c 'itemscope' - Network accessline 84
| Shopify | Theme ships Product JSON-LD by default | Verify values against the visible page (sale price versus compare-at price, missing brand or sku); fix the theme markup rather than adding a duplicate Product | | Webflow | No automatic s - Network accessline 84
| Shopify | Theme ships Product JSON-LD by default | Verify values against the visible page (sale price versus compare-at price, missing brand or sku); fix the theme markup rather than adding a duplicate Product | | Webflow | No automatic s - Network accessline 86
| Headless or SPA builds | Markup present in the repo, absent from the served HTML | Move it into the server response; confirm with the curl check from Step 1 | - Network accessline 86
| Headless or SPA builds | Markup present in the repo, absent from the served HTML | Move it into the server response; confirm with the curl check from Step 1 | - Network accessline 102
{ "@context": "https://schema.org", - Network accessline 102
{ "@context": "https://schema.org", - Network accessline 103
"@context": "https://schema.org", - Network accessline 103
"@context": "https://schema.org", - Network accessline 104
"@graph": [ { "@type": "Organization", "@id": "https://example.com/#organization", "name": "Example Co" }, { "@type": "Person", "@id": "https://example.com/team/jane/#person", "name": "Jane Doe", - Network accessline 104
"@graph": [ { "@type": "Organization", "@id": "https://example.com/#organization", "name": "Example Co" }, { "@type": "Person", "@id": "https://example.com/team/jane/#person", "name": "Jane Doe", - Network accessline 105
{ "@type": "Organization", "@id": "https://example.com/#organization", "name": "Example Co" }, - Network accessline 105
{ "@type": "Organization", "@id": "https://example.com/#organization", "name": "Example Co" }, - Network accessline 106
{ "@type": "Person", "@id": "https://example.com/team/jane/#person", "name": "Jane Doe", - Network accessline 106
{ "@type": "Person", "@id": "https://example.com/team/jane/#person", "name": "Jane Doe", - Network accessline 107
"worksFor": { "@id": "https://example.com/#organization" } }, - Network accessline 107
"worksFor": { "@id": "https://example.com/#organization" } }, - Network accessline 108
{ "@type": "Article", "headline": "Example headline", "datePublished": "2026-04-02", "dateModified": "2026-05-28", "author": { "@id": "https://example.com/team/jane/#person" }, - Network accessline 108
{ "@type": "Article", "headline": "Example headline", "datePublished": "2026-04-02", "dateModified": "2026-05-28", "author": { "@id": "https://example.com/team/jane/#person" }, - Network accessline 109
"datePublished": "2026-04-02", "dateModified": "2026-05-28", "author": { "@id": "https://example.com/team/jane/#person" }, "publisher": { "@id": "https://example.com/#organization" } } - Network accessline 109
"datePublished": "2026-04-02", "dateModified": "2026-05-28", "author": { "@id": "https://example.com/team/jane/#person" }, "publisher": { "@id": "https://example.com/#organization" } } - Network accessline 110
"author": { "@id": "https://example.com/team/jane/#person" }, - Network accessline 110
"author": { "@id": "https://example.com/team/jane/#person" }, - Network accessline 111
"publisher": { "@id": "https://example.com/#organization" } } - Network accessline 111
"publisher": { "@id": "https://example.com/#organization" } } - Network accessline 121
- One script tag of type application/ld+json per graph, in head or body (Google accepts both). - JSON-LD is the format Google recommends over microdata and RDFa: decoupled from the HTML, it survives redesigns and template changes (https://d - Network accessline 121
- One script tag of type application/ld+json per graph, in head or body (Google accepts both). - JSON-LD is the format Google recommends over microdata and RDFa: decoupled from the HTML, it survives redesigns and template changes (https://d - Network accessline 122
- JSON-LD is the format Google recommends over microdata and RDFa: decoupled from the HTML, it survives redesigns and template changes (https://developers.google.com/search/docs/appearance/structured-data/intro-structured-data). - Network accessline 122
- JSON-LD is the format Google recommends over microdata and RDFa: decoupled from the HTML, it survives redesigns and template changes (https://developers.google.com/search/docs/appearance/structured-data/intro-structured-data). - Network accessline 128
1. https://validator.schema.org checks vocabulary and syntax (catches typos, wrong types, broken nesting). 2. https://search.google.com/test/rich-results checks Google eligibility (catches missing required fields per rich result type). Both - Network accessline 128
1. https://validator.schema.org checks vocabulary and syntax (catches typos, wrong types, broken nesting). 2. https://search.google.com/test/rich-results checks Google eligibility (catches missing required fields per rich result type). Both - Network accessline 129
2. https://search.google.com/test/rich-results checks Google eligibility (catches missing required fields per rich result type). Both are free, web-based, and need no API key. 3. After deploy: curl the production URL and confirm the JSON-LD - Network accessline 129
2. https://search.google.com/test/rich-results checks Google eligibility (catches missing required fields per rich result type). Both are free, web-based, and need no API key. 3. After deploy: curl the production URL and confirm the JSON-LD - Network accessline 130
3. After deploy: curl the production URL and confirm the JSON-LD survived the build. SPA and static-site builds sometimes strip it or move it to client-side injection, which AI crawlers never see. - Network accessline 130
3. After deploy: curl the production URL and confirm the JSON-LD survived the build. SPA and static-site builds sometimes strip it or move it to client-side injection, which AI crawlers never see. - Network accessline 144
1. Did Google remove the feature for everyone? Check the status table: FAQ (May 2026), HowTo (2023), sitelinks search box (2024) are gone regardless of markup quality. 2. GSC Enhancements: new errors, or valid items dropping to zero, indica - Network accessline 144
1. Did Google remove the feature for everyone? Check the status table: FAQ (May 2026), HowTo (2023), sitelinks search box (2024) are gone regardless of markup quality. 2. GSC Enhancements: new errors, or valid items dropping to zero, indica - Network accessline 145
2. GSC Enhancements: new errors, or valid items dropping to zero, indicate a deploy that stripped or broke the block. Confirm with the Step 1 curl against production. - Network accessline 145
2. GSC Enhancements: new errors, or valid items dropping to zero, indicate a deploy that stripped or broke the block. Confirm with the Step 1 curl against production. - Network accessline 154
| Type | Status | Verdict | |---|---|---| | FAQPage | Rich results restricted to government and health sites in August 2023, removed entirely on May 7, 2026 (https://www.searchenginejournal.com/google-drops-faq-rich-results-from-search/5744 - Network accessline 154
| Type | Status | Verdict | |---|---|---| | FAQPage | Rich results restricted to government and health sites in August 2023, removed entirely on May 7, 2026 (https://www.searchenginejournal.com/google-drops-faq-rich-results-from-search/5744 - Network accessline 155
|---|---|---| | FAQPage | Rich results restricted to government and health sites in August 2023, removed entirely on May 7, 2026 (https://www.searchenginejournal.com/google-drops-faq-rich-results-from-search/574429/) | No SERP gain for anyo - Network accessline 155
|---|---|---| | FAQPage | Rich results restricted to government and health sites in August 2023, removed entirely on May 7, 2026 (https://www.searchenginejournal.com/google-drops-faq-rich-results-from-search/574429/) | No SERP gain for anyo - Network accessline 156
| FAQPage | Rich results restricted to government and health sites in August 2023, removed entirely on May 7, 2026 (https://www.searchenginejournal.com/google-drops-faq-rich-results-from-search/574429/) | No SERP gain for anyone. The markup - Network accessline 156
| FAQPage | Rich results restricted to government and health sites in August 2023, removed entirely on May 7, 2026 (https://www.searchenginejournal.com/google-drops-faq-rich-results-from-search/574429/) | No SERP gain for anyone. The markup - Network accessline 157
| HowTo | Rich results removed in 2023, no surface since (https://developers.google.com/search/blog/2023/08/howto-faq-changes) | Skip | - Network accessline 157
| HowTo | Rich results removed in 2023, no surface since (https://developers.google.com/search/blog/2023/08/howto-faq-changes) | Skip | - Network accessline 158
| Article, BlogPosting | No visual badge, but supplies machine-readable author, datePublished, dateModified | Implement on every post; honest dateModified is the freshness signal answer engines read | | Product, Offer, AggregateRating, Revi - Network accessline 158
| Article, BlogPosting | No visual badge, but supplies machine-readable author, datePublished, dateModified | Implement on every post; honest dateModified is the freshness signal answer engines read | | Product, Offer, AggregateRating, Revi - Network accessline 159
| Product, Offer, AggregateRating, Review | Active rich results (price, stars, availability) and the basis of Merchant listings (https://developers.google.com/search/docs/appearance/structured-data/product) | Implement on every product page - Network accessline 159
| Product, Offer, AggregateRating, Review | Active rich results (price, stars, availability) and the basis of Merchant listings (https://developers.google.com/search/docs/appearance/structured-data/product) | Implement on every product page - Network accessline 160
| Organization plus sameAs | The entity anchor: logo, founder, identifiers, official profiles (https://developers.google.com/search/docs/appearance/structured-data/organization) | Implement sitewide; this is the node LLM entity reconciliati - Network accessline 160
| Organization plus sameAs | The entity anchor: logo, founder, identifiers, official profiles (https://developers.google.com/search/docs/appearance/structured-data/organization) | Implement sitewide; this is the node LLM entity reconciliati - Network accessline 161
| WebSite | Sitelinks search box retired in 2024 (https://developers.google.com/search/blog/2024/10/sitelinks-search-box), still names the site entity | Implement, minimal effort | - Network accessline 161
| WebSite | Sitelinks search box retired in 2024 (https://developers.google.com/search/blog/2024/10/sitelinks-search-box), still names the site entity | Implement, minimal effort | - Network accessline 170
1. Visible content only. Markup must describe content the user can see on that page. Invisible or inflated markup is a structured data manual action waiting to happen (https://developers.google.com/search/docs/appearance/structured-data/sd- - Network accessline 170
1. Visible content only. Markup must describe content the user can see on that page. Invisible or inflated markup is a structured data manual action waiting to happen (https://developers.google.com/search/docs/appearance/structured-data/sd- - Network accessline 171
2. Never invent ratings or reviews. No aggregateRating without real reviews displayed on the page. Self-serving review snippets are explicitly ineligible: LocalBusiness and Organization cannot carry ratings they collected and display about - Network accessline 171
2. Never invent ratings or reviews. No aggregateRating without real reviews displayed on the page. Self-serving review snippets are explicitly ineligible: LocalBusiness and Organization cannot carry ratings they collected and display about - Network accessline 222
3. Product facts: engines answering "how much does X cost" prefer sources where price, currency, and availability are declared and consistent with the visible page. Shopping surfaces in AI assistants consume the same product facts that feed - Network accessline 222
3. Product facts: engines answering "how much does X cost" prefer sources where price, currency, and availability are declared and consistent with the visible page. Shopping surfaces in AI assistants consume the same product facts that feed - Network accessline 223
4. Author Person nodes: answer engines increasingly attribute claims to named sources; a provable author entity (Person with url and sameAs, linked from every Article) is machine-readable accountability. 5. The Bing path: Bing's webmaster g - Network accessline 223
4. Author Person nodes: answer engines increasingly attribute claims to named sources; a provable author entity (Person with url and sameAs, linked from every Article) is machine-readable accountability. 5. The Bing path: Bing's webmaster g - Network accessline 224
5. The Bing path: Bing's webmaster guidelines list Schema.org markup among the signals it uses to understand pages (https://www.bing.com/webmasters/help/webmaster-guidelines-30fba23a), and Bing's index feeds ChatGPT search (see seo-technica - Network accessline 224
5. The Bing path: Bing's webmaster guidelines list Schema.org markup among the signals it uses to understand pages (https://www.bing.com/webmasters/help/webmaster-guidelines-30fba23a), and Bing's index feeds ChatGPT search (see seo-technica - Network accessline 282
- Structured data intro, JSON-LD recommended: https://developers.google.com/search/docs/appearance/structured-data/intro-structured-data - Network accessline 282
- Structured data intro, JSON-LD recommended: https://developers.google.com/search/docs/appearance/structured-data/intro-structured-data - Network accessline 283
- General policies (visible content, manual actions): https://developers.google.com/search/docs/appearance/structured-data/sd-policies - Network accessline 283
- General policies (visible content, manual actions): https://developers.google.com/search/docs/appearance/structured-data/sd-policies - Network accessline 284
- FAQ and HowTo restriction, August 2023: https://developers.google.com/search/blog/2023/08/howto-faq-changes - Network accessline 284
- FAQ and HowTo restriction, August 2023: https://developers.google.com/search/blog/2023/08/howto-faq-changes - Network accessline 285
- FAQ rich results full removal, May 7, 2026: https://www.searchenginejournal.com/google-drops-faq-rich-results-from-search/574429/ - Network accessline 285
- FAQ rich results full removal, May 7, 2026: https://www.searchenginejournal.com/google-drops-faq-rich-results-from-search/574429/ - Network accessline 286
- Product structured data: https://developers.google.com/search/docs/appearance/structured-data/product - Network accessline 286
- Product structured data: https://developers.google.com/search/docs/appearance/structured-data/product - Network accessline 287
- Merchant listings: https://developers.google.com/search/docs/appearance/structured-data/merchant-listing - Network accessline 287
- Merchant listings: https://developers.google.com/search/docs/appearance/structured-data/merchant-listing - Network accessline 288
- Review snippet rules, self-serving ban: https://developers.google.com/search/docs/appearance/structured-data/review-snippet - Network accessline 288
- Review snippet rules, self-serving ban: https://developers.google.com/search/docs/appearance/structured-data/review-snippet - Network accessline 289
- Organization (including identifiers): https://developers.google.com/search/docs/appearance/structured-data/organization - Network accessline 289
- Organization (including identifiers): https://developers.google.com/search/docs/appearance/structured-data/organization - Network accessline 290
- Sitelinks search box retirement: https://developers.google.com/search/blog/2024/10/sitelinks-search-box - Network accessline 290
- Sitelinks search box retirement: https://developers.google.com/search/blog/2024/10/sitelinks-search-box - Network accessline 291
- Bing webmaster guidelines (structured data): https://www.bing.com/webmasters/help/webmaster-guidelines-30fba23a - Network accessline 291
- Bing webmaster guidelines (structured data): https://www.bing.com/webmasters/help/webmaster-guidelines-30fba23a - Network accessline 292
- Validators, free, no API key: https://validator.schema.org and https://search.google.com/test/rich-results - Network accessline 292
- Validators, free, no API key: https://validator.schema.org and https://search.google.com/test/rich-results
skills/seo-schema-markup/evals/evals.json
- Network accessline 11
"id": 2, "prompt": "Set up structured data for our Shopify product pages. We want the price and star ratings to show in Google. We do not have reviews on our site yet, but our products average 4.8 on Trustpilot, can we just use that n - Network accessline 11
"id": 2, "prompt": "Set up structured data for our Shopify product pages. We want the price and star ratings to show in Google. We do not have reviews on our site yet, but our products average 4.8 on Trustpilot, can we just use that n - Network accessline 12
"prompt": "Set up structured data for our Shopify product pages. We want the price and star ratings to show in Google. We do not have reviews on our site yet, but our products average 4.8 on Trustpilot, can we just use that number?", - Network accessline 12
"prompt": "Set up structured data for our Shopify product pages. We want the price and star ratings to show in Google. We do not have reviews on our site yet, but our products average 4.8 on Trustpilot, can we just use that number?", - Network accessline 13
"expected_output": "An implementation of Product plus Offer with price, priceCurrency, and availability matching the visible page (adapted from references/jsonld-templates.md with placeholders resolved), plus a clear refusal on the rating: - Network accessline 13
"expected_output": "An implementation of Product plus Offer with price, priceCurrency, and availability matching the visible page (adapted from references/jsonld-templates.md with placeholders resolved), plus a clear refusal on the rating: - Network accessline 17
"id": 3, "prompt": "We are a 15-person B2B SaaS. What structured data should we have across the site and how should the pieces connect? We blog twice a week and we care a lot about being recommended by ChatGPT.", "expected_outpu - Network accessline 17
"id": 3, "prompt": "We are a 15-person B2B SaaS. What structured data should we have across the site and how should the pieces connect? We blog twice a week and we care a lot about being recommended by ChatGPT.", "expected_outpu - Network accessline 18
"prompt": "We are a 15-person B2B SaaS. What structured data should we have across the site and how should the pieces connect? We blog twice a week and we care a lot about being recommended by ChatGPT.", "expected_output": "A sitewide - Network accessline 18
"prompt": "We are a 15-person B2B SaaS. What structured data should we have across the site and how should the pieces connect? We blog twice a week and we care a lot about being recommended by ChatGPT.", "expected_output": "A sitewide - Network accessline 19
"expected_output": "A sitewide plan anchored on one entity graph rather than isolated blocks: a full Organization node with sameAs pointing to real profiles (LinkedIn, Crunchbase, G2, Wikipedia only if the page exists) as the hub at @id {{S - Network accessline 19
"expected_output": "A sitewide plan anchored on one entity graph rather than isolated blocks: a full Organization node with sameAs pointing to real profiles (LinkedIn, Crunchbase, G2, Wikipedia only if the page exists) as the hub at @id {{S
skills/seo-schema-markup/references/jsonld-templates.md
- Network accessline 15
{ "@context": "https://schema.org", - Network accessline 15
{ "@context": "https://schema.org", - Network accessline 16
"@context": "https://schema.org", - Network accessline 16
"@context": "https://schema.org", - Network accessline 38
}, "sameAs": [ "https://www.linkedin.com/company/{{LINKEDIN_SLUG}}", - Network accessline 38
}, "sameAs": [ "https://www.linkedin.com/company/{{LINKEDIN_SLUG}}", - Network accessline 39
"sameAs": [ "https://www.linkedin.com/company/{{LINKEDIN_SLUG}}", "https://www.crunchbase.com/organization/{{CRUNCHBASE_SLUG}}", - Network accessline 39
"sameAs": [ "https://www.linkedin.com/company/{{LINKEDIN_SLUG}}", "https://www.crunchbase.com/organization/{{CRUNCHBASE_SLUG}}", - Network accessline 40
"https://www.linkedin.com/company/{{LINKEDIN_SLUG}}", - Network accessline 40
"https://www.linkedin.com/company/{{LINKEDIN_SLUG}}", - Network accessline 41
"https://www.crunchbase.com/organization/{{CRUNCHBASE_SLUG}}", - Network accessline 41
"https://www.crunchbase.com/organization/{{CRUNCHBASE_SLUG}}", - Network accessline 42
"https://www.g2.com/products/{{G2_SLUG}}", - Network accessline 42
"https://www.g2.com/products/{{G2_SLUG}}", - Network accessline 43
"https://en.wikipedia.org/wiki/{{WIKIPEDIA_PAGE}}" - Network accessline 43
"https://en.wikipedia.org/wiki/{{WIKIPEDIA_PAGE}}" - Network accessline 49
{ "@context": "https://schema.org", - Network accessline 49
{ "@context": "https://schema.org", - Network accessline 50
"@context": "https://schema.org", - Network accessline 50
"@context": "https://schema.org", - Network accessline 63
{ "@context": "https://schema.org", - Network accessline 63
{ "@context": "https://schema.org", - Network accessline 64
"@context": "https://schema.org", - Network accessline 64
"@context": "https://schema.org", - Network accessline 86
{ "@context": "https://schema.org", - Network accessline 86
{ "@context": "https://schema.org", - Network accessline 87
"@context": "https://schema.org", - Network accessline 87
"@context": "https://schema.org", - Network accessline 98
"price": "{{PRICE_AS_DISPLAYED}}", "priceCurrency": "{{ISO_CURRENCY}}", "availability": "https://schema.org/InStock", - Network accessline 98
"price": "{{PRICE_AS_DISPLAYED}}", "priceCurrency": "{{ISO_CURRENCY}}", "availability": "https://schema.org/InStock", - Network accessline 99
"priceCurrency": "{{ISO_CURRENCY}}", "availability": "https://schema.org/InStock", "priceValidUntil": "{{YYYY-MM-DD}}" - Network accessline 99
"priceCurrency": "{{ISO_CURRENCY}}", "availability": "https://schema.org/InStock", "priceValidUntil": "{{YYYY-MM-DD}}" - Network accessline 100
"availability": "https://schema.org/InStock", - Network accessline 100
"availability": "https://schema.org/InStock", - Network accessline 114
{ "@context": "https://schema.org", - Network accessline 114
{ "@context": "https://schema.org", - Network accessline 115
"@context": "https://schema.org", - Network accessline 115
"@context": "https://schema.org", - Network accessline 150
{ "@context": "https://schema.org", - Network accessline 150
{ "@context": "https://schema.org", - Network accessline 151
"@context": "https://schema.org", - Network accessline 151
"@context": "https://schema.org", - Network accessline 162
{ "@context": "https://schema.org", - Network accessline 162
{ "@context": "https://schema.org", - Network accessline 163
"@context": "https://schema.org", - Network accessline 163
"@context": "https://schema.org", - Network accessline 170
"worksFor": { "@id": "{{SITE_URL}}/#organization" }, "sameAs": [ "https://www.linkedin.com/in/{{LINKEDIN_SLUG}}", - Network accessline 170
"worksFor": { "@id": "{{SITE_URL}}/#organization" }, "sameAs": [ "https://www.linkedin.com/in/{{LINKEDIN_SLUG}}", - Network accessline 171
"sameAs": [ "https://www.linkedin.com/in/{{LINKEDIN_SLUG}}", "https://x.com/{{X_HANDLE}}" - Network accessline 171
"sameAs": [ "https://www.linkedin.com/in/{{LINKEDIN_SLUG}}", "https://x.com/{{X_HANDLE}}" - Network accessline 172
"https://www.linkedin.com/in/{{LINKEDIN_SLUG}}", - Network accessline 172
"https://www.linkedin.com/in/{{LINKEDIN_SLUG}}", - Network accessline 173
"https://x.com/{{X_HANDLE}}" - Network accessline 173
"https://x.com/{{X_HANDLE}}" - Network accessline 182
{ "@context": "https://schema.org", - Network accessline 182
{ "@context": "https://schema.org", - Network accessline 183
"@context": "https://schema.org", - Network accessline 183
"@context": "https://schema.org", - Network accessline 184
"@type": "Course", "@id": "https://example.com/program/#course", "name": "Program name", - Network accessline 184
"@type": "Course", "@id": "https://example.com/program/#course", "name": "Program name", - Network accessline 185
"@id": "https://example.com/program/#course", - Network accessline 185
"@id": "https://example.com/program/#course", - Network accessline 186
"name": "Program name", "description": "What the learner will be able to do at the end, in one or two sentences.", "provider": { "@id": "https://example.com/#organization" }, - Network accessline 186
"name": "Program name", "description": "What the learner will be able to do at the end, in one or two sentences.", "provider": { "@id": "https://example.com/#organization" }, - Network accessline 187
"description": "What the learner will be able to do at the end, in one or two sentences.", "provider": { "@id": "https://example.com/#organization" }, "inLanguage": "fr", - Network accessline 187
"description": "What the learner will be able to do at the end, in one or two sentences.", "provider": { "@id": "https://example.com/#organization" }, "inLanguage": "fr", - Network accessline 188
"provider": { "@id": "https://example.com/#organization" }, - Network accessline 188
"provider": { "@id": "https://example.com/#organization" }, - Network accessline 194
"price": "997", "priceCurrency": "EUR", "url": "https://example.com/program/" - Network accessline 194
"price": "997", "priceCurrency": "EUR", "url": "https://example.com/program/" - Network accessline 195
"priceCurrency": "EUR", "url": "https://example.com/program/" }, - Network accessline 195
"priceCurrency": "EUR", "url": "https://example.com/program/" }, - Network accessline 196
"url": "https://example.com/program/" - Network accessline 196
"url": "https://example.com/program/" - Network accessline 212
{ "@context": "https://schema.org", - Network accessline 212
{ "@context": "https://schema.org", - Network accessline 213
"@context": "https://schema.org", - Network accessline 213
"@context": "https://schema.org", - Network accessline 215
{ "@type": "Organization", "@id": "https://example.com/#organization", - Network accessline 215
{ "@type": "Organization", "@id": "https://example.com/#organization", - Network accessline 216
"@type": "Organization", "@id": "https://example.com/#organization", "name": "Example Co", - Network accessline 216
"@type": "Organization", "@id": "https://example.com/#organization", "name": "Example Co", - Network accessline 217
"@id": "https://example.com/#organization", - Network accessline 217
"@id": "https://example.com/#organization", - Network accessline 218
"name": "Example Co", "url": "https://example.com/" }, - Network accessline 218
"name": "Example Co", "url": "https://example.com/" }, - Network accessline 219
"url": "https://example.com/" - Network accessline 219
"url": "https://example.com/" - Network accessline 221
{ "@type": "Person", "@id": "https://example.com/team/jane/#person", - Network accessline 221
{ "@type": "Person", "@id": "https://example.com/team/jane/#person", - Network accessline 222
"@type": "Person", "@id": "https://example.com/team/jane/#person", "name": "Jane Doe", - Network accessline 222
"@type": "Person", "@id": "https://example.com/team/jane/#person", "name": "Jane Doe", - Network accessline 223
"@id": "https://example.com/team/jane/#person", - Network accessline 223
"@id": "https://example.com/team/jane/#person", - Network accessline 224
"name": "Jane Doe", "worksFor": { "@id": "https://example.com/#organization" } }, - Network accessline 224
"name": "Jane Doe", "worksFor": { "@id": "https://example.com/#organization" } }, - Network accessline 225
"worksFor": { "@id": "https://example.com/#organization" } - Network accessline 225
"worksFor": { "@id": "https://example.com/#organization" } - Network accessline 227
{ "@type": "Article", "@id": "https://example.com/blog/example-post/#article", - Network accessline 227
{ "@type": "Article", "@id": "https://example.com/blog/example-post/#article", - Network accessline 228
"@type": "Article", "@id": "https://example.com/blog/example-post/#article", "headline": "Example headline", - Network accessline 228
"@type": "Article", "@id": "https://example.com/blog/example-post/#article", "headline": "Example headline", - Network accessline 229
"@id": "https://example.com/blog/example-post/#article", - Network accessline 229
"@id": "https://example.com/blog/example-post/#article", - Network accessline 231
"datePublished": "2026-04-02", "dateModified": "2026-05-28", "author": { "@id": "https://example.com/team/jane/#person" }, - Network accessline 231
"datePublished": "2026-04-02", "dateModified": "2026-05-28", "author": { "@id": "https://example.com/team/jane/#person" }, - Network accessline 232
"dateModified": "2026-05-28", "author": { "@id": "https://example.com/team/jane/#person" }, "publisher": { "@id": "https://example.com/#organization" }, - Network accessline 232
"dateModified": "2026-05-28", "author": { "@id": "https://example.com/team/jane/#person" }, "publisher": { "@id": "https://example.com/#organization" }, - Network accessline 233
"author": { "@id": "https://example.com/team/jane/#person" }, - Network accessline 233
"author": { "@id": "https://example.com/team/jane/#person" }, - Network accessline 234
"publisher": { "@id": "https://example.com/#organization" }, - Network accessline 234
"publisher": { "@id": "https://example.com/#organization" }, - Network accessline 235
"mainEntityOfPage": "https://example.com/blog/example-post/" - Network accessline 235
"mainEntityOfPage": "https://example.com/blog/example-post/" - Network accessline 242
1. https://validator.schema.org for syntax and vocabulary. 2. https://search.google.com/test/rich-results for Google eligibility. Both free, no API key. 3. curl the production URL after deploy and confirm the block survived the build server - Network accessline 242
1. https://validator.schema.org for syntax and vocabulary. 2. https://search.google.com/test/rich-results for Google eligibility. Both free, no API key. 3. curl the production URL after deploy and confirm the block survived the build server - Network accessline 243
2. https://search.google.com/test/rich-results for Google eligibility. Both free, no API key. - Network accessline 243
2. https://search.google.com/test/rich-results for Google eligibility. Both free, no API key. - Network accessline 244
3. curl the production URL after deploy and confirm the block survived the build server-side. - Network accessline 244
3. curl the production URL after deploy and confirm the block survived the build server-side.
skills/seo-technical/SKILL.md
- Network accessline 4
license: MIT metadata: author: "Sorank (https://sorank.com)" - Network accessline 4
license: MIT metadata: author: "Sorank (https://sorank.com)" - Network accessline 5
metadata: author: "Sorank (https://sorank.com)" version: "1.0.0" - Network accessline 5
metadata: author: "Sorank (https://sorank.com)" version: "1.0.0" - Network accessline 6
author: "Sorank (https://sorank.com)" - Network accessline 6
author: "Sorank (https://sorank.com)" - Network accessline 53
Field finding from 115+ agency audits: a large share of audited sites had neither installed, or had them installed with nobody able to access the accounts. Without GSC you cannot see coverage, queries, or manual actions, and every later ste - Network accessline 53
Field finding from 115+ agency audits: a large share of audited sites had neither installed, or had them installed with nobody able to access the accounts. Without GSC you cannot see coverage, queries, or manual actions, and every later ste - Network accessline 58
python3 scripts/seo_audit.py https://example.com /services /blog /pricing /contact - Network accessline 58
python3 scripts/seo_audit.py https://example.com /services /blog /pricing /contact - Network accessline 70
For a fast automated first pass, run the bundled audit script from the seo-geo-audit skill (scripts/seo_audit.py), which checks robots.txt AI bot rules, sitemap, and on-page basics. Use its output to direct the manual work below. For the si - Network accessline 70
For a fast automated first pass, run the bundled audit script from the seo-geo-audit skill (scripts/seo_audit.py), which checks robots.txt AI bot rules, sitemap, and on-page basics. Use its output to direct the manual work below. For the si - Network accessline 87
Measurement artifact (September 2025): Google removed the num=100 results parameter. Many properties saw desktop impressions collapse and average position improve overnight because rank-tracking bots stopped loading 100-result pages. Check - Network accessline 87
Measurement artifact (September 2025): Google removed the num=100 results parameter. Many properties saw desktop impressions collapse and average position improve overnight because rank-tracking bots stopped loading 100-result pages. Check - Network accessline 99
- Hard size limit: 50,000 URLs and 50 MB uncompressed per sitemap file. Google rejects an oversized file entirely, not just the overflow, so every URL in it loses sitemap discovery at once. Above the limit, split into child sitemaps under a - Network accessline 99
- Hard size limit: 50,000 URLs and 50 MB uncompressed per sitemap file. Google rejects an oversized file entirely, not just the overflow, so every URL in it loses sitemap discovery at once. Above the limit, split into child sitemaps under a - Network accessline 101
- Multilingual sites: every language lists the same pages. Count the URLs in each language's sitemap (or per hreflang language when one sitemap holds them all): the counts must be equal, and a gap always means a problem to find. Usual cause - Network accessline 101
- Multilingual sites: every language lists the same pages. Count the URLs in each language's sitemap (or per hreflang language when one sitemap holds them all): the counts must be equal, and a gap always means a problem to find. Usual cause - Network accessline 102
- Keep lastmod honest: update it only when content meaningfully changes. Google states it ignores lastmod when it is uniformly fresh or inaccurate. - Do not ping Google's sitemap endpoint: deprecated in June 2023, it returns 404. Submit thr - Network accessline 102
- Keep lastmod honest: update it only when content meaningfully changes. Google states it ignores lastmod when it is uniformly fresh or inaccurate. - Do not ping Google's sitemap endpoint: deprecated in June 2023, it returns 404. Submit thr - Network accessline 103
- Do not ping Google's sitemap endpoint: deprecated in June 2023, it returns 404. Submit through GSC and the robots.txt Sitemap: line (https://developers.google.com/search/blog/2023/06/sitemaps-lastmod-ping). - Network accessline 103
- Do not ping Google's sitemap endpoint: deprecated in June 2023, it returns 404. Submit through GSC and the robots.txt Sitemap: line (https://developers.google.com/search/blog/2023/06/sitemaps-lastmod-ping). - Network accessline 104
- Set up IndexNow for Bing: instant push of new and updated URLs, built into many CMS plugins and Cloudflare. Bing is a primary gateway into ChatGPT search, which makes Bing Webmaster Tools standard equipment in 2026 (https://yoast.com/chat - Network accessline 104
- Set up IndexNow for Bing: instant push of new and updated URLs, built into many CMS plugins and Cloudflare. Bing is a primary gateway into ChatGPT search, which makes Bing Webmaster Tools standard equipment in 2026 (https://yoast.com/chat - Network accessline 126
No AI crawler executes JavaScript. The Vercel and MERJ study of 500M+ crawler fetches found that GPTBot, ClaudeBot, PerplexityBot, and Meta-ExternalAgent sometimes download JavaScript files (11.5 percent of ChatGPT fetches, 23.8 percent of - Network accessline 126
No AI crawler executes JavaScript. The Vercel and MERJ study of 500M+ crawler fetches found that GPTBot, ClaudeBot, PerplexityBot, and Meta-ExternalAgent sometimes download JavaScript files (11.5 percent of ChatGPT fetches, 23.8 percent of - Network accessline 140
curl -sL https://example.com/page/ | grep -c "exact sentence from the page" - Network accessline 140
curl -sL https://example.com/page/ | grep -c "exact sentence from the page" - Network accessline 159
Judge mobile first: mobile carries 80 to 90 percent of traffic on typical lead-gen and e-commerce sites (field range). Measure with the free PageSpeed Insights web interface at https://pagespeed.web.dev: no API key, no account, and it retur - Network accessline 159
Judge mobile first: mobile carries 80 to 90 percent of traffic on typical lead-gen and e-commerce sites (field range). Measure with the free PageSpeed Insights web interface at https://pagespeed.web.dev: no API key, no account, and it retur - Network accessline 162
|---|---|---| | LCP | Under 2.5 s | Largest Contentful Paint | | INP | Under 200 ms | Replaced FID in March 2024; the most commonly failed of the three vitals (https://web.dev/articles/inp) | - Network accessline 162
|---|---|---| | LCP | Under 2.5 s | Largest Contentful Paint | | INP | Under 200 ms | Replaced FID in March 2024; the most commonly failed of the three vitals (https://web.dev/articles/inp) | - Network accessline 163
| LCP | Under 2.5 s | Largest Contentful Paint | | INP | Under 200 ms | Replaced FID in March 2024; the most commonly failed of the three vitals (https://web.dev/articles/inp) | | CLS | Under 0.1 | Layout stability | - Network accessline 163
| LCP | Under 2.5 s | Largest Contentful Paint | | INP | Under 200 ms | Replaced FID in March 2024; the most commonly failed of the three vitals (https://web.dev/articles/inp) | | CLS | Under 0.1 | Layout stability | - Network accessline 164
| INP | Under 200 ms | Replaced FID in March 2024; the most commonly failed of the three vitals (https://web.dev/articles/inp) | - Network accessline 164
| INP | Under 200 ms | Replaced FID in March 2024; the most commonly failed of the three vitals (https://web.dev/articles/inp) | - Network accessline 173
2. Never lazy-load above-the-fold images, least of all the LCP image; mark the LCP image fetchpriority="high". 3. Defer render-blocking third-party scripts; load chat widgets and trackers after interaction. 4. Text-to-HTML ratio under 10 pe - Network accessline 173
2. Never lazy-load above-the-fold images, least of all the LCP image; mark the LCP image fetchpriority="high". 3. Defer render-blocking third-party scripts; load chat widgets and trackers after interaction. 4. Text-to-HTML ratio under 10 pe - Network accessline 175
4. Text-to-HTML ratio under 10 percent signals a thin or bloated page (field heuristic): too little content or too much markup. Related: keep the DOM under roughly 1,500 nodes; Lighthouse flags excessive DOM size starting around 800 (https: - Network accessline 175
4. Text-to-HTML ratio under 10 percent signals a thin or bloated page (field heuristic): too little content or too much markup. Related: keep the DOM under roughly 1,500 nodes; Lighthouse flags excessive DOM size starting around 800 (https: - Network accessline 196
- HTTPS everywhere: every HTTP URL 301s to HTTPS in one hop, no mixed content, valid certificate. - Hack detection: search the raw HTML (hacks often cloak, so not just the rendered page) for injected casino, pharma, and replica anchors. Che - Network accessline 196
- HTTPS everywhere: every HTTP URL 301s to HTTPS in one hop, no mixed content, valid certificate. - Hack detection: search the raw HTML (hacks often cloak, so not just the rendered page) for injected casino, pharma, and replica anchors. Che - Network accessline 197
- Hack detection: search the raw HTML (hacks often cloak, so not just the rendered page) for injected casino, pharma, and replica anchors. Check GSC Security Issues and run a site: search for pages you do not recognize. On WordPress: clean - Network accessline 197
- Hack detection: search the raw HTML (hacks often cloak, so not just the rendered page) for injected casino, pharma, and replica anchors. Check GSC Security Issues and run a site: search for pages you do not recognize. On WordPress: clean - Network accessline 198
- Unintentional geo-blocking: a firewall rule or a country block (often shipped by a WAF, a CDN security preset, or a hosting default) can make the site unreachable from entire regions, so a slice of human visitors, search bots, and AI craw - Network accessline 198
- Unintentional geo-blocking: a firewall rule or a country block (often shipped by a WAF, a CDN security preset, or a hosting default) can make the site unreachable from entire regions, so a slice of human visitors, search bots, and AI craw - Network accessline 217
# Status code and redirect chain (flag chains longer than one hop) curl -sIL https://example.com/page/ | grep -iE "^HTTP|^location" - Network accessline 217
# Status code and redirect chain (flag chains longer than one hop) curl -sIL https://example.com/page/ | grep -iE "^HTTP|^location" - Network accessline 218
curl -sIL https://example.com/page/ | grep -iE "^HTTP|^location" - Network accessline 218
curl -sIL https://example.com/page/ | grep -iE "^HTTP|^location" - Network accessline 220
# Indexability: X-Robots-Tag header, then meta robots in raw HTML curl -sIL https://example.com/page/ | grep -i "x-robots-tag" - Network accessline 220
# Indexability: X-Robots-Tag header, then meta robots in raw HTML curl -sIL https://example.com/page/ | grep -i "x-robots-tag" - Network accessline 221
curl -sIL https://example.com/page/ | grep -i "x-robots-tag" - Network accessline 221
curl -sIL https://example.com/page/ | grep -i "x-robots-tag" - Network accessline 222
curl -sL https://example.com/page/ | grep -io '<meta name="robots"[^>]*>' - Network accessline 222
curl -sL https://example.com/page/ | grep -io '<meta name="robots"[^>]*>' - Network accessline 224
# Canonical as served (must match the clean URL) curl -sL https://example.com/page/ | grep -io '<link rel="canonical"[^>]*>' - Network accessline 224
# Canonical as served (must match the clean URL) curl -sL https://example.com/page/ | grep -io '<link rel="canonical"[^>]*>' - Network accessline 225
curl -sL https://example.com/page/ | grep -io '<link rel="canonical"[^>]*>' - Network accessline 225
curl -sL https://example.com/page/ | grep -io '<link rel="canonical"[^>]*>' - Network accessline 227
# robots.txt: sitemap declared, no accidental Disallow: / curl -s https://example.com/robots.txt - Network accessline 227
# robots.txt: sitemap declared, no accidental Disallow: / curl -s https://example.com/robots.txt - Network accessline 228
curl -s https://example.com/robots.txt - Network accessline 228
curl -s https://example.com/robots.txt - Network accessline 230
# Content present without JavaScript (the AI visibility test from Step 3) curl -sL https://example.com/page/ | grep -c "a sentence from the page" - Network accessline 230
# Content present without JavaScript (the AI visibility test from Step 3) curl -sL https://example.com/page/ | grep -c "a sentence from the page" - Network accessline 231
curl -sL https://example.com/page/ | grep -c "a sentence from the page" - Network accessline 231
curl -sL https://example.com/page/ | grep -c "a sentence from the page" - Network accessline 262
- Adoption sits around 10 percent of the 300,000 domains SE Ranking studied in 2025. - Server-log analyses find AI bots requesting the file in a tiny fraction of hits, commonly cited near 0.1 percent. - No engine confirms reading it: not Op - Network accessline 262
- Adoption sits around 10 percent of the 300,000 domains SE Ranking studied in 2025. - Server-log analyses find AI bots requesting the file in a tiny fraction of hits, commonly cited near 0.1 percent. - No engine confirms reading it: not Op - Network accessline 263
- Server-log analyses find AI bots requesting the file in a tiny fraction of hits, commonly cited near 0.1 percent. - No engine confirms reading it: not OpenAI, not Anthropic, not Perplexity, not Google. John Mueller publicly compared it to - Network accessline 263
- Server-log analyses find AI bots requesting the file in a tiny fraction of hits, commonly cited near 0.1 percent. - No engine confirms reading it: not OpenAI, not Anthropic, not Perplexity, not Google. John Mueller publicly compared it to - Network accessline 264
- No engine confirms reading it: not OpenAI, not Anthropic, not Perplexity, not Google. John Mueller publicly compared it to the meta keywords tag (https://www.seroundtable.com/google-does-not-endorse-llms-txt-40789.html). - Network accessline 264
- No engine confirms reading it: not OpenAI, not Anthropic, not Perplexity, not Google. John Mueller publicly compared it to the meta keywords tag (https://www.seroundtable.com/google-does-not-endorse-llms-txt-40789.html). - Network accessline 265
- Google states sites do not need special AI text files for its AI features (https://developers.google.com/search/docs/appearance/ai-features). - Network accessline 265
- Google states sites do not need special AI text files for its AI features (https://developers.google.com/search/docs/appearance/ai-features). - Network accessline 283
The Google-Extended trap: Google-Extended is a control token, not a crawler. Blocking it only opts the site out of Gemini training and grounding. It does NOT remove the site from AI Overviews or AI Mode, which are fed by regular Googlebot c - Network accessline 283
The Google-Extended trap: Google-Extended is a control token, not a crawler. Blocking it only opts the site out of Gemini training and grounding. It does NOT remove the site from AI Overviews or AI Mode, which are fed by regular Googlebot c - Network accessline 334
- Sitemap ping deprecation: https://developers.google.com/search/blog/2023/06/sitemaps-lastmod-ping - Network accessline 334
- Sitemap ping deprecation: https://developers.google.com/search/blog/2023/06/sitemaps-lastmod-ping - Network accessline 335
- Bing index as ChatGPT gateway: https://yoast.com/chatgpt-search/ - Network accessline 335
- Bing index as ChatGPT gateway: https://yoast.com/chatgpt-search/ - Network accessline 336
- num=100 removal impact: https://searchengineland.com/google-num100-impact-data-462231 - Network accessline 336
- num=100 removal impact: https://searchengineland.com/google-num100-impact-data-462231 - Network accessline 337
- INP thresholds and rollout: https://web.dev/articles/inp - Network accessline 337
- INP thresholds and rollout: https://web.dev/articles/inp - Network accessline 338
- AI crawlers and JavaScript, 500M+ fetches: https://vercel.com/blog/the-rise-of-the-ai-crawler - Network accessline 338
- AI crawlers and JavaScript, 500M+ fetches: https://vercel.com/blog/the-rise-of-the-ai-crawler - Network accessline 339
- AI search and JS rendering: https://www.gsqi.com/marketing-blog/ai-search-javascript-rendering/ - Network accessline 339
- AI search and JS rendering: https://www.gsqi.com/marketing-blog/ai-search-javascript-rendering/ - Network accessline 340
- Google on AI features and text files: https://developers.google.com/search/docs/appearance/ai-features - Network accessline 340
- Google on AI features and text files: https://developers.google.com/search/docs/appearance/ai-features - Network accessline 341
- Mueller on llms.txt: https://www.seroundtable.com/google-does-not-endorse-llms-txt-40789.html - Network accessline 341
- Mueller on llms.txt: https://www.seroundtable.com/google-does-not-endorse-llms-txt-40789.html - Network accessline 342
- Googlebot and Google-Extended documentation: https://developers.google.com/search/docs/crawling-indexing/google-common-crawlers - Network accessline 342
- Googlebot and Google-Extended documentation: https://developers.google.com/search/docs/crawling-indexing/google-common-crawlers - Network accessline 343
- DOM size: https://developer.chrome.com/docs/lighthouse/performance/dom-size - Network accessline 343
- DOM size: https://developer.chrome.com/docs/lighthouse/performance/dom-size - Network accessline 344
- PageSpeed Insights, free web interface, no API key: https://pagespeed.web.dev - Network accessline 344
- PageSpeed Insights, free web interface, no API key: https://pagespeed.web.dev
skills/seo-technical/evals/evals.json
- Network accessline 5
"id": 1, "prompt": "We rebuilt our marketing site and docs as a React single-page app three months ago. Google still ranks us fine, but ChatGPT and Perplexity stopped citing our docs entirely and our AI referral traffic went to zero. - Network accessline 5
"id": 1, "prompt": "We rebuilt our marketing site and docs as a React single-page app three months ago. Google still ranks us fine, but ChatGPT and Perplexity stopped citing our docs entirely and our AI referral traffic went to zero. - Network accessline 6
"prompt": "We rebuilt our marketing site and docs as a React single-page app three months ago. Google still ranks us fine, but ChatGPT and Perplexity stopped citing our docs entirely and our AI referral traffic went to zero. The dev team sa - Network accessline 6
"prompt": "We rebuilt our marketing site and docs as a React single-page app three months ago. Google still ranks us fine, but ChatGPT and Perplexity stopped citing our docs entirely and our AI referral traffic went to zero. The dev team sa - Network accessline 7
"expected_output": "A diagnosis of client-side rendering as the cause: no AI crawler executes JavaScript, only Googlebot renders, which is exactly why Google rankings held while ChatGPT and Perplexity citations died. The answer cites the Ve - Network accessline 7
"expected_output": "A diagnosis of client-side rendering as the cause: no AI crawler executes JavaScript, only Googlebot renders, which is exactly why Google rankings held while ChatGPT and Perplexity citations died. The answer cites the Ve
skills/seo-technical/references/ai-crawlers.md
- Network accessline 17
| User-agent | Operator | Role | Obeys robots.txt | Identity verification | |---|---|---|---|---| | GPTBot | OpenAI | Training | Yes | https://openai.com/gptbot.json | - Network accessline 17
| User-agent | Operator | Role | Obeys robots.txt | Identity verification | |---|---|---|---|---| | GPTBot | OpenAI | Training | Yes | https://openai.com/gptbot.json | - Network accessline 18
|---|---|---|---|---| | GPTBot | OpenAI | Training | Yes | https://openai.com/gptbot.json | | OAI-SearchBot | OpenAI | Search index (ChatGPT search citations) | Yes | https://openai.com/searchbot.json | - Network accessline 18
|---|---|---|---|---| | GPTBot | OpenAI | Training | Yes | https://openai.com/gptbot.json | | OAI-SearchBot | OpenAI | Search index (ChatGPT search citations) | Yes | https://openai.com/searchbot.json | - Network accessline 19
| GPTBot | OpenAI | Training | Yes | https://openai.com/gptbot.json | | OAI-SearchBot | OpenAI | Search index (ChatGPT search citations) | Yes | https://openai.com/searchbot.json | | ChatGPT-User | OpenAI | User fetch | No (acts on direct u - Network accessline 19
| GPTBot | OpenAI | Training | Yes | https://openai.com/gptbot.json | | OAI-SearchBot | OpenAI | Search index (ChatGPT search citations) | Yes | https://openai.com/searchbot.json | | ChatGPT-User | OpenAI | User fetch | No (acts on direct u - Network accessline 20
| OAI-SearchBot | OpenAI | Search index (ChatGPT search citations) | Yes | https://openai.com/searchbot.json | | ChatGPT-User | OpenAI | User fetch | No (acts on direct user requests) | https://openai.com/chatgpt-user.json | | ClaudeBot | A - Network accessline 20
| OAI-SearchBot | OpenAI | Search index (ChatGPT search citations) | Yes | https://openai.com/searchbot.json | | ChatGPT-User | OpenAI | User fetch | No (acts on direct user requests) | https://openai.com/chatgpt-user.json | | ClaudeBot | A - Network accessline 21
| ChatGPT-User | OpenAI | User fetch | No (acts on direct user requests) | https://openai.com/chatgpt-user.json | - Network accessline 21
| ChatGPT-User | OpenAI | User fetch | No (acts on direct user requests) | https://openai.com/chatgpt-user.json | - Network accessline 22
| ClaudeBot | Anthropic | Training | Yes, supports Crawl-delay | https://claude.com/crawling/bots.json | | Claude-SearchBot | Anthropic | Search index | Yes | https://claude.com/crawling/bots.json | | Claude-User | Anthropic | User fetch | - Network accessline 22
| ClaudeBot | Anthropic | Training | Yes, supports Crawl-delay | https://claude.com/crawling/bots.json | | Claude-SearchBot | Anthropic | Search index | Yes | https://claude.com/crawling/bots.json | | Claude-User | Anthropic | User fetch | - Network accessline 23
| Claude-SearchBot | Anthropic | Search index | Yes | https://claude.com/crawling/bots.json | | Claude-User | Anthropic | User fetch | Yes | https://claude.com/crawling/bots.json | | PerplexityBot | Perplexity | Search index | Yes | https:/ - Network accessline 23
| Claude-SearchBot | Anthropic | Search index | Yes | https://claude.com/crawling/bots.json | | Claude-User | Anthropic | User fetch | Yes | https://claude.com/crawling/bots.json | | PerplexityBot | Perplexity | Search index | Yes | https:/ - Network accessline 24
| Claude-User | Anthropic | User fetch | Yes | https://claude.com/crawling/bots.json | - Network accessline 24
| Claude-User | Anthropic | User fetch | Yes | https://claude.com/crawling/bots.json | - Network accessline 25
| PerplexityBot | Perplexity | Search index | Yes | https://www.perplexity.com/perplexitybot.json | | Perplexity-User | Perplexity | User fetch | Generally no | https://www.perplexity.com/perplexity-user.json | | Googlebot | Google | Search - Network accessline 25
| PerplexityBot | Perplexity | Search index | Yes | https://www.perplexity.com/perplexitybot.json | | Perplexity-User | Perplexity | User fetch | Generally no | https://www.perplexity.com/perplexity-user.json | | Googlebot | Google | Search - Network accessline 26
| Perplexity-User | Perplexity | User fetch | Generally no | https://www.perplexity.com/perplexity-user.json | - Network accessline 26
| Perplexity-User | Perplexity | User fetch | Generally no | https://www.perplexity.com/perplexity-user.json | - Network accessline 27
| Googlebot | Google | Search, AI Overviews, AI Mode grounding | Yes | Reverse DNS plus https://developers.google.com/search/apis/ipranges/googlebot.json | - Network accessline 27
| Googlebot | Google | Search, AI Overviews, AI Mode grounding | Yes | Reverse DNS plus https://developers.google.com/search/apis/ipranges/googlebot.json | - Network accessline 28
| Google-Extended | Google | Control token (Gemini training and grounding), not a crawler | Yes (as a token) | Not applicable: fetches arrive via Google infrastructure | | Bingbot | Microsoft | Bing, Copilot, supplies ChatGPT search | Yes | - Network accessline 28
| Google-Extended | Google | Control token (Gemini training and grounding), not a crawler | Yes (as a token) | Not applicable: fetches arrive via Google infrastructure | | Bingbot | Microsoft | Bing, Copilot, supplies ChatGPT search | Yes | - Network accessline 29
| Bingbot | Microsoft | Bing, Copilot, supplies ChatGPT search | Yes | Reverse DNS (search.msn.com) | | CCBot | Common Crawl | Open datasets reused for training by many labs | Yes | https://commoncrawl.org/ccbot | | Applebot-Extended | Appl - Network accessline 29
| Bingbot | Microsoft | Bing, Copilot, supplies ChatGPT search | Yes | Reverse DNS (search.msn.com) | | CCBot | Common Crawl | Open datasets reused for training by many labs | Yes | https://commoncrawl.org/ccbot | | Applebot-Extended | Appl - Network accessline 30
| CCBot | Common Crawl | Open datasets reused for training by many labs | Yes | https://commoncrawl.org/ccbot | - Network accessline 30
| CCBot | Common Crawl | Open datasets reused for training by many labs | Yes | https://commoncrawl.org/ccbot | - Network accessline 31
| Applebot-Extended | Apple | Control token for Apple Intelligence training (the crawler is Applebot) | Yes (as a token) | https://support.apple.com/en-us/119829 | - Network accessline 31
| Applebot-Extended | Apple | Control token for Apple Intelligence training (the crawler is Applebot) | Yes (as a token) | https://support.apple.com/en-us/119829 | - Network accessline 32
| Meta-ExternalAgent | Meta | Training | Declared yes | https://developers.facebook.com/docs/sharing/webmasters/web-crawlers | - Network accessline 32
| Meta-ExternalAgent | Meta | Training | Declared yes | https://developers.facebook.com/docs/sharing/webmasters/web-crawlers | - Network accessline 33
| Amazonbot | Amazon | Alexa and AI answers | Yes | https://developer.amazon.com/amazonbot | | DuckAssistBot | DuckDuckGo | DuckAssist answers | Yes | https://duckduckgo.com/duckduckgo-help-pages/results/duckassistbot/ | | MistralAI-User | - Network accessline 33
| Amazonbot | Amazon | Alexa and AI answers | Yes | https://developer.amazon.com/amazonbot | | DuckAssistBot | DuckDuckGo | DuckAssist answers | Yes | https://duckduckgo.com/duckduckgo-help-pages/results/duckassistbot/ | | MistralAI-User | - Network accessline 34
| DuckAssistBot | DuckDuckGo | DuckAssist answers | Yes | https://duckduckgo.com/duckduckgo-help-pages/results/duckassistbot/ | | MistralAI-User | Mistral | User fetch (Le Chat) | Declared yes | No published IP list; judge by behavior | | B - Network accessline 34
| DuckAssistBot | DuckDuckGo | DuckAssist answers | Yes | https://duckduckgo.com/duckduckgo-help-pages/results/duckassistbot/ | | MistralAI-User | Mistral | User fetch (Le Chat) | Declared yes | No published IP list; judge by behavior | | B - Network accessline 35
| MistralAI-User | Mistral | User fetch (Le Chat) | Declared yes | No published IP list; judge by behavior | - Network accessline 35
| MistralAI-User | Mistral | User fetch (Le Chat) | Declared yes | No published IP list; judge by behavior | - Network accessline 40
1. None of them execute JavaScript. Measured across 500M+ fetches by Vercel and MERJ: GPTBot, ClaudeBot, PerplexityBot, and Meta-ExternalAgent sometimes download JavaScript files (11.5 percent of ChatGPT fetches, 23.8 percent of Claude fetc - Network accessline 40
1. None of them execute JavaScript. Measured across 500M+ fetches by Vercel and MERJ: GPTBot, ClaudeBot, PerplexityBot, and Meta-ExternalAgent sometimes download JavaScript files (11.5 percent of ChatGPT fetches, 23.8 percent of Claude fetc - Network accessline 41
2. Googlebot is the only renderer. Gemini, AI Overviews, and AI Mode can see client-side rendered content; ChatGPT, Claude, and Perplexity cannot (https://www.gsqi.com/marketing-blog/ai-search-javascript-rendering/). - Network accessline 41
2. Googlebot is the only renderer. Gemini, AI Overviews, and AI Mode can see client-side rendered content; ChatGPT, Claude, and Perplexity cannot (https://www.gsqi.com/marketing-blog/ai-search-javascript-rendering/). - Network accessline 42
3. Google-Extended does not control AI Overviews. It only opts out of Gemini training and grounding. AI Overviews and AI Mode are fed by standard Googlebot crawling; the only opt-outs (nosnippet, max-snippet, noindex) also reduce classic se - Network accessline 42
3. Google-Extended does not control AI Overviews. It only opts out of Gemini training and grounding. AI Overviews and AI Mode are fed by standard Googlebot crawling; the only opt-outs (nosnippet, max-snippet, noindex) also reduce classic se - Network accessline 43
4. Bing is a gateway to ChatGPT search. Being indexed in Bing (Bing Webmaster Tools plus IndexNow) is part of ChatGPT visibility (https://yoast.com/chatgpt-search/). 5. User-fetch agents follow users, not robots. ChatGPT-User and Perplexity - Network accessline 43
4. Bing is a gateway to ChatGPT search. Being indexed in Bing (Bing Webmaster Tools plus IndexNow) is part of ChatGPT visibility (https://yoast.com/chatgpt-search/). 5. User-fetch agents follow users, not robots. ChatGPT-User and Perplexity - Network accessline 57
Sitemap: https://www.example.com/sitemap.xml - Network accessline 57
Sitemap: https://www.example.com/sitemap.xml - Network accessline 97
Sitemap: https://www.example.com/sitemap.xml - Network accessline 97
Sitemap: https://www.example.com/sitemap.xml - Network accessline 119
- https://vercel.com/blog/the-rise-of-the-ai-crawler - Network accessline 119
- https://vercel.com/blog/the-rise-of-the-ai-crawler - Network accessline 120
- https://www.gsqi.com/marketing-blog/ai-search-javascript-rendering/ - Network accessline 120
- https://www.gsqi.com/marketing-blog/ai-search-javascript-rendering/ - Network accessline 121
- https://developers.google.com/search/docs/crawling-indexing/google-common-crawlers - Network accessline 121
- https://developers.google.com/search/docs/crawling-indexing/google-common-crawlers - Network accessline 122
- https://developers.google.com/search/docs/appearance/ai-features - Network accessline 122
- https://developers.google.com/search/docs/appearance/ai-features - Network accessline 123
- https://yoast.com/chatgpt-search/ - Network accessline 123
- https://yoast.com/chatgpt-search/
skills/seo-traffic-drop/SKILL.md
- Network accessline 4
license: MIT metadata: author: "Sorank (https://sorank.com)" - Network accessline 4
license: MIT metadata: author: "Sorank (https://sorank.com)" - Network accessline 5
metadata: author: "Sorank (https://sorank.com)" version: "1.0.0" - Network accessline 5
metadata: author: "Sorank (https://sorank.com)" version: "1.0.0" - Network accessline 6
author: "Sorank (https://sorank.com)" - Network accessline 6
author: "Sorank (https://sorank.com)" - Network accessline 65
- The num=100 removal of September 2025. Rank trackers stopped loading 100-result pages, so many properties saw desktop impressions collapse and average position improve overnight, with clicks flat (https://searchengineland.com/google-num10 - Network accessline 65
- The num=100 removal of September 2025. Rank trackers stopped loading 100-result pages, so many properties saw desktop impressions collapse and average position improve overnight, with clicks flat (https://searchengineland.com/google-num10 - Network accessline 66
- The Search Console impression logging error, disclosed on the Data Anomalies page: from 13 May 2025 until the fix rolled out on 27 April 2026, impressions were logged inaccurately, which also distorted CTR and average position. Clicks wer - Network accessline 66
- The Search Console impression logging error, disclosed on the Data Anomalies page: from 13 May 2025 until the fix rolled out on 27 April 2026, impressions were logged inaccurately, which also distorted CTR and average position. Clicks wer - Network accessline 89
For update windows, use the Google Search Status Dashboard, which publishes confirmed ranking updates with official start and end dates (https://developers.google.com/search/help/status-dashboard). A drop that starts three days before an up - Network accessline 89
For update windows, use the Google Search Status Dashboard, which publishes confirmed ranking updates with official start and end dates (https://developers.google.com/search/help/status-dashboard). A drop that starts three days before an up - Network accessline 159
1. Record the fix date. Recovery is measured from it, not from the drop. 2. Set the re-measure date honestly: a technical fix needs a recrawl before anything moves, so weeks on a site of any size. Recovery from an update usually waits for t - Network accessline 159
1. Record the fix date. Recovery is measured from it, not from the drop. 2. Set the re-measure date honestly: a technical fix needs a recrawl before anything moves, so weeks on a site of any size. Recovery from an update usually waits for t - Network accessline 160
2. Set the re-measure date honestly: a technical fix needs a recrawl before anything moves, so weeks on a site of any size. Recovery from an update usually waits for the next update; Google's own guidance is that there is nothing to fix in - Network accessline 160
2. Set the re-measure date honestly: a technical fix needs a recrawl before anything moves, so weeks on a site of any size. Recovery from an update usually waits for the next update; Google's own guidance is that there is nothing to fix in - Network accessline 240
- Search Console Data Anomalies (the official list of known reporting issues): https://support.google.com/webmasters/answer/6211453 - Network accessline 240
- Search Console Data Anomalies (the official list of known reporting issues): https://support.google.com/webmasters/answer/6211453 - Network accessline 241
- The 50-week impression logging error and its 27 April 2026 fix: https://www.seroundtable.com/google-search-console-fix-data-logging-issue-41260.html - Network accessline 241
- The 50-week impression logging error and its 27 April 2026 fix: https://www.seroundtable.com/google-search-console-fix-data-logging-issue-41260.html - Network accessline 242
- num=100 removal and its impression impact: https://searchengineland.com/google-num100-impact-data-462231 - Network accessline 242
- num=100 removal and its impression impact: https://searchengineland.com/google-num100-impact-data-462231 - Network accessline 243
- Google Search Status Dashboard, confirmed update windows: https://developers.google.com/search/help/status-dashboard - Network accessline 243
- Google Search Status Dashboard, confirmed update windows: https://developers.google.com/search/help/status-dashboard - Network accessline 244
- Google guidance on core updates and recovery: https://developers.google.com/search/docs/appearance/core-updates - Network accessline 244
- Google guidance on core updates and recovery: https://developers.google.com/search/docs/appearance/core-updates - Network accessline 245
- AI Overviews click impact, conservative end, with the branded and non-branded split (Amsive, 700,000 keywords): https://www.amsive.com/insights/seo/google-ai-overviews-new-research-reveals-how-to-navigate-click-drop-off/ - Network accessline 245
- AI Overviews click impact, conservative end, with the branded and non-branded split (Amsive, 700,000 keywords): https://www.amsive.com/insights/seo/google-ai-overviews-new-research-reveals-how-to-navigate-click-drop-off/ - Network accessline 246
- AI Overviews click impact (Ahrefs): https://ahrefs.com/blog/ai-overviews-reduce-clicks/ - Network accessline 246
- AI Overviews click impact (Ahrefs): https://ahrefs.com/blog/ai-overviews-reduce-clicks/ - Network accessline 247
- Zero-click and CTR trend into 2026: https://searchengineland.com/google-ai-overviews-ctr-recovery-study-475566 - Network accessline 247
- Zero-click and CTR trend into 2026: https://searchengineland.com/google-ai-overviews-ctr-recovery-study-475566
skills/seo-traffic-drop/references/investigation-protocol.md
- Network accessline 57
# Indexability as served: meta robots and the header version templates hide curl -sIL https://example.com/page/ | grep -i "x-robots-tag" - Network accessline 57
# Indexability as served: meta robots and the header version templates hide curl -sIL https://example.com/page/ | grep -i "x-robots-tag" - Network accessline 58
curl -sIL https://example.com/page/ | grep -i "x-robots-tag" - Network accessline 58
curl -sIL https://example.com/page/ | grep -i "x-robots-tag" - Network accessline 59
curl -sL https://example.com/page/ | grep -io '<meta name="robots"[^>]*>' - Network accessline 59
curl -sL https://example.com/page/ | grep -io '<meta name="robots"[^>]*>' - Network accessline 61
# Canonical as served curl -sL https://example.com/page/ | grep -io '<link rel="canonical"[^>]*>' - Network accessline 61
# Canonical as served curl -sL https://example.com/page/ | grep -io '<link rel="canonical"[^>]*>' - Network accessline 62
curl -sL https://example.com/page/ | grep -io '<link rel="canonical"[^>]*>' - Network accessline 62
curl -sL https://example.com/page/ | grep -io '<link rel="canonical"[^>]*>' - Network accessline 64
# robots.txt, checking for a shipped staging config curl -s https://example.com/robots.txt - Network accessline 64
# robots.txt, checking for a shipped staging config curl -s https://example.com/robots.txt - Network accessline 65
curl -s https://example.com/robots.txt - Network accessline 65
curl -s https://example.com/robots.txt - Network accessline 67
# Status and redirect chain, flagging chains longer than one hop curl -sIL https://example.com/old-url/ | grep -iE "^HTTP|^location" - Network accessline 67
# Status and redirect chain, flagging chains longer than one hop curl -sIL https://example.com/old-url/ | grep -iE "^HTTP|^location" - Network accessline 68
curl -sIL https://example.com/old-url/ | grep -iE "^HTTP|^location" - Network accessline 68
curl -sIL https://example.com/old-url/ | grep -iE "^HTTP|^location" - Network accessline 70
# Does the site answer differently to Googlebot (blocking, or dynamic rendering) curl -sI -A "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" https://example.com/ | head -1 - Network accessline 70
# Does the site answer differently to Googlebot (blocking, or dynamic rendering) curl -sI -A "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" https://example.com/ | head -1 - Network accessline 71
curl -sI -A "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" https://example.com/ | head -1 - Network accessline 71
curl -sI -A "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" https://example.com/ | head -1 - Network accessline 73
# Is the content in the HTML at all (the AI visibility test) curl -sL https://example.com/page/ | grep -c "a sentence from the page" - Network accessline 73
# Is the content in the HTML at all (the AI visibility test) curl -sL https://example.com/page/ | grep -c "a sentence from the page" - Network accessline 74
curl -sL https://example.com/page/ | grep -c "a sentence from the page" - Network accessline 74
curl -sL https://example.com/page/ | grep -c "a sentence from the page" - Network accessline 82
1. Manual Actions and Security Issues in Search Console. Binary, two clicks. 2. robots.txt and meta robots on three URLs. One curl each. - Network accessline 82
1. Manual Actions and Security Issues in Search Console. Binary, two clicks. 2. robots.txt and meta robots on three URLs. One curl each. - Network accessline 83
2. robots.txt and meta robots on three URLs. One curl each. - Network accessline 83
2. robots.txt and meta robots on three URLs. One curl each.
skills/seo-traffic-drop/scripts/content_decay.py
skills/seo-traffic-drop/scripts/gsc_diff.py
skills/social-amplification/SKILL.md
- Network accessline 4
license: MIT metadata: author: "Sorank (https://sorank.com)" - Network accessline 4
license: MIT metadata: author: "Sorank (https://sorank.com)" - Network accessline 5
metadata: author: "Sorank (https://sorank.com)" version: "1.0.0" - Network accessline 5
metadata: author: "Sorank (https://sorank.com)" version: "1.0.0" - Network accessline 6
author: "Sorank (https://sorank.com)" - Network accessline 6
author: "Sorank (https://sorank.com)" - Network accessline 50
Why branded search matters for SEO and GEO: branded search volume correlates with organic rankings and with AI visibility. Brand web mentions correlate with AI Overview brand presence at 0.664 versus 0.218 for backlinks (Ahrefs, 75,000 bran - Network accessline 50
Why branded search matters for SEO and GEO: branded search volume correlates with organic rankings and with AI visibility. Brand web mentions correlate with AI Overview brand presence at 0.664 versus 0.218 for backlinks (Ahrefs, 75,000 bran - Network accessline 54
YouTube, Reddit, and LinkedIn are among the most cited domains in AI answers (https://www.semrush.com/blog/most-cited-domains-ai/), and Perplexity overweights YouTube, Reddit, and user-generated content (https://www.tryprofound.com/blog/ai- - Network accessline 54
YouTube, Reddit, and LinkedIn are among the most cited domains in AI answers (https://www.semrush.com/blog/most-cited-domains-ai/), and Perplexity overweights YouTube, Reddit, and user-generated content (https://www.tryprofound.com/blog/ai- - Network accessline 107
YouTube is two things at once: the second largest search engine in the world, and a heavily cited AI surface (Perplexity overweights it, https://www.tryprofound.com/blog/ai-platform-citation-patterns; field heuristic from 115+ agency audits - Network accessline 107
YouTube is two things at once: the second largest search engine in the world, and a heavily cited AI surface (Perplexity overweights it, https://www.tryprofound.com/blog/ai-platform-citation-patterns; field heuristic from 115+ agency audits - Network accessline 126
1. The 95/5 rule, strictly. An account whose every post links to the brand gets banned, and every contribution it made disappears with it. The account that helps twenty times and links twice keeps its standing for years. Never astroturf. 2. - Network accessline 126
1. The 95/5 rule, strictly. An account whose every post links to the brand gets banned, and every contribution it made disappears with it. The account that helps twenty times and links twice keeps its standing for years. Never astroturf. 2. - Network accessline 127
2. Volatility, stated honestly. Reddit's share of ChatGPT citations moved from roughly 60% to roughly 10% within about a month after platform shifts (https://www.semrush.com/blog/most-cited-domains-ai/). Participate cleanly because it is go - Network accessline 127
2. Volatility, stated honestly. Reddit's share of ChatGPT citations moved from roughly 60% to roughly 10% within about a month after platform shifts (https://www.semrush.com/blog/most-cited-domains-ai/). Participate cleanly because it is go - Network accessline 190
Citability of the content itself (answer-first passages, self-contained chunks, sourced statistics) is owned by geo-visibility; apply its rules when writing the YouTube description, the LinkedIn post, or any text that an engine may quote. A - Network accessline 190
Citability of the content itself (answer-first passages, self-contained chunks, sourced statistics) is owned by geo-visibility; apply its rules when writing the YouTube description, the LinkedIn post, or any text that an engine may quote. A - Network accessline 272
- Semrush, most cited domains in AI answers, including YouTube, Reddit, and LinkedIn, and Reddit citation volatility (roughly 60% to 10%): https://www.semrush.com/blog/most-cited-domains-ai/ - Network accessline 272
- Semrush, most cited domains in AI answers, including YouTube, Reddit, and LinkedIn, and Reddit citation volatility (roughly 60% to 10%): https://www.semrush.com/blog/most-cited-domains-ai/ - Network accessline 273
- Profound, AI platform citation patterns, Perplexity overweighting YouTube, Reddit, and user-generated content: https://www.tryprofound.com/blog/ai-platform-citation-patterns - Network accessline 273
- Profound, AI platform citation patterns, Perplexity overweighting YouTube, Reddit, and user-generated content: https://www.tryprofound.com/blog/ai-platform-citation-patterns - Network accessline 274
- Ahrefs, brand mentions versus backlinks correlation with AI Overview presence (0.664 versus 0.218), 75,000 brands: https://ahrefs.com/blog/ai-overview-brand-correlation/ - Network accessline 274
- Ahrefs, brand mentions versus backlinks correlation with AI Overview presence (0.664 versus 0.218), 75,000 brands: https://ahrefs.com/blog/ai-overview-brand-correlation/ - Network accessline 275
- Aggarwal et al., GEO: Generative Engine Optimization (Princeton et al.), impact of statistics and citations on generative visibility: https://arxiv.org/abs/2311.09735 - Network accessline 275
- Aggarwal et al., GEO: Generative Engine Optimization (Princeton et al.), impact of statistics and citations on generative visibility: https://arxiv.org/abs/2311.09735
skills/social-amplification/evals/evals.json
- Network accessline 4
{ "id": 1, "prompt": "We just published a 2500-word original study on our blog at https://forecastly.io/blog/2026-demand-planning-benchmark with survey data from 400 supply chain managers. It got almost no traffic. We sell deman - Network accessline 4
{ "id": 1, "prompt": "We just published a 2500-word original study on our blog at https://forecastly.io/blog/2026-demand-planning-benchmark with survey data from 400 supply chain managers. It got almost no traffic. We sell deman - Network accessline 5
"id": 1, "prompt": "We just published a 2500-word original study on our blog at https://forecastly.io/blog/2026-demand-planning-benchmark with survey data from 400 supply chain managers. It got almost no traffic. We sell demand planni - Network accessline 5
"id": 1, "prompt": "We just published a 2500-word original study on our blog at https://forecastly.io/blog/2026-demand-planning-benchmark with survey data from 400 supply chain managers. It got almost no traffic. We sell demand planni - Network accessline 6
"prompt": "We just published a 2500-word original study on our blog at https://forecastly.io/blog/2026-demand-planning-benchmark with survey data from 400 supply chain managers. It got almost no traffic. We sell demand planning software to - Network accessline 6
"prompt": "We just published a 2500-word original study on our blog at https://forecastly.io/blog/2026-demand-planning-benchmark with survey data from 400 supply chain managers. It got almost no traffic. We sell demand planning software to
How the signals fit together
Facts from a static read of the files at the pinned commit. They describe what the code does, not why.
Some files could not be read; the facts below still hold.
Signal confidence: 500 facts
- Network access in the frontmatter of the SKILL.mdgeo-tracking/SKILL.md:4Low confidence
- Network access in the frontmatter of the SKILL.mdgeo-tracking/SKILL.md:5Low confidence
- Network access in the frontmatter of the SKILL.mdgeo-tracking/SKILL.md:6Low confidence
- Network access in prose of the SKILL.mdgeo-tracking/SKILL.md:54Low confidence
- Network access in prose of the SKILL.mdgeo-tracking/SKILL.md:67Low confidence
- Network access in prose of the SKILL.mdgeo-tracking/SKILL.md:77Low confidence
- Network access in prose of the SKILL.mdgeo-tracking/SKILL.md:83Low confidence
- Network access in prose of the SKILL.mdgeo-tracking/SKILL.md:170Low confidence
- Network access in prose of the SKILL.mdgeo-tracking/SKILL.md:171Low confidence
- Network access in prose of the SKILL.mdgeo-tracking/SKILL.md:172Low confidence
- Network access in prose of the SKILL.mdgeo-tracking/SKILL.md:173Low confidence
- Network access in prose of the SKILL.mdgeo-tracking/SKILL.md:293Low confidence
- Network access in prose of the SKILL.mdgeo-tracking/SKILL.md:294Low confidence
- Network access in prose of the SKILL.mdgeo-tracking/SKILL.md:295Low confidence
- Network access in prose of the SKILL.mdgeo-tracking/SKILL.md:296Low confidence
- Network access in prose of the SKILL.mdgeo-tracking/SKILL.md:297Low confidence
- Network access in prose of the SKILL.mdgeo-tracking/SKILL.md:298Low confidence
- Network access in prose of the SKILL.mdgeo-tracking/SKILL.md:299Low confidence
- Network access in the frontmatter of the SKILL.mdskills/geo-visibility/SKILL.md:4Low confidence
- Network access in the frontmatter of the SKILL.mdgeo-visibility/SKILL.md:4Low confidence
- Network access in the frontmatter of the SKILL.mdskills/geo-visibility/SKILL.md:5Low confidence
- Network access in the frontmatter of the SKILL.mdgeo-visibility/SKILL.md:5Low confidence
- Network access in the frontmatter of the SKILL.mdskills/geo-visibility/SKILL.md:6Low confidence
- Network access in the frontmatter of the SKILL.mdgeo-visibility/SKILL.md:6Low confidence
- Network access in prose of the SKILL.mdskills/geo-visibility/SKILL.md:43Low confidence
- Network access in prose of the SKILL.mdgeo-visibility/SKILL.md:43Low confidence
- Network access in prose of the SKILL.mdskills/geo-visibility/SKILL.md:45Low confidence
- Network access in prose of the SKILL.mdgeo-visibility/SKILL.md:45Low confidence
- Network access in prose of the SKILL.mdskills/geo-visibility/SKILL.md:46Low confidence
- Network access in prose of the SKILL.mdgeo-visibility/SKILL.md:46Low confidence
- Network access in prose of the SKILL.mdskills/geo-visibility/SKILL.md:47Low confidence
- Network access in prose of the SKILL.mdgeo-visibility/SKILL.md:47Low confidence
- Network access in prose of the SKILL.mdskills/geo-visibility/SKILL.md:48Low confidence
- Network access in prose of the SKILL.mdgeo-visibility/SKILL.md:48Low confidence
- Network access in prose of the SKILL.mdskills/geo-visibility/SKILL.md:49Low confidence
- Network access in prose of the SKILL.mdgeo-visibility/SKILL.md:49Low confidence
- Network access in prose of the SKILL.mdskills/geo-visibility/SKILL.md:50Low confidence
- Network access in prose of the SKILL.mdgeo-visibility/SKILL.md:50Low confidence
- Network access in prose of the SKILL.mdskills/geo-visibility/SKILL.md:117Low confidence
- Network access in prose of the SKILL.mdgeo-visibility/SKILL.md:117Low confidence
- Network access in prose of the SKILL.mdskills/geo-visibility/SKILL.md:118Low confidence
- Network access in prose of the SKILL.mdgeo-visibility/SKILL.md:118Low confidence
- Network access in prose of the SKILL.mdskills/geo-visibility/SKILL.md:119Low confidence
- Network access in prose of the SKILL.mdgeo-visibility/SKILL.md:119Low confidence
- Network access in prose of the SKILL.mdskills/geo-visibility/SKILL.md:120Low confidence
- Network access in prose of the SKILL.mdgeo-visibility/SKILL.md:120Low confidence
- Network access in prose of the SKILL.mdskills/geo-visibility/SKILL.md:121Low confidence
- Network access in prose of the SKILL.mdgeo-visibility/SKILL.md:121Low confidence
- Network access in prose of the SKILL.mdskills/geo-visibility/SKILL.md:220Low confidence
- Network access in prose of the SKILL.mdgeo-visibility/SKILL.md:220Low confidence
and 450 more
Only the first 500 facts are listed.
Works with
| Agent | Status | Evidence | Install to |
|---|---|---|---|
| Claude Code | Native | Manifest .claude-plugin/marketplace.json | .claude/skills/<skill-name>/ |
| Codex | Native | Manifest AGENTS.md | .agents/skills/<skill-name>/ |
| Cursor | Compatible | Standard SKILL.md skills/geo-tracking/SKILL.md | .cursor/skills/<skill-name>/ |
| Gemini CLI | Compatible | Standard SKILL.md skills/geo-tracking/SKILL.md | .gemini/skills/<skill-name>/ |
| GitHub Copilot | Compatible | Standard SKILL.md skills/geo-tracking/SKILL.md | .github/skills/<skill-name>/ |
| OpenCode | Compatible | Standard SKILL.md skills/geo-tracking/SKILL.md | .opencode/skills/<skill-name>/ |
- Native The repository ships a manifest, folder or frontmatter field for this agent.
- Compatible A standard SKILL.md that this agent can read.
- Unknown No evidence either way.
Derived automatically from paths, manifests and frontmatter. Not tested on each agent.