Skip to content
v0.4.0MIT

Free Rust SEO and GEO audits: 64-rule checks, live crawl, AI citation scoring, rank drift. 19-tool MCP for agents.


title: "jev-seo: Free Rust SEO & GEO CLI + MCP for Devs and Agents" description: "Free Rust SEO and GEO toolkit powered by TypeSafe Jev: 64-rule audits, site crawls, AI citation checks, rank drift, CI gates, 19-tool MCP. Zero cost." canonical: "https://github.com/AkashPriyadarshii/jev-seo" image: "https://github.com/AkashPriyadarshii/jev-seo/raw/master/docs/assets/banner.png" author: "Akash Priyadarshi" license: "MIT" language: "en" topic: "developer-tools" tags:

  • seo
  • geo
  • generative-engine-optimization
  • ai-seo
  • llm-seo
  • answer-engine-optimization
  • typesafe-ai
  • jev
  • rust
  • cli
  • mcp
  • model-context-protocol
  • search-radar
  • semrush-alternative
  • ahrefs-alternative
  • free-seo-tool
  • open-source-seo
  • cli-seo
  • ai-crawler
  • agent-seo
  • llms-txt
  • schema-org
  • robots-txt
  • sitemap-audit
  • rank-tracker
  • content-brief
  • search-console-cli
  • technical-seo
  • on-page-seo
  • content-audit keywords:
  • seo
  • geo
  • generative engine optimization
  • answer engine optimization
  • aeo
  • llm seo
  • ai seo
  • typesafe ai
  • jev
  • foss
  • rust
  • rust cli
  • cli
  • mcp
  • model context protocol
  • semrush alternative
  • ahrefs alternative
  • free seo tool
  • open source seo
  • seo audit cli
  • website audit tool free
  • technical seo checker
  • on-page seo checker
  • content audit tool
  • llms.txt checker
  • ai crawler permissions
  • robots.txt audit
  • xml sitemap validator
  • hreflang validator
  • schema.org validator
  • json-ld validator
  • rank tracker cli
  • search console cli
  • content brief generator
  • serp analysis free
  • agent seo tools
  • coding agent seo
  • claude code seo
  • gemini cli seo
  • cursor seo
  • ci seo gate
  • local seo tools
  • no subscription seo

Support this project: Buy Me a Coffee


Direct answer

What is jev-seo? It is a free, open-source SEO and GEO command-line tool written in Rust. You install one binary from crates.io or a release archive. It audits local content and live sites under 64 stable rules, scores pages for AI answer-engine citation with TypeSafe AI Jev, stores rank history in local SQLite, gates CI on blocking rules, and exposes 19 MCP tools so coding agents can run the same checks. The free path uses DuckDuckGo and local files only. Optional paid backends stay off until you pass a flag and key.

Who is it for? Developers, indie hackers, technical writers, and autonomous coding agents (Claude Code, Gemini CLI, Cursor, Antigravity) who need SEO evidence without a $130/month dashboard seat.

What does it cost? Rules, crawls, reports, rank history: free. Jev semantic calls: fractions of a cent under --jev-budget (default $0.25 per run).

jev-seo is a single static Rust binary for developers who refuse a $130/month SEO seat. It audits local Markdown and HTML trees under 64 stable rules, crawls live hosts with robots.txt honored, scores pages for answer-engine citation with TypeSafe AI Jev typed primitives, tracks rank drift in a local SQLite file, and exposes the same surface as a 19-tool stdio MCP server. Free search data comes from DuckDuckGo. Semantic scores sit behind --jev-budget (default $0.25 per run). Paid backends never fire without an explicit flag and key.

One command proves the pitch:

$ jev-seo explain R19
R19 | content | Medium | advisory (warning only) | effort 2 (about a day)
  title: AI slop markers
  fix:   Rewrite flagged boilerplate in plain words.
$ jev-seo audit docs/ --min-pass 40 && echo gate_ok
gate_ok

See the output

Trust strip: battle-tested numbers

HTML report: scorecard, pages, findings

Live crawl progress (real session shape)

Action tracker CSV (same rank as the terminal)

Explain a rule, then diff a baseline

19-tool MCP surface

