#880 by GitHub stars

Bhanunamikaze/Agentic-SEO-Skill

Deterministic LLM-first SEO audits for websites, blog posts, and GitHub repositories. Use this when the user asks to "perform SEO analysis", "run SEO audit", "analyze SEO", "check technical SEO", "review schema", "Core Web Vitals", "E-E-A-T", "hreflang", "GEO", "AEO", or GitHub repository SEO optimi

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

SKILL.md

Week of Oct 26, 2026 · +0 / −0 lines

Before Network or broad shell → After Network or broad shell

445c46c268d9 → 445c46c268d9

Compare on GitHub

View on GitHubAdd to my skills

Verified commit 445c46c268d947fac25c4b57d38aaf723129fe62

1kGitHub stars
11stars in 7 days
1skill in this repository
1commit in 30 days

Heat

5.3
  • Star growth, last 7 daysAhead of 84% of tracked repositories
  • Star growth, last 24 hoursAhead of 73% of tracked repositories
  • Rank movement, last 7 daysAhead of 4% of tracked repositories
  • Commits, last 30 daysAhead of 54% of tracked repositories
  • Accounts asking about it through MCP, last 7 daysNot available
  • Hot votes this weekAhead of 0% of tracked repositories

Heat never changes the order by stars, and sponsorship never touches it. How heat works

Stars over time

Aug 2, 2026Nov 7, 20261,026

Individual skills in this repository

How it works

seo

When your agent uses it

Deterministic LLM-first SEO audits for websites, blog posts, and GitHub repositories. Use this when the user asks to "perform SEO analysis", "run SEO audit", "analyze SEO", "check technical SEO", "review schema", "Core Web Vitals", "E-E-A-T", "hreflang", "GEO", "AEO", or GitHub repository SEO optimization. For full/page/repo audits, run bundled scripts for evidence and return prioritized, confidence-labeled fixes.

What it loads into context

Frontmatter

121 tokens

Always available to the agent

SKILL.md

4,849 tokens

When the skill is activated

Reference documents

77,553 tokens

Loaded on request

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

The playbook

  1. Deterministic Trigger Mapping
  2. Available Commands
  3. Orchestration Logic
  4. Industry Detection
  5. Schema Templates
  6. Validation Scripts
  7. Output Format
  8. Critical Rules
  9. Dependencies

Scripts executed separately

  • install.ps1
  • install.sh
  • scripts/__init__.py
  • scripts/a11y_seo_checker.py
  • scripts/ai_crawler_policy_matrix.py
  • scripts/analyze_visual.py
  • scripts/anchor_text_audit.py
  • scripts/answer_block_scanner.py
  • scripts/article_seo.py
  • scripts/audit_runner.py
  • scripts/broken_links.py
  • scripts/cache_compression_checker.py
  • scripts/canonical_checker.py
  • scripts/capture_screenshot.py
  • scripts/citation_readiness.py
  • scripts/collection_page_checker.py
  • scripts/competitor_gap.py
  • scripts/content_decay_detector.py
  • scripts/content_intent_matcher.py
  • scripts/crawl_audit.py
  • scripts/critical_request_chain.py
  • scripts/duplicate_content.py
  • scripts/eeat_signal_checker.py
  • scripts/entity_checker.py
  • scripts/env_loader.py
  • scripts/external_link_quality.py
  • scripts/faceted_nav_audit.py
  • scripts/fetch_page.py
  • scripts/finding_verifier.py
  • scripts/font_audit.py
  • scripts/freshness_checker.py
  • scripts/generate_report.py
  • scripts/github_api.py
  • scripts/github_community_health.py
  • scripts/github_competitor_research.py
  • scripts/github_readme_lint.py
  • scripts/github_repo_audit.py
  • scripts/github_search_benchmark.py
  • scripts/github_seo_report.py
  • scripts/github_traffic_archiver.py
  • scripts/github_weekly_scorecard.py
  • scripts/gsc_checker.py
  • scripts/hreflang_checker.py
  • scripts/hreflang_sitemap_validator.py
  • scripts/image_inventory.py
  • scripts/image_weight_audit.py
  • scripts/indexability_matrix.py
  • scripts/indexnow_checker.py
  • scripts/internal_links.py
  • scripts/javascript_render_audit.py
  • scripts/lcp_subparts.py
  • scripts/lib/__init__.py
  • scripts/lib/safe_http.py
  • scripts/lighthouse_runner.py
  • scripts/link_profile.py
  • scripts/llms_txt_checker.py
  • scripts/llms_txt_generator.py
  • scripts/local_seo_checker.py
  • scripts/log_file_analyzer.py
  • scripts/mobile_render_checker.py
  • scripts/orphan_pages_from_sitemap.py
  • scripts/pagespeed.py
  • scripts/parse_html.py
  • scripts/pre_commit_seo_check.sh
  • scripts/product_schema_checker.py
  • scripts/readability.py
  • scripts/redirect_backlink_reclaim.py
  • scripts/redirect_checker.py
  • scripts/reference_freshness.py
  • scripts/repo_docs_site_checker.py
  • scripts/repo_file_inventory.py
  • scripts/repo_release_seo.py
  • scripts/repo_social_preview_checker.py
  • scripts/repo_topic_suggester.py
  • scripts/review_schema_checker.py
  • scripts/rich_results_guard.py
  • scripts/robots_checker.py
  • scripts/robots_path_tester.py
  • scripts/schema_diff.py
  • scripts/schema_required_props.py
  • scripts/schema_template_generator.py
  • scripts/security_headers.py
  • scripts/seo_common.py
  • scripts/sitemap_checker.py
  • scripts/sitemap_generator.py
  • scripts/social_meta.py
  • scripts/third_party_script_audit.py
  • scripts/topical_cluster_mapper.py
  • scripts/url_quality.py
  • scripts/validate_schema.py
  • scripts/validate_skill_inventory.py
  • scripts/video_schema_checker.py
  • scripts/visual_regression_snapshot.py
  • scripts/x_robots_header_checker.py
  • tests/test_content_ai_scripts.py
  • tests/test_core_seo_scripts.py
  • tests/test_duplicate_content.py
  • tests/test_link_and_github_depth_scripts.py
  • tests/test_pagespeed.py
  • tests/test_performance_scripts.py
  • tests/test_readability.py
  • tests/test_reporting.py
  • tests/test_schema_local_ecommerce_scripts.py

Files

  • .env.exampleasset2,039 bytes
  • .github/CODEOWNERSasset17 bytes
  • .github/ISSUE_TEMPLATE/bug_report.mddoc309 bytes
  • .github/ISSUE_TEMPLATE/feature_request.mddoc250 bytes
  • .github/dependabot.ymlasset270 bytes
  • .github/pull_request_template.mddoc437 bytes
  • .github/workflows/ci.ymlasset609 bytes
  • .github/workflows/package-on-tag.ymlasset2,136 bytes
  • .gitignoreasset497 bytes
  • CHANGELOG.mddoc1,692 bytes
  • CITATION.cffasset616 bytes
  • CODE_OF_CONDUCT.mddoc870 bytes
  • CONTRIBUTING.mddoc1,560 bytes
  • LICENSEasset1,103 bytes
  • README.mddoc27,922 bytes
  • SECURITY.mddoc1,025 bytes
  • SKILL.mdcore19,845 bytes
  • SKILL.mdcore19,845 bytes
  • SKILL.mdcore19,845 bytes
  • SKILL.mdcore19,845 bytes
  • SKILL.mdcore19,845 bytes
  • SKILL.mdcore19,845 bytes
  • SKILL.mdcore19,845 bytes
  • SKILL.mdcore19,845 bytes
  • SKILL.mdcore19,845 bytes
  • SKILL.mdcore19,845 bytes
  • SKILL.mdcore19,845 bytes
  • SKILL.mdcore19,845 bytes
  • SKILL.mdcore19,845 bytes
  • SKILL.mdcore19,845 bytes
  • SKILL.mdcore19,845 bytes
  • SUPPORT.mddoc576 bytes
  • docs/images/example-prompt-output.pngasset75,771 bytes
  • docs/images/report-dashboard.pngasset232,849 bytes
  • improvements.mddoc34,371 bytes
  • install.ps1runs39,122 bytes
  • install.shruns27,368 bytes
  • pyproject.tomlasset860 bytes
  • requirements.txtdoc190 bytes
  • resources/agents/seo-content.mddoc5,814 bytes
  • resources/agents/seo-github-analyst.mddoc1,764 bytes
  • resources/agents/seo-github-benchmark.mddoc1,275 bytes
  • resources/agents/seo-github-data.mddoc1,314 bytes
  • resources/agents/seo-performance.mddoc5,012 bytes
  • resources/agents/seo-schema.mddoc4,279 bytes
  • resources/agents/seo-sitemap.mddoc4,583 bytes
  • resources/agents/seo-technical.mddoc5,076 bytes
  • resources/agents/seo-verifier.mddoc1,207 bytes
  • resources/agents/seo-visual.mddoc5,150 bytes
  • resources/config/scoring.jsonasset1,313 bytes
  • resources/references/cwv-thresholds.mddoc5,183 bytes
  • resources/references/eeat-framework.mddoc7,503 bytes
  • resources/references/github-api-ops.mddoc1,799 bytes
  • resources/references/github-ranking-factors.mddoc1,833 bytes
  • resources/references/google-seo-reference.mddoc7,766 bytes
  • resources/references/link-building.mddoc5,965 bytes
  • resources/references/llm-audit-rubric.mddoc5,050 bytes
  • resources/references/quality-gates.mddoc5,240 bytes
  • resources/references/readme-audit-rubric.mddoc1,795 bytes
  • resources/references/schema-types.mddoc5,949 bytes
  • resources/schema/templates.jsonasset12,733 bytes
  • resources/skills/seo-aeo.mddoc6,633 bytes
  • resources/skills/seo-article.mddoc1,984 bytes
  • resources/skills/seo-audit.mddoc3,614 bytes
  • resources/skills/seo-competitor-pages.mddoc6,960 bytes
  • resources/skills/seo-content.mddoc7,083 bytes
  • resources/skills/seo-geo.mddoc8,692 bytes
  • resources/skills/seo-github.mddoc4,775 bytes
  • resources/skills/seo-hreflang.mddoc7,986 bytes
  • resources/skills/seo-images.mddoc5,457 bytes
  • resources/skills/seo-links.mddoc4,442 bytes
  • resources/skills/seo-page.mddoc4,023 bytes
  • resources/skills/seo-plan.mddoc5,917 bytes
  • resources/skills/seo-programmatic.mddoc8,007 bytes
  • resources/skills/seo-schema.mddoc5,101 bytes
  • resources/skills/seo-sitemap.mddoc3,686 bytes
  • resources/skills/seo-technical.mddoc9,280 bytes
  • resources/templates/agency.mddoc4,522 bytes
  • resources/templates/blog-post.mddoc2,546 bytes
  • resources/templates/ecommerce.mddoc4,888 bytes
  • resources/templates/generic.mddoc4,171 bytes
  • resources/templates/github-seo-report.mddoc866 bytes
  • resources/templates/github-weekly-scorecard.mddoc954 bytes
  • resources/templates/local-service.mddoc5,446 bytes
  • resources/templates/news-article.mddoc2,354 bytes
  • resources/templates/publisher.mddoc4,568 bytes
  • resources/templates/saas.mddoc4,487 bytes
  • resources/templates/technical-article.mddoc2,415 bytes
  • scripts/__init__.pyruns34 bytes
  • scripts/a11y_seo_checker.pyruns3,440 bytes
  • scripts/ai_crawler_policy_matrix.pyruns2,220 bytes
  • scripts/analyze_visual.pyruns6,629 bytes
  • scripts/anchor_text_audit.pyruns7,930 bytes
  • scripts/answer_block_scanner.pyruns3,986 bytes
  • scripts/article_seo.pyruns27,770 bytes
  • scripts/audit_runner.pyruns3,171 bytes
  • scripts/broken_links.pyruns8,510 bytes
  • scripts/cache_compression_checker.pyruns6,818 bytes
  • scripts/canonical_checker.pyruns3,511 bytes
  • scripts/capture_screenshot.pyruns4,490 bytes
  • scripts/citation_readiness.pyruns5,247 bytes
  • scripts/collection_page_checker.pyruns4,303 bytes
  • scripts/competitor_gap.pyruns10,475 bytes
  • scripts/content_decay_detector.pyruns6,329 bytes
  • scripts/content_intent_matcher.pyruns5,554 bytes
  • scripts/crawl_audit.pyruns7,355 bytes
  • scripts/critical_request_chain.pyruns4,890 bytes
  • scripts/duplicate_content.pyruns14,300 bytes
  • scripts/eeat_signal_checker.pyruns5,616 bytes
  • scripts/entity_checker.pyruns19,843 bytes
  • scripts/env_loader.pyruns3,642 bytes
  • scripts/external_link_quality.pyruns6,732 bytes
  • scripts/faceted_nav_audit.pyruns3,404 bytes
  • scripts/fetch_page.pyruns3,721 bytes
  • scripts/finding_verifier.pyruns4,976 bytes
  • scripts/font_audit.pyruns6,048 bytes
  • scripts/freshness_checker.pyruns6,344 bytes
  • scripts/generate_report.pyruns82,657 bytes
  • scripts/github_api.pyruns13,081 bytes
  • scripts/github_community_health.pyruns9,068 bytes
  • scripts/github_competitor_research.pyruns17,567 bytes
  • scripts/github_readme_lint.pyruns15,245 bytes
  • scripts/github_repo_audit.pyruns21,464 bytes
  • scripts/github_search_benchmark.pyruns7,902 bytes
  • scripts/github_seo_report.pyruns32,814 bytes
  • scripts/github_traffic_archiver.pyruns6,481 bytes
  • scripts/github_weekly_scorecard.pyruns4,532 bytes
  • scripts/gsc_checker.pyruns11,695 bytes
  • scripts/hreflang_checker.pyruns24,738 bytes
  • scripts/hreflang_sitemap_validator.pyruns6,527 bytes
  • scripts/image_inventory.pyruns2,900 bytes
  • scripts/image_weight_audit.pyruns4,875 bytes
  • scripts/indexability_matrix.pyruns3,576 bytes
  • scripts/indexnow_checker.pyruns9,578 bytes
  • scripts/internal_links.pyruns10,724 bytes
  • scripts/javascript_render_audit.pyruns2,984 bytes
  • scripts/lcp_subparts.pyruns7,505 bytes
  • scripts/lib/__init__.pyruns46 bytes
  • scripts/lib/safe_http.pyruns6,260 bytes
  • scripts/lighthouse_runner.pyruns6,096 bytes
  • scripts/link_profile.pyruns12,851 bytes
  • scripts/llms_txt_checker.pyruns7,638 bytes
  • scripts/llms_txt_generator.pyruns2,990 bytes
  • scripts/local_seo_checker.pyruns3,738 bytes
  • scripts/log_file_analyzer.pyruns6,137 bytes
  • scripts/mobile_render_checker.pyruns7,070 bytes
  • scripts/orphan_pages_from_sitemap.pyruns6,352 bytes
  • scripts/pagespeed.pyruns13,253 bytes
  • scripts/parse_html.pyruns12,493 bytes
  • scripts/pre_commit_seo_check.shruns2,972 bytes
  • scripts/product_schema_checker.pyruns4,971 bytes
  • scripts/readability.pyruns14,799 bytes
  • scripts/redirect_backlink_reclaim.pyruns5,811 bytes
  • scripts/redirect_checker.pyruns6,341 bytes
  • scripts/reference_freshness.pyruns2,979 bytes
  • scripts/repo_docs_site_checker.pyruns5,885 bytes
  • scripts/repo_file_inventory.pyruns3,674 bytes
  • scripts/repo_release_seo.pyruns6,720 bytes
  • scripts/repo_social_preview_checker.pyruns4,167 bytes
  • scripts/repo_topic_suggester.pyruns6,445 bytes
  • scripts/review_schema_checker.pyruns4,054 bytes
  • scripts/rich_results_guard.pyruns3,524 bytes
  • scripts/robots_checker.pyruns7,415 bytes
  • scripts/robots_path_tester.pyruns1,831 bytes
  • scripts/schema_diff.pyruns3,127 bytes
  • scripts/schema_required_props.pyruns8,311 bytes
  • scripts/schema_template_generator.pyruns5,481 bytes
  • scripts/security_headers.pyruns6,961 bytes
  • scripts/seo_common.pyruns14,429 bytes
  • scripts/sitemap_checker.pyruns6,623 bytes
  • scripts/sitemap_generator.pyruns3,503 bytes
  • scripts/social_meta.pyruns8,912 bytes
  • scripts/third_party_script_audit.pyruns4,804 bytes
  • scripts/topical_cluster_mapper.pyruns6,549 bytes
  • scripts/url_quality.pyruns2,567 bytes
  • scripts/validate_schema.pyruns4,387 bytes
  • scripts/validate_skill_inventory.pyruns4,876 bytes
  • scripts/video_schema_checker.pyruns3,706 bytes
  • scripts/visual_regression_snapshot.pyruns5,455 bytes
  • scripts/x_robots_header_checker.pyruns2,049 bytes
  • tests/fixtures/pagespeed_field_data.jsonasset945 bytes
  • tests/fixtures/pagespeed_lab_data.jsonasset810 bytes
  • tests/fixtures/report_data.jsonasset2,136 bytes
  • tests/test_content_ai_scripts.pyruns5,021 bytes
  • tests/test_core_seo_scripts.pyruns1,824 bytes
  • tests/test_duplicate_content.pyruns2,908 bytes
  • tests/test_link_and_github_depth_scripts.pyruns2,545 bytes
  • tests/test_pagespeed.pyruns3,432 bytes
  • tests/test_performance_scripts.pyruns4,088 bytes
  • tests/test_readability.pyruns1,387 bytes
  • tests/test_reporting.pyruns1,958 bytes
  • tests/test_schema_local_ecommerce_scripts.pyruns2,408 bytes
  • wiki/Audit-Workflow.mddoc2,283 bytes
  • wiki/Command-Reference.mddoc1,733 bytes
  • wiki/Example-Prompts.mddoc12,989 bytes
  • wiki/Home.mddoc5,916 bytes
  • wiki/Installation.mddoc8,432 bytes
  • wiki/Release-and-Packaging.mddoc1,136 bytes
  • wiki/Reports-and-Outputs.mddoc6,242 bytes
  • wiki/Script-Inventory.mddoc11,551 bytes
  • wiki/Troubleshooting.mddoc1,677 bytes
  • wiki/_Sidebar.mddoc218 bytes
