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 effort | What runs where | What 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 get | Why it matters |
|---|---|
| One binary, zero services | cargo install jev-seo or a release tarball. No Electron, no SaaS login, no browser farm. |
| 64-rule local + live checks | R01-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 chat | Intent, 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 MCP | 19 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 paste | audit --min-pass 40 exits nonzero under the floor. Workflow lives in .github/workflows/seo-gate.yml. |
| Reports from one run | HTML, PDF, Markdown, findings CSV, action-tracker CSV, cannibalization pair CSV, frozen run.json + ledger.json. |
| Local rank history | SQLite drift in .jev-seo.db. crawl --diff compares to the last snapshot. |
| Free search path | DuckDuckGo 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
| Job | Paid dashboards | jev-seo |
|---|---|---|
| One-site audit with ranked fixes | Monthly seat, queued crawl | crawl in seconds, actions free |
| Rank tracking over time | Subscription per project | SQLite drift history, ₹0 |
| AI visibility scoring | Add-on tier | geo + llms, fractions of a cent per Jev call |
| Agent access | API credits per call | 19-tool MCP on stdio |
| Report exports | Export limits per plan | HTML, PDF, Markdown, CSV, action tracker, pairs |
| CI gate | Plan tier | audit --min-pass, zero config beyond the binary |
What runs where, and what it costs
| Part | Where it runs | Cost |
|---|---|---|
| 64-rule audit, local HTML/PDF/MD, CSV, pair matrix | Your machine | Free |
| Live crawl (robots, redirects, orphans, timing) | Your binary → target host | Free |
Rank history, snapshots, --diff | Local SQLite .jev-seo.db | Free |
Search Console pulls (gsc) | Google API with your OAuth client | Free |
| SERP autocomplete and scrape | DuckDuckGo | Free |
| Page/site/keyword/brief Jev judgments | TypeSafe System One | Capped by --jev-budget (default $0.25/run) |
| Tavily search or extract | Tavily (TAVILY_API_KEY) | Opt-in only; free path never calls it |
| DataForSEO live SERP | DATAFORSEO_USERNAME + DATAFORSEO_PASSWORD | Opt-in only via query --provider dfs; free fallback on error |
| Jina / Firecrawl body upgrades | Respective APIs | Opt-in; --max-credits 0 parks spend |
| DataForSEO | Not required | Non-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.
| Check | Result | Rerun |
|---|---|---|
Cold start (--help) | 6ms | time jev-seo --help |
| Local audit, 4 files | ~0.2s | jev-seo audit docs/ --json |
| Live crawl, 6-10 pages | 3-11s wall (server-bound) | jev-seo crawl <url> --max-pages 10 |
| Score repeatability, 3 crawls | Score 99 stable; findings ±2 from timing rules only | jev-seo crawl <url> --json ×3 |
| Test suite | 133 green, clippy -D warnings clean | cargo test |
| Budget guard | --jev-budget 0 → zero Jev POSTs | jev-seo audit docs/ --jev-budget 0 |
| Citation gate | Report text citing unknown RULE-Rxx refuses to write | Covered 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 master | Use it |
|---|---|
explain R19 / RULE-R19 | Rule card: area, severity, effort band, fix |
report --baseline | Score delta, rules cleared/new between two audit JSONs |
crawl --vitals | Keyless PageSpeed lab vitals with R51-R53 |
query --provider dfs | Opt-in DataForSEO live SERP, free fallback |
audit --actions-csv | Ranked action tracker (id, priority, effort, impact) |
audit --pairs-csv | Cannibalization A×B pairs with word-count winner |
audit --manifest | Frozen run.json + ledger.json beside exports |
--no-jev / --jev-budget | Rules-only mode and hard USD spend cap |
--user / --password / --header | Basic auth + custom headers on target-site fetches; staging behind login becomes auditable |
| R58 broken hreflang clusters | Alternates pointing at noindexed or unreciprocated targets (heuristic, advisory) |
narrative.json | Owner narrative; unknown action IDs fail closed |
MCP seo_explain, seo_report | Same explain and baseline over stdio (19 tools) |
MCP seo_cite_check | Citation check that works on every client: answer, sampling, or engine path |
MCP seo_gap + gsc gap | Search Console impressions × weak positions, joined with citation history |
geo keyless score | Deterministic 0-100 GEO formula with zero keys; Jev upgrades it when keyed |
drift baseline/compare/history | SQLite audit snapshots as deploy gates; seo_report takes baseline_label |
audit --digest, bundle | Agent brief with verify lines; one-file canonical close with pairs + drift |
| Paid engine answers | JEV_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
| Lane | Command |
|---|---|
| Cargo (published) | cargo install jev-seo |
| Build from source (What's new before release) | git clone … && cargo install --path . |
| Linux x86_64 / ARM64 | jev-seo-<target>.tar.gz from Releases |
| macOS Intel / ARM | Same Releases page, tar.gz with SHA256 |
| Windows x86_64 | Same 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
| Command | Description | Flags |
|---|---|---|
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 |
rank | SQLite 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 |
doctor | Version, API key, database, platform | --json |
capabilities | Machine 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 |
serve | HTTP 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 |
mcp | Stdio 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 Tool | Arguments | Purpose |
|---|---|---|
seo_cite_check | target: string, query: string, answer?: string | Citation verdict via own answer, sampling, or engine |
seo_gap | site: string, limit?: int | Gap queue: impressions × weak positions + citation history |
seo_keywords | query: string | Autocomplete variants and intent class |
seo_serp_inspect | query: string, limit?: int | Live top titles, snippets, URLs |
seo_audit | path: string | Local Markdown/HTML audit, orphans, AI slop |
seo_geo | target: string, query: string | Citation likelihood 1-10 and answer presence |
seo_schema | target: string | JSON-LD structure and deprecation rules |
seo_robots | domain: string | Live robots.txt for major LLM crawlers |
seo_brief | topic: string, limit?: int | Markdown brief with H2 outline |
seo_sitemap | target: string | Sitemap protocol, HTTPS, hreflang |
seo_crawl | url: string, max_pages?: int | Broken links, redirects, orphans |
seo_llms | domain: string | llms.txt and AI crawler permissions |
seo_extract | urls: string[], query: string | URL to markdown (key-gated paid path) |
seo_explain | id: string | Rule card for R19 / RULE-R19 |
seo_report | path: string, baseline?: string, baseline_label?: string | Audit 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 actionsexamples/jevseo-site/llms.json: answer-engine readiness with checks and actionsexamples/local-docs/report.html,report.md,findings.csv: one audit in three formatsexamples/narrative.example.json: narrative contract shape for report embedsdocs/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.pngpreview-summary.png·preview-terminal.png·preview-actions.pngpreview-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
- GitHub: @AkashPriyadarshii
- Portfolio: akashpriyadarshi.vercel.app
- LinkedIn: Akash Priyadarshi
- Resume: akashpriyadarshii.github.io/Resume
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.