Cost ladder: free path vs seat

Impact vs effortWhat runs whereWhat it costs

Why it earns a slot

Paid suites price a seat. This prices a compile. The table maps what you get to why a FOSS dev or agent loop cares.

What you getWhy it matters
One binary, zero servicescargo install jev-seo or a release tarball. No Electron, no SaaS login, no browser farm.
64-rule local + live checksR01-R64 across crawl, on-page, content, links, structured data, AI access, performance, security, canonical. Crawl and audit share one registry.
Jev as typed oracle, not chatIntent, GEO composite, page quality as Choice / Score / Noul with confidence gates. Weak answers print [verify] or drop. No free-form generation.
Spend you can prove--jev-budget hard-caps USD before each POST. --no-jev forces rules-only. ledger.json records requests and tokens when you pass --manifest.
Agent-native MCP19 tools on stdio JSON-RPC 2.0. One config block wires Claude Code, Gemini CLI, Antigravity. Guarded file reads and SSRF refuse on remote hops.
CI gate you can pasteaudit --min-pass 40 exits nonzero under the floor. Workflow lives in .github/workflows/seo-gate.yml.
Reports from one runHTML, PDF, Markdown, findings CSV, action-tracker CSV, cannibalization pair CSV, frozen run.json + ledger.json.
Local rank historySQLite drift in .jev-seo.db. crawl --diff compares to the last snapshot.
Free search pathDuckDuckGo HTML and suggest. Tavily, DataForSEO, Jina, Firecrawl, extract stay parked until you opt in with a key.

Start here: Example crawl · Example audit HTML · Narrative contract · Eval protocol · Agent skill · PRD


Free vs paid dashboards

JobPaid dashboardsjev-seo
One-site audit with ranked fixesMonthly seat, queued crawlcrawl in seconds, actions free
Rank tracking over timeSubscription per projectSQLite drift history, ₹0
AI visibility scoringAdd-on tiergeo + llms, fractions of a cent per Jev call
Agent accessAPI credits per call19-tool MCP on stdio
Report exportsExport limits per planHTML, PDF, Markdown, CSV, action tracker, pairs
CI gatePlan tieraudit --min-pass, zero config beyond the binary

What runs where, and what it costs

PartWhere it runsCost
64-rule audit, local HTML/PDF/MD, CSV, pair matrixYour machineFree
Live crawl (robots, redirects, orphans, timing)Your binary → target hostFree
Rank history, snapshots, --diffLocal SQLite .jev-seo.dbFree
Search Console pulls (gsc)Google API with your OAuth clientFree
SERP autocomplete and scrapeDuckDuckGoFree
Page/site/keyword/brief Jev judgmentsTypeSafe System OneCapped by --jev-budget (default $0.25/run)
Tavily search or extractTavily (TAVILY_API_KEY)Opt-in only; free path never calls it
DataForSEO live SERPDATAFORSEO_USERNAME + DATAFORSEO_PASSWORDOpt-in only via query --provider dfs; free fallback on error
Jina / Firecrawl body upgradesRespective APIsOpt-in; --max-credits 0 parks spend
DataForSEONot requiredNon-goal on the free path

Keys come from the environment: TYPESAFE_API_KEY for Jev, TAVILY_* / JINA_API_KEY / FIRECRAWL_* for paid upgrades, GOOGLE_CLIENT_ID + GOOGLE_CLIENT_SECRET for gsc. Missing optional keys degrade to local-only sections; they do not fail the run.


How far to trust it

Measured 2026-09-22. Protocol and re-run commands: docs/EVAL.md.

CheckResultRerun
Cold start (--help)6mstime jev-seo --help
Local audit, 4 files~0.2sjev-seo audit docs/ --json
Live crawl, 6-10 pages3-11s wall (server-bound)jev-seo crawl <url> --max-pages 10
Score repeatability, 3 crawlsScore 99 stable; findings ±2 from timing rules onlyjev-seo crawl <url> --json ×3
Test suite133 green, clippy -D warnings cleancargo test
Budget guard--jev-budget 0 → zero Jev POSTsjev-seo audit docs/ --jev-budget 0
Citation gateReport text citing unknown RULE-Rxx refuses to writeCovered in unit tests

