Audit any site for SEO and AI-search visibility. A deterministic crawl feeds narrow typed questions to the Jev decision model, and the dashboard renders the probabilities as they land — not after the report.
$ npx jevseo
No account. No API key. No clone. Dashboard and API on one port — 8787.
Code finds, Jev judges, the dashboard shows the probabilities.
Jev never writes prose. It answers narrow typed questions over crawled text and returns
choice, score or noul answers with probabilities
attached, which the code turns into ranked findings only where the answer is decisive.
An LLM-authored finding is the defining failure mode of this category, so it is designed out
rather than warned about.
Each layer promises the next something specific. Click any layer to see its invariants and the traps that cost time rather than code.
LAYERS.mdThe whole install is one command. It prints a URL and serves the dashboard and the API on the same port.
npx jevseo
The package is scoped; the command is not.
npm i -g jevseo puts a plain jev-seo on your PATH.
start --detach · status · stop ·
doctorstop kills by PID from a pid file, never by process name.
npm install · npm run dev
Dev is two ports with HMR: Vite 5173 + API 8787. Production is one.
opencode for deep research · uv/Python for the MCP ·
a GCP service account for Search Console. Without that key the agent is never granted the
gsc tool, so it cannot source real traffic or keyword data — the audit
still runs, on on-page mining alone.
Eight stages. The model is never asked anything code can count for itself.
robots.txt, seeds from sitemap.xml. Refuses private, loopback and link-local addresses so a pasted URL cannot reach an internal service.Both live in one reviewable file rather than being generated per call, because question design and threshold tuning move accuracy more than the choice of model does.
choice picks one of up to 255 options and returns the full distribution ·
score is an ordered 2–10 rubric returning the probability-weighted mean ·
noul returns P(yes) for one proposition, used as a gate.
noul is a real primitive name, not a typo. Renaming it breaks the schema.
Decisive answers become findings. The grey zone is published, not hidden — and widening
act to raise apparent coverage is the easiest way to make this product wrong.
The limits are part of the product, so they are stated rather than discovered.
Jev carries no index, no volume data and no backlink graph, so there is no way to produce a monthly search count from this state — not approximately, not as an estimate. Keyword opportunity is computed in code from what is actually observable: on-page frequency, whether the term appears in headings, and how many pages carry it.
google-trends was removed rather than registered, because it has no
official API and its “relative interest” index is exactly the pseudo-volume this
product refuses to put in front of a paying customer.
| Variable | Meaning |
|---|---|
JEV_DATA_DIR | state directory, default ~/.jev-seo |
PORT | port, default 8787 (--port beats it) |
JEV_ENV_FILE | explicit .env path |
JEV_WEB_DIST | explicit built-UI path |
JEV_MODEL | judge model, default jev-1.13-free |
ZEN_API_KEY | only for the rate-limited jev-1.13 |
All mutable state goes in ~/.jev-seo. The install directory is never written to
— under npx it is a cache npm garbage-collects.
Six design contracts, plus the knowledge base an agent reads before touching this repo.