Configuration
geo.config.json: JSON only, JSON Schema 2020-12, unknown keys are errors. No executable configuration.
{
"$schema": "https://moelzanaty3.github.io/geopilot/schema/config/v1.json",
"version": 1,
"framework": "auto",
"profile": "web",
"site": { "origin": "https://www.example.com", "language": "en" },
"routes": { "include": ["/**"], "exclude": ["/admin/**", "/api/**"] },
"crawl": { "maxPages": 25, "maxDepth": 3, "render": "auto", "requestTimeoutMs": 10000 },
"policy": { "aiSearchCrawlers": "allow", "aiTrainingCrawlers": "undecided", "userTriggeredFetchers": "allow" },
"appLinks": { "ios": null, "android": null },
"rules": { "GEO-102": "off", "GEO-012": { "severity": "low" } },
"suppress": [{ "rule": "GEO-014", "routes": ["/legal/**"], "reason": "Intentional noindex", "expires": "2027-06-01" }],
"fix": {
"verifyCommands": [["pnpm", "test"]],
"runtimeTimeoutSeconds": 60,
"serve": { "command": ["pnpm", "exec", "next", "dev", "--port", "3100"], "url": "http://127.0.0.1:3100", "readyTimeoutSeconds": 120 }
},
"thresholds": { "failOn": null, "minReadiness": null, "minCoverage": 80 },
"hook": { "failOn": null, "timeoutSeconds": 5 },
"experimental": false
}Precedence
CLI flags, then documented GEO_* environment variables, then the workspace config (the current directory), then the repository-root config, then defaults. --print-config prints the effective result. Monorepo workspaces are scored independently, never averaged.
Things GEO never infers
site.originandsite.language— canonical checks and the S1/S2/G2/G3 fixes need them.- Crawler policy. The training-crawler policy defaults to
undecided, which produces no allow/block recommendation. - App identifiers for
.well-knownfiles. fix.serve.command— owner-written, an argv array that is never passed to a shell, with a loopbackurl. Config alone never authorises running it.
Keys
| Key | Meaning |
|---|---|
framework | auto, nextjs-app, static or generic. generic is not an error: it enables T0/T1 and disables unproven T2/T3 operations. |
profile | web (default) or app, which enables GEO-101 and the GEO-102 observation. |
routes | Globs. /** matches everything; /admin/** also matches /admin. |
crawl | maxPages (default 25 remote, 200 for an explicitly named local target), maxDepth, render. |
rules | "off" or a severity override per rule id. |
suppress | Hide findings with a reason; expired suppressions reactivate with a notice. Suppression never changes readiness. |
fix.verifyCommands | V3 commands, argv arrays. Run only with interactive confirmation, an exact --verify-cmd, or GEO_ALLOW_VERIFY_COMMAND=1. |
thresholds | Gates used when no flag overrides them. minCoverage drives --fail-on-incomplete. |
Environment
GEO_MAX_PAGES,GEO_RENDER,GEO_SITE_ORIGIN— configuration overrides.GEO_ALLOW_VERIFY_COMMAND=1,GEO_ALLOW_SERVE_COMMAND=1— non-interactive authorisation for V3/V4.GEO_CACHE_DIR— where URL-only runs are cached outside a repository.NO_COLOR,FORCE_COLOR,CI— output and interactivity.