Scores rank work. They do not predict rankings or traffic. Confidence gates print facts only when Jev is decisive; otherwise you get [verify] or a withheld number.


What's new

v0.4.0 (unreleased): Search CI (check + verify, policy.toml, --git, --sarif/--junit), regional SERP flags, GSC inspect/winners/losers, Bing sites/queries, R59-R64, citation struct, indexability table, 4 new MCP tools (19 total), jev:// resources, evidence snapshots. Plus portable Agent Plugins package (plugin.json + mcp.json + .app.json), annotated MCP tools, bundled skills/jev-audit/SKILL.md, bridge GET /health probe.

v0.3.0 (2 October 2026): plugin bridge jev-seo serve, capabilities --json, watch --diff-only, deterministic fix-plan, crawl sitemap seeding (closes #3), R32/R08/R56 rule breadth, JS verification gate, GEO trends with sparkline SVG. See CHANGELOG.md.

Feature on masterUse it
explain R19 / RULE-R19Rule card: area, severity, effort band, fix
report --baselineScore delta, rules cleared/new between two audit JSONs
crawl --vitalsKeyless PageSpeed lab vitals with R51-R53
query --provider dfsOpt-in DataForSEO live SERP, free fallback
audit --actions-csvRanked action tracker (id, priority, effort, impact)
audit --pairs-csvCannibalization A×B pairs with word-count winner
audit --manifestFrozen run.json + ledger.json beside exports
--no-jev / --jev-budgetRules-only mode and hard USD spend cap
--user / --password / --headerBasic auth + custom headers on target-site fetches; staging behind login becomes auditable
R58 broken hreflang clustersAlternates pointing at noindexed or unreciprocated targets (heuristic, advisory)
narrative.jsonOwner narrative; unknown action IDs fail closed
MCP seo_explain, seo_reportSame explain and baseline over stdio (19 tools)
MCP seo_cite_checkCitation check that works on every client: answer, sampling, or engine path
MCP seo_gap + gsc gapSearch Console impressions × weak positions, joined with citation history
geo keyless scoreDeterministic 0-100 GEO formula with zero keys; Jev upgrades it when keyed
drift baseline/compare/historySQLite audit snapshots as deploy gates; seo_report takes baseline_label
audit --digest, bundleAgent brief with verify lines; one-file canonical close with pairs + drift
Paid engine answersJEV_SEO_LLM_KEY + model (+ optional URL) covers Perplexity, OpenRouter, Ollama

Get the latest:

cargo install jev-seo
jev-seo explain R19

Build from source for the working tree:

git clone https://github.com/AkashPriyadarshii/jev-seo.git
cd jev-seo
cargo install --path .

Quickstart

cargo install jev-seo

# Optional: TypeSafe key for Jev semantic scores
export TYPESAFE_API_KEY=your_key_here

# Competitive SERP radar
jev-seo query "offline expense tracker android"

# 64-rule audit on docs
jev-seo audit docs/

# Live crawl with health score and ranked actions
jev-seo crawl https://example.com --max-pages 10

# Exports agents and spreadsheets read
jev-seo audit docs/ --html out/report.html --actions-csv out/actions.csv --pairs-csv out/pairs.csv

# CI gate
jev-seo audit docs/ --min-pass 40

# Agent server
jev-seo mcp

If jev-seo saved you a dashboard seat, star the repo so you can find it later.

Install

LaneCommand
Cargo (published)cargo install jev-seo
Build from source (What's new before release)git clone … && cargo install --path .
Linux x86_64 / ARM64jev-seo-<target>.tar.gz from Releases
macOS Intel / ARMSame Releases page, tar.gz with SHA256
Windows x86_64Same Releases page, .zip

MCP config for any client:

{
  "mcpServers": {
    "jev-seo": { "command": "jev-seo", "args": ["mcp"] }
  }
}

Workflows

1. Batch directory and file audit

jev-seo audit content/posts/
jev-seo audit content/posts/ --html report.html --pdf report.pdf --md report.md
jev-seo audit content/posts/ --actions-csv actions.csv --pairs-csv pairs.csv --manifest out/

Walks every Markdown and HTML file. Flags title collisions, thin content under 300 words, missing canonicals, missing alt text, skip-level headings, AI boilerplate, em-dash density, orphan pages, and keyword stems fighting each other. --pairs-csv expands each multi-file stem into A×B rows with a word-count winner.

2. JSON-LD Schema.org validation

jev-seo schema content/guide.md

Checks SoftwareApplication, Article, Organization, Product. Flags deprecated types such as HowTo rich results that no longer qualify.

3. Robots.txt and AI crawler inspection

jev-seo robots example.com

Reads robots.txt for GPTBot, ClaudeBot, anthropic-ai, PerplexityBot, Google-Extended, Bytespider. Prints allow/disallow and readiness actions.

More workflows: briefs, GEO scoring, CI gate, sitemap, AI-slop radar, explain, baselines, narrative (click to expand)

4. SERP-driven content brief

jev-seo brief "fast local sqlite tui" --markdown

Live DuckDuckGo competitors, word-count estimate, Jev fan-out for H2 outline plus a direct-answer block sized for answer engines.

5. GEO citation score

jev-seo geo README.md --query "agentic skills framework for coding agents"

Citation likelihood 1-10 from Jev Score and Noul. Five-dimension composite (structure, density, directness, statistics, freshness) with published weights and history delta. Low-confidence answers are withheld. For a broader view of how AI engines perceive your brand, see Prefer.

6. Confidence-gated scoring

Strong Jev scores print as facts. Shaky ones print [verify]. Unsure ones print a note and no number. Thresholds live in src/policy.rs. Act confidence is 0.80. Injection pre-screen runs before quality suites.

7. CI SEO gate

jev-seo audit docs/ --min-pass 40
jev-seo audit docs/ --no-jev --jev-budget 0

Two gates, different jobs. --min-pass exits nonzero under your score floor. --fail-on (default blocking) exits nonzero only on deterministic blocking findings: missing titles, broken links, invalid JSON-LD, missing canonicals. Judgment calls (slop markers, length windows, lab vitals) print as warn and never fail the build alone, so a rule Google quietly changes cannot become the flaky test everyone bypasses. --fail-on all restores fail-on-anything. --no-jev and --jev-budget 0 keep CI offline for semantics. Workflow: .github/workflows/seo-gate.yml. The full blocking list lives in src/rules.rs (gate()); every action line, CSV row, and explain card carries its class.

8. XML sitemap and hreflang

jev-seo sitemap sitemap.xml
jev-seo sitemap https://example.com/sitemap.xml

Canonical HTTPS, parameter pollution, 50,000 URL limit, hreflang codes (rejects en-UK for en-GB, requires x-default when alternates exist).

9. Helpful Content and AI slop radar

Built into audit:

  • Em-dash density over 2 per 500 words
  • 17 AI boilerplate markers (delve, leverage, testament, foster, seamless, crucial, robust, landscape, and peers)
  • Heading hierarchy skip-levels (H1 to H3 with no H2)
  • Internal link graph for zero-inbound orphans
  • Keyword cannibalization stems plus A×B conflict pairs

10. Explain a rule, then diff a baseline

jev-seo explain R19
jev-seo explain RULE-R42 --json

jev-seo audit docs/ --json > before.json
# ... fix content ...
jev-seo audit docs/ --json > after.json
jev-seo report after.json --baseline before.json

explain prints area, severity, effort band, title, fix for any stable rule id. report prints score delta, rules cleared, rules new, ranked actions.

11. Optional narrative beside the report

Drop narrative.json next to exports (or in --manifest). Required keys: executive_summary, strengths, risks, plan. Every RULE-Rxx you cite must exist or load fails. Numbers that match nothing and plan effort bands that fight the action table print as warnings. Missing file embeds an automatic evidence-only summary, labeled automatic. Spec: references/narrative.md. Shape: examples/narrative.example.json.


Command Reference

CommandDescriptionFlags
keywords <query>Autocomplete discovery and Jev intent classification--json
query <query>Live SERP scrape, Jev relevance rerank, gap analysis--limit <n>, --provider auto|ddg|tavily|dfs, --depth, --topic, --json
audit <path>Directory or file audit under 64 rules; orphans, thin, cannibalization--target-query <query>, --json, --min-pass <pct>, --fail-on blocking|all, --forbid R31,R36, --max-critical <n>, --html <path>, --pdf <path>, --md <path>, --csv <path>, --actions-csv <path>, --pairs-csv <path>, --rescore <path>, --manifest <dir>, --no-jev, --jev-budget <usd>, --user <u>, --password <p>, --header <name:value>
geo <target>GEO citation score 1-10, five-dimension composite, trend--query <query>, --json, --jev-budget <usd>
schema <target>JSON-LD structural and deprecation validator--json
robots <domain>Robots.txt and AI crawler permission auditor--json
brief <topic>SERP heading outline and direct-answer block--limit <n>, --provider auto|ddg|tavily|dfs, --markdown, --json
link <path>Jev Choice internal-link suggestions per page, or no_link--limit <n>, --json
rankSQLite rank drift tracker (.jev-seo.db)--domain <domain>, --query <query>
sitemap <target>XML sitemap, 50k limit, HTTPS, hreflang--json
crawl <url>Live BFS crawl: health score, actions, redirects, orphans, timing--sitemap <url>, --max-pages <n>, --fetch auto|direct|jina|firecrawl, --max-credits <n>, --json, --diff, --csv <path>, --rescore <path>, --manifest <dir>, --no-jev, --jev-budget <usd>, --user <u>, --password <p>, --header <name:value>, --vitals
llms <domain>llms.txt and AI crawler readiness with actions--json
explain <id>Rule card for R19 or RULE-R19--json
report <path>Diff two audit JSONs: score, rules, actions--baseline <path>, --actions-csv <path>, --json
bundle <audit.json>Canonical close bundle (digest + pairs + drift)--out <PATH>
drift <op>Snapshot baselines baseline/compare/history--report <path>, --label <name>, --json
doctorVersion, API key, database, platform--json
capabilitiesMachine source of truth {version, rule_set, rules, mcp_tools, commands}--json
fix-plan <audit.json>Deterministic patch hints from findings (fact/heuristic)--limit <n>, --json
watch <target>Regression watch vs stored baseline (polling)--repo/--site, --once, --every <min>, --label, --json, --no-jev
serveHTTP bridge for ChatGPT Plugin Extensions (Streamable HTTP)--addr <host:port>
gsc <auth|sites|query|gap>Search Console: free first-party query data--site <url>, --code, --limit <n>, --json
mcpStdio JSON-RPC 2.0 agent MCP server(None)

Real --help excerpt (audit):

Usage: jev-seo.exe audit [OPTIONS] <PATH>

Options:
      --json
      --min-pass <MIN_PASS>       Exit nonzero when pass rate falls below this percent (CI gate)
      --fail-on <FAIL_ON>         Which findings fail the build: blocking or all [default: blocking]
      --forbid <FORBID>           Comma-separated rule ids that always fail
      --max-critical <MAX_CRITICAL>  Fail when more than N Critical findings fire
      --html <PATH>               Write a single-file HTML report to this path
      --pdf <PATH>                Write a PDF report to this path
      --md <PATH>                 Write a Markdown report to this path
      --csv <PATH>                Write a CSV findings export to this path
      --actions-csv <PATH>        Write ranked action-tracker CSV (id, priority, effort, impact)
      --pairs-csv <PATH>          Write stem×URL conflict pairs CSV (cannibalization)
      --rescore <PATH>            Rebuild findings and actions from a saved audit JSON, no work
      --manifest <DIR>            Write run.json + ledger.json to this directory
      --no-jev                    Skip all Jev semantic calls (rules and local audit only)
      --jev-budget <USD>          Hard Jev spend cap in USD for this run [default: 0.25]

Optional narrative.json beside audit exports loads at report time: unknown action IDs fail closed; a missing file embeds an automatic evidence-only summary (references/narrative.md).


Native MCP Server (15 Tools)

jev-seo mcp speaks stdio JSON-RPC 2.0. It answers initialize, stays silent on notifications, reports parse errors, and sets isError on tool failures. File tools use a guarded reader (content extensions only, no dot-files, no URLs) plus a Jev safety classifier for secret-looking targets. Remote fetches refuse private hosts, resolved DNS, and redirect landings.

MCP ToolArgumentsPurpose
seo_cite_checktarget: string, query: string, answer?: stringCitation verdict via own answer, sampling, or engine
seo_gapsite: string, limit?: intGap queue: impressions × weak positions + citation history
seo_keywordsquery: stringAutocomplete variants and intent class
seo_serp_inspectquery: string, limit?: intLive top titles, snippets, URLs
seo_auditpath: stringLocal Markdown/HTML audit, orphans, AI slop
seo_geotarget: string, query: stringCitation likelihood 1-10 and answer presence
seo_schematarget: stringJSON-LD structure and deprecation rules
seo_robotsdomain: stringLive robots.txt for major LLM crawlers
seo_brieftopic: string, limit?: intMarkdown brief with H2 outline
seo_sitemaptarget: stringSitemap protocol, HTTPS, hreflang
seo_crawlurl: string, max_pages?: intBroken links, redirects, orphans
seo_llmsdomain: stringllms.txt and AI crawler permissions
seo_extracturls: string[], query: stringURL to markdown (key-gated paid path)
seo_explainid: stringRule card for R19 / RULE-R19
seo_reportpath: string, baseline?: string, baseline_label?: stringAudit JSON diff: score, rules, actions, pairs, drift

Examples from real runs

Real output in the repo, not mockups:

  • examples/jevseo-site/crawl.json: 10-page live crawl with health score, areas, findings, and actions
  • examples/jevseo-site/llms.json: answer-engine readiness with checks and actions
  • examples/local-docs/report.html, report.md, findings.csv: one audit in three formats
  • examples/narrative.example.json: narrative contract shape for report embeds
  • docs/audits/akashpriyadarshi-vercel-app-2026-09-24.md: full portfolio sweep with 38 orphans, 11 empty pages, 100/100 readiness, GEO 5 with verify

Field report: Real audit: portfolio site, 50 pages, zero spend. Every number comes from one live run, including pre-fix findings.

Single-file report and session shots (regenerated pack in docs/assets/):

  • banner.png · trust-strip.png · pipeline.svg · cost-ladder.png
  • preview-summary.png · preview-terminal.png · preview-actions.png
  • preview-mcp.png · preview-explain.png · impact-effort.png

FAQ

What is jev-seo in one sentence? A free, open-source Rust SEO and GEO CLI plus 19-tool MCP that audits, crawls, scores AI citation readiness, and gates CI without a monthly subscription.

What does it cost? Nothing for rules, crawls, and reports. Semantic Jev calls cost fractions of a cent under a hard per-run USD cap.

Is there a free Semrush or Ahrefs alternative? jev-seo is built as that alternative: local binary, DuckDuckGo search path, MIT license, no DataForSEO requirement on the free tier.

Does it need API keys? Not for deterministic work. Jev scoring wants TYPESAFE_API_KEY. Without it, those sections print local-only output. Paid search and extract backends stay parked until you pass their flags and keys.

How is this different from a web dashboard? It is a binary. You script it, gate CI on it, and agents call it over MCP. No seat to renew.

What is a GEO score? Citation likelihood 1-10 for answer engines, from a five-dimension composite with published weights in src/policy.rs.

What is AEO / answer engine optimization here? GEO score, llms.txt readiness, AI crawler permissions, and briefs that open with a direct answer. Rules that measure those stay labeled heuristics.

Which pages does a crawl check? Up to --max-pages (default 50), seeded from /sitemap.xml when present, robots.txt honored.

Can CI fail on it? Yes. audit --min-pass exits nonzero under your floor, and --fail-on blocking (the default) fails only on deterministic rules. crawl --diff reports drift against the last SQLite snapshot.

Do I need paid APIs? No. Paid backends are opt-in per flag. Free DuckDuckGo paths never call them.

When do I get explain, report, and action trackers from crates.io? Shipped in v0.1.2. cargo install jev-seo.

Is my data sent anywhere? Rank history and snapshots stay in .jev-seo.db. Audits run on your filesystem. Only the commands you point at remote hosts make network requests.

Can an agent drive it? Yes. jev-seo mcp exposes 19 tools over stdio JSON-RPC 2.0. One config block in your MCP client is enough.

What license? MIT. Source and binaries are free to use, modify, and redistribute.


Watch

jev-seo watch docs/ --once --no-jev          # one-shot vs last baseline (repo)
jev-seo watch https://example.com --once --every 30  # site; loop every 30m
jev-seo watch --repo . --json | jq .status   # machine gate: clean|regressed|improved|baseline

Compares score, blocking/warning counts, findings, and drift_alerts (citation/geo) against watch-<slug> sqlite baseline, then saves current as next baseline. ponytail: polling, not inotify; pool if >100 rps.

Architecture

jev-seo
├── src
│   ├── main.rs         CLI entrypoint and command dispatch
│   ├── engine.rs       TypeSafe Jev client, fan-out, spend counters
│   ├── policy.rs       Confidence thresholds, GEO weights, injection gate
│   ├── manifest.rs     run.json + ledger.json, citation gate, budgets
│   ├── narrative.rs    narrative.json load, ID refusal, number checks
│   ├── paths.rs        Guarded file reader, domain match, SSRF block
│   ├── serp.rs         DuckDuckGo HTML and suggest scraper
│   ├── audit.rs        Batch directory and file on-page auditor
│   ├── rules.rs        Rule registry R01-R64, scoring, explain, CSV
│   ├── actions.rs      Ranked actions and action-tracker CSV
│   ├── schema.rs       JSON-LD Schema.org validator
│   ├── robots.rs       Robots.txt and AI crawler analyzer
│   ├── brief.rs        SERP-driven content brief generator
│   ├── rank.rs         Local SQLite rank drift tracker
│   ├── sitemap.rs      XML sitemap and hreflang auditor
│   ├── crawl.rs        Live-site BFS crawler with dedup and timing
│   ├── fetch.rs        Direct / Jina / Firecrawl bodies under credit budget
│   ├── gsc.rs          Search Console device-flow client
│   ├── llms.rs         llms.txt and AI crawler readiness scorer
│   ├── mcp.rs          Stdio JSON-RPC 2.0 MCP server (19 tools)
│   └── tests.rs        Unit and integration harness (142 tests)
├── references/narrative.md
├── examples/           Real crawl, audit, and narrative fixtures
├── docs/               PRD, design, architecture, EVAL protocol
├── Cargo.toml
└── README.md

Development

git clone https://github.com/AkashPriyadarshii/jev-seo.git
cd jev-seo
cargo test
cargo clippy --all-targets -- -D warnings
cargo run -- audit docs/ --min-pass 40

CI runs cargo check --all-targets, cargo test --all, and the SEO gate on every push to master.


Limits and non-goals

  • Large live crawls sample at --max-pages (default 50). The report says so via completeness notes.
  • Heuristic rules (AI slop markers, em-dash density) are editorial conventions, not Google ranking factors.
  • Jev thresholds are confidence-gated, not human-label-tuned. Decisive answers print; others print [verify] or drop.
  • This does not measure traffic, revenue, or long-term rankings. Search Console (gsc) reports first-party clicks and positions you already own.
  • No Electron or cloud web dashboard.
  • No forced DataForSEO or other paid API on the free path.
  • No generative prose synthesis. Jev is an evaluation oracle, not a writer.
  • No heavy local browser farm. Crawls use lightweight HTTP fetches.

Ecosystem

  • jev-seo — this radar (FOSS SEO and GEO CLI + MCP)
  • jev-superpowers — Jev-gated agent engineering workflows
  • jev-curate — Jev-curated content toolkit
  • jev-git — Jev reflex gates for git
  • tdlib-android — Precompiled TDLib binaries for four Android ABIs
  • kharcha — Offline-first UPI expense tracker for Android
  • Prefer — AI visibility platform for understanding how ChatGPT, Claude, Gemini, and Perplexity talk about your brand

Author

Akash Priyadarshi
Patna, Bihar, India

Social: X / Twitter · Threads · Instagram · Reddit


Contributors

  • @jerryrat — paid search provider path and DuckDuckGo header research (PR #2)

Free open-source SEO and GEO radar. MIT. Rust CLI + 19-tool MCP. Built with TypeSafe AI System One.