Not in the top 1,000 by GitHub stars

AgriciDaniel/jev-seo

Live SEO audit for any website from one homepage URL, judged by Jev. PDF, XLSX and Markdown reports.

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

55a184a3b0d0 → 55a184a3b0d0

Compare on GitHub

View on GitHubAdd to my skills

Verified commit 55a184a3b0d09565a4c84268f725a47784e62528

756GitHub stars
31stars in 7 days
1skill in this repository
0commits in 30 days

Heat

4.4
  • Star growth, last 7 daysNot available
  • Star growth, last 24 hoursNot available
  • Rank movement, last 7 daysNot available
  • Commits, last 30 daysNot available
  • Accounts asking about it through MCP, last 7 daysNot available
  • Hot votes this weekNot available

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

Stars over time

Sep 20, 2026Nov 5, 2026756

Individual skills in this repository

How it works

jev-seo

When your agent uses it

Full live SEO audit of any website from its homepage URL, powered by Jev (TypeSafe's System One model). Crawls the site live (robots.txt, sitemaps, internal links, JavaScript rendering when needed), runs 52 deterministic checks tied to Google Search Central, measures Core Web Vitals with PageSpeed Insights, asks Jev batched typed questions about every page (page type, intent, importance, helpfulness, specificity, trust, citability, title and meta fit, competing pages), scores and ranks every fix, then exports a designed PDF with charts and Jev-style infographics, an Excel action tracker and a Markdown report. Use when the user says "/jev-seo", "jev seo", "audit this site", "SEO audit", "site audit with Jev", or gives a homepage URL and wants an SEO report, PDF, XLSX or MD.

What it loads into context

Frontmatter

231 tokens

Always available to the agent

SKILL.md

2,593 tokens

When the skill is activated

Reference documents

19,663 tokens

Loaded on request

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

The playbook

  1. Workflow
  2. Options
  3. What the report contains
  4. Rules
  5. Deeper references

Scripts executed separately

  • bin/jevseo
  • jevseo/__init__.py
  • jevseo/__main__.py
  • jevseo/checks.py
  • jevseo/cli.py
  • jevseo/crawl.py
  • jevseo/dfs.py
  • jevseo/env.py
  • jevseo/jev.py
  • jevseo/parse.py
  • jevseo/psi.py
  • jevseo/report/__init__.py
  • jevseo/report/charts.py
  • jevseo/report/md.py
  • jevseo/report/pdf.py
  • jevseo/report/xlsx.py
  • jevseo/score.py
  • tests/test_jevseo.py

Files

  • .env.exampleasset310 bytes
  • .github/workflows/ci.ymlasset662 bytes
  • .gitignoreasset41 bytes
  • CHANGELOG.mddoc2,261 bytes
  • CONTRIBUTING.mddoc684 bytes
  • LICENSEasset1,070 bytes
  • README.mddoc11,620 bytes
  • SECURITY.mddoc514 bytes
  • SKILL.mdcore10,079 bytes
  • SKILL.mdcore10,079 bytes
  • SKILL.mdcore10,079 bytes
  • SKILL.mdcore10,079 bytes
  • bin/jevseoruns244 bytes
  • docs/assets/banner.pngasset67,452 bytes
  • docs/assets/banner.svgasset4,978 bytes
  • docs/assets/impact_effort.pngasset47,217 bytes
  • docs/assets/invest.pngasset91,643 bytes
  • docs/assets/opportunities.pngasset94,842 bytes
  • docs/assets/pipeline.svgasset4,404 bytes
  • docs/assets/preview-jev.jpgasset107,984 bytes
  • docs/assets/preview-md.pngasset223,209 bytes
  • docs/assets/preview-method.jpgasset119,653 bytes
  • docs/assets/preview-summary.jpgasset124,282 bytes
  • docs/assets/preview-terminal.pngasset156,952 bytes
  • docs/assets/preview-visibility.jpgasset109,585 bytes
  • docs/assets/preview-xlsx.pngasset153,132 bytes
  • examples/claude-seo.md/charts/categories.pngasset67,164 bytes
  • examples/claude-seo.md/charts/cwv.pngasset28,307 bytes
  • examples/claude-seo.md/charts/funnel.pngasset29,086 bytes
  • examples/claude-seo.md/charts/gauge.pngasset26,636 bytes
  • examples/claude-seo.md/charts/impact_effort.pngasset47,217 bytes
  • examples/claude-seo.md/charts/invest.pngasset91,643 bytes
  • examples/claude-seo.md/charts/jev_confidence.pngasset48,945 bytes
  • examples/claude-seo.md/charts/jev_heatmap.pngasset288,029 bytes
  • examples/claude-seo.md/charts/lighthouse.pngasset28,892 bytes
  • examples/claude-seo.md/charts/opportunities.pngasset94,842 bytes
  • examples/claude-seo.md/charts/positions.pngasset22,732 bytes
  • examples/claude-seo.md/charts/referring_domains.pngasset41,650 bytes
  • examples/claude-seo.md/charts/severity_by_category.pngasset54,076 bytes
  • examples/claude-seo.md/charts/site_map.pngasset409,695 bytes
  • examples/claude-seo.md/digest.mddoc10,023 bytes
  • examples/claude-seo.md/narrative.jsonasset3,619 bytes
  • examples/claude-seo.md/report.mddoc29,953 bytes
  • examples/claude-seo.md/report.pdfasset424,418 bytes
  • examples/claude-seo.md/report.xlsxasset1,361,268 bytes
  • jevseo/__init__.pyruns166 bytes
  • jevseo/__main__.pyruns36 bytes
  • jevseo/checks.pyruns30,026 bytes
  • jevseo/cli.pyruns18,056 bytes
  • jevseo/crawl.pyruns20,295 bytes
  • jevseo/dfs.pyruns13,518 bytes
  • jevseo/env.pyruns1,172 bytes
  • jevseo/fonts/Inter-Bold.otfasset631,880 bytes
  • jevseo/fonts/Inter-ExtraBold.otfasset633,580 bytes
  • jevseo/fonts/Inter-Medium.otfasset627,988 bytes
  • jevseo/fonts/Inter-Regular.otfasset609,600 bytes
  • jevseo/fonts/Inter-SemiBold.otfasset629,912 bytes
  • jevseo/fonts/InterDisplay-Bold.otfasset629,020 bytes
  • jevseo/fonts/InterDisplay-ExtraBold.otfasset629,712 bytes
  • jevseo/fonts/JetBrainsMono-Medium.ttfasset273,860 bytes
  • jevseo/fonts/inter-OFL.txtdoc4,377 bytes
  • jevseo/fonts/jetbrainsmono-OFL.txtdoc4,399 bytes
  • jevseo/jev.pyruns26,370 bytes
  • jevseo/parse.pyruns8,837 bytes
  • jevseo/psi.pyruns4,366 bytes
  • jevseo/report/__init__.pyruns21,278 bytes
  • jevseo/report/charts.pyruns24,950 bytes
  • jevseo/report/md.pyruns11,477 bytes
  • jevseo/report/pdf.pyruns2,205 bytes
  • jevseo/report/xlsx.pyruns21,042 bytes
  • jevseo/score.pyruns24,705 bytes
  • jevseo/templates/report.cssasset10,051 bytes
  • jevseo/templates/report.html.j2asset26,992 bytes
  • pyproject.tomlasset808 bytes
  • references/evaluation.mddoc4,331 bytes
  • references/judgments.mddoc4,621 bytes
  • references/method.mddoc2,860 bytes
  • references/narrative.mddoc2,657 bytes
  • requirements.txtdoc67 bytes
  • tests/test_jevseo.pyruns27,025 bytes
Read SKILL.md

# Jev SEO

One command, one homepage URL, a complete audit. The operating rule is the
Jev brain's: **a source finds, code decides, Jev judges, Claude writes.**
Code crawls, counts, parses and scores. Jev answers only narrow semantic
questions, with probabilities kept. You (the lead agent) review the
evidence and write the narrative. Nobody invents a number.

The CLI lives in this skill folder. Call it through `bin/jevseo` using the
skill's base directory, for example `"<skill-dir>/bin/jevseo" doctor`.

## Workflow

1. **Resolve the input.** The user supplies a homepage URL. If none was
View the complete source on GitHub

Skills included

  • jev-seo

Repository facts

License
MIT
Created
Sep 22, 2026
Last pushed
Sep 22, 2026
Forks
122
Open issues
1
Project activity
Active

Rank over the last 12 weeks

Now #916 · best #843 · up 26 in 30 days

  1. #893 on Oct 18
  2. #936 on Oct 19
  3. #920 on Oct 20
  4. #933 on Oct 21
  5. #900 on Oct 22
  6. #916 since Oct 23
28 earlier periods
  1. #915 on Sep 20
  2. #936 on Sep 21
  3. #952 on Sep 22
  4. #942 on Sep 23
  5. #907 on Sep 24
  6. #855 on Sep 25
  7. #878 on Sep 26
  8. #897 on Sep 27
  9. #942 on Sep 28
  10. #967 on Sep 29
  11. #927 on Sep 30
  12. #857 on Oct 1
  13. #872 on Oct 2
  14. #843 on Oct 3
  15. #887 on Oct 4
  16. #906 on Oct 5
  17. #895 on Oct 6
  18. #929 on Oct 7
  19. #970 on Oct 8
  20. #934 on Oct 9
  21. #910 on Oct 10
  22. #922 on Oct 11
  23. #944 on Oct 12
  24. #934 on Oct 13
  25. #945 on Oct 14
  26. #929 on Oct 15
  27. #930 on Oct 16
  28. #911 on Oct 17

Before you install

Network or broad shell

Automated signals, not a guarantee

Checked Nov 6, 2026

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

Show 3 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
Show all 310 signals by file

.env.example

  • Access to secretsline 1
    [Credential-related source omitted]
  • Access to secretsline 2
    [Credential-related source omitted]
  • Access to secretsline 4
    [Credential-related source omitted]

.github/workflows/ci.yml

  • Dangerous shell operationline 18
    run: sudo apt-get update && sudo apt-get install -y libpango-1.0-0 libpangoft2-1.0-0 libharfbuzz0b poppler-utils

.gitignore

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

README.md

  • Network accessline 5
    [![version](https://img.shields.io/badge/version-0.1.1-d45bb6?style=flat-square&labelColor=0b0b0b)](CHANGELOG.md)
  • Network accessline 6
    [![checks](https://github.com/AgriciDaniel/jev-seo/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/AgriciDaniel/jev-seo/actions/workflows/ci.yml)
  • Network accessline 7
    [![license](https://img.shields.io/badge/license-MIT-666666?style=flat-square&labelColor=0b0b0b)](LICENSE)
  • Network accessline 8
    [![python](https://img.shields.io/badge/python-3.10%2B-666666?style=flat-square&labelColor=0b0b0b)](pyproject.toml)
  • Network accessline 9
    [![jev](https://img.shields.io/badge/judged%20by-jev--1.13.0-d45bb6?style=flat-square&labelColor=0b0b0b)](https://docs.typesafe.ai/primitives)
  • Network accessline 11
    jev-seo is a **live SEO audit for any website, from one homepage URL**. It crawls the site, checks it against 52 rules tied to Google Search Central, measures Core Web Vitals, and asks [Jev](https://docs.typesafe.ai/primitives), TypeSafe's 
  • Network accessline 13
    It runs as a Claude Code skill (`/jev-seo https://example.com`) or from the command line. The standard mode needs no SEO data subscription and costs about a cent in Jev per site. An optional `--full` mode adds rankings, keywords and backlin
  • Network accessline 31
    A full audit of [claude-seo.md](https://claude-seo.md), run with `--full` on 2026-09-22. Every file is in [`examples/claude-seo.md/`](examples/claude-seo.md/): [report.pdf](examples/claude-seo.md/report.pdf) · [report.xlsx](examples/claude-
  • Dangerous shell operationline 63
    Python 3.10+. WeasyPrint needs the Pango text library: on Debian or Ubuntu `sudo apt install libpango-1.0-0 libpangoft2-1.0-0`, on macOS `brew install pango`, on Fedora it is usually present ([WeasyPrint install notes](https://doc.courtboui
  • Network accessline 63
    Python 3.10+. WeasyPrint needs the Pango text library: on Debian or Ubuntu `sudo apt install libpango-1.0-0 libpangoft2-1.0-0`, on macOS `brew install pango`, on Fedora it is usually present ([WeasyPrint install notes](https://doc.courtboui
  • Network accessline 66
    git clone https://github.com/AgriciDaniel/jev-seo.git
  • Network accessline 70
    [Credential-related source omitted]
  • Access to secretsline 70
    [Credential-related source omitted]
  • Network accessline 72
    bin/jevseo run https://example.com             # audit and render with an automatic summary
  • Network accessline 83
    In Claude Code, link the folder as a skill (`ln -s "$PWD" ~/.claude/skills/jev-seo`) and run `/jev-seo https://example.com`. The skill runs the audit in the background, relays progress, reads the digest, checks surprising findings, writes t
  • Network accessline 86
    bin/jevseo audit https://example.com                            # crawl, rules, Jev, PageSpeed -> audit.json + digest.md
  • Network accessline 87
    bin/jevseo render jev-seo-reports/<dir>                         # -> report.pdf, report.xlsx, report.md bin/jevseo audit https://example.com --full                     # add DataForSEO (paid per call) bin/jevseo audit https://example.com --
  • Network accessline 88
    bin/jevseo audit https://example.com --full                     # add DataForSEO (paid per call)
  • Network accessline 89
    bin/jevseo audit https://example.com --full --reuse-dfs <dir>   # reuse DataForSEO data already collected
  • Access to secretsline 105
    [Credential-related source omitted]

SKILL.md

  • Access to secretsline 35
    [Credential-related source omitted]
  • Network accessline 172
    measured about accuracy and repeatability. - For Jev API questions use the official docs at   https://docs.typesafe.ai (and a local Jev knowledge brain or agent if
  • Network accessline 173
    - For Jev API questions use the official docs at   https://docs.typesafe.ai (and a local Jev knowledge brain or agent if   one is installed). Re-check price and model alias before relying on
  • Network accessline 174
    https://docs.typesafe.ai (and a local Jev knowledge brain or agent if
  • Network accessline 176
    them (`GET https://api.typesafe.ai/v1/models`).

bin/jevseo

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

docs/assets/banner.svg

  • Network accessline 1
    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1600 480" width="1600" height="480" font-family="Inter, 'Helvetica Neue', Arial, sans-serif">

docs/assets/pipeline.svg

  • Network accessline 1
    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 420" width="1200" height="420" font-family="Inter, 'Helvetica Neue', Arial, sans-serif">

examples/claude-seo.md/digest.md

  • Network accessline 39
    ## No issue detected by rule robots_missing, robots_blocks_site, sitemap_missing, sitemap_errors, sitemap_bad_urls, not_in_sitemap, http_errors, broken_internal_links, redirect_chains, links_to_redirects, noindex, canonical_missing, canonic
  • Network accessline 40
    robots_missing, robots_blocks_site, sitemap_missing, sitemap_errors, sitemap_bad_urls, not_in_sitemap, http_errors, broken_internal_links, redirect_chains, links_to_redirects, noindex, canonical_missing, canonical_elsewhere, canonical_broke
  • Network accessline 41
    - PSI mobile https://claude-seo.md/: scores {'performance': 99, 'accessibility': 100, 'best-practices': 100, 'seo': 100}; field (URL-level) LCP 1024ms good; INP 89ms good; CLS 0.0 good; FCP 1046ms good; TTFB 690ms good
  • Network accessline 42
    - PSI desktop https://claude-seo.md/: scores {'performance': 99, 'accessibility': 100, 'best-practices': 100, 'seo': 100}; field (URL-level) LCP 748ms good; INP 50ms good; CLS 0.0 good; FCP 753ms good; TTFB 507ms good
  • Network accessline 43
    - PSI mobile https://claude-seo.md/install: scores {'performance': 100, 'accessibility': 100, 'best-practices': 100, 'seo': 100}; field (origin-level) LCP 933ms good; INP 88ms good; CLS 0.0 good; FCP 931ms good; TTFB 600ms good
  • Network accessline 44
    - PSI desktop https://claude-seo.md/install: scores {'performance': 100, 'accessibility': 100, 'best-practices': 100, 'seo': 100}; field (URL-level) LCP 644ms good; INP 33ms good; CLS 0.0 good; FCP 744ms good; TTFB 370ms good
  • Network accessline 45
    - PSI mobile https://claude-seo.md/skills: scores {'performance': 94, 'accessibility': 96, 'best-practices': 100, 'seo': 100}; field (URL-level) LCP 580ms good; CLS 0.0 good; FCP 544ms good; TTFB 347ms good
  • Network accessline 46
    - PSI desktop https://claude-seo.md/skills: scores {'performance': 99, 'accessibility': 96, 'best-practices': 100, 'seo': 100}; field (URL-level) LCP 382ms good; INP 30ms good; CLS 0.0 good; FCP 389ms good; TTFB 179ms good

examples/claude-seo.md/report.md

  • Network accessline 214
    | Page A | Page B | Title overlap | P(compete) | |---|---|---:|---:| | https://claude-seo.md/skills/seo-drift | https://claude-seo.md/blog/seo-drift-monitoring-guide | 1.0 | 0.53 |
  • Network accessline 215
    |---|---|---:|---:| | https://claude-seo.md/skills/seo-drift | https://claude-seo.md/blog/seo-drift-monitoring-guide | 1.0 | 0.53 | | https://claude-seo.md/blog/claude-seo-v190-community-release | https://claude-seo.md/blog/claude-seo-v2-re
  • Network accessline 216
    | https://claude-seo.md/skills/seo-drift | https://claude-seo.md/blog/seo-drift-monitoring-guide | 1.0 | 0.53 |
  • Network accessline 217
    | https://claude-seo.md/blog/claude-seo-v190-community-release | https://claude-seo.md/blog/claude-seo-v2-release | 1.0 | 0.32 |
  • Network accessline 218
    | https://claude-seo.md/blog/claude-seo-v190-community-release | https://claude-seo.md/blog/claude-seo-v231-release | 1.0 | 0.31 |
  • Network accessline 219
    | https://claude-seo.md/blog/claude-seo-v231-release | https://claude-seo.md/blog/claude-seo-v220-release | 1.0 | 0.26 |
  • Network accessline 220
    | https://claude-seo.md/ | https://claude-seo.md/skills | 1.0 | 0.24 |
  • Network accessline 221
    | https://claude-seo.md/blog/claude-seo-v190-community-release | https://claude-seo.md/blog/claude-seo-v220-release | 1.0 | 0.24 |
  • Network accessline 222
    | https://claude-seo.md/skills | https://claude-seo.md/blog/claude-seo-v2-release | 1.0 | 0.23 |
  • Network accessline 223
    | https://claude-seo.md/blog/claude-seo-v190-community-release | https://claude-seo.md/blog/claude-seo-v181-image-seo | 1.0 | 0.23 |
  • Network accessline 224
    | https://claude-seo.md/blog/claude-seo-v190-community-release | https://claude-seo.md/blog/claude-seo-v196-flow-security-hardening | 1.0 | 0.23 |
  • Network accessline 225
    | https://claude-seo.md/blog/claude-seo-v190-community-release | https://claude-seo.md/blog/claude-seo-v224-release | 1.0 | 0.23 |
  • Network accessline 226
    | https://claude-seo.md/blog/claude-seo-v190-community-release | https://claude-seo.md/blog/claude-seo-v223-release | 1.0 | 0.22 |
  • Network accessline 227
    | https://claude-seo.md/ | https://claude-seo.md/blog/claude-seo-v2-release | 1.0 | 0.21 |
  • Network accessline 228
    | https://claude-seo.md/blog/claude-seo-v190-community-release | https://claude-seo.md/blog/claude-seo-v225-release | 1.0 | 0.21 |
  • Network accessline 229
    | https://claude-seo.md/blog/claude-seo-v190-community-release | https://claude-seo.md/blog/claude-seo-v172-update | 1.0 | 0.21 |
  • Network accessline 230
    | https://claude-seo.md/blog/claude-seo-v181-image-seo | https://claude-seo.md/blog/claude-seo-v2-release | 1.0 | 0.20 |
  • Network accessline 231
    | https://claude-seo.md/skills | https://claude-seo.md/blog/claude-seo-v190-community-release | 1.0 | 0.19 |
  • Network accessline 232
    | https://claude-seo.md/skills | https://claude-seo.md/blog/claude-seo-v231-release | 1.0 | 0.18 |
  • Network accessline 233
    | https://claude-seo.md/skills | https://claude-seo.md/blog/claude-seo-v220-release | 1.0 | 0.17 |
  • Network accessline 234
    | https://claude-seo.md/skills | https://claude-seo.md/blog/claude-seo-v223-release | 1.0 | 0.17 |
  • Network accessline 235
    | https://claude-seo.md/skills | https://claude-seo.md/blog/claude-seo-v181-image-seo | 1.0 | 0.16 |
  • Network accessline 243
    - Evidence: 1 affected · www.claude-seo.md answered 307 - Fix: Use a permanent redirect (301 or 308) for www, non-www and HTTP to HTTPS, so search engines consolidate on one host. ([source](https://developers.google.com/search/docs/crawling
  • Network accessline 244
    - Fix: Use a permanent redirect (301 or 308) for www, non-www and HTTP to HTTPS, so search engines consolidate on one host. ([source](https://developers.google.com/search/docs/crawling-indexing/301-redirects))
  • Network accessline 245
    - URLs: https://claude-seo.md/
  • Network accessline 251
    - Evidence: 2 affected · Jev P(H1 states the topic) averaged 0.29 (0 worst, 1 best) on 2 pages: /, /blog/claude-seo-v224-release - Fix: Make the H1 name the page's topic rather than a slogan. ([source](https://developers.google.com/search/d
  • Network accessline 252
    - Fix: Make the H1 name the page's topic rather than a slogan. ([source](https://developers.google.com/search/docs/fundamentals/seo-starter-guide))
  • Network accessline 253
    - URLs: https://claude-seo.md/, https://claude-seo.md/blog/claude-seo-v224-release
  • Network accessline 259
    - Evidence: 2 affected · Anchors such as: LEARN MORE → - Fix: Use anchor text that describes the destination. ([source](https://developers.google.com/search/docs/crawling-indexing/links-crawlable))
  • Network accessline 260
    - Fix: Use anchor text that describes the destination. ([source](https://developers.google.com/search/docs/crawling-indexing/links-crawlable))
  • Network accessline 261
    - URLs: https://claude-seo.md/blog/best-claude-code-skills, https://claude-seo.md/blog/claude-seo-vs-ahrefs-semrush
  • Network accessline 265
    - Evidence: 1 affected · 1 of 80 sampled outbound links - Fix: Update or remove outbound links that no longer resolve. ([source](https://developers.google.com/crawling/docs/troubleshooting/http-status-codes))
  • Network accessline 266
    - Fix: Update or remove outbound links that no longer resolve. ([source](https://developers.google.com/crawling/docs/troubleshooting/http-status-codes))
  • Network accessline 267
    - URLs: https://www.skool.com/@daniel-agrici-3925
  • Network accessline 273
    - Evidence: 28 affected · SoftwareApplication on / lacks aggregateRating or review; SoftwareApplication on /skills lacks offers.price, aggregateRating or review; SoftwareApplication on /install lacks aggregateRating or review; SoftwareAppli
  • Network accessline 274
    - Fix: Add the missing required properties listed in the evidence, or remove markup that cannot be completed truthfully. ([source](https://developers.google.com/search/docs/appearance/structured-data/intro-structured-data))
  • Network accessline 275
    - URLs: https://claude-seo.md/, https://claude-seo.md/install, https://claude-seo.md/skills, https://claude-seo.md/skills/seo, https://claude-seo.md/skills/seo-audit, https://claude-seo.md/skills/seo-backlinks, https://claude-seo.md/skills/
  • Network accessline 281
    - Evidence: 2 affected · seo tools (site at position 35; AI Overview cites semrush.com, zapier.com); sxo (site at position 18; AI Overview cites bluerank.com, gemeosagency.com, linkedin.com) - Fix: Study who is cited today and make sure the
  • Network accessline 282
    - Fix: Study who is cited today and make sure the page answers the search directly. Google states there are no extra requirements to appear in AI Overviews beyond normal Search eligibility. ([source](https://developers.google.com/search/doc
  • Network accessline 283
    - URLs: https://claude-seo.md/
  • Network accessline 287
    - Evidence: 4 affected · Jev P(opens with the point) averaged 0.42 (0 worst, 1 best) on 4 pages - Fix: Open with a one or two sentence answer or offer before any preamble. Editorial heuristic for readers and answer engines, not a Google req
  • Network accessline 288
    - Fix: Open with a one or two sentence answer or offer before any preamble. Editorial heuristic for readers and answer engines, not a Google requirement. ([source](https://developers.google.com/search/docs/appearance/ai-features))
  • Network accessline 289
    - URLs: https://claude-seo.md/blog/claude-seo-34k-organic-clicks, https://claude-seo.md/blog/generative-engine-optimization-guide, https://claude-seo.md/blog/best-claude-code-skills, https://claude-seo.md/blog/wp-mcp-ultimate-wordpress-ai-s
  • Network accessline 299
    - Evidence: 4 affected · 20 images without explicit size - Fix: Set width and height so layout does not shift while images load. ([source](https://web.dev/articles/optimize-cls))
  • Network accessline 300
    - Fix: Set width and height so layout does not shift while images load. ([source](https://web.dev/articles/optimize-cls))
  • Network accessline 301
    - URLs: https://claude-seo.md/blog/claude-seo-v220-release, https://claude-seo.md/blog/claude-seo-v190-community-release, https://claude-seo.md/blog/claude-seo-v2-release, https://claude-seo.md/blog/claude-seo-v196-flow-security-hardening
  • Network accessline 307
    - Evidence: 4 affected · sxo (720/mo, position 18, difficulty 0); seo skills claude (90/mo, position 16, difficulty 0); seo code (90/mo, position 6, difficulty 14); longer term: free website audit online (110/mo, position 19, difficulty 84)
  • Network accessline 308
    - Fix: Strengthen the ranking page for each keyword: answer the search more fully, add internal links to it and tighten its title. ([source](https://docs.dataforseo.com/v3/dataforseo_labs/overview/))
  • Network accessline 309
    - URLs: https://claude-seo.md/, https://claude-seo.md/skills, https://claude-seo.md/skills/seo-sxo
  • Network accessline 313
    - Evidence: 25 affected · difficulty unknown: claude seo skill github (50/mo) -> /skills; difficulty unknown: claude seo plugin (30/mo) -> /; difficulty unknown: claude seo tool (20/mo) -> /; difficulty unknown: claude seo audit (20/mo) -> 
  • Network accessline 314
    - Fix: Expand the named page to cover each keyword's search need, then link to it from related pages. ([source](https://docs.dataforseo.com/v3/dataforseo_labs/overview/))
  • Network accessline 315
    - URLs: https://claude-seo.md/, https://claude-seo.md/skills, https://claude-seo.md/skills/seo-audit, https://claude-seo.md/skills/seo-geo, https://claude-seo.md/skills/seo-maps, https://claude-seo.md/skills/seo-schema and 17 more
  • Network accessline 319
    - Evidence: 1 affected · 40 referring domains against a median of 101,083 across 5 domains ranking for the same keywords (semrush.com 137,260, moz.com 118,858, ahrefs.com 101,083, searchengineland.com 95,931, seranking.com 17,391) - Fix: Ea
  • Network accessline 320
    - Fix: Earn links from sites your audience already reads: original data, tools, guest expertise and partner pages. ([source](https://docs.dataforseo.com/v3/backlinks/overview/))
  • Network accessline 321
    - URLs: https://claude-seo.md/
  • Network accessline 342
    | Page | Depth | Words | Inlinks | Type (Jev) | Intent (Jev) | Importance | Action (Jev) | |---|---:|---:|---:|---|---|---:|---| | https://claude-seo.md/ | 0 | 1791 | 59 | homepage | informational | 1.00 | keep or improve |
  • Network accessline 343
    |---|---:|---:|---:|---|---|---:|---| | https://claude-seo.md/ | 0 | 1791 | 59 | homepage | informational | 1.00 | keep or improve | | https://claude-seo.md/blog | 1 | 1290 | 59 | category or listing | informational | 0.65 | keep or improve
  • Network accessline 344
    | https://claude-seo.md/ | 0 | 1791 | 59 | homepage | informational | 1.00 | keep or improve |
  • Network accessline 345
    | https://claude-seo.md/blog | 1 | 1290 | 59 | category or listing | informational | 0.65 | keep or improve |
  • Network accessline 346
    | https://claude-seo.md/blog/claude-seo-34k-organic-clicks | 1 | 1865 | 2 | case study or proof | informational | 0.67 | keep or improve |
  • Network accessline 347
    | https://claude-seo.md/blog/claude-seo-v180-free-backlinks | 1 | 1552 | 6 | article or guide | informational | 0.61 | keep or improve |
  • Network accessline 348
    | https://claude-seo.md/blog/claude-seo-v181-image-seo | 1 | 1646 | 5 | article or guide | informational | 0.58 | keep or improve |
  • Network accessline 349
    | https://claude-seo.md/blog/claude-seo-v190-community-release | 1 | 1748 | 7 | article or guide | informational | 0.59 | keep or improve |
  • Network accessline 350
    | https://claude-seo.md/blog/claude-seo-v220-release | 1 | 1317 | 3 | article or guide | informational | 0.53 | keep or improve |
  • Network accessline 351
    | https://claude-seo.md/blog/claude-seo-v231-release | 1 | 1966 | 3 | article or guide | informational | 0.54 | keep or improve |
  • Network accessline 352
    | https://claude-seo.md/install | 1 | 540 | 10 | support or docs | transactional | 0.95 | keep or improve |
  • Network accessline 353
    | https://claude-seo.md/skills | 1 | 1060 | 59 | product or service | informational | 0.82 | keep or improve |
  • Network accessline 354
    | https://claude-seo.md/skills/seo-audit | 1 | 1747 | 33 | support or docs | informational | 0.73 | keep or improve |
  • Network accessline 355
    | https://claude-seo.md/skills/seo-backlinks | 1 | 1626 | 7 | product or service | informational | 0.75 | keep or improve |
  • Network accessline 356
    | https://claude-seo.md/skills/seo-cluster | 1 | 1657 | 9 | product or service | informational | 0.65 | keep or improve |
  • Network accessline 357
    | https://claude-seo.md/skills/seo-competitor-pages | 1 | 1576 | 4 | product or service | informational | 0.70 | keep or improve |
  • Network accessline 358
    | https://claude-seo.md/skills/seo-content | 1 | 1555 | 13 | product or service | informational | 0.72 | keep or improve |
  • Network accessline 359
    | https://claude-seo.md/skills/seo-dataforseo | 1 | 1614 | 11 | product or service | informational | 0.67 | keep or improve |
  • Network accessline 360
    | https://claude-seo.md/skills/seo-drift | 1 | 1606 | 7 | product or service | informational | 0.61 | keep or improve |
  • Network accessline 361
    | https://claude-seo.md/skills/seo-ecommerce | 1 | 1520 | 5 | support or docs | informational | 0.61 | keep or improve |
  • Network accessline 362
    | https://claude-seo.md/skills/seo-flow | 1 | 1682 | 12 | product or service | informational | 0.73 | keep or improve |
  • Network accessline 363
    | https://claude-seo.md/skills/seo-geo | 1 | 1737 | 16 | product or service | informational | 0.73 | keep or improve |
  • Network accessline 364
    | https://claude-seo.md/skills/seo-google | 1 | 1901 | 4 | product or service | informational | 0.67 | keep or improve |
  • Network accessline 365
    | https://claude-seo.md/skills/seo-hreflang | 1 | 1795 | 3 | product or service | informational | 0.70 | keep or improve |
  • Network accessline 366
    | https://claude-seo.md/skills/seo-image-gen | 1 | 2244 | 4 | support or docs | informational | 0.56 | keep or improve |
  • Network accessline 367
    | https://claude-seo.md/skills/seo-images | 1 | 1572 | 6 | product or service | informational | 0.73 | keep or improve |
  • Network accessline 368
    | https://claude-seo.md/skills/seo-local | 1 | 1868 | 8 | product or service | informational | 0.78 | keep or improve |
  • Network accessline 369
    | https://claude-seo.md/skills/seo-maps | 1 | 1573 | 6 | product or service | informational | 0.75 | keep or improve |
  • Network accessline 370
    | https://claude-seo.md/skills/seo-page | 1 | 1552 | 6 | product or service | informational | 0.78 | keep or improve |
  • Network accessline 371
    | https://claude-seo.md/skills/seo-plan | 1 | 1455 | 7 | product or service | informational | 0.78 | keep or improve |
  • Network accessline 372
    | https://claude-seo.md/skills/seo-programmatic | 1 | 1612 | 6 | product or service | informational | 0.74 | keep or improve |
  • Network accessline 373
    | https://claude-seo.md/skills/seo-schema | 1 | 1534 | 22 | product or service | informational | 0.75 | keep or improve |
  • Network accessline 374
    | https://claude-seo.md/skills/seo-sitemap | 1 | 1555 | 6 | product or service | informational | 0.70 | keep or improve |
  • Network accessline 375
    | https://claude-seo.md/skills/seo-sxo | 1 | 1578 | 7 | product or service | informational | 0.62 | keep or improve |
  • Network accessline 376
    | https://claude-seo.md/skills/seo-technical | 1 | 1698 | 27 | product or service | informational | 0.78 | keep or improve |
  • Network accessline 377
    | https://claude-seo.md/speed-report | 1 | 1826 | 4 | article or guide | informational | 0.59 | keep or improve |
  • Network accessline 378
    | https://claude-seo.md/ai-visibility-tool | 2 | 822 | 1 | article or guide | informational | 0.65 | keep or improve |
  • Network accessline 379
    | https://claude-seo.md/blog/best-claude-code-skills | 2 | 1940 | 2 | article or guide | informational | 0.62 | keep or improve |
  • Network accessline 380
    | https://claude-seo.md/blog/claude-seo-v172-update | 2 | 1468 | 3 | article or guide | informational | 0.47 | keep or improve |
  • Network accessline 381
    | https://claude-seo.md/blog/claude-seo-v196-flow-security-hardening | 2 | 2325 | 5 | article or guide | informational | 0.55 | keep or improve |
  • Network accessline 382
    | https://claude-seo.md/blog/claude-seo-v2-release | 2 | 2011 | 2 | article or guide | informational | 0.65 | keep or improve |
  • Network accessline 383
    | https://claude-seo.md/blog/claude-seo-v223-release | 2 | 1221 | 2 | article or guide | informational | 0.41 | keep or improve |
  • Network accessline 384
    | https://claude-seo.md/blog/claude-seo-v224-release | 2 | 1012 | 4 | article or guide | informational | 0.53 | keep or improve |
  • Network accessline 385
    | https://claude-seo.md/blog/claude-seo-v225-release | 2 | 912 | 3 | article or guide | informational | 0.57 | keep or improve |
  • Network accessline 386
    | https://claude-seo.md/blog/claude-seo-vs-ahrefs-semrush | 2 | 2021 | 13 | article or guide | commercial | 0.67 | keep or improve |
  • Network accessline 387
    | https://claude-seo.md/blog/flow-framework-seo-guide | 2 | 1996 | 5 | article or guide | informational | 0.67 | keep or improve |
  • Network accessline 388
    | https://claude-seo.md/blog/free-seo-audit-tool-guide | 2 | 1889 | 4 | article or guide | commercial | 0.68 | keep or improve |
  • Network accessline 389
    | https://claude-seo.md/blog/generative-engine-optimization-guide | 2 | 2518 | 10 | article or guide | informational | 0.66 | keep or improve |
  • Network accessline 390
    | https://claude-seo.md/blog/google-api-seo-reporting-claude | 2 | 1676 | 7 | article or guide | informational | 0.63 | keep or improve |
  • Network accessline 391
    | https://claude-seo.md/blog/how-to-run-free-seo-audit-claude-seo | 2 | 1349 | 16 | article or guide | informational | 0.69 | keep or improve |
  • Network accessline 392
    | https://claude-seo.md/blog/hreflang-x-default-guide | 2 | 1646 | 2 | article or guide | informational | 0.54 | keep or improve |
  • Network accessline 393
    | https://claude-seo.md/blog/local-seo-guide | 2 | 6494 | 2 | article or guide | informational | 0.54 | keep or improve |
  • Network accessline 394
    | https://claude-seo.md/blog/robots-txt-guide | 2 | 4872 | 1 | article or guide | informational | 0.56 | keep or improve |
  • Network accessline 395
    | https://claude-seo.md/blog/schema-markup-generator-guide | 2 | 1526 | 4 | article or guide | informational | 0.64 | keep or improve |
  • Network accessline 396
    | https://claude-seo.md/blog/seo-drift-monitoring-guide | 2 | 1749 | 2 | article or guide | informational | 0.60 | keep or improve |
  • Network accessline 397
    | https://claude-seo.md/blog/technical-seo-with-claude-code | 2 | 1744 | 15 | article or guide | informational | 0.68 | keep or improve |
  • Network accessline 398
    | https://claude-seo.md/blog/topic-clustering-serp-overlap | 2 | 1811 | 3 | article or guide | informational | 0.62 | keep or improve |
  • Network accessline 399
    | https://claude-seo.md/blog/webmcp-website-readiness | 2 | 1892 | 2 | article or guide | informational | 0.44 | keep or improve |
  • Network accessline 400
    | https://claude-seo.md/blog/wp-mcp-ultimate-wordpress-ai-seo | 2 | 1647 | 1 | article or guide | informational | 0.75 | keep or improve |
  • Network accessline 401
    | https://claude-seo.md/blog/xml-sitemap-guide | 2 | 6218 | 3 | article or guide | informational | 0.50 | keep or improve |
  • Network accessline 402
    | https://claude-seo.md/skills/seo | 2 | 1433 | 2 | product or service | informational | 0.72 | keep or improve |
  • Network accessline 403
    | https://claude-seo.md/skills/seo-content-brief | 2 | 1499 | 5 | product or service | informational | 0.68 | keep or improve |

jevseo/__init__.py

  • Executable scriptline 1
    Executable file

jevseo/__main__.py

  • Executable scriptline 1
    Executable file

jevseo/checks.py

  • Executable scriptline 1
    Executable file
  • Network accessline 15
    G = "https://developers.google.com/search/docs/"
  • Network accessline 17
    "robots": G + "crawling-indexing/robots/intro",     "sitemaps": G + "crawling-indexing/sitemaps/overview",     "http": "https://developers.google.com/crawling/docs/troubleshooting/http-status-codes",
  • Network accessline 18
    "sitemaps": G + "crawling-indexing/sitemaps/overview",     "http": "https://developers.google.com/crawling/docs/troubleshooting/http-status-codes",     "redirects": G + "crawling-indexing/301-redirects",
  • Network accessline 19
    "http": "https://developers.google.com/crawling/docs/troubleshooting/http-status-codes",
  • Network accessline 39
    "https": G + "appearance/page-experience",     "ai": G + "appearance/ai-features",  # Google: no special optimization is required for AI features     "broken": "https://developers.google.com/crawling/docs/troubleshooting/http-status-codes",
  • Network accessline 40
    "ai": G + "appearance/ai-features",  # Google: no special optimization is required for AI features     "broken": "https://developers.google.com/crawling/docs/troubleshooting/http-status-codes",     "soft404": "https://developers.google.com/
  • Network accessline 41
    "broken": "https://developers.google.com/crawling/docs/troubleshooting/http-status-codes",
  • Network accessline 42
    "soft404": "https://developers.google.com/crawling/docs/troubleshooting/http-status-codes",
  • Network accessline 43
    "og": "https://ogp.me/",
  • Network accessline 44
    "hsts": "https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Strict-Transport-Security",
  • Network accessline 45
    "headers": "https://owasp.org/projects/secure-headers-project",
  • Network accessline 46
    "mixed": "https://developer.mozilla.org/en-US/docs/Web/Security/Defenses/Mixed_content",
  • Network accessline 47
    "cls": "https://web.dev/articles/optimize-cls",
  • Network accessline 48
    "ttfb": "https://web.dev/articles/ttfb",
  • Network accessline 49
    "cwv": "https://web.dev/articles/vitals",
  • Network accessline 50
    "llms": "https://llmstxt.org/",
  • Network accessline 51
    "crawlers_google": "https://developers.google.com/crawling/docs/crawlers-fetchers/google-common-crawlers",
  • Network accessline 52
    "lang": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Global_attributes/lang",
  • Network accessline 53
    "dfs_labs": "https://docs.dataforseo.com/v3/dataforseo_labs/overview/",
  • Network accessline 54
    "dfs_backlinks": "https://docs.dataforseo.com/v3/backlinks/overview/",
  • Network accessline 55
    "dfs_serp": "https://docs.dataforseo.com/v3/serp/overview/",
  • Network accessline 240
    hv = probes["host_variant"]     if hv["status"] == 200 and not hv["redirects_to_canonical_host"]:         out.append(finding("host_variant", [f"https://{hv['host']}/"], f"{hv['host']} answers without redirecting to the preferred host"))
  • Network accessline 241
    if hv["status"] == 200 and not hv["redirects_to_canonical_host"]:         out.append(finding("host_variant", [f"https://{hv['host']}/"], f"{hv['host']} answers without redirecting to the preferred host"))     temp = [f"{label} answered {st}
  • Network accessline 242
    out.append(finding("host_variant", [f"https://{hv['host']}/"], f"{hv['host']} answers without redirecting to the preferred host"))

jevseo/cli.py

  • Executable scriptline 1
    Executable file
  • Access to secretsline 263
    [Credential-related source omitted]
  • Access to secretsline 264
    [Credential-related source omitted]

jevseo/crawl.py

  • Executable scriptline 1
    Executable file
  • Network accessline 54
    class Fetcher:     def __init__(self, delay: float = 0.0):         self.session = requests.Session()
  • Network accessline 55
    def __init__(self, delay: float = 0.0):         self.session = requests.Session()         self.session.headers.update({"User-Agent": USER_AGENT, "Accept": "text/html,application/xhtml+xml,*/*;q=0.8", "Accept-Language": "en;q=0.9,*;q=0.5"})
  • Network accessline 56
    self.session = requests.Session()

jevseo/dfs.py

  • Executable scriptline 1
    Executable file
  • Network accessline 17
    BASE = "https://api.dataforseo.com/v3/"
  • Network accessline 64
    cost = None         try:             r = requests.post(BASE + path, auth=self.auth, json=[task], timeout=120)
  • Network accessline 65
    try:             r = requests.post(BASE + path, auth=self.auth, json=[task], timeout=120)             data = r.json()
  • Network accessline 66
    r = requests.post(BASE + path, auth=self.auth, json=[task], timeout=120)

jevseo/env.py

  • Executable scriptline 1
    Executable file
  • Access to secretsline 4
    [Credential-related source omitted]
  • Access to secretsline 5
    [Credential-related source omitted]
  • Access to secretsline 17
    [Credential-related source omitted]
  • Access to secretsline 18
    [Credential-related source omitted]
  • Access to secretsline 19
    [Credential-related source omitted]
  • Access to secretsline 24
    [Credential-related source omitted]
  • Access to secretsline 25
    [Credential-related source omitted]

jevseo/fonts/inter-OFL.txt

  • Network accessline 1
    Copyright 2020 The Inter Project Authors (https://github.com/rsms/inter)
  • Network accessline 3
    This Font Software is licensed under the SIL Open Font License, Version 1.1. This license is copied below, and is also available with a FAQ at: https://scripts.sil.org/OFL
  • Network accessline 5
    https://scripts.sil.org/OFL

jevseo/fonts/jetbrainsmono-OFL.txt

  • Network accessline 1
    Copyright 2020 The JetBrains Mono Project Authors (https://github.com/JetBrains/JetBrainsMono)
  • Network accessline 5
    This license is copied below, and is also available with a FAQ at: https://scripts.sil.org/OFL

jevseo/jev.py

  • Executable scriptline 1
    Executable file
  • Network accessline 3
    POST https://api.typesafe.ai/v1/systemone with state, model and questions
  • Network accessline 21
    API = "https://api.typesafe.ai/v1/systemone"
  • Network accessline 22
    MODELS_API = "https://api.typesafe.ai/v1/models"
  • Access to secretsline 332
    [Credential-related source omitted]
  • Network accessline 355
    [Credential-related source omitted]
  • Network accessline 356
    [Credential-related source omitted]
  • Network accessline 357
    [Credential-related source omitted]
  • Access to secretsline 434
    [Credential-related source omitted]

jevseo/parse.py

  • Executable scriptline 1
    Executable file

jevseo/psi.py

  • Executable scriptline 1
    Executable file
  • Network accessline 15
    API = "https://www.googleapis.com/pagespeedonline/v5/runPagespeed"
  • Network accessline 45
    params.append(("key", key))     try:         r = requests.get(API, params=params, timeout=120)
  • Network accessline 46
    try:         r = requests.get(API, params=params, timeout=120)     except requests.RequestException as err:
  • Network accessline 47
    r = requests.get(API, params=params, timeout=120)
  • Access to secretsline 77
    [Credential-related source omitted]
  • Network accessline 88
    ok = sum(1 for r in results if "error" not in r)     log(f"PageSpeed Insights: {ok}/{len(results)} runs succeeded")     return {"source": "https://developers.google.com/speed/docs/insights/v5/get-started", "keyed": bool(key), "runs": result
  • Network accessline 90
    return {"source": "https://developers.google.com/speed/docs/insights/v5/get-started", "keyed": bool(key), "runs": results}

jevseo/report/__init__.py

  • Executable scriptline 1
    Executable file

jevseo/report/charts.py

  • Executable scriptline 1
    Executable file

jevseo/report/md.py

  • Executable scriptline 1
    Executable file

jevseo/report/pdf.py

  • Executable scriptline 1
    Executable file
  • Network accessline 33
    "yes": jev.YES,         "no": jev.NO,         "sources": sorted({a["source"] for a in vm["actions"]} | {"https://docs.typesafe.ai/primitives", "https://docs.typesafe.ai/confidence", "https://developers.google.com/speed/docs/insights/v5/abou
  • Network accessline 34
    "no": jev.NO,         "sources": sorted({a["source"] for a in vm["actions"]} | {"https://docs.typesafe.ai/primitives", "https://docs.typesafe.ai/confidence", "https://developers.google.com/speed/docs/insights/v5/about"}),     }
  • Network accessline 35
    "sources": sorted({a["source"] for a in vm["actions"]} | {"https://docs.typesafe.ai/primitives", "https://docs.typesafe.ai/confidence", "https://developers.google.com/speed/docs/insights/v5/about"}),

jevseo/report/xlsx.py

  • Executable scriptline 1
    Executable file

jevseo/score.py

  • Executable scriptline 1
    Executable file

jevseo/templates/report.html.j2

  • Network accessline 30
    <h1 class="domain-string">{{ domain }}</h1>     <div class="sub">A live crawl of the site, checked by rules, judged by Jev, scored by code and explained in plain language.</div>     <svg class="dots" viewBox="0 0 120 120" xmlns="http://www.
  • Network accessline 31
    <div class="sub">A live crawl of the site, checked by rules, judged by Jev, scored by code and explained in plain language.</div>     <svg class="dots" viewBox="0 0 120 120" xmlns="http://www.w3.org/2000/svg">       {% for i in range(6) %}{
  • Network accessline 32
    <svg class="dots" viewBox="0 0 120 120" xmlns="http://www.w3.org/2000/svg">

pyproject.toml

  • Network accessline 24
    [project.urls] Homepage = "https://github.com/AgriciDaniel/jev-seo"
  • Network accessline 25
    Homepage = "https://github.com/AgriciDaniel/jev-seo"
  • Network accessline 26
    Issues = "https://github.com/AgriciDaniel/jev-seo/issues"

references/judgments.md

  • Network accessline 3
    All questions go to `POST https://api.typesafe.ai/v1/systemone` with

tests/test_jevseo.py

  • Executable scriptline 1
    Executable file
  • Network accessline 16
    HOME = "https://example.org/"
  • Network accessline 19
    <meta name="description" content="24 hour emergency plumbing across Leeds."> <meta name="viewport" content="width=device-width"> <link rel="canonical" href="https://example.org/services/emergency/">
  • Network accessline 20
    <meta name="viewport" content="width=device-width"> <link rel="canonical" href="https://example.org/services/emergency/"> <script type="application/ld+json">{"@context":"https://schema.org","@type":"Plumber","name":"Acme"}</script>
  • Network accessline 21
    <link rel="canonical" href="https://example.org/services/emergency/">
  • Network accessline 22
    <script type="application/ld+json">{"@context":"https://schema.org","@type":"Plumber","name":"Acme"}</script>
  • Network accessline 23
    <script type="application/ld+json">{ broken json </script> <link rel="stylesheet" href="http://cdn.example.org/site.css"> </head><body><nav><a href="/">Home</a><a href="/about">About</a></nav>
  • Network accessline 24
    <link rel="stylesheet" href="http://cdn.example.org/site.css">
  • Network accessline 26
    <main><h1>Emergency plumbers</h1><h3>Skipped level</h3> <p>We fix burst pipes across Leeds within 60 minutes, day or night.</p> <a href="http://other.org/plain-link">an outbound http link is not mixed content</a>
  • Network accessline 27
    <p>We fix burst pipes across Leeds within 60 minutes, day or night.</p> <a href="http://other.org/plain-link">an outbound http link is not mixed content</a> <a href="/contact">click here</a><img src="/a.jpg"><img src="/b.jpg" alt="" width="
  • Network accessline 28
    <a href="http://other.org/plain-link">an outbound http link is not mixed content</a>
  • Network accessline 40
    def crawl_fixture():     home = page(HOME, depth=0, canonical=HOME, title="Acme Plumbing", favicon=True, schema_types=["WebSite"])     svc = page("https://example.org/services/emergency", canonical="https://example.org/services/emergency")
  • Network accessline 41
    home = page(HOME, depth=0, canonical=HOME, title="Acme Plumbing", favicon=True, schema_types=["WebSite"])     svc = page("https://example.org/services/emergency", canonical="https://example.org/services/emergency")     dup = page("https://e
  • Network accessline 42
    svc = page("https://example.org/services/emergency", canonical="https://example.org/services/emergency")
  • Network accessline 43
    dup = page("https://example.org/services/emergency-2", canonical="https://example.org/services/emergency-2", in_sitemap=False, inlinks=0)
  • Network accessline 44
    thin = page("https://example.org/thin", canonical="https://example.org/thin", word_count=40, meta_robots="noindex")
  • Network accessline 45
    moved = {"url": "https://example.org/old", "kind": "redirect", "status": 301, "final_url": HOME, "redirect_chain": [{"url": "https://example.org/old", "status": 301}, {"url": "https://example.org/mid", "status": 302}], "depth": 1}
  • Network accessline 46
    gone = {"url": "https://example.org/gone", "kind": "page", "status": 404, "depth": 2}
  • Network accessline 47
    home["links_internal"] = [{"url": "https://example.org/gone", "anchor": "read more"}, {"url": "https://example.org/old", "anchor": "Old"}]
  • Network accessline 48
    return {         "input_url": HOME, "start_url": HOME, "final_url": HOME, "origin": "https://example.org", "domain": "example.org", "https": True,         "robots": {"url": "https://example.org/robots.txt", "status": 200, "present": True, "
  • Network accessline 49
    "input_url": HOME, "start_url": HOME, "final_url": HOME, "origin": "https://example.org", "domain": "example.org", "https": True,
  • Network accessline 50
    "robots": {"url": "https://example.org/robots.txt", "status": 200, "present": True, "bytes": 30, "sitemaps": [], "crawl_delay": None, "disallow_all": False,
  • Network accessline 51
    "search_bots": {"Googlebot": True, "Bingbot": True}, "ai_bots": {"GPTBot": False, "ClaudeBot": True}, "ai_bots_named": ["GPTBot"]},         "sitemaps": {"files": [{"url": "https://example.org/sitemap.xml", "status": 200, "urls": 4, "error":
  • Network accessline 52
    "sitemaps": {"files": [{"url": "https://example.org/sitemap.xml", "status": 200, "urls": 4, "error": None, "lastmod": 0}], "urls": [HOME, "https://example.org/services/emergency", "https://example.org/thin", "https://example.org/old"], "tot
  • Network accessline 53
    "probes": {"http_to_https": True, "host_variant": {"host": "www.example.org", "status": 200, "redirects_to_canonical_host": False}, "not_found_status": 200, "llms_txt": False},         "pages": [home, svc, dup, thin, moved, gone],         "
  • Network accessline 54
    "pages": [home, svc, dup, thin, moved, gone],         "link_status": {"https://example.org/gone": 404, "https://example.org/old": 301, "https://example.org/contact": 200},         "external_status": {"http://other.org/plain-link": 200}, "ex
  • Network accessline 55
    "link_status": {"https://example.org/gone": 404, "https://example.org/old": 301, "https://example.org/contact": 200},         "external_status": {"http://other.org/plain-link": 200}, "external_total": 1, "blocked_by_robots": [],         "re
  • Network accessline 56
    "external_status": {"http://other.org/plain-link": 200}, "external_total": 1, "blocked_by_robots": [],         "render": {"mode": "auto", "browser_available": None, "homepage_rendered": False}, "requests": 12,         "limits": {"max_pages"
  • Network accessline 79
    site = {"business_model": answer("choice", "local_service"), "value_prop": answer("score", 0.4), "entity_clarity": answer("noul", 0.1),             "topical_focus": answer("score", 0.9), "serves_local_area": answer("noul", 0.95)}     return
  • Network accessline 80
    "topical_focus": answer("score", 0.9), "serves_local_area": answer("noul", 0.95)}     return {"available": True, "site": site, "pages": pages, "pairs": [{"a": HOME, "b": "https://example.org/services/emergency", "title_overlap": 0.5, "judgm
  • Network accessline 81
    return {"available": True, "site": site, "pages": pages, "pairs": [{"a": HOME, "b": "https://example.org/services/emergency", "title_overlap": 0.5, "judgment": answer("noul", 0.9)}],             "ledger": {"model_requested": "jev-latest", "
  • Network accessline 86
    class ParseTests(unittest.TestCase):     def test_facts(self):         p = parse_page("https://example.org/x", PAGE_HTML, "example.org")
  • Network accessline 87
    def test_facts(self):         p = parse_page("https://example.org/x", PAGE_HTML, "example.org")         self.assertEqual(p["title"], "Acme Plumbing | Emergency plumbers in Leeds")
  • Network accessline 88
    p = parse_page("https://example.org/x", PAGE_HTML, "example.org")
  • Network accessline 89
    self.assertEqual(p["title"], "Acme Plumbing | Emergency plumbers in Leeds")         self.assertEqual(p["canonical"], "https://example.org/services/emergency")         self.assertIn("Plumber", p["schema_types"])
  • Network accessline 90
    self.assertEqual(p["canonical"], "https://example.org/services/emergency")
  • Network accessline 98
    def test_mixed_content_ignores_plain_links(self):         p = parse_page("https://example.org/x", PAGE_HTML, "example.org")
  • Network accessline 99
    p = parse_page("https://example.org/x", PAGE_HTML, "example.org")
  • Network accessline 100
    self.assertEqual(p["mixed_content"], ["http://cdn.example.org/site.css"])
  • Network accessline 102
    def test_normalize(self):         self.assertEqual(normalize_url("HTTPS://Example.org/a/#top"), "https://example.org/a")
  • Network accessline 103
    self.assertEqual(normalize_url("HTTPS://Example.org/a/#top"), "https://example.org/a")
  • Network accessline 104
    self.assertEqual(normalize_url("https://example.org"), "https://example.org/")
  • Network accessline 222
    xml = b'<?xml version="1.0"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"><!-- Main --><url><loc>https://x.org/</loc><lastmod>2026-09-10</lastmod></url><url><loc>https://x.org/a</loc></url></urlset>'
  • Network accessline 228
    with mock.patch.object(Fetcher, "get", return_value=R()):             out = read_sitemaps(Fetcher(), ["https://x.org/sitemap.xml"])
  • Network accessline 229
    out = read_sitemaps(Fetcher(), ["https://x.org/sitemap.xml"])
  • Network accessline 243
    def test_noise_tokens_removed_from_text(self):         p = parse_page("https://x.org/", "<html><body><main><p>Hello " + "QUJD" * 30 + " world</p></main></body></html>", "x.org")
  • Network accessline 244
    p = parse_page("https://x.org/", "<html><body><main><p>Hello " + "QUJD" * 30 + " world</p></main></body></html>", "x.org")
  • Network accessline 247
    def test_unicode_urls_normalise_like_requests(self):         self.assertEqual(normalize_url("https://x.org/café/"), normalize_url("https://x.org/caf%C3%A9"))
  • Network accessline 248
    self.assertEqual(normalize_url("https://x.org/café/"), normalize_url("https://x.org/caf%C3%A9"))
  • Network accessline 250
    def test_homepage_hreflang_self_reference_passes(self):         crawl = crawl_fixture()         crawl["pages"][0]["hreflang"] = [{"lang": "en", "href": "https://example.org"}, {"lang": "x-default", "href": "https://example.org/"}]
  • Network accessline 251
    crawl = crawl_fixture()         crawl["pages"][0]["hreflang"] = [{"lang": "en", "href": "https://example.org"}, {"lang": "x-default", "href": "https://example.org/"}]         self.assertNotIn("hreflang_issues", {f["id"] for f in checks.run_
  • Network accessline 252
    crawl["pages"][0]["hreflang"] = [{"lang": "en", "href": "https://example.org"}, {"lang": "x-default", "href": "https://example.org/"}]
  • Network accessline 255
    def test_robots_blocked_target_is_not_broken(self):         crawl = crawl_fixture()         crawl["pages"][0]["links_internal"] = [{"url": "https://example.org/private", "anchor": "Private"}]
  • Network accessline 256
    crawl = crawl_fixture()         crawl["pages"][0]["links_internal"] = [{"url": "https://example.org/private", "anchor": "Private"}]         crawl["link_status"] = {"https://example.org/private": "blocked"}
  • Network accessline 257
    crawl["pages"][0]["links_internal"] = [{"url": "https://example.org/private", "anchor": "Private"}]
  • Network accessline 258
    crawl["link_status"] = {"https://example.org/private": "blocked"}
  • Network accessline 261
    def test_link_through_redirect_to_404_is_broken(self):         crawl = crawl_fixture()         crawl["pages"][0]["links_internal"] = [{"url": "https://example.org/moved", "anchor": "Moved"}]
  • Network accessline 262
    crawl = crawl_fixture()         crawl["pages"][0]["links_internal"] = [{"url": "https://example.org/moved", "anchor": "Moved"}]         crawl["link_status"] = {"https://example.org/moved": 404}
  • Network accessline 263
    crawl["pages"][0]["links_internal"] = [{"url": "https://example.org/moved", "anchor": "Moved"}]
  • Network accessline 264
    crawl["link_status"] = {"https://example.org/moved": 404}
  • Network accessline 312
    "available": True, "location_code": 2840, "language_code": "en",         "overview": {"count": 3, "etv": 120.5, "pos_1": 0, "pos_2_3": 1, "pos_4_10": 1, "pos_11_20": 1},         "ranked": [{"keyword": "emergency plumber leeds", "position": 
  • Network accessline 313
    "overview": {"count": 3, "etv": 120.5, "pos_1": 0, "pos_2_3": 1, "pos_4_10": 1, "pos_11_20": 1},         "ranked": [{"keyword": "emergency plumber leeds", "position": 7, "volume": 900, "difficulty": 20, "intent": "commercial", "url": "https
  • Network accessline 314
    "ranked": [{"keyword": "emergency plumber leeds", "position": 7, "volume": 900, "difficulty": 20, "intent": "commercial", "url": "https://example.org/services/emergency"},
  • Network accessline 331
    def keyword_judgments():     def kw(rel, page, other=0.1):         return {"relevance": answer("score", rel), "page": answer("choice", page), "page_url": None if page == "none_fit" else "https://example.org/services/emergency", "other_brand
  • Network accessline 332
    def kw(rel, page, other=0.1):         return {"relevance": answer("score", rel), "page": answer("choice", page), "page_url": None if page == "none_fit" else "https://example.org/services/emergency", "other_brand": answer("noul", other)}    
  • Network accessline 333
    return {"relevance": answer("score", rel), "page": answer("choice", page), "page_url": None if page == "none_fit" else "https://example.org/services/emergency", "other_brand": answer("noul", other)}

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.

Declared and executed: 11 facts
  • Contacts developers.google.com, which SKILL.md, the README and the plugin manifest do not mentionjevseo/checks.py:15High confidence
  • Contacts ogp.me, which SKILL.md, the README and the plugin manifest do not mentionjevseo/checks.py:43High confidence
  • Contacts developer.mozilla.org, which SKILL.md, the README and the plugin manifest do not mentionjevseo/checks.py:44High confidence
  • Contacts owasp.org, which SKILL.md, the README and the plugin manifest do not mentionjevseo/checks.py:45High confidence
  • Contacts web.dev, which SKILL.md, the README and the plugin manifest do not mentionjevseo/checks.py:47High confidence
  • Contacts llmstxt.org, which SKILL.md, the README and the plugin manifest do not mentionjevseo/checks.py:50High confidence
  • Contacts docs.dataforseo.com, which SKILL.md, the README and the plugin manifest do not mentionjevseo/checks.py:53High confidence
  • Contacts api.dataforseo.com, which SKILL.md, the README and the plugin manifest do not mentionjevseo/dfs.py:17High confidence
  • Contacts www.googleapis.com, which SKILL.md, the README and the plugin manifest do not mentionjevseo/psi.py:15High confidence
  • Contacts developers.google.com, which SKILL.md, the README and the plugin manifest do not mentionjevseo/psi.py:90High confidence
  • Contacts developers.google.com, which SKILL.md, the README and the plugin manifest do not mentionjevseo/report/pdf.py:35High confidence
Signal confidence: 297 facts

and 247 more

Works with

Agent compatibility, from the files in this repository
AgentStatusEvidenceInstall to
Claude CodeNativeFrontmatter field argument-hint in 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.