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
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
Individual skills in this repository
- jev-seo
/
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 tokensAlways available to the agent
SKILL.md
2,593 tokensWhen the skill is activated
Reference documents
19,663 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Workflow
- Options
- What the report contains
- Rules
- Deeper references
Scripts executed separately
bin/jevseojevseo/__init__.pyjevseo/__main__.pyjevseo/checks.pyjevseo/cli.pyjevseo/crawl.pyjevseo/dfs.pyjevseo/env.pyjevseo/jev.pyjevseo/parse.pyjevseo/psi.pyjevseo/report/__init__.pyjevseo/report/charts.pyjevseo/report/md.pyjevseo/report/pdf.pyjevseo/report/xlsx.pyjevseo/score.pytests/test_jevseo.py
Files
.env.exampleasset310 bytes.github/workflows/ci.ymlasset662 bytes.gitignoreasset41 bytesCHANGELOG.mddoc2,261 bytesCONTRIBUTING.mddoc684 bytesLICENSEasset1,070 bytesREADME.mddoc11,620 bytesSECURITY.mddoc514 bytesSKILL.mdcore10,079 bytesSKILL.mdcore10,079 bytesSKILL.mdcore10,079 bytesSKILL.mdcore10,079 bytesbin/jevseoruns244 bytesdocs/assets/banner.pngasset67,452 bytesdocs/assets/banner.svgasset4,978 bytesdocs/assets/impact_effort.pngasset47,217 bytesdocs/assets/invest.pngasset91,643 bytesdocs/assets/opportunities.pngasset94,842 bytesdocs/assets/pipeline.svgasset4,404 bytesdocs/assets/preview-jev.jpgasset107,984 bytesdocs/assets/preview-md.pngasset223,209 bytesdocs/assets/preview-method.jpgasset119,653 bytesdocs/assets/preview-summary.jpgasset124,282 bytesdocs/assets/preview-terminal.pngasset156,952 bytesdocs/assets/preview-visibility.jpgasset109,585 bytesdocs/assets/preview-xlsx.pngasset153,132 bytesexamples/claude-seo.md/charts/categories.pngasset67,164 bytesexamples/claude-seo.md/charts/cwv.pngasset28,307 bytesexamples/claude-seo.md/charts/funnel.pngasset29,086 bytesexamples/claude-seo.md/charts/gauge.pngasset26,636 bytesexamples/claude-seo.md/charts/impact_effort.pngasset47,217 bytesexamples/claude-seo.md/charts/invest.pngasset91,643 bytesexamples/claude-seo.md/charts/jev_confidence.pngasset48,945 bytesexamples/claude-seo.md/charts/jev_heatmap.pngasset288,029 bytesexamples/claude-seo.md/charts/lighthouse.pngasset28,892 bytesexamples/claude-seo.md/charts/opportunities.pngasset94,842 bytesexamples/claude-seo.md/charts/positions.pngasset22,732 bytesexamples/claude-seo.md/charts/referring_domains.pngasset41,650 bytesexamples/claude-seo.md/charts/severity_by_category.pngasset54,076 bytesexamples/claude-seo.md/charts/site_map.pngasset409,695 bytesexamples/claude-seo.md/digest.mddoc10,023 bytesexamples/claude-seo.md/narrative.jsonasset3,619 bytesexamples/claude-seo.md/report.mddoc29,953 bytesexamples/claude-seo.md/report.pdfasset424,418 bytesexamples/claude-seo.md/report.xlsxasset1,361,268 bytesjevseo/__init__.pyruns166 bytesjevseo/__main__.pyruns36 bytesjevseo/checks.pyruns30,026 bytesjevseo/cli.pyruns18,056 bytesjevseo/crawl.pyruns20,295 bytesjevseo/dfs.pyruns13,518 bytesjevseo/env.pyruns1,172 bytesjevseo/fonts/Inter-Bold.otfasset631,880 bytesjevseo/fonts/Inter-ExtraBold.otfasset633,580 bytesjevseo/fonts/Inter-Medium.otfasset627,988 bytesjevseo/fonts/Inter-Regular.otfasset609,600 bytesjevseo/fonts/Inter-SemiBold.otfasset629,912 bytesjevseo/fonts/InterDisplay-Bold.otfasset629,020 bytesjevseo/fonts/InterDisplay-ExtraBold.otfasset629,712 bytesjevseo/fonts/JetBrainsMono-Medium.ttfasset273,860 bytesjevseo/fonts/inter-OFL.txtdoc4,377 bytesjevseo/fonts/jetbrainsmono-OFL.txtdoc4,399 bytesjevseo/jev.pyruns26,370 bytesjevseo/parse.pyruns8,837 bytesjevseo/psi.pyruns4,366 bytesjevseo/report/__init__.pyruns21,278 bytesjevseo/report/charts.pyruns24,950 bytesjevseo/report/md.pyruns11,477 bytesjevseo/report/pdf.pyruns2,205 bytesjevseo/report/xlsx.pyruns21,042 bytesjevseo/score.pyruns24,705 bytesjevseo/templates/report.cssasset10,051 bytesjevseo/templates/report.html.j2asset26,992 bytespyproject.tomlasset808 bytesreferences/evaluation.mddoc4,331 bytesreferences/judgments.mddoc4,621 bytesreferences/method.mddoc2,860 bytesreferences/narrative.mddoc2,657 bytesrequirements.txtdoc67 bytestests/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 wasView the complete source on GitHubSkills 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
- #893 on Oct 18
- #936 on Oct 19
- #920 on Oct 20
- #933 on Oct 21
- #900 on Oct 22
- #916 since Oct 23
28 earlier periods
- #915 on Sep 20
- #936 on Sep 21
- #952 on Sep 22
- #942 on Sep 23
- #907 on Sep 24
- #855 on Sep 25
- #878 on Sep 26
- #897 on Sep 27
- #942 on Sep 28
- #967 on Sep 29
- #927 on Sep 30
- #857 on Oct 1
- #872 on Oct 2
- #843 on Oct 3
- #887 on Oct 4
- #906 on Oct 5
- #895 on Oct 6
- #929 on Oct 7
- #970 on Oct 8
- #934 on Oct 9
- #910 on Oct 10
- #922 on Oct 11
- #944 on Oct 12
- #934 on Oct 13
- #945 on Oct 14
- #929 on Oct 15
- #930 on Oct 16
- #911 on Oct 17
Before you install
Network or broad shellAutomated 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:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzed
- No broad tool permissions
- 2 dangerous shell commandsin 2 files: .github/workflows/ci.yml:18 README.md:63
- 271 network referencesin 18 files: examples/claude-seo.md/report.md:214 tests/test_jevseo.py:16 jevseo/checks.py:15 and 15 more
- No hidden or obfuscated text
- No instruction overrides
- 18 executable scriptsin 18 files: bin/jevseo:1 jevseo/__init__.py:1 jevseo/__main__.py:1 and 15 more
- 19 references to secretsin 8 files: jevseo/env.py:4 .env.example:1 README.md:70 and 5 more
- No requests to vote in Hot
Show all 310 signals by file
.env.example
.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
[](CHANGELOG.md) - Network accessline 6
[](https://github.com/AgriciDaniel/jev-seo/actions/workflows/ci.yml) - Network accessline 7
[](LICENSE) - Network accessline 8
[](pyproject.toml) - Network accessline 9
[](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
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
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
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
- Network access in prose of documentationREADME.md:5Low confidence
- Network access in prose of documentationREADME.md:6Low confidence
- Network access in prose of documentationREADME.md:7Low confidence
- Network access in prose of documentationREADME.md:8Low confidence
- Network access in prose of documentationREADME.md:9Low confidence
- Network access in prose of documentationREADME.md:11Low confidence
- Network access in prose of documentationREADME.md:13Low confidence
- Network access in prose of documentationREADME.md:31Low confidence
- Dangerous shell operation in prose of documentationREADME.md:63Low confidence
- Network access in prose of documentationREADME.md:63Low confidence
- Network access in code of documentationREADME.md:66Low confidence
- Network access in code of documentationREADME.md:70Low confidence
- Access to secrets in code of documentation: a variable, placeholder or call, not a stored valueREADME.md:70Low confidence
- Network access in code of documentationREADME.md:72Low confidence
- Network access in prose of documentationREADME.md:83Low confidence
- Network access in code of documentationREADME.md:86Low confidence
- Network access in code of documentationREADME.md:87Low confidence
- Network access in code of documentationREADME.md:88Low confidence
- Network access in code of documentationREADME.md:89Low confidence
- Access to secrets in prose of documentation: a variable, placeholder or call, not a stored valueREADME.md:105Low confidence
- Access to secrets in prose of the SKILL.mdSKILL.md:35Low confidence
- Network access in prose of the SKILL.mdSKILL.md:172Low confidence
- Network access in prose of the SKILL.mdSKILL.md:173Low confidence
- Network access in prose of the SKILL.mdSKILL.md:174Low confidence
- Network access in prose of the SKILL.mdSKILL.md:176Low confidence
- Executable script in code of a file that runsbin/jevseo:1High confidence
- Network access in prose of documentationexamples/claude-seo.md/digest.md:39Low confidence
- Network access in prose of documentationexamples/claude-seo.md/digest.md:40Low confidence
- Network access in prose of documentationexamples/claude-seo.md/digest.md:41Low confidence
- Network access in prose of documentationexamples/claude-seo.md/digest.md:42Low confidence
- Network access in prose of documentationexamples/claude-seo.md/digest.md:43Low confidence
- Network access in prose of documentationexamples/claude-seo.md/digest.md:44Low confidence
- Network access in prose of documentationexamples/claude-seo.md/digest.md:45Low confidence
- Network access in prose of documentationexamples/claude-seo.md/digest.md:46Low confidence
- Network access in prose of documentationexamples/claude-seo.md/report.md:214Low confidence
- Network access in prose of documentationexamples/claude-seo.md/report.md:215Low confidence
- Network access in prose of documentationexamples/claude-seo.md/report.md:216Low confidence
- Network access in prose of documentationexamples/claude-seo.md/report.md:217Low confidence
- Network access in prose of documentationexamples/claude-seo.md/report.md:218Low confidence
- Network access in prose of documentationexamples/claude-seo.md/report.md:219Low confidence
- Network access in prose of documentationexamples/claude-seo.md/report.md:220Low confidence
- Network access in prose of documentationexamples/claude-seo.md/report.md:221Low confidence
- Network access in prose of documentationexamples/claude-seo.md/report.md:222Low confidence
- Network access in prose of documentationexamples/claude-seo.md/report.md:223Low confidence
- Network access in prose of documentationexamples/claude-seo.md/report.md:224Low confidence
- Network access in prose of documentationexamples/claude-seo.md/report.md:225Low confidence
- Network access in prose of documentationexamples/claude-seo.md/report.md:226Low confidence
- Network access in prose of documentationexamples/claude-seo.md/report.md:227Low confidence
- Network access in prose of documentationexamples/claude-seo.md/report.md:228Low confidence
- Network access in prose of documentationexamples/claude-seo.md/report.md:229Low confidence
and 247 more
Works with
| Agent | Status | Evidence | Install to |
|---|---|---|---|
| Claude Code | Native | Frontmatter field argument-hint in SKILL.md | .claude/skills/<skill-name>/ |
| Codex | Compatible | Standard SKILL.md SKILL.md | .agents/skills/<skill-name>/ |
| Cursor | Compatible | Standard SKILL.md SKILL.md | .cursor/skills/<skill-name>/ |
| Gemini CLI | Compatible | Standard SKILL.md SKILL.md | .gemini/skills/<skill-name>/ |
| GitHub Copilot | Compatible | Standard SKILL.md SKILL.md | .github/skills/<skill-name>/ |
| OpenCode | Compatible | Standard 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.