Read SKILL.md

# SEO Skill (Agentic / Claude / Codex)

LLM-first SEO analysis skill with 16 specialized sub-skills, 10 specialist agents, and 89 scripts for website, blog, and GitHub repository optimization.

## Deterministic Trigger Mapping

For prompt reliability in Codex/agent IDEs, map common user wording to a fixed workflow:

- If user says `perform seo analysis on <url>` (or similar generic SEO request with a URL), treat it as a **single-URL full audit**.
- If no explicit sub-skill is specified, run the full/page audit path with **LLM-first reasoning** and script-backed evidence.
- For full/page audits, always produce:
  - `FULL-AUDIT-REPORT.md` (detailed findings)
  - `ACTION-PLAN.md` (prioritized fixes)
- If `generate_report.py` is run, also return the saved HTML path (for example `SEO-REPORT.html`).
View the complete source on GitHub

Skills included

  • seo

Repository facts

License
MIT
Created
Mar 2, 2026
Last pushed
Oct 14, 2026
Forks
152
Open issues
5
Project activity
Active

Rank over the last 12 weeks

Now #880 · best #620 · down 116 in 30 days

  1. #866 on Nov 2
  2. #871 on Nov 3
  3. #875 on Nov 4
  4. #876 on Nov 5
  5. #877 on Nov 6
  6. #880 since Nov 7
72 earlier periods
  1. #621 on Aug 2
  2. #609 on Aug 8
  3. #620 on Aug 9
  4. #646 on Aug 10
  5. #654 on Aug 11
  6. #650 on Aug 12
  7. #644 on Aug 14
  8. #624 on Aug 15
  9. #637 on Aug 16
  10. #646 on Aug 17
  11. #659 on Aug 18
  12. #644 on Aug 20
  13. #649 on Aug 21
  14. #620 on Aug 22
  15. #650 on Aug 23
  16. #664 on Aug 24
  17. #669 on Aug 25
  18. #654 on Aug 26
  19. #659 on Aug 27
  20. #682 on Aug 28
  21. #633 on Aug 29
  22. #634 on Aug 30
  23. #663 on Aug 31
  24. #676 on Sep 1
  25. #661 on Sep 2
  26. #666 on Sep 3
  27. #657 on Sep 6
  28. #693 on Sep 8
  29. #681 from Sep 9 to Sep 10
  30. #668 on Sep 11
  31. #671 on Sep 12
  32. #670 on Sep 13
  33. #692 on Sep 14
  34. #681 on Sep 15
  35. #693 on Sep 16
  36. #694 on Sep 17
  37. #663 on Sep 19
  38. #677 on Sep 20
  39. #692 on Sep 21
  40. #710 on Sep 22
  41. #702 on Sep 23
  42. #675 on Sep 24
  43. #661 on Sep 25
  44. #663 on Sep 26
  45. #695 on Sep 27
  46. #700 on Sep 28
  47. #719 on Sep 30
  48. #689 on Oct 2
  49. #667 on Oct 3
  50. #706 on Oct 5
  51. #714 on Oct 6
  52. #723 on Oct 7
  53. #764 on Oct 8
  54. #727 on Oct 9
  55. #712 on Oct 10
  56. #714 on Oct 11
  57. #732 on Oct 12
  58. #737 on Oct 13
  59. #748 on Oct 14
  60. #739 on Oct 15
  61. #743 on Oct 16
  62. #723 on Oct 17
  63. #757 on Oct 20
  64. #766 on Oct 21
  65. #750 on Oct 23
  66. #712 on Oct 24
  67. #843 on Oct 25
  68. #851 on Oct 28
  69. #855 on Oct 29
  70. #857 on Oct 30
  71. #858 on Oct 31
  72. #860 on Nov 1

Before you install

Network or broad shell

Automated signals, not a guarantee

Checked Nov 4, 2026

Not fully analyzed: some files were too long, unreadable or missing. This never lowers the level.

Show 14 notes
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
Show all 841 signals by file

.env.example

  • Network accessline 11
    # Google PageSpeed Insights (scripts/pagespeed.py, scripts/generate_report.py) # --------------------------------------------------------------------------- # Get one at https://console.cloud.google.com/ → enable "PageSpeed Insights API".
  • Network accessline 12
    # --------------------------------------------------------------------------- # Get one at https://console.cloud.google.com/ → enable "PageSpeed Insights API". # Without a key the public PSI endpoint works but is heavily rate-limited.
  • Network accessline 13
    # Get one at https://console.cloud.google.com/ → enable "PageSpeed Insights API".
  • Access to secretsline 15
    [Credential-related source omitted]
  • Network accessline 18
    # Google Knowledge Graph (scripts/entity_checker.py) # --------------------------------------------------------------------------- # Get one at https://console.cloud.google.com/ → enable "Knowledge Graph Search API".
  • Network accessline 19
    [Credential-related source omitted]
  • Network accessline 20
    # Get one at https://console.cloud.google.com/ → enable "Knowledge Graph Search API".
  • Access to secretsline 21
    [Credential-related source omitted]
  • Access to secretsline 25
    [Credential-related source omitted]

.gitignore

  • Access to secretsline 35
    [Credential-related source omitted]

CITATION.cff

  • Network accessline 5
    authors:   - family-names: "Bhanunamikaze" repository-code: "https://github.com/Bhanunamikaze/Agentic-SEO-Skill"
  • Network accessline 6
    - family-names: "Bhanunamikaze" repository-code: "https://github.com/Bhanunamikaze/Agentic-SEO-Skill" url: "https://github.com/Bhanunamikaze/Agentic-SEO-Skill"
  • Network accessline 7
    repository-code: "https://github.com/Bhanunamikaze/Agentic-SEO-Skill"
  • Network accessline 8
    url: "https://github.com/Bhanunamikaze/Agentic-SEO-Skill"

README.md

  • Network accessline 5
    For detailed installation guidance, example prompts, report generation, troubleshooting, and the full script inventory, see the **[Agentic SEO Skill Wiki](https://github.com/Bhanunamikaze/Agentic-SEO-Skill/wiki)**.
  • Network accessline 38
    The README only highlights the scripts most users reach for first. See the full 89-script list with purpose notes in the [Script Inventory wiki](https://github.com/Bhanunamikaze/Agentic-SEO-Skill/wiki/Script-Inventory).
  • Network accessline 151
    # Default: installs to every target at once curl -fsSL https://raw.githubusercontent.com/Bhanunamikaze/Agentic-SEO-Skill/main/install.sh | bash -s -- --online
  • Dangerous shell operationline 152
    curl -fsSL https://raw.githubusercontent.com/Bhanunamikaze/Agentic-SEO-Skill/main/install.sh | bash -s -- --online
  • Network accessline 152
    curl -fsSL https://raw.githubusercontent.com/Bhanunamikaze/Agentic-SEO-Skill/main/install.sh | bash -s -- --online
  • Network accessline 154
    # Claude Code only curl -fsSL https://raw.githubusercontent.com/Bhanunamikaze/Agentic-SEO-Skill/main/install.sh | bash -s -- --online --target claude
  • Dangerous shell operationline 155
    curl -fsSL https://raw.githubusercontent.com/Bhanunamikaze/Agentic-SEO-Skill/main/install.sh | bash -s -- --online --target claude
  • Network accessline 155
    curl -fsSL https://raw.githubusercontent.com/Bhanunamikaze/Agentic-SEO-Skill/main/install.sh | bash -s -- --online --target claude
  • Network accessline 157
    # User-wide (Claude + Codex) curl -fsSL https://raw.githubusercontent.com/Bhanunamikaze/Agentic-SEO-Skill/main/install.sh | bash -s -- --online --target global
  • Dangerous shell operationline 158
    curl -fsSL https://raw.githubusercontent.com/Bhanunamikaze/Agentic-SEO-Skill/main/install.sh | bash -s -- --online --target global
  • Network accessline 158
    curl -fsSL https://raw.githubusercontent.com/Bhanunamikaze/Agentic-SEO-Skill/main/install.sh | bash -s -- --online --target global
  • Network accessline 160
    # Every target, scoped to a project curl -fsSL https://raw.githubusercontent.com/Bhanunamikaze/Agentic-SEO-Skill/main/install.sh | bash -s -- --online --target all --project-dir /path/to/your/project
  • Dangerous shell operationline 161
    curl -fsSL https://raw.githubusercontent.com/Bhanunamikaze/Agentic-SEO-Skill/main/install.sh | bash -s -- --online --target all --project-dir /path/to/your/project
  • Network accessline 161
    curl -fsSL https://raw.githubusercontent.com/Bhanunamikaze/Agentic-SEO-Skill/main/install.sh | bash -s -- --online --target all --project-dir /path/to/your/project
  • Network accessline 166
    # Download installer, then run with --online irm https://raw.githubusercontent.com/Bhanunamikaze/Agentic-SEO-Skill/main/install.ps1 -OutFile install.ps1
  • Network accessline 167
    irm https://raw.githubusercontent.com/Bhanunamikaze/Agentic-SEO-Skill/main/install.ps1 -OutFile install.ps1
  • Network accessline 182
    git clone https://github.com/Bhanunamikaze/Agentic-SEO-Skill.git
  • Network accessline 234
    curl -fsSLO https://raw.githubusercontent.com/Bhanunamikaze/Agentic-SEO-Skill/main/install.sh
  • Network accessline 280
    For expanded copy-paste prompt templates across full audits, technical SEO, schema, content, GEO/AEO, local SEO, ecommerce, and GitHub SEO, see the [Example Prompts wiki](https://github.com/Bhanunamikaze/Agentic-SEO-Skill/wiki/Example-Promp
  • Network accessline 326
    Run a full SEO audit for https://hackingdream.net and prioritize fixes by impact.
  • Network accessline 332
    Analyze this article: https://www.hackingdream.net/2026/02/cobalt-strike-beacon-commands-red-team-field-guide.html
  • Network accessline 336
    Do a single-page SEO analysis of https://hackingdream.net and show critical issues first.
  • Network accessline 342
    Analyze technical SEO for https://hackingdream.net (robots, crawlability, canonicals, redirects, headers).
  • Network accessline 348
    Review content quality and E-E-A-T signals on https://hackingdream.net and suggest concrete rewrites.
  • Network accessline 354
    Check schema markup on https://hackingdream.net, validate errors, and generate corrected JSON-LD.
  • Network accessline 360
    Run Core Web Vitals analysis on https://hackingdream.net and break down LCP subparts.
  • Network accessline 366
    Evaluate GEO readiness for https://hackingdream.net (AI crawler access, llms.txt, citation structure).
  • Network accessline 372
    Analyze AEO signals for https://hackingdream.net — Featured Snippet targeting, PAA optimization, Knowledge Panel readiness.
  • Network accessline 378
    Analyze internal link structure and backlink profile for https://hackingdream.net.
  • Network accessline 384
    Check entity SEO for https://hackingdream.net — Wikidata presence, sameAs links, Knowledge Graph signals.
  • Network accessline 390
    Find content gaps between https://hackingdream.net and competitors https://hackerone.com https://portswigger.net.
  • Network accessline 396
    Validate hreflang implementation on https://hackingdream.net — BCP-47 tags, bidirectional links, x-default.
  • Network accessline 402
    Check IndexNow implementation for https://hackingdream.net with key abc123def456.
  • Network accessline 408
    Create a topical authority cluster plan for https://hackingdream.net covering cybersecurity topics.
  • Network accessline 414
    Pull GSC performance data for https://hackingdream.net and identify striking-distance keywords.
  • Network accessline 420
    Audit sitemap quality for https://hackingdream.net and flag missing, redirected, or noindex URLs.
  • Network accessline 426
    Run image SEO checks for https://hackingdream.net (alt text, lazy loading, dimensions, format suggestions).
  • Network accessline 432
    Create a 6-month SEO strategy for https://hackingdream.net with milestones and KPIs.
  • Network accessline 438
    Take desktop and mobile screenshots of https://hackingdream.net and analyze above-the-fold content.
  • Network accessline 448
    Run a complete SEO audit on https://hackingdream.net — include technical, content, schema, performance,
  • Network accessline 467
    Run a full SEO audit for https://hackingdream.net and produce a prioritized action plan with evidence for each finding.
  • Network accessline 473
    python3 scripts/generate_report.py "https://hackingdream.net" --output seo-report-hackingdream.html
  • Access to secretsline 498
    [Credential-related source omitted]
  • Access to secretsline 499
    [Credential-related source omitted]
  • Network accessline 504
    | Variable | Used by | How to get one | |---|---|---| | `PAGESPEED_API_KEY` | `pagespeed.py`, `generate_report.py` | [Google Cloud Console](https://console.cloud.google.com/) → enable "PageSpeed Insights API" |
  • Network accessline 505
    |---|---|---| | `PAGESPEED_API_KEY` | `pagespeed.py`, `generate_report.py` | [Google Cloud Console](https://console.cloud.google.com/) → enable "PageSpeed Insights API" | | `GOOGLE_KG_API_KEY` | `entity_checker.py` | Same console → enable "
  • Network accessline 506
    [Credential-related source omitted]
  • Access to secretsline 506
    [Credential-related source omitted]
  • Access to secretsline 507
    [Credential-related source omitted]
  • Access to secretsline 513
    [Credential-related source omitted]
  • Network accessline 518
    # Example target URL="https://example.com"
  • Network accessline 519
    URL="https://example.com"
  • Network accessline 550
    python3 scripts/duplicate_content.py "$URL" --json python3 scripts/link_profile.py "$URL" --json python3 scripts/competitor_gap.py "$URL" --competitor https://competitor.com --json
  • Network accessline 551
    python3 scripts/link_profile.py "$URL" --json python3 scripts/competitor_gap.py "$URL" --competitor https://competitor.com --json python3 scripts/faceted_nav_audit.py "$URL" --json
  • Network accessline 552
    python3 scripts/competitor_gap.py "$URL" --competitor https://competitor.com --json
  • Network accessline 611
    This project was originally inspired by **[claude-seo](https://github.com/AgriciDaniel/claude-seo)** by **[AgriciDaniel](https://github.com/AgriciDaniel)**.
  • Network accessline 621
    Earlier inspiration and some concepts trace back to [claude-seo](https://github.com/AgriciDaniel/claude-seo), which is also MIT-licensed.

SKILL.md

  • Access to secretsline 143
    [Credential-related source omitted]

improvements.md

  • Network accessline 16
    | P1       | Scoring weights are inconsistent.                                                                                    | `SKILL.md` and `seo-audit.md` define canonical weights.   `generate_report.py` has its own category weights.
  • Network accessline 17
    | P1       | Network safety is inconsistent across scripts.                                                                       | `fetch_page.py` has SSRF prevention for the initial URL.  `analyze_visual.py` also blocks private/internal I
  • Network accessline 18
    | P1       | `fetch_page.py` still uses the upstream project’s old user agent.                                                    | User-Agent says `ClaudeSEO/1.0; +https://github.com/AgriciDaniel/claude-seo`.                               

install.ps1

  • Executable scriptline 1
    #!/usr/bin/env pwsh
  • Network accessline 5
    $REPO_URL        = if ($env:REPO_URL) { $env:REPO_URL } else { 'https://github.com/Bhanunamikaze/Agentic-SEO-Skill.git' }
  • Network accessline 606
    try {         $releaseInfo = Invoke-RestMethod `             -Uri "https://api.github.com/repos/$GITHUB_REPO/releases/latest" `
  • Network accessline 607
    $releaseInfo = Invoke-RestMethod              -Uri "https://api.github.com/repos/$GITHUB_REPO/releases/latest"
  • Network accessline 608
    -Uri "https://api.github.com/repos/$GITHUB_REPO/releases/latest" `
  • Network accessline 621
    }             else {                 $downloadUrl  = "https://github.com/$GITHUB_REPO/archive/refs/tags/$latestTag.zip"
  • Network accessline 622
    else {                 $downloadUrl  = "https://github.com/$GITHUB_REPO/archive/refs/tags/$latestTag.zip"                 $downloadDesc = "source archive for tag $latestTag"
  • Network accessline 623
    $downloadUrl  = "https://github.com/$GITHUB_REPO/archive/refs/tags/$latestTag.zip"
  • Network accessline 630
    }     if (-not $downloadUrl) {         $downloadUrl  = "https://github.com/$GITHUB_REPO/archive/refs/heads/$GITHUB_REF.zip"
  • Network accessline 631
    if (-not $downloadUrl) {         $downloadUrl  = "https://github.com/$GITHUB_REPO/archive/refs/heads/$GITHUB_REF.zip"         $downloadDesc = "branch archive: $GITHUB_REF"
  • Network accessline 632
    $downloadUrl  = "https://github.com/$GITHUB_REPO/archive/refs/heads/$GITHUB_REF.zip"
  • Network accessline 689
    $gitCmd = Get-Command -Name 'git' -CommandType Application -ErrorAction SilentlyContinue | Select-Object -First 1         if (-not $gitCmd) {             throw "Error: git executable not found on PATH. Install Git for Windows (https://git-s
  • Network accessline 690
    if (-not $gitCmd) {             throw "Error: git executable not found on PATH. Install Git for Windows (https://git-scm.com/download/win) or pass --online to download a release archive instead."         }
  • Network accessline 691
    throw "Error: git executable not found on PATH. Install Git for Windows (https://git-scm.com/download/win) or pass --online to download a release archive instead."
  • Network accessline 827
    Write-Host 'Next steps:'     Write-Host '  1. Restart your IDE/agent session to pick up the skill.'     Write-Host "  2. Ask: 'perform seo analysis on https://example.com'"
  • Network accessline 828
    Write-Host '  1. Restart your IDE/agent session to pick up the skill.'     Write-Host "  2. Ask: 'perform seo analysis on https://example.com'"     Write-Host "  3. Or:  'seo github https://github.com/owner/repo'"
  • Network accessline 829
    Write-Host "  2. Ask: 'perform seo analysis on https://example.com'"
  • Network accessline 830
    Write-Host "  3. Or:  'seo github https://github.com/owner/repo'"

install.sh

  • Executable scriptline 1
    #!/usr/bin/env bash
  • Network accessline 5
    REPO_URL="${REPO_URL:-https://github.com/Bhanunamikaze/Agentic-SEO-Skill.git}"
  • Network accessline 86
    Safer remote install:   curl -fsSLO https://raw.githubusercontent.com/Bhanunamikaze/Agentic-SEO-Skill/main/install.sh
  • Network accessline 87
    curl -fsSLO https://raw.githubusercontent.com/Bhanunamikaze/Agentic-SEO-Skill/main/install.sh
  • Dangerous shell operationline 94
    rm -rf "${TEMP_DIR}"
  • Dangerous shell operationline 140
    rm -rf "${dest}"
  • Dangerous shell operationline 183
    find "${dest}" -type d -name "__pycache__" -prune -exec rm -rf {} + 2>/dev/null || true
  • Dangerous shell operationline 184
    find "${dest}" -type f -name "*.pyc" -delete 2>/dev/null || true
  • Dangerous shell operationline 185
    find "${dest}" -type f -name "seo-report-*.html" -delete 2>/dev/null || true
  • Dangerous shell operationline 439
    rm -rf "${build_dir}"
  • Dangerous shell operationline 464
    rm -rf "${build_dir}"
  • Network accessline 548
    if [[ "${ONLINE_MODE}" -eq 1 ]]; then     require_cmd curl     require_cmd tar
  • Network accessline 549
    require_cmd curl     require_cmd tar     TEMP_DIR="$(mktemp -d)"
  • Network accessline 560
    echo "Fetching latest release info from ${GITHUB_REPO}..."     RELEASE_JSON=$(curl -fsSL "https://api.github.com/repos/${GITHUB_REPO}/releases/latest" 2>/dev/null || true)
  • Network accessline 561
    RELEASE_JSON=$(curl -fsSL "https://api.github.com/repos/${GITHUB_REPO}/releases/latest" 2>/dev/null || true)
  • Network accessline 576
    DOWNLOAD_DESC="release asset: $(basename "${ASSET_URL}")"         else             DOWNLOAD_URL="https://github.com/${GITHUB_REPO}/archive/refs/tags/${LATEST_TAG}.tar.gz"
  • Network accessline 577
    else             DOWNLOAD_URL="https://github.com/${GITHUB_REPO}/archive/refs/tags/${LATEST_TAG}.tar.gz"             DOWNLOAD_DESC="source archive for tag ${LATEST_TAG}"
  • Network accessline 578
    DOWNLOAD_URL="https://github.com/${GITHUB_REPO}/archive/refs/tags/${LATEST_TAG}.tar.gz"
  • Network accessline 580
    fi     fi     if [[ -z "${DOWNLOAD_URL}" ]]; then
  • Network accessline 581
    fi     if [[ -z "${DOWNLOAD_URL}" ]]; then         DOWNLOAD_URL="https://github.com/${GITHUB_REPO}/archive/refs/heads/${GITHUB_REF}.tar.gz"
  • Network accessline 582
    if [[ -z "${DOWNLOAD_URL}" ]]; then
  • Network accessline 583
    DOWNLOAD_URL="https://github.com/${GITHUB_REPO}/archive/refs/heads/${GITHUB_REF}.tar.gz"
  • Network accessline 585
    fi     echo "  Downloading ${DOWNLOAD_DESC}..."     if ! curl -fsSL -o "${PKG}" "${DOWNLOAD_URL}"; then
  • Network accessline 586
    echo "  Downloading ${DOWNLOAD_DESC}..."     if ! curl -fsSL -o "${PKG}" "${DOWNLOAD_URL}"; then         echo "Error: download failed: ${DOWNLOAD_URL}" >&2
  • Network accessline 587
    if ! curl -fsSL -o "${PKG}" "${DOWNLOAD_URL}"; then
  • Network accessline 588
    echo "Error: download failed: ${DOWNLOAD_URL}" >&2
  • Dangerous shell operationline 595
    rm -f "${PKG}"
  • Network accessline 610
    if [[ -z "${SRC_DIR}" ]]; then             echo "Error: downloaded archive did not contain SKILL.md." >&2             echo "  Source URL: ${DOWNLOAD_URL}" >&2
  • Network accessline 611
    echo "Error: downloaded archive did not contain SKILL.md." >&2             echo "  Source URL: ${DOWNLOAD_URL}" >&2             echo "  Extract dir: ${EXTRACT_DIR}" >&2
  • Network accessline 612
    echo "  Source URL: ${DOWNLOAD_URL}" >&2
  • Network accessline 636
    require_cmd git     TEMP_DIR="$(mktemp -d)"     echo "Cloning source repo: ${REPO_URL}"
  • Network accessline 637
    TEMP_DIR="$(mktemp -d)"     echo "Cloning source repo: ${REPO_URL}"     if ! git clone --depth 1 "${REPO_URL}" "${TEMP_DIR}/repo" >/dev/null 2>&1; then
  • Network accessline 638
    echo "Cloning source repo: ${REPO_URL}"
  • Network accessline 639
    if ! git clone --depth 1 "${REPO_URL}" "${TEMP_DIR}/repo" >/dev/null 2>&1; then
  • Network accessline 640
    echo "Error: failed to clone source repo: ${REPO_URL}" >&2
  • Network accessline 727
    echo "Next steps:" echo "  1. Restart your IDE/agent session to pick up the skill." echo "  2. Ask: 'perform seo analysis on https://example.com'"
  • Network accessline 728
    echo "  1. Restart your IDE/agent session to pick up the skill." echo "  2. Ask: 'perform seo analysis on https://example.com'" echo "  3. Or:  'seo github https://github.com/owner/repo'"
  • Network accessline 729
    echo "  2. Ask: 'perform seo analysis on https://example.com'"
  • Network accessline 730
    echo "  3. Or:  'seo github https://github.com/owner/repo'"

resources/agents/seo-performance.md

  • Network accessline 102
    |------|-------| | **Lighthouse 13.0** (Oct 2025) | Major audit restructuring. Lab tool only — validate with field data | | **CrUX Vis** (Nov 2025) | Replaced CrUX Dashboard. Use [cruxvis.withgoogle.com](https://cruxvis.withgoogle.com) or C
  • Network accessline 103
    | **Lighthouse 13.0** (Oct 2025) | Major audit restructuring. Lab tool only — validate with field data | | **CrUX Vis** (Nov 2025) | Replaced CrUX Dashboard. Use [cruxvis.withgoogle.com](https://cruxvis.withgoogle.com) or CrUX API | | **Pag
  • Network accessline 104
    | **CrUX Vis** (Nov 2025) | Replaced CrUX Dashboard. Use [cruxvis.withgoogle.com](https://cruxvis.withgoogle.com) or CrUX API |
  • Network accessline 110
    # PageSpeed Insights API curl "https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url=URL&key=API_KEY"
  • Network accessline 111
    [Credential-related source omitted]
  • Access to secretsline 111
    [Credential-related source omitted]
  • Network accessline 116
    # CrUX API (field data) curl "https://chromeuxreport.googleapis.com/v1/records:queryRecord?key=API_KEY" \
  • Network accessline 117
    [Credential-related source omitted]
  • Access to secretsline 117
    [Credential-related source omitted]
  • Network accessline 118
    -d '{"url": "https://example.com"}'

resources/agents/seo-schema.md

  • Network accessline 46
    ### Always Prefer - JSON-LD format over Microdata or RDFa - `https://schema.org` as `@context` (not http)
  • Network accessline 47
    - JSON-LD format over Microdata or RDFa - `https://schema.org` as `@context` (not http) - Absolute URLs (not relative)
  • Network accessline 48
    - `https://schema.org` as `@context` (not http)
  • Network accessline 54
    For any schema block, verify: 1. ✅ `@context` is `"https://schema.org"`
  • Network accessline 55
    1. ✅ `@context` is `"https://schema.org"`

resources/agents/seo-sitemap.md

  • Network accessline 68
    <?xml version="1.0" encoding="UTF-8"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  • Network accessline 69
    <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  • Network accessline 70
    <url>     <loc>https://example.com/page</loc>     <lastmod>2026-02-07</lastmod>
  • Network accessline 71
    <loc>https://example.com/page</loc>
  • Network accessline 79
    <?xml version="1.0" encoding="UTF-8"?> <sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  • Network accessline 80
    <sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  • Network accessline 81
    <sitemap>     <loc>https://example.com/sitemap-posts.xml</loc>     <lastmod>2026-02-07</lastmod>
  • Network accessline 82
    <loc>https://example.com/sitemap-posts.xml</loc>
  • Network accessline 84
    </sitemap>   <sitemap>     <loc>https://example.com/sitemap-pages.xml</loc>
  • Network accessline 85
    <sitemap>     <loc>https://example.com/sitemap-pages.xml</loc>     <lastmod>2026-01-15</lastmod>
  • Network accessline 86
    <loc>https://example.com/sitemap-pages.xml</loc>
  • Network accessline 94
    <url>   <loc>https://example.com/page</loc>
  • Network accessline 95
    <loc>https://example.com/page</loc>
  • Network accessline 96
    <xhtml:link rel="alternate" hreflang="en" href="https://example.com/page"/>
  • Network accessline 97
    <xhtml:link rel="alternate" hreflang="es" href="https://example.com/es/page"/>
  • Network accessline 98
    <xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/page"/>
  • Network accessline 104
    <url>   <loc>https://example.com/page</loc>
  • Network accessline 105
    <loc>https://example.com/page</loc>
  • Network accessline 106
    <image:image>     <image:loc>https://example.com/images/hero.webp</image:loc>     <image:title>Descriptive title</image:title>
  • Network accessline 107
    <image:loc>https://example.com/images/hero.webp</image:loc>
  • Network accessline 115
    Ensure your sitemap is discoverable: 1. **robots.txt**: `Sitemap: https://example.com/sitemap.xml`
  • Network accessline 116
    1. **robots.txt**: `Sitemap: https://example.com/sitemap.xml`

resources/agents/seo-technical.md

  • Network accessline 64
    Check these response headers (use `curl -I <url>`):

resources/references/cwv-thresholds.md

  • Network accessline 94
    # PageSpeed Insights API curl "https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url=URL&key=API_KEY"
  • Network accessline 95
    [Credential-related source omitted]
  • Access to secretsline 95
    [Credential-related source omitted]
  • Network accessline 103
    - **Lighthouse 13.0** (October 2025): Major audit restructuring with reorganized performance categories and updated scoring weights. Lighthouse is a lab tool (simulated conditions) — always cross-reference with CrUX field data for real-worl
  • Network accessline 104
    - **CrUX Vis** replaced the CrUX Dashboard (November 2025). The old Looker Studio dashboard was deprecated. Use [CrUX Vis](https://cruxvis.withgoogle.com) or the CrUX API directly.

resources/references/google-seo-reference.md

  • Network accessline 138
    - [Google Search Essentials](https://developers.google.com/search/docs/essentials)
  • Network accessline 139
    - [How Google Search Works](https://developers.google.com/search/docs/fundamentals/how-search-works)
  • Network accessline 140
    - [Structured Data Overview](https://developers.google.com/search/docs/appearance/structured-data/intro-structured-data)
  • Network accessline 141
    - [Rich Results Test](https://search.google.com/test/rich-results)
  • Network accessline 142
    - [Core Web Vitals Report](https://support.google.com/webmasters/answer/9205520)
  • Network accessline 143
    - [PageSpeed Insights](https://pagespeed.web.dev/)
  • Network accessline 144
    - [Search Console Help](https://support.google.com/webmasters)
  • Network accessline 145
    - [Manual Actions Report](https://support.google.com/webmasters/answer/9044175)
  • Network accessline 146
    - [Google Search Status Dashboard](https://status.search.google.com/)
  • Network accessline 147
    - [Google Search Central Blog](https://developers.google.com/search/blog)
  • Network accessline 148
    - [Spam Policies](https://developers.google.com/search/docs/essentials/spam-policies)
  • Network accessline 149
    - [E-E-A-T and Quality Rater Guidelines](https://developers.google.com/search/docs/fundamentals/creating-helpful-content)

resources/references/link-building.md

  • Network accessline 105
    # URL-level disavow (use only when specific pages are problematic, not the whole domain) https://mixed-site.com/spam-page-linking-to-me
  • Network accessline 106
    https://mixed-site.com/spam-page-linking-to-me

resources/references/schema-types.md

  • Network accessline 102
    1. ✅ `@context` is `"https://schema.org"` (not http)
  • Network accessline 113
    - [Google Rich Results Test](https://search.google.com/test/rich-results)
  • Network accessline 114
    - [Schema.org Validator](https://validator.schema.org/)

resources/schema/templates.json

  • Network accessline 5
    "description": "Video content pages with thumbnails, duration, and playback URLs. Enables video rich results in Google Search.",       "template": {         "@context": "https://schema.org",
  • Network accessline 6
    "template": {         "@context": "https://schema.org",         "@type": "VideoObject",
  • Network accessline 7
    "@context": "https://schema.org",
  • Network accessline 28
    "description": "Live streaming content for LIVE badge in Google Search results. Requires VideoObject and isLiveBroadcast flag.",       "template": {         "@context": "https://schema.org",
  • Network accessline 29
    "template": {         "@context": "https://schema.org",         "@type": "VideoObject",
  • Network accessline 30
    "@context": "https://schema.org",
  • Network accessline 48
    "description": "Key moments or chapters within a video. Enables key moments rich results with timestamp links.",       "template": {         "@context": "https://schema.org",
  • Network accessline 49
    "template": {         "@context": "https://schema.org",         "@type": "VideoObject",
  • Network accessline 50
    "@context": "https://schema.org",
  • Network accessline 77
    "description": "Enable seek functionality in video rich results. Allows users to jump to specific timestamps from search.",       "template": {         "@context": "https://schema.org",
  • Network accessline 78
    "template": {         "@context": "https://schema.org",         "@type": "VideoObject",
  • Network accessline 79
    "@context": "https://schema.org",
  • Network accessline 95
    "description": "Open source and code repository pages. Describes programming language, platform, and repository location.",       "template": {         "@context": "https://schema.org",
  • Network accessline 96
    "template": {         "@context": "https://schema.org",         "@type": "SoftwareSourceCode",
  • Network accessline 97
    "@context": "https://schema.org",
  • Network accessline 99
    "name": "[Repository Name]",         "description": "[Repository Description]",         "codeRepository": "[Repository URL, e.g. https://github.com/org/repo]",
  • Network accessline 100
    "description": "[Repository Description]",         "codeRepository": "[Repository URL, e.g. https://github.com/org/repo]",         "programmingLanguage": "[Language, e.g. Python]",
  • Network accessline 101
    "codeRepository": "[Repository URL, e.g. https://github.com/org/repo]",
  • Network accessline 106
    "name": "[Author Name]"         },         "license": "[License URL, e.g. https://opensource.org/licenses/MIT]",
  • Network accessline 107
    },         "license": "[License URL, e.g. https://opensource.org/licenses/MIT]",         "dateCreated": "[YYYY-MM-DD]",
  • Network accessline 108
    "license": "[License URL, e.g. https://opensource.org/licenses/MIT]",
  • Network accessline 115
    "description": "E-commerce product variants grouped by attributes like size, color. Enables variant-aware rich results with variesBy and hasVariant properties.",       "template": {         "@context": "https://schema.org",
  • Network accessline 116
    "template": {         "@context": "https://schema.org",         "@type": "ProductGroup",
  • Network accessline 117
    "@context": "https://schema.org",
  • Network accessline 120
    "description": "[Product group description]",         "productGroupID": "[product-group-id]",         "variesBy": ["https://schema.org/size", "https://schema.org/color"],
  • Network accessline 121
    "productGroupID": "[product-group-id]",         "variesBy": ["https://schema.org/size", "https://schema.org/color"],         "hasVariant": [
  • Network accessline 122
    "variesBy": ["https://schema.org/size", "https://schema.org/color"],
  • Network accessline 132
    "price": "[29.99]",               "priceCurrency": "USD",               "availability": "https://schema.org/InStock"
  • Network accessline 133
    "priceCurrency": "USD",               "availability": "https://schema.org/InStock"             }
  • Network accessline 134
    "availability": "https://schema.org/InStock"
  • Network accessline 142
    "description": "Author, creator, or team member profile pages. Enhances E-E-A-T signals with mainEntity Person markup and sameAs links.",       "template": {         "@context": "https://schema.org",
  • Network accessline 143
    "template": {         "@context": "https://schema.org",         "@type": "ProfilePage",
  • Network accessline 144
    "@context": "https://schema.org",
  • Network accessline 160
    "description": "Product certifications (Energy Star, safety, organic, etc.). Replaced EnergyConsumptionDetails in April 2025.",       "template": {         "@context": "https://schema.org",
  • Network accessline 161
    "template": {         "@context": "https://schema.org",         "@type": "Product",
  • Network accessline 162
    "@context": "https://schema.org",
  • Network accessline 177
    "description": "Shipping and delivery information for e-commerce products. Includes shipping rate, handling time, and transit time.",       "template": {         "@context": "https://schema.org",
  • Network accessline 178
    "template": {         "@context": "https://schema.org",         "@type": "Product",
  • Network accessline 179
    "@context": "https://schema.org",
  • Network accessline 214
    "description": "Blog articles with author attribution, dates, and images. Core type for content-heavy sites and E-E-A-T signals.",       "template": {         "@context": "https://schema.org",
  • Network accessline 215
    "template": {         "@context": "https://schema.org",         "@type": "BlogPosting",
  • Network accessline 216
    "@context": "https://schema.org",
  • Network accessline 246
    "description": "News and general articles. Use instead of BlogPosting for news sites, magazines, and journalistic content.",       "template": {         "@context": "https://schema.org",
  • Network accessline 247
    "template": {         "@context": "https://schema.org",         "@type": "Article",
  • Network accessline 248
    "@context": "https://schema.org",
  • Network accessline 274
    "description": "Company or brand identity with logo, contact, and social profiles. Essential for knowledge panel and brand SERP.",       "template": {         "@context": "https://schema.org",
  • Network accessline 275
    "template": {         "@context": "https://schema.org",         "@type": "Organization",
  • Network accessline 276
    "@context": "https://schema.org",
  • Network accessline 299
    "description": "Physical business with address, hours, and geo coordinates. Critical for local SEO and Google Business Profile.",       "template": {         "@context": "https://schema.org",
  • Network accessline 300
    "template": {         "@context": "https://schema.org",         "@type": "LocalBusiness",
  • Network accessline 301
    "@context": "https://schema.org",
  • Network accessline 335
    "description": "Navigation breadcrumbs showing page hierarchy. Enhances SERP display with breadcrumb trail instead of raw URL.",       "template": {         "@context": "https://schema.org",
  • Network accessline 336
    "template": {         "@context": "https://schema.org",         "@type": "BreadcrumbList",
  • Network accessline 337
    "@context": "https://schema.org",
  • Network accessline 363
    "description": "Site-level markup with SearchAction for sitelinks search box in Google. Place on homepage only.",       "template": {         "@context": "https://schema.org",
  • Network accessline 364
    "template": {         "@context": "https://schema.org",         "@type": "WebSite",
  • Network accessline 365
    "@context": "https://schema.org",

resources/skills/seo-aeo.md

  • Network accessline 97
    "name": "Example Corp",     "sameAs": [       "https://en.wikipedia.org/wiki/Example_Corp",
  • Network accessline 98
    "sameAs": [       "https://en.wikipedia.org/wiki/Example_Corp",       "https://www.linkedin.com/company/example-corp",
  • Network accessline 99
    "https://en.wikipedia.org/wiki/Example_Corp",
  • Network accessline 100
    "https://www.linkedin.com/company/example-corp",
  • Network accessline 101
    "https://twitter.com/examplecorp"
  • Network accessline 124
    {   "@context": "https://schema.org",
  • Network accessline 125
    "@context": "https://schema.org",
  • Network accessline 126
    "@type": "WebSite",   "url": "https://example.com/",   "potentialAction": {
  • Network accessline 127
    "url": "https://example.com/",
  • Network accessline 130
    "target": {       "@type": "EntryPoint",       "urlTemplate": "https://example.com/search?q={search_term_string}"
  • Network accessline 131
    "@type": "EntryPoint",       "urlTemplate": "https://example.com/search?q={search_term_string}"     },
  • Network accessline 132
    "urlTemplate": "https://example.com/search?q={search_term_string}"

resources/skills/seo-competitor-pages.md

  • Network accessline 61
    {   "@context": "https://schema.org",
  • Network accessline 62
    "@context": "https://schema.org",
  • Network accessline 82
    {   "@context": "https://schema.org",
  • Network accessline 83
    "@context": "https://schema.org",
  • Network accessline 98
    {   "@context": "https://schema.org",
  • Network accessline 99
    "@context": "https://schema.org",
  • Network accessline 100
    "@type": "ItemList",   "name": "Best [Category] Tools [Year]",   "itemListOrder": "https://schema.org/ItemListOrderDescending",
  • Network accessline 101
    "name": "Best [Category] Tools [Year]",   "itemListOrder": "https://schema.org/ItemListOrderDescending",   "numberOfItems": "[Count]",
  • Network accessline 102
    "itemListOrder": "https://schema.org/ItemListOrderDescending",

resources/skills/seo-github.md

  • Access to secretsline 38
    [Credential-related source omitted]
  • Access to secretsline 40
    [Credential-related source omitted]

resources/skills/seo-hreflang.md

  • Network accessline 88
    <link rel="alternate" hreflang="en-US" href="https://example.com/page" />
  • Network accessline 89
    <link rel="alternate" hreflang="en-GB" href="https://example.co.uk/page" />
  • Network accessline 90
    <link rel="alternate" hreflang="fr" href="https://example.com/fr/page" />
  • Network accessline 91
    <link rel="alternate" hreflang="x-default" href="https://example.com/page" />
  • Network accessline 100
    Link: <https://example.com/page>; rel="alternate"; hreflang="en-US",
  • Network accessline 101
    <https://example.com/fr/page>; rel="alternate"; hreflang="fr",
  • Network accessline 102
    <https://example.com/page>; rel="alternate"; hreflang="x-default"
  • Network accessline 134
    <?xml version="1.0" encoding="UTF-8"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
  • Network accessline 135
    <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
  • Network accessline 136
    xmlns:xhtml="http://www.w3.org/1999/xhtml">
  • Network accessline 137
    <url>     <loc>https://example.com/page</loc>     <xhtml:link rel="alternate" hreflang="en-US" href="https://example.com/page" />
  • Network accessline 138
    <loc>https://example.com/page</loc>
  • Network accessline 139
    <xhtml:link rel="alternate" hreflang="en-US" href="https://example.com/page" />
  • Network accessline 140
    <xhtml:link rel="alternate" hreflang="fr" href="https://example.com/fr/page" />
  • Network accessline 141
    <xhtml:link rel="alternate" hreflang="de" href="https://example.de/page" />
  • Network accessline 142
    <xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/page" />
  • Network accessline 143
    </url>   <url>     <loc>https://example.com/fr/page</loc>
  • Network accessline 144
    <url>     <loc>https://example.com/fr/page</loc>     <xhtml:link rel="alternate" hreflang="en-US" href="https://example.com/page" />
  • Network accessline 145
    <loc>https://example.com/fr/page</loc>
  • Network accessline 146
    <xhtml:link rel="alternate" hreflang="en-US" href="https://example.com/page" />
  • Network accessline 147
    <xhtml:link rel="alternate" hreflang="fr" href="https://example.com/fr/page" />
  • Network accessline 148
    <xhtml:link rel="alternate" hreflang="de" href="https://example.de/page" />
  • Network accessline 149
    <xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/page" />
  • Network accessline 170
    | Language | URL | Self-Ref | Return Tags | x-default | Status | |----------|-----|----------|-------------|-----------|--------| | en-US | https://... | ✅ | ✅ | ✅ | ✅ |
  • Network accessline 171
    |----------|-----|----------|-------------|-----------|--------| | en-US | https://... | ✅ | ✅ | ✅ | ✅ | | fr | https://... | ❌ | ⚠<U+FE0F> | ✅ | ❌ |
  • Network accessline 172
    | en-US | https://... | ✅ | ✅ | ✅ | ✅ |
  • Network accessline 173
    | fr | https://... | ❌ | ⚠<U+FE0F> | ✅ | ❌ |
  • Network accessline 174
    | de | https://... | ✅ | ❌ | ✅ | ❌ |

resources/skills/seo-links.md

  • Network accessline 95
    https://index.commoncrawl.org/CC-MAIN-latest/cdx?url=example.com/*

resources/skills/seo-schema.md

  • Network accessline 71
    {   "@context": "https://schema.org",
  • Network accessline 72
    "@context": "https://schema.org",
  • Network accessline 92
    {   "@context": "https://schema.org",
  • Network accessline 93
    "@context": "https://schema.org",
  • Network accessline 116
    {   "@context": "https://schema.org",
  • Network accessline 117
    "@context": "https://schema.org",

resources/skills/seo-sitemap.md

  • Network accessline 70
    <?xml version="1.0" encoding="UTF-8"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  • Network accessline 71
    <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  • Network accessline 72
    <url>     <loc>https://example.com/page</loc>     <lastmod>2026-02-07</lastmod>
  • Network accessline 73
    <loc>https://example.com/page</loc>
  • Network accessline 81
    <?xml version="1.0" encoding="UTF-8"?> <sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  • Network accessline 82
    <sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  • Network accessline 83
    <sitemap>     <loc>https://example.com/sitemap-pages.xml</loc>     <lastmod>2026-02-07</lastmod>
  • Network accessline 84
    <loc>https://example.com/sitemap-pages.xml</loc>
  • Network accessline 86
    </sitemap>   <sitemap>     <loc>https://example.com/sitemap-posts.xml</loc>
  • Network accessline 87
    <sitemap>     <loc>https://example.com/sitemap-posts.xml</loc>     <lastmod>2026-02-07</lastmod>
  • Network accessline 88
    <loc>https://example.com/sitemap-posts.xml</loc>

resources/skills/seo-technical.md

  • Network accessline 176
    {   "@context": "https://schema.org",
  • Network accessline 177
    "@context": "https://schema.org",

resources/templates/agency.md

  • Network accessline 59
    {   "@context": "https://schema.org",
  • Network accessline 60
    "@context": "https://schema.org",
  • Network accessline 62
    "name": "Agency Name",   "description": "What the agency does",   "url": "https://example.com",
  • Network accessline 63
    "description": "What the agency does",   "url": "https://example.com",   "logo": "https://example.com/logo.png",
  • Network accessline 64
    "url": "https://example.com",
  • Network accessline 65
    "logo": "https://example.com/logo.png",

resources/templates/blog-post.md

  • Network accessline 52
    {   "@context": "https://schema.org",
  • Network accessline 53
    "@context": "https://schema.org",
  • Network accessline 55
    "mainEntityOfPage": {     "@type": "WebPage",     "@id": "https://example.com/blog/your-post-url"
  • Network accessline 56
    "@type": "WebPage",     "@id": "https://example.com/blog/your-post-url"   },
  • Network accessline 57
    "@id": "https://example.com/blog/your-post-url"
  • Network accessline 59
    "headline": "Your Post Headline",   "description": "Your meta description here.",   "image": "https://example.com/featured-image.jpg",
  • Network accessline 60
    "description": "Your meta description here.",   "image": "https://example.com/featured-image.jpg",   "author": {
  • Network accessline 61
    "image": "https://example.com/featured-image.jpg",
  • Network accessline 63
    "@type": "Person",     "name": "Author Name",     "url": "https://example.com/author-bio"
  • Network accessline 64
    "name": "Author Name",     "url": "https://example.com/author-bio"   },
  • Network accessline 65
    "url": "https://example.com/author-bio"
  • Network accessline 70
    "logo": {       "@type": "ImageObject",       "url": "https://example.com/logo.png"
  • Network accessline 71
    "@type": "ImageObject",       "url": "https://example.com/logo.png"     }
  • Network accessline 72
    "url": "https://example.com/logo.png"

resources/templates/ecommerce.md

  • Network accessline 67
    {   "@context": "https://schema.org",
  • Network accessline 68
    "@context": "https://schema.org",
  • Network accessline 69
    "@type": "Product",   "name": "Product Name",   "image": ["https://example.com/product.jpg"],
  • Network accessline 70
    "name": "Product Name",   "image": ["https://example.com/product.jpg"],   "description": "Product description",
  • Network accessline 71
    "image": ["https://example.com/product.jpg"],
  • Network accessline 80
    "price": "99.99",     "priceCurrency": "USD",     "availability": "https://schema.org/InStock",
  • Network accessline 81
    "priceCurrency": "USD",     "availability": "https://schema.org/InStock",     "url": "https://example.com/product"
  • Network accessline 82
    "availability": "https://schema.org/InStock",
  • Network accessline 83
    "url": "https://example.com/product"

resources/templates/local-service.md

  • Network accessline 70
    {   "@context": "https://schema.org",
  • Network accessline 71
    "@context": "https://schema.org",

resources/templates/news-article.md

  • Network accessline 41
    {   "@context": "https://schema.org",
  • Network accessline 42
    "@context": "https://schema.org",
  • Network accessline 44
    "headline": "Breaking News Headline",   "image": [     "https://example.com/photos/1x1/photo.jpg",
  • Network accessline 45
    "image": [     "https://example.com/photos/1x1/photo.jpg",     "https://example.com/photos/4x3/photo.jpg",
  • Network accessline 46
    "https://example.com/photos/1x1/photo.jpg",
  • Network accessline 47
    "https://example.com/photos/4x3/photo.jpg",
  • Network accessline 48
    "https://example.com/photos/16x9/photo.jpg"
  • Network accessline 53
    "@type": "Person",       "name": "Jane Journalist",       "url": "https://example.com/profile/jane-journalist"
  • Network accessline 54
    "name": "Jane Journalist",       "url": "https://example.com/profile/jane-journalist"     }]
  • Network accessline 55
    "url": "https://example.com/profile/jane-journalist"

resources/templates/publisher.md

  • Network accessline 52
    {   "@context": "https://schema.org",
  • Network accessline 53
    "@context": "https://schema.org",
  • Network accessline 59
    "@type": "Person",     "name": "Author Name",     "url": "https://example.com/authors/author-name"
  • Network accessline 60
    "name": "Author Name",     "url": "https://example.com/authors/author-name"   },
  • Network accessline 61
    "url": "https://example.com/authors/author-name"
  • Network accessline 66
    "logo": {       "@type": "ImageObject",       "url": "https://example.com/logo.png"
  • Network accessline 67
    "@type": "ImageObject",       "url": "https://example.com/logo.png"     }
  • Network accessline 68
    "url": "https://example.com/logo.png"
  • Network accessline 69
    }   },   "image": ["https://example.com/article-image.jpg"],
  • Network accessline 70
    },   "image": ["https://example.com/article-image.jpg"],   "mainEntityOfPage": {
  • Network accessline 71
    "image": ["https://example.com/article-image.jpg"],
  • Network accessline 72
    "mainEntityOfPage": {     "@type": "WebPage",     "@id": "https://example.com/article-url"
  • Network accessline 73
    "@type": "WebPage",     "@id": "https://example.com/article-url"   }
  • Network accessline 74
    "@id": "https://example.com/article-url"

resources/templates/technical-article.md

  • Network accessline 40
    {   "@context": "https://schema.org/",
  • Network accessline 41
    "@context": "https://schema.org/",

scripts/__init__.py

  • Executable scriptline 1
    Executable file

scripts/a11y_seo_checker.py

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

scripts/ai_crawler_policy_matrix.py

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

scripts/analyze_visual.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Network accessline 5
    Usage:     python analyze_visual.py https://example.com
  • Network accessline 6
    python analyze_visual.py https://example.com

scripts/anchor_text_audit.py

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

scripts/answer_block_scanner.py

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

scripts/article_seo.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Network accessline 15
    Usage:     python article_seo.py https://example.com/article
  • Network accessline 16
    python article_seo.py https://example.com/article
  • Network accessline 17
    python article_seo.py https://example.com/article --keyword "red team ops"
  • Network accessline 18
    python article_seo.py https://example.com/article --json
  • Network accessline 106
    if soup.find("link", attrs={"rel": "https://api.w.org/"}):
  • Network accessline 414
    try:         url = (             "https://suggestqueries.google.com/complete/search"
  • Network accessline 415
    url = (             "https://suggestqueries.google.com/complete/search"             f"?client=chrome&q={urllib.parse.quote(query)}"
  • Network accessline 416
    "https://suggestqueries.google.com/complete/search"             f"?client=chrome&q={urllib.parse.quote(query)}"         )

scripts/audit_runner.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Network accessline 8
    Usage:     python audit_runner.py https://example.com
  • Network accessline 9
    python audit_runner.py https://example.com
  • Network accessline 10
    python audit_runner.py https://example.com --json audit.json --html SEO-REPORT.html

scripts/broken_links.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Network accessline 8
    Usage:     python broken_links.py https://example.com
  • Network accessline 9
    python broken_links.py https://example.com
  • Network accessline 10
    python broken_links.py https://example.com --json
  • Network accessline 11
    python broken_links.py https://example.com --internal-only

scripts/cache_compression_checker.py

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

scripts/canonical_checker.py

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

scripts/capture_screenshot.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Network accessline 5
    Usage:     python capture_screenshot.py https://example.com
  • Network accessline 6
    python capture_screenshot.py https://example.com
  • Network accessline 7
    python capture_screenshot.py https://example.com --mobile
  • Network accessline 8
    python capture_screenshot.py https://example.com --output screenshots/

scripts/citation_readiness.py

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

scripts/collection_page_checker.py

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

scripts/competitor_gap.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Network accessline 10
    Usage:     python competitor_gap.py https://yoursite.com --competitor https://competitor.com --json
  • Network accessline 11
    python competitor_gap.py https://yoursite.com --competitor https://competitor.com --json
  • Network accessline 12
    python competitor_gap.py https://yoursite.com --competitor https://c1.com --competitor https://c2.com

scripts/content_decay_detector.py

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

scripts/content_intent_matcher.py

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

scripts/crawl_audit.py

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

scripts/critical_request_chain.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Network accessline 88
    if node["cross_origin"]:             host = urlparse(node["url"]).netloc             has_preconnect = host in preconnects or f"https://{host}" in preconnects
  • Network accessline 89
    host = urlparse(node["url"]).netloc             has_preconnect = host in preconnects or f"https://{host}" in preconnects             node["preconnected"] = has_preconnect
  • Network accessline 90
    has_preconnect = host in preconnects or f"https://{host}" in preconnects

scripts/duplicate_content.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Network accessline 8
    Usage:     python duplicate_content.py https://example.com --depth 2 --json
  • Network accessline 9
    python duplicate_content.py https://example.com --depth 2 --json
  • Network accessline 10
    python duplicate_content.py https://example.com --threshold 0.85

scripts/eeat_signal_checker.py

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

scripts/entity_checker.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Network accessline 9
    Usage:     python entity_checker.py https://example.com --json
  • Network accessline 10
    python entity_checker.py https://example.com --json
  • Network accessline 11
    python entity_checker.py https://example.com --entity "Example Corp"
  • Network accessline 12
    python entity_checker.py https://example.com --kg-api-key YOUR_KEY
  • Network accessline 187
    try:         query = urllib.parse.quote(entity_name)         url = f"https://www.wikidata.org/w/api.php?action=wbsearchentities&search={query}&language=en&format=json&limit=3"
  • Network accessline 188
    query = urllib.parse.quote(entity_name)         url = f"https://www.wikidata.org/w/api.php?action=wbsearchentities&search={query}&language=en&format=json&limit=3"         data = safe_get(url, timeout=8).json()
  • Network accessline 189
    url = f"https://www.wikidata.org/w/api.php?action=wbsearchentities&search={query}&language=en&format=json&limit=3"
  • Network accessline 198
    "label": best.get("label"),                 "description": best.get("description", ""),                 "url": f"https://www.wikidata.org/wiki/{best.get('id')}",
  • Network accessline 199
    "description": best.get("description", ""),                 "url": f"https://www.wikidata.org/wiki/{best.get('id')}",                 "confidence": "High" if best.get("label", "").lower() == entity_name.lower() else "Medium",
  • Network accessline 200
    "url": f"https://www.wikidata.org/wiki/{best.get('id')}",
  • Network accessline 218
    try:         query = urllib.parse.quote(entity_name.replace(" ", "_"))         url = f"https://en.wikipedia.org/w/api.php?action=query&titles={query}&format=json&redirects=1"
  • Network accessline 219
    query = urllib.parse.quote(entity_name.replace(" ", "_"))         url = f"https://en.wikipedia.org/w/api.php?action=query&titles={query}&format=json&redirects=1"         data = safe_get(url, timeout=8).json()
  • Network accessline 220
    url = f"https://en.wikipedia.org/w/api.php?action=query&titles={query}&format=json&redirects=1"
  • Network accessline 227
    "found": True,                     "title": page_data.get("title"),                     "url": f"https://en.wikipedia.org/wiki/{urllib.parse.quote(page_data.get('title', '').replace(' ', '_'))}",
  • Network accessline 228
    "title": page_data.get("title"),                     "url": f"https://en.wikipedia.org/wiki/{urllib.parse.quote(page_data.get('title', '').replace(' ', '_'))}",                 }
  • Network accessline 229
    "url": f"https://en.wikipedia.org/wiki/{urllib.parse.quote(page_data.get('title', '').replace(' ', '_'))}",
  • Access to secretsline 237
    [Credential-related source omitted]
  • Access to secretsline 239
    [Credential-related source omitted]
  • Network accessline 244
    try:         response = safe_get(             "https://kgsearch.googleapis.com/v1/entities:search",
  • Network accessline 245
    response = safe_get(             "https://kgsearch.googleapis.com/v1/entities:search",             params={
  • Network accessline 246
    "https://kgsearch.googleapis.com/v1/entities:search",
  • Access to secretsline 249
    [Credential-related source omitted]
  • Access to secretsline 320
    [Credential-related source omitted]
  • Access to secretsline 359
    [Credential-related source omitted]
  • Access to secretsline 457
    [Credential-related source omitted]
  • Access to secretsline 462
    [Credential-related source omitted]
  • Access to secretsline 463
    [Credential-related source omitted]

scripts/env_loader.py

  • Executable scriptline 1
    Executable file
  • Access to secretsline 2
    [Credential-related source omitted]
  • Access to secretsline 4
    [Credential-related source omitted]
  • Access to secretsline 17
    [Credential-related source omitted]
  • Access to secretsline 34
    [Credential-related source omitted]
  • Access to secretsline 40
    [Credential-related source omitted]
  • Access to secretsline 42
    [Credential-related source omitted]
  • Access to secretsline 44
    [Credential-related source omitted]
  • Access to secretsline 79
    [Credential-related source omitted]
  • Access to secretsline 90
    [Credential-related source omitted]
  • Access to secretsline 92
    [Credential-related source omitted]
  • Access to secretsline 99
    [Credential-related source omitted]
  • Access to secretsline 126
    [Credential-related source omitted]

scripts/external_link_quality.py

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

scripts/faceted_nav_audit.py

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

scripts/fetch_page.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Network accessline 5
    Usage:     python fetch_page.py https://example.com
  • Network accessline 6
    python fetch_page.py https://example.com
  • Network accessline 7
    python fetch_page.py https://example.com --output page.html

scripts/finding_verifier.py

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

scripts/font_audit.py

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

scripts/freshness_checker.py

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

scripts/generate_report.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Network accessline 8
    Usage:     python generate_report.py https://example.com
  • Network accessline 9
    python generate_report.py https://example.com
  • Network accessline 10
    python generate_report.py https://example.com --output my-report.html
  • Access to secretsline 331
    [Credential-related source omitted]
  • Network accessline 1292
    }} </style> <link rel="preconnect" href="https://fonts.googleapis.com">
  • Network accessline 1293
    </style> <link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
  • Network accessline 1294
    <link rel="preconnect" href="https://fonts.googleapis.com">
  • Network accessline 1295
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
  • Network accessline 1296
    <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
  • Access to secretsline 1516
    [Credential-related source omitted]

scripts/github_api.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Network accessline 19
    API_BASE = "https://api.github.com"
  • Access to secretsline 33
    [Credential-related source omitted]
  • Access to secretsline 41
    [Credential-related source omitted]
  • Access to secretsline 42
    [Credential-related source omitted]
  • Network accessline 128
    if text.startswith("git@github.com:"):         text = text.split(":", 1)[1]     elif text.startswith(("https://github.com/", "http://github.com/")):
  • Network accessline 129
    text = text.split(":", 1)[1]     elif text.startswith(("https://github.com/", "http://github.com/")):         parsed = urllib.parse.urlparse(text)
  • Network accessline 130
    elif text.startswith(("https://github.com/", "http://github.com/")):         parsed = urllib.parse.urlparse(text)         text = parsed.path.strip("/")

scripts/github_community_health.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Access to secretsline 203
    [Credential-related source omitted]

scripts/github_competitor_research.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Possible obfuscationline 165
    raw = base64.b64decode(content.encode("utf-8"), validate=False)
  • Dangerous shell operationline 211
    rm = item.get("readme_metrics", {})
  • Network accessline 325
    "best_rank": None,                     "query_ranks": {},                     "sample_item": {"description": "", "topics": [], "stargazers_count": 0, "html_url": f"https://github.com/{slug}"},
  • Network accessline 326
    "query_ranks": {},                     "sample_item": {"description": "", "topics": [], "stargazers_count": 0, "html_url": f"https://github.com/{slug}"},                 }
  • Network accessline 327
    "sample_item": {"description": "", "topics": [], "stargazers_count": 0, "html_url": f"https://github.com/{slug}"},
  • Dangerous shell operationline 363
    [Credential-related source omitted]
  • Network accessline 389
    "stargazers_count": int(target_repo_data.get("stargazers_count", 0)),         "forks_count": int(target_repo_data.get("forks_count", 0)),         "html_url": target_repo_data.get("html_url") or f"https://github.com/{repo}",
  • Network accessline 390
    "forks_count": int(target_repo_data.get("forks_count", 0)),         "html_url": target_repo_data.get("html_url") or f"https://github.com/{repo}",     }
  • Network accessline 391
    "html_url": target_repo_data.get("html_url") or f"https://github.com/{repo}",
  • Access to secretsline 423
    [Credential-related source omitted]

scripts/github_readme_lint.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Possible obfuscationline 57
    raw = base64.b64decode(content.encode("utf-8"), validate=False)
  • Access to secretsline 377
    [Credential-related source omitted]

scripts/github_repo_audit.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Access to secretsline 10
    [Credential-related source omitted]
  • Access to secretsline 531
    [Credential-related source omitted]

scripts/github_search_benchmark.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Access to secretsline 152
    [Credential-related source omitted]

scripts/github_seo_report.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Network accessline 277
    repo_slug = metadata.get("full_name")         if repo_slug:             repo_url = f"https://github.com/{repo_slug}"
  • Network accessline 279
    repo_url = f"https://github.com/{repo_slug}"
  • Access to secretsline 687
    [Credential-related source omitted]

scripts/github_traffic_archiver.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Access to secretsline 136
    [Credential-related source omitted]

scripts/github_weekly_scorecard.py

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

scripts/gsc_checker.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Network accessline 13
    Usage:     python gsc_checker.py https://example.com --credentials creds.json --json
  • Network accessline 14
    python gsc_checker.py https://example.com --credentials creds.json --json
  • Network accessline 15
    python gsc_checker.py https://example.com --credentials creds.json --days 28
  • Network accessline 16
    python gsc_checker.py https://example.com --credentials creds.json --query "red team"
  • Network accessline 33
    SCOPES = ["https://www.googleapis.com/auth/webmasters.readonly"]
  • Network accessline 248
    description="Google Search Console Data Checker — pulls GSC data for LLM analysis"     )     parser.add_argument("site_url", help="GSC property URL (e.g., https://example.com)")
  • Network accessline 249
    )     parser.add_argument("site_url", help="GSC property URL (e.g., https://example.com)")     parser.add_argument("--credentials", default="", help="Path to service account JSON credentials file. Falls back to GSC_CREDENTIALS_PATH env var 
  • Network accessline 250
    parser.add_argument("site_url", help="GSC property URL (e.g., https://example.com)")
  • Access to secretsline 251
    [Credential-related source omitted]
  • Access to secretsline 261
    [Credential-related source omitted]

scripts/hreflang_checker.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Network accessline 17
    Usage:     python hreflang_checker.py https://example.com/page
  • Network accessline 18
    python hreflang_checker.py https://example.com/page
  • Network accessline 19
    python hreflang_checker.py https://example.com/page --json
  • Network accessline 20
    python hreflang_checker.py https://example.com/page --verify-returns

scripts/hreflang_sitemap_validator.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Network accessline 40
    continue             attrs = child.attrib             rel = attrs.get("rel") or attrs.get("{http://www.w3.org/1999/xhtml}rel")
  • Network accessline 41
    attrs = child.attrib             rel = attrs.get("rel") or attrs.get("{http://www.w3.org/1999/xhtml}rel")             hreflang = attrs.get("hreflang") or attrs.get("{http://www.w3.org/1999/xhtml}hreflang")
  • Network accessline 42
    rel = attrs.get("rel") or attrs.get("{http://www.w3.org/1999/xhtml}rel")
  • Network accessline 43
    hreflang = attrs.get("hreflang") or attrs.get("{http://www.w3.org/1999/xhtml}hreflang")
  • Network accessline 44
    href = attrs.get("href") or attrs.get("{http://www.w3.org/1999/xhtml}href")

scripts/image_inventory.py

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

scripts/image_weight_audit.py

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

scripts/indexability_matrix.py

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

scripts/indexnow_checker.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Network accessline 16
    Usage:     python indexnow_checker.py https://example.com --key YOUR_KEY --json
  • Network accessline 17
    python indexnow_checker.py https://example.com --key YOUR_KEY --json
  • Network accessline 18
    python indexnow_checker.py https://example.com --key YOUR_KEY --ping https://example.com/updated-page
  • Network accessline 19
    python indexnow_checker.py https://example.com --key YOUR_KEY --ping-sitemap
  • Network accessline 39
    INDEXNOW_ENDPOINTS = {     "bing": "https://www.bing.com/indexnow",
  • Network accessline 40
    "bing": "https://www.bing.com/indexnow",
  • Network accessline 41
    "yandex": "https://yandex.com/indexnow",
  • Network accessline 42
    "seznam": "https://search.seznam.cz/indexnow",
  • Network accessline 43
    "naver": "https://searchadvisor.naver.com/indexnow",

scripts/internal_links.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Network accessline 8
    Usage:     python internal_links.py https://example.com
  • Network accessline 9
    python internal_links.py https://example.com
  • Network accessline 10
    python internal_links.py https://example.com --depth 2 --json

scripts/javascript_render_audit.py

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

scripts/lcp_subparts.py

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

scripts/lib/__init__.py

  • Executable scriptline 1
    Executable file

scripts/lib/safe_http.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Network accessline 16
    AGENTIC_SEO_USER_AGENT = (     "Mozilla/5.0 (compatible; AgenticSEOSkill/1.0; "     "+https://github.com/Bhanunamikaze/Agentic-SEO-Skill)"
  • Network accessline 17
    "Mozilla/5.0 (compatible; AgenticSEOSkill/1.0; "     "+https://github.com/Bhanunamikaze/Agentic-SEO-Skill)" )
  • Network accessline 18
    "+https://github.com/Bhanunamikaze/Agentic-SEO-Skill)"
  • Network accessline 144
    current = assert_safe_url(url)     request_headers = default_headers(headers)     requester = session or requests.Session()
  • Network accessline 145
    request_headers = default_headers(headers)     requester = session or requests.Session()     history = []
  • Network accessline 146
    requester = session or requests.Session()

scripts/lighthouse_runner.py

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

scripts/link_profile.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Network accessline 12
    Usage:     python link_profile.py https://example.com --json
  • Network accessline 13
    python link_profile.py https://example.com --json
  • Network accessline 14
    python link_profile.py https://example.com --max-pages 100 --json
  • Network accessline 15
    python link_profile.py https://example.com --gsc-credentials creds.json
  • Network accessline 270
    scopes = ["https://www.googleapis.com/auth/webmasters.readonly"]
  • Access to secretsline 300
    [Credential-related source omitted]

scripts/llms_txt_checker.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Network accessline 5
    llms.txt is a proposed standard for providing LLM-friendly site information. See: https://llmstxt.org/
  • Network accessline 6
    See: https://llmstxt.org/
  • Network accessline 8
    Usage:     python llms_txt_checker.py https://example.com
  • Network accessline 9
    python llms_txt_checker.py https://example.com
  • Network accessline 10
    python llms_txt_checker.py https://example.com --json
  • Network accessline 43
    parsed = urlparse(url)     if not parsed.scheme:         url = f"https://{url}"
  • Network accessline 44
    if not parsed.scheme:         url = f"https://{url}"         parsed = urlparse(url)
  • Network accessline 45
    url = f"https://{url}"

scripts/llms_txt_generator.py

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

scripts/local_seo_checker.py

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

scripts/log_file_analyzer.py

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

scripts/mobile_render_checker.py

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

scripts/orphan_pages_from_sitemap.py

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

scripts/pagespeed.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Access to secretsline 10
    [Credential-related source omitted]
  • Access to secretsline 11
    [Credential-related source omitted]
  • Network accessline 15
    Usage:     python pagespeed.py https://example.com
  • Network accessline 16
    python pagespeed.py https://example.com
  • Network accessline 17
    python pagespeed.py https://example.com --strategy mobile
  • Network accessline 18
    python pagespeed.py https://example.com --json
  • Network accessline 19
    [Credential-related source omitted]
  • Access to secretsline 19
    [Credential-related source omitted]
  • Network accessline 42
    PSI_API = "https://www.googleapis.com/pagespeedonline/v5/runPagespeed"
  • Access to secretsline 184
    [Credential-related source omitted]
  • Access to secretsline 191
    [Credential-related source omitted]
  • Access to secretsline 207
    [Credential-related source omitted]
  • Access to secretsline 208
    [Credential-related source omitted]
  • Access to secretsline 249
    [Credential-related source omitted]
  • Access to secretsline 251
    [Credential-related source omitted]
  • Access to secretsline 335
    [Credential-related source omitted]
  • Access to secretsline 338
    [Credential-related source omitted]
  • Access to secretsline 350
    [Credential-related source omitted]

scripts/parse_html.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Network accessline 5
    Usage:     python parse_html.py page.html     python parse_html.py page.html --url https://example.com
  • Network accessline 6
    python parse_html.py page.html     python parse_html.py page.html --url https://example.com     python parse_html.py --fetch https://example.com --json
  • Network accessline 7
    python parse_html.py page.html --url https://example.com
  • Network accessline 8
    python parse_html.py --fetch https://example.com --json

scripts/pre_commit_seo_check.sh

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

scripts/product_schema_checker.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Network accessline 14
    VALID_AVAILABILITY = {     "https://schema.org/InStock",
  • Network accessline 15
    "https://schema.org/InStock",
  • Network accessline 16
    "https://schema.org/OutOfStock",
  • Network accessline 17
    "https://schema.org/PreOrder",
  • Network accessline 18
    "https://schema.org/BackOrder",
  • Network accessline 19
    "https://schema.org/LimitedAvailability",

scripts/readability.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Network accessline 8
    Usage:     python readability.py page.html --json     python readability.py --url https://example.com --json
  • Network accessline 9
    python readability.py page.html --json     python readability.py --url https://example.com --json     python readability.py --text "Your text here"
  • Network accessline 10
    python readability.py --url https://example.com --json

scripts/redirect_backlink_reclaim.py

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

scripts/redirect_checker.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Network accessline 8
    Usage:     python redirect_checker.py https://example.com
  • Network accessline 9
    python redirect_checker.py https://example.com
  • Network accessline 10
    python redirect_checker.py https://example.com http://example.com --json
  • Network accessline 45
    parsed = urlparse(url)     if not parsed.scheme:         url = f"https://{url}"
  • Network accessline 47
    url = f"https://{url}"

scripts/reference_freshness.py

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

scripts/repo_docs_site_checker.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Network accessline 70
    if resolved_repo:         owner, name = resolved_repo.split("/", 1)         candidate_urls.extend([f"https://{owner}.github.io/{name}/", f"https://github.com/{resolved_repo}#readme"])
  • Network accessline 71
    owner, name = resolved_repo.split("/", 1)         candidate_urls.extend([f"https://{owner}.github.io/{name}/", f"https://github.com/{resolved_repo}#readme"])     for url in _readme_urls(path):
  • Network accessline 72
    candidate_urls.extend([f"https://{owner}.github.io/{name}/", f"https://github.com/{resolved_repo}#readme"])

scripts/repo_file_inventory.py

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

scripts/repo_release_seo.py

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

scripts/repo_social_preview_checker.py

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

scripts/repo_topic_suggester.py

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

scripts/review_schema_checker.py

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

scripts/rich_results_guard.py

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

scripts/robots_checker.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Network accessline 5
    Usage:     python robots_checker.py https://example.com
  • Network accessline 6
    python robots_checker.py https://example.com
  • Network accessline 7
    python robots_checker.py https://example.com --json
  • Network accessline 54
    parsed = urlparse(url)     if not parsed.scheme:         url = f"https://{url}"
  • Network accessline 55
    if not parsed.scheme:         url = f"https://{url}"         parsed = urlparse(url)
  • Network accessline 56
    url = f"https://{url}"

scripts/robots_path_tester.py

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

scripts/schema_diff.py

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

scripts/schema_required_props.py

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

scripts/schema_template_generator.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Network accessline 21
    "description": "Standard ecommerce product page with Offer, product identifiers, images, and rating/review hooks.",         "template": {             "@context": "https://schema.org",
  • Network accessline 22
    "template": {             "@context": "https://schema.org",             "@type": "Product",
  • Network accessline 23
    "@context": "https://schema.org",
  • Network accessline 33
    "price": "[Price]",                 "priceCurrency": "USD",                 "availability": "https://schema.org/InStock",
  • Network accessline 34
    "priceCurrency": "USD",                 "availability": "https://schema.org/InStock",             },
  • Network accessline 35
    "availability": "https://schema.org/InStock",
  • Network accessline 41
    "description": "Review markup for first-party or editorial reviews with rating and reviewed entity.",         "template": {             "@context": "https://schema.org",
  • Network accessline 42
    "template": {             "@context": "https://schema.org",             "@type": "Review",
  • Network accessline 43
    "@context": "https://schema.org",

scripts/security_headers.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Network accessline 8
    Usage:     python security_headers.py https://example.com
  • Network accessline 9
    python security_headers.py https://example.com
  • Network accessline 10
    python security_headers.py https://example.com --json
  • Network accessline 81
    parsed = urlparse(url)     if not parsed.scheme:         url = f"https://{url}"
  • Network accessline 82
    if not parsed.scheme:         url = f"https://{url}"         parsed = urlparse(url)
  • Network accessline 83
    url = f"https://{url}"

scripts/seo_common.py

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

scripts/sitemap_checker.py

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

scripts/sitemap_generator.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Network accessline 34
    def build_urlset(rows: list[dict], default_lastmod: str | None = None) -> str:     ET.register_namespace("", "http://www.sitemaps.org/schemas/sitemap/0.9")
  • Network accessline 35
    ET.register_namespace("", "http://www.sitemaps.org/schemas/sitemap/0.9")
  • Network accessline 36
    root = ET.Element("{http://www.sitemaps.org/schemas/sitemap/0.9}urlset")
  • Network accessline 50
    def build_index(sitemap_urls: list[str], default_lastmod: str | None = None) -> str:     ET.register_namespace("", "http://www.sitemaps.org/schemas/sitemap/0.9")
  • Network accessline 51
    ET.register_namespace("", "http://www.sitemaps.org/schemas/sitemap/0.9")
  • Network accessline 52
    root = ET.Element("{http://www.sitemaps.org/schemas/sitemap/0.9}sitemapindex")

scripts/social_meta.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Network accessline 8
    Usage:     python social_meta.py https://example.com
  • Network accessline 9
    python social_meta.py https://example.com
  • Network accessline 10
    python social_meta.py https://example.com --json

scripts/third_party_script_audit.py

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

scripts/topical_cluster_mapper.py

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

scripts/url_quality.py

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

scripts/validate_schema.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Network accessline 50
    if "@context" not in obj:         errors.append(f"{prefix}: Missing @context")     elif obj["@context"] not in ("https://schema.org", "http://schema.org"):
  • Network accessline 51
    errors.append(f"{prefix}: Missing @context")     elif obj["@context"] not in ("https://schema.org", "http://schema.org"):         errors.append(f"{prefix}: @context should be 'https://schema.org'")
  • Network accessline 52
    elif obj["@context"] not in ("https://schema.org", "http://schema.org"):
  • Network accessline 53
    errors.append(f"{prefix}: @context should be 'https://schema.org'")

scripts/validate_skill_inventory.py

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

scripts/video_schema_checker.py

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

scripts/visual_regression_snapshot.py

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

scripts/x_robots_header_checker.py

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

tests/fixtures/report_data.json

  • Network accessline 1
    {   "url": "https://example.com/",
  • Network accessline 2
    "url": "https://example.com/",
  • Network accessline 34
    },     "social": {"score": 80},     "robots": {"status": 200, "sitemaps": ["https://example.com/sitemap.xml"], "ai_crawler_status": {}},
  • Network accessline 35
    "social": {"score": 80},     "robots": {"status": 200, "sitemaps": ["https://example.com/sitemap.xml"], "ai_crawler_status": {}},     "broken_links": {"summary": {"total": 10, "broken": 1}},
  • Network accessline 36
    "robots": {"status": 200, "sitemaps": ["https://example.com/sitemap.xml"], "ai_crawler_status": {}},
  • Network accessline 49
    ]     },     "onpage": {"title": "Example page", "meta_description": "", "h1": ["Example"], "canonical": "https://example.com/"},
  • Network accessline 50
    },     "onpage": {"title": "Example page", "meta_description": "", "h1": ["Example"], "canonical": "https://example.com/"},     "readability": {"flesch_reading_ease": 62},
  • Network accessline 51
    "onpage": {"title": "Example page", "meta_description": "", "h1": ["Example"], "canonical": "https://example.com/"},

tests/test_content_ai_scripts.py

  • Executable scriptline 1
    Executable file
  • Network accessline 17
    <meta property="article:published_time" content="2024-01-10">   <meta property="article:modified_time" content="2026-05-01">   <link rel="canonical" href="https://example.com/technical-seo-audit">
  • Network accessline 18
    <meta property="article:modified_time" content="2026-05-01">   <link rel="canonical" href="https://example.com/technical-seo-audit">   <script type="application/ld+json">
  • Network accessline 19
    <link rel="canonical" href="https://example.com/technical-seo-audit">
  • Network accessline 20
    <script type="application/ld+json">   {"@context":"https://schema.org","@type":"Article","author":{"@type":"Person","name":"Ada Analyst","sameAs":["https://www.wikidata.org/wiki/Q42"]},"datePublished":"2024-01-10","dateModified":"2026-05-01
  • Network accessline 21
    {"@context":"https://schema.org","@type":"Article","author":{"@type":"Person","name":"Ada Analyst","sameAs":["https://www.wikidata.org/wiki/Q42"]},"datePublished":"2024-01-10","dateModified":"2026-05-01"}
  • Network accessline 36
    <p>According to research in 2024, 64% of large sites had indexability issues.</p>     <p>We tested the checklist on 25 customer sites in 2026.</p>     <a href="https://www.gov.uk/service-manual">Government service manual</a>
  • Network accessline 37
    <p>We tested the checklist on 25 customer sites in 2026.</p>     <a href="https://www.gov.uk/service-manual">Government service manual</a>   </main>
  • Network accessline 38
    <a href="https://www.gov.uk/service-manual">Government service manual</a>
  • Network accessline 84
    cluster_csv.write_text(         "url,title,cluster,links\n"         "https://example.com/seo,Technical SEO Hub,technical seo,https://example.com/seo/crawl\n"
  • Network accessline 85
    "url,title,cluster,links\n"         "https://example.com/seo,Technical SEO Hub,technical seo,https://example.com/seo/crawl\n"         "https://example.com/seo/crawl,Crawl Audit,technical seo,https://example.com/seo\n",
  • Network accessline 86
    "https://example.com/seo,Technical SEO Hub,technical seo,https://example.com/seo/crawl\n"
  • Network accessline 87
    "https://example.com/seo/crawl,Crawl Audit,technical seo,https://example.com/seo\n",
  • Network accessline 96
    decay_csv.write_text(         "date,url,query,clicks,impressions,position\n"         "2026-04-01,https://example.com/seo,technical seo audit,100,1000,3\n"
  • Network accessline 97
    "date,url,query,clicks,impressions,position\n"         "2026-04-01,https://example.com/seo,technical seo audit,100,1000,3\n"         "2026-04-02,https://example.com/seo,technical seo checklist,10,500,9\n"
  • Network accessline 98
    "2026-04-01,https://example.com/seo,technical seo audit,100,1000,3\n"
  • Network accessline 99
    "2026-04-02,https://example.com/seo,technical seo checklist,10,500,9\n"
  • Network accessline 100
    "2026-05-01,https://example.com/seo,technical seo audit,40,950,5\n"
  • Network accessline 101
    "2026-05-02,https://example.com/seo,technical seo checklist,15,600,8\n",

tests/test_core_seo_scripts.py

  • Executable scriptline 1
    Executable file
  • Network accessline 16
    sitemap_generator = load_script("sitemap_generator")     xml = sitemap_generator.build_urlset([         {"url": "https://example.com/", "lastmod": "2026-05-15"},
  • Network accessline 17
    xml = sitemap_generator.build_urlset([         {"url": "https://example.com/", "lastmod": "2026-05-15"},         {"url": "https://example.com/about"},
  • Network accessline 18
    {"url": "https://example.com/", "lastmod": "2026-05-15"},
  • Network accessline 19
    {"url": "https://example.com/about"},
  • Network accessline 22
    assert "<loc>https://example.com/</loc>" in xml
  • Network accessline 28
    url_quality = load_script("url_quality")     result = url_quality.analyze_urls([         "https://example.com/Products/List?utm_source=x&sort=price&color=red",
  • Network accessline 29
    result = url_quality.analyze_urls([         "https://example.com/Products/List?utm_source=x&sort=price&color=red",     ])
  • Network accessline 30
    "https://example.com/Products/List?utm_source=x&sort=price&color=red",

tests/test_duplicate_content.py

  • Executable scriptline 1
    Executable file
  • Network accessline 16
    duplicate_content = load_script("duplicate_content")     report = duplicate_content.detect_duplicates({         "https://example.com/utility": {
  • Network accessline 17
    report = duplicate_content.detect_duplicates({         "https://example.com/utility": {             "text": "Short utility page",
  • Network accessline 18
    "https://example.com/utility": {
  • Network accessline 40
    report = duplicate_content.detect_duplicates(         {             "https://example.com/a": {
  • Network accessline 41
    {             "https://example.com/a": {                 "text": base,
  • Network accessline 42
    "https://example.com/a": {
  • Network accessline 45
    "html": f"<html><body>{base}</body></html>",             },             "https://example.com/b": {
  • Network accessline 46
    },             "https://example.com/b": {                 "text": variant,
  • Network accessline 47
    "https://example.com/b": {
  • Network accessline 67
    report = duplicate_content.detect_duplicates({         "https://example.com/indexable": {
  • Network accessline 68
    "https://example.com/indexable": {
  • Network accessline 71
    "html": f"<html><body>{text}</body></html>",         },         "https://example.com/noindex": {
  • Network accessline 72
    },         "https://example.com/noindex": {             "text": text,
  • Network accessline 73
    "https://example.com/noindex": {

tests/test_link_and_github_depth_scripts.py

  • Executable scriptline 1
    Executable file
  • Network accessline 18
    <html><body>       <a href="/features">Learn more</a>       <a href="https://example.com/pricing" rel="nofollow"></a>
  • Network accessline 19
    <a href="/features">Learn more</a>       <a href="https://example.com/pricing" rel="nofollow"></a>       <a href="https://external.test/">External</a>
  • Network accessline 20
    <a href="https://example.com/pricing" rel="nofollow"></a>
  • Network accessline 21
    <a href="https://external.test/">External</a>
  • Network accessline 25
    links = anchor_text_audit.extract_internal_anchors(html, "https://example.com/", "https://example.com/")
  • Network accessline 34
    row = log_file_analyzer.parse_log_line(         '127.0.0.1 - - [15/May/2026:10:20:30 +0000] "GET /missing HTTP/1.1" '         '404 123 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"'
  • Network accessline 35
    '127.0.0.1 - - [15/May/2026:10:20:30 +0000] "GET /missing HTTP/1.1" '         '404 123 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"'     )
  • Network accessline 36
    '404 123 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"'

tests/test_pagespeed.py

  • Executable scriptline 1
    Executable file
  • Network accessline 27
    result = pagespeed.parse_pagespeed_response(         load_fixture("pagespeed_field_data.json"),         url="https://example.com/",
  • Network accessline 28
    load_fixture("pagespeed_field_data.json"),         url="https://example.com/",         strategy="mobile",
  • Network accessline 29
    url="https://example.com/",
  • Network accessline 46
    result = pagespeed.parse_pagespeed_response(         load_fixture("pagespeed_lab_data.json"),         url="https://example.com/",
  • Network accessline 47
    load_fixture("pagespeed_lab_data.json"),         url="https://example.com/",         strategy="desktop",
  • Network accessline 48
    url="https://example.com/",
  • Network accessline 72
    result = pagespeed.get_pagespeed("https://example.com/", strategy="mobile")
  • Network accessline 82
    result = pagespeed.get_pagespeed("https://example.com/", strategy="mobile")
  • Access to secretsline 89
    [Credential-related source omitted]
  • Network accessline 94
    result = pagespeed.get_pagespeed_for_strategies("https://example.com/", ["mobile", "desktop"])

tests/test_performance_scripts.py

  • Executable scriptline 1
    Executable file
  • Network accessline 26
    @font-face { font-family: Demo; src: url("font.woff2") format("woff2"); }             </style>             <script src="https://www.googletagmanager.com/gtm.js"></script>
  • Network accessline 27
    </style>             <script src="https://www.googletagmanager.com/gtm.js"></script>           </head>
  • Network accessline 28
    <script src="https://www.googletagmanager.com/gtm.js"></script>

tests/test_readability.py

  • Executable scriptline 1
    Executable file

tests/test_reporting.py

  • Executable scriptline 1
    Executable file

tests/test_schema_local_ecommerce_scripts.py

  • Executable scriptline 1
    Executable file
  • Network accessline 16
    schema_required_props = load_script("schema_required_props")     doc = {         "@context": "https://schema.org",
  • Network accessline 17
    doc = {         "@context": "https://schema.org",         "@graph": [
  • Network accessline 18
    "@context": "https://schema.org",
  • Network accessline 19
    "@graph": [             {"@type": "Organization", "name": "Example Co", "url": "https://example.com"},             {"@type": "Product", "name": "Widget"},
  • Network accessline 20
    {"@type": "Organization", "name": "Example Co", "url": "https://example.com"},
  • Network accessline 32
    product_schema_checker = load_script("product_schema_checker")     doc = {         "@context": "https://schema.org",
  • Network accessline 33
    doc = {         "@context": "https://schema.org",         "@type": "Product",
  • Network accessline 34
    "@context": "https://schema.org",
  • Network accessline 56
    hreflang_sitemap_validator = load_script("hreflang_sitemap_validator")     xml = """<?xml version="1.0" encoding="UTF-8"?>     <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
  • Network accessline 57
    xml = """<?xml version="1.0" encoding="UTF-8"?>     <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"       xmlns:xhtml="http://www.w3.org/1999/xhtml">
  • Network accessline 58
    <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
  • Network accessline 59
    xmlns:xhtml="http://www.w3.org/1999/xhtml">
  • Network accessline 60
    <url>         <loc>https://example.com/en/</loc>         <xhtml:link rel="alternate" hreflang="en" href="https://example.com/en/"/>
  • Network accessline 61
    <loc>https://example.com/en/</loc>
  • Network accessline 62
    <xhtml:link rel="alternate" hreflang="en" href="https://example.com/en/"/>
  • Network accessline 63
    <xhtml:link rel="alternate" hreflang="fr" href="https://example.com/fr/"/>
  • Network accessline 68
    result = hreflang_sitemap_validator.parse_hreflang_sitemap(xml, "https://example.com/sitemap.xml")

wiki/Audit-Workflow.md

  • Network accessline 8
    python3 <SKILL_DIR>/scripts/fetch_page.py https://example.com --output /tmp/page.html
  • Network accessline 9
    python3 <SKILL_DIR>/scripts/parse_html.py /tmp/page.html --url https://example.com --json
  • Network accessline 10
    python3 <SKILL_DIR>/scripts/readability.py /tmp/page.html --json python3 <SKILL_DIR>/scripts/pagespeed.py https://example.com --strategy mobile python3 <SKILL_DIR>/scripts/security_headers.py https://example.com
  • Network accessline 11
    python3 <SKILL_DIR>/scripts/pagespeed.py https://example.com --strategy mobile
  • Network accessline 12
    python3 <SKILL_DIR>/scripts/security_headers.py https://example.com
  • Network accessline 13
    python3 <SKILL_DIR>/scripts/social_meta.py https://example.com
  • Network accessline 24
    python3 <SKILL_DIR>/scripts/audit_runner.py https://example.com --output-dir audit-output
  • Network accessline 32
    python3 <SKILL_DIR>/scripts/generate_report.py https://example.com --output SEO-REPORT.html
  • Access to secretsline 51
    [Credential-related source omitted]

wiki/Command-Reference.md

  • Network accessline 29
    perform seo analysis on https://example.com

wiki/Home.md

  • Network accessline 32
    curl -fsSLO https://raw.githubusercontent.com/Bhanunamikaze/Agentic-SEO-Skill/main/install.sh
  • Network accessline 39
    $seo audit https://example.com
  • Network accessline 45
    Run a full SEO audit for https://example.com.
  • Network accessline 55
    python3 ~/.codex/skills/seo/scripts/generate_report.py "https://example.com" --output SEO-REPORT.html
  • Network accessline 60
    ![SEO report dashboard example](https://raw.githubusercontent.com/Bhanunamikaze/Agentic-SEO-Skill/main/docs/images/report-dashboard.png)

wiki/Installation.md

  • Network accessline 9
    https://github.com/Bhanunamikaze/Agentic-SEO-Skill/releases/tag/v3.0.0
  • Dangerous shell operationline 39
    curl -fsSL https://raw.githubusercontent.com/Bhanunamikaze/Agentic-SEO-Skill/main/install.sh | bash -s -- --online
  • Network accessline 39
    curl -fsSL https://raw.githubusercontent.com/Bhanunamikaze/Agentic-SEO-Skill/main/install.sh | bash -s -- --online
  • Dangerous shell operationline 45
    curl -fsSL https://raw.githubusercontent.com/Bhanunamikaze/Agentic-SEO-Skill/main/install.sh | bash -s -- --online --target claude
  • Network accessline 45
    curl -fsSL https://raw.githubusercontent.com/Bhanunamikaze/Agentic-SEO-Skill/main/install.sh | bash -s -- --online --target claude
  • Dangerous shell operationline 51
    curl -fsSL https://raw.githubusercontent.com/Bhanunamikaze/Agentic-SEO-Skill/main/install.sh | bash -s -- --online --target codex
  • Network accessline 51
    curl -fsSL https://raw.githubusercontent.com/Bhanunamikaze/Agentic-SEO-Skill/main/install.sh | bash -s -- --online --target codex
  • Dangerous shell operationline 57
    curl -fsSL https://raw.githubusercontent.com/Bhanunamikaze/Agentic-SEO-Skill/main/install.sh | bash -s -- --online --target global
  • Network accessline 57
    curl -fsSL https://raw.githubusercontent.com/Bhanunamikaze/Agentic-SEO-Skill/main/install.sh | bash -s -- --online --target global
  • Dangerous shell operationline 63
    curl -fsSL https://raw.githubusercontent.com/Bhanunamikaze/Agentic-SEO-Skill/main/install.sh | bash -s -- --online --target project --project-dir /path/to/your/project
  • Network accessline 63
    curl -fsSL https://raw.githubusercontent.com/Bhanunamikaze/Agentic-SEO-Skill/main/install.sh | bash -s -- --online --target project --project-dir /path/to/your/project
  • Dangerous shell operationline 69
    curl -fsSL https://raw.githubusercontent.com/Bhanunamikaze/Agentic-SEO-Skill/main/install.sh | bash -s -- --online --target all --project-dir /path/to/your/project
  • Network accessline 69
    curl -fsSL https://raw.githubusercontent.com/Bhanunamikaze/Agentic-SEO-Skill/main/install.sh | bash -s -- --online --target all --project-dir /path/to/your/project
  • Network accessline 75
    curl -fsSLO https://raw.githubusercontent.com/Bhanunamikaze/Agentic-SEO-Skill/main/install.sh
  • Network accessline 84
    iwr https://raw.githubusercontent.com/Bhanunamikaze/Agentic-SEO-Skill/main/install.ps1 -OutFile install.ps1
  • Network accessline 122
    git clone https://github.com/Bhanunamikaze/Agentic-SEO-Skill.git
  • Network accessline 197
    curl -fsSLO https://raw.githubusercontent.com/Bhanunamikaze/Agentic-SEO-Skill/main/install.sh
  • Network accessline 205
    iwr https://raw.githubusercontent.com/Bhanunamikaze/Agentic-SEO-Skill/main/install.ps1 -OutFile install.ps1
  • Network accessline 261
    Run an SEO audit on https://example.com.
  • Network accessline 269
    Analyze Core Web Vitals for https://example.com and prioritize fixes.
  • Network accessline 279
    $seo audit https://example.com

wiki/Release-and-Packaging.md

  • Network accessline 7
    https://github.com/Bhanunamikaze/Agentic-SEO-Skill/releases/tag/v3.0.0

wiki/Reports-and-Outputs.md

  • Network accessline 18
    Run a full SEO audit for https://example.com.
  • Network accessline 53
    python3 scripts/generate_report.py "https://example.com" --output SEO-REPORT.html
  • Network accessline 59
    python3 ~/.codex/skills/seo/scripts/generate_report.py "https://example.com" --output SEO-REPORT.html
  • Network accessline 72
    ![SEO report dashboard example](https://raw.githubusercontent.com/Bhanunamikaze/Agentic-SEO-Skill/main/docs/images/report-dashboard.png)
  • Network accessline 88
    python3 scripts/audit_runner.py "https://example.com" --output-dir audit-output
  • Network accessline 194
    python3 <SKILL_DIR>/scripts/generate_report.py https://example.com --output SEO-REPORT.html

wiki/Troubleshooting.md

  • Access to secretsline 24
    [Credential-related source omitted]

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: 18 facts
  • Dangerous shell operation in code of documentationREADME.md:152Low confidence
  • Network access in code of documentationREADME.md:152Low confidence
  • Dangerous shell operation in code of documentationREADME.md:155Low confidence
  • Network access in code of documentationREADME.md:155Low confidence
  • Dangerous shell operation in code of documentationREADME.md:158Low confidence
  • Network access in code of documentationREADME.md:158Low confidence
  • Dangerous shell operation in code of documentationREADME.md:161Low confidence
  • Network access in code of documentationREADME.md:161Low confidence
  • Network access in code of documentationREADME.md:167Low confidence
  • Network access in code of documentationREADME.md:182Low confidence
  • Network access in code of documentationREADME.md:234Low confidence
  • Network access in prose of documentationREADME.md:280Low confidence
  • Network access in code of documentationREADME.md:473Low confidence
  • Access to secrets in code of documentationREADME.md:498Low confidence
  • Access to secrets in code of documentation: a variable, placeholder or call, not a stored valueREADME.md:499Low confidence
  • Access to secrets in code of documentationREADME.md:513Low confidence
  • Network access in code of documentationREADME.md:519Low confidence
  • Network access in code of documentationREADME.md:552Low confidence

Works with

Agent compatibility, from the files in this repository
AgentStatusEvidenceInstall to
Claude CodeCompatibleStandard SKILL.md SKILL.md.claude/skills/<skill-name>/
CodexCompatibleStandard SKILL.md SKILL.md.agents/skills/<skill-name>/
CursorCompatibleStandard SKILL.md SKILL.md.cursor/skills/<skill-name>/
Gemini CLICompatibleStandard SKILL.md SKILL.md.gemini/skills/<skill-name>/
GitHub CopilotCompatibleStandard SKILL.md SKILL.md.github/skills/<skill-name>/
OpenCodeCompatibleStandard SKILL.md 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.

Add this badge to your README

It updates every night and links to this page.

Bhanunamikaze/Agentic-SEO-Skill: #880 on hotskills, 1k stars

[![Bhanunamikaze/Agentic-SEO-Skill on hotskills](https://hotskills.dev/badge/bhanunamikaze-agentic-seo-skill.svg)](https://hotskills.dev/skill/bhanunamikaze-agentic-seo-skill/)