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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

View on GitHubAdd to my skills

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>/
18GitHub stars
1star in 7 days
20skills in this repository
28commits in 30 days

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

Oct 25, 2026Nov 2, 202618

30-day change not yet available: not enough history.

Individual skills in this repository

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 tokens

Always available to the agent

SKILL.md

4,937 tokens

When the skill is activated

Reference documents

186,115 tokens

Loaded on request

Token counts are estimates. Scripts run separately; they are not counted as reference context.

The playbook

  1. Company knowledge first (Obsidian)
  2. When to use this skill
  3. Workflow
  4. Reading the signals together
  5. Rules and thresholds
  6. Output format
  7. Common mistakes
  8. Cross-references
  9. 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 bytes
  • SKILL.mdcore22,031 bytes
  • SKILL.mdcore22,031 bytes
  • SKILL.mdcore22,031 bytes
  • evals/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 GitHub

Skills 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 shell

Automated 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:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/geo-tracking/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/geo-visibility/evals/evals.json:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/seo-backlinks/evals/evals.json:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/seo-content-comparison-page/evals/evals.json:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/seo-internal-linking/evals/evals.json:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/seo-page-sections/evals/evals.json:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/seo-schema-markup/evals/evals.json:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/seo-schema-markup/evals/evals.json:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/seo-technical/evals/evals.json:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/geo-visibility/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/geo-visibility/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/geo-visibility/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/geo-visibility/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/geo-visibility/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/seo-ai-site-builders/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/seo-ai-site-builders/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/geo-visibility/evals/evals.json:1 Plugin-wide analysis incomplete; see repository notes
  • skills/seo-backlinks/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/seo-backlinks/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
Show all 1,846 signals by file

.claude-plugin/marketplace.json

  • Network accessline 3
    "owner": {     "name": "Sorank",     "url": "https://sorank.com"
  • Network accessline 4
    "name": "Sorank",     "url": "https://sorank.com"   },
  • Network accessline 5
    "url": "https://sorank.com"

.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

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Executable scriptline 1
    #!/usr/bin/env python3

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

  • 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

skills/seo-traffic-drop/scripts/gsc_diff.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Executable scriptline 1
    #!/usr/bin/env python3

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

and 450 more

Only the first 500 facts are listed.

Works with

Agent compatibility, from the files in this repository
AgentStatusEvidenceInstall to
Claude CodeNativeManifest .claude-plugin/marketplace.json.claude/skills/<skill-name>/
CodexNativeManifest AGENTS.md.agents/skills/<skill-name>/
CursorCompatibleStandard SKILL.md skills/geo-tracking/SKILL.md.cursor/skills/<skill-name>/
Gemini CLICompatibleStandard SKILL.md skills/geo-tracking/SKILL.md.gemini/skills/<skill-name>/
GitHub CopilotCompatibleStandard SKILL.md skills/geo-tracking/SKILL.md.github/skills/<skill-name>/
OpenCodeCompatibleStandard 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.