Find the issue.Trace it to source.Prove the fix.
geopilot audits any website for the technical conditions crawlers and AI search systems document — robots, sitemaps, indexability, canonicals, metadata, structured data — shows the evidence, maps it to the line that caused it, and verifies the change it proposes.
npx geopilot scan https://your.site$ npx geopilot scan . geopilot · nextjs-app (detected) · provenance T2 · fixes T3 Score 41–75/100, Unconfirmed (checked 15 of 23 points) Readiness insufficient evidence Coverage 43% Confidence 82% · 6 rules need runtime evidence — re-run with --url HIGH GEO-014 /pricing sets robots noindex in its metadata app/pricing/page.tsx:5 provenance exact fix G1-b75653d6 (guarded) MED GEO-012 / root <html> has no lang attribute app/layout.tsx:10 provenance absent fix S2-d8092663 (safe) $ npx geopilot fix --apply --approve G1-b75653d6 --serve S2-d8092663 verified required V2, achieved V2 G1-b75653d6 verified required V4, achieved V4 V4 pass served by a process GEO started after the write source_freshness confirmed (process_started_after_write)
Honest by contract. Technical readiness only. GEO does not measure or predict citations, rankings, traffic or inclusion in any AI or search product.
Observable finding to verified fix, with nothing assumed in between.
URL scans and a 0–100 score are commodity. The difference is the chain: evidence, a source mapping you can check, the smallest safe patch, and verification that never overstates what it proved.
Observe
Fetch the site the way a crawler does: robots.txt first, sitemaps, server HTML, bounded and SSRF-guarded.
Evidence
Every finding carries the URL, header, selector or line that shows it, capped and redacted.
Trace
On Next.js App Router and static HTML, map the value to the literal that produced it — or say why not.
Patch
Propose the smallest closed-list change. Safe fixes apply with --apply; guarded ones need their id.
Prove
Re-check the rule condition, not the fingerprint. V4 counts only on a server GEO started after the write.
A score that refuses to guess.
A repository-only scan of a Next.js app finds and traces problems but reports insufficient evidence rather than a readiness number: its HTTP sub-checks cannot run, and a rule never passes on part of its own checks.
Weighted prevalence of failures in direct evidence. Inferred and agent observations never enter it.
How much of what applies was assessed directly. Below 50%, no readiness number is shown.
The direct share of what was evaluated. Repo-only inferences lower it, visibly.
Exactly which rule and subject pairs were checked. Change it, and numeric deltas are suppressed.
Every number in the docs is recomputed from executable fixtures. See the worked examples →
Every stack gets a URL audit. Source claims are earned.
A framework is not “supported” because it can be scanned by URL or read by an agent. Each output names the tier that actually applied.
| Tier | Capability | Available on | What it may claim |
|---|---|---|---|
| T0 | Universal URL | Any web stack | Observed URL findings. No source claims. |
| T1 | Generic repository | Any readable repo | Hints and candidate files only. No automatic patch. |
| T2 | Verified source mapping | Next.js App Router, static HTML | File and line, when the evidence meets the bar. |
| T3 | Deterministic remediation | Next.js App Router, static HTML | Five closed-list fixes, approvals, snapshots, rollback. |
| Agent | Contextual investigation | Any repository your coding agent can read | Recommendations and hypotheses, labelled agent-suggested. Never engine provenance. |
Useful without AI. Better with your agent.
New to GEO? Install the plugin and run a scan. Your agent checks your code against every rule, shows you what to fix first, and fixes it with your approval. The CLI measures your running site when you want proof.
- Claude Code
/plugin install geopilot --marketplace moelzanaty3/geopilotSupported - GitHub Copilot CLI
copilot plugin marketplace add moelzanaty3/geopilotSupported - OpenCode
npx geopilot agent install --host opencodeSupported - OpenAI Codex
codex plugin marketplace add moelzanaty3/geopilotSupported
In our published benchmark on sample projects, geopilot and a plain prompt found the same planted bugs. On the projects kept back during tuning, geopilot raised no false alarms against 1.56 per report, and far fewer wrong ideas. A plain prompt raised slightly more useful ideas, and cost about half as much.
The CLI, no model involved
Crawl any site, run deterministic rules, explain them, trace source on supported frameworks, apply approved fixes, verify outcomes, cache runs. It never calls an LLM, ships no provider SDK and needs no API key.
The agent plugins, your model
Your agent reads your code on any framework with no install, gives you a code score and the fixes to do first, explains them in plain words, and applies what you approve.
12 scored rules. No folklore.
Each rule cites the platform documentation or standard it rests on. Word counts, mandatory FAQs and llms.txt are not requirements; GEO-010 reports llms.txt for information only.
GEO-013E1 · w3
robots.txt is reachable, parseable and within size limits
GEO-009E1 · w3
Search crawlers have the access your declared policy says they should
GEO-014E1 · w3
Sitemap-listed and linked routes are indexable
GEO-015E2 · w2
An absolute canonical resolves to an indexable URL on the declared origin
GEO-003E2 · w3
Primary content is present in server HTML
GEO-004E1 · w2
Present JSON-LD parses and meets documented requirements
GEO-011E2 · w2
A valid sitemap is discoverable and its URLs are reachable
GEO-012E2 · w2
Title, meta description and html lang are present
GEO-016E2 · w2
Key routes are reachable through server-rendered links
GEO-017E1 · w2
Snippet restrictions do not conflict with an AI-search inclusion policy
GEO-002E2 · w1
Selected accessibility checks pass on the rendered page
GEO-101E1 · w2
Mobile app association files are served correctly
One command to the first result.
Point it at a URL, a repository, or both. Nothing is written outside .geo/ until you approve it.
npx geopilot scan . --url http://127.0.0.1:3000