Know the moment your SEO breaks.
An open-source SEO crawler and monitor in a single Rust binary. It runs 44 checks, scores your site from 0 to 100, diffs two audits and fails your CI build before rankings drop.
$cargo install codoseo
Point it at a URL. Read what's broken.
One command crawls the site, runs every check and prints a report. Output is a table, JSON, Markdown or CSV, so you can read it, pipe it into jq or save it as a file.
Preflight … ok Crawling ━━━━━━━━━━━━━━━━━━━━ 142 pages 28s # CodoSEO report for https://example.com/ - Health score: 84 / 100 - Checks: 37 of 44 checks passed ## Critical (1) | Check | Slug | Affected | Examples | | Page returns a 4xx error | http_4xx | 1 page | /old-page | ## Warning (2) | Page links to a broken URL | links_to_broken | 1 page | /contact | | Meta description is missing | description_missing | 6 pages | /blog/… | ## Summary - Pages: 142 (138 indexable) - Status: 2xx 138 · 3xx 3 · 4xx 1 · 5xx 0 - Avg response: 210 ms
codoseo check <URL>codoseo robots <URL>codoseo redirects <URL>codoseo diff before.json after.json
44 checks after every crawl.
Each check passes or fails and names the pages behind it. Results roll up into a health score from 0 to 100, weighted by severity and by how many pages are affected.
Crawl again tomorrow and see the diff.
Save each audit as JSON and compare any two. codoseo diff lists new issues, resolved issues, score changes, status changes, title changes and redirect regressions.
Fail the build before rankings drop.
CodoSEO is one static binary with no browser and no config file, so it drops into any pipeline. --fail-on critical exits with code 1 when the threshold is reached.
critical or warning findings, for crawls and for diffs.- name: SEO audit run: | cargo install codoseo codoseo crawl ${{ env.SITE_URL }} \ --format json -o audit.json \ --fail-on critical # later: compare against the last release - name: SEO diff run: codoseo diff before.json audit.json --fail-on critical
The CLI is the first piece.
The crawler, checks and diff engine are shipped. The hosted and assistant-facing parts are not, and the dates are not fixed. Watch the repo for releases.
Web app
A dashboard for continuous monitoring. Add a URL and get your first report without touching a terminal.
- Scheduled crawls with change detection between runs
- Alerts to Slack, Discord, email and webhooks
- Health score trend and issue history
- Self-host with
docker compose up, or use a hosted plan
MCP server
Ask Claude, Cursor or any MCP client to audit a page, check a canonical or diff two crawls from your editor.
- Crawl and audit a site from a chat prompt
- Natural-language questions about issues
- Suggested fixes for failing checks
- Shares the engine with the CLI and web app
GEO checks
Visibility for AI answer engines, next to the classic SEO checks.
- AI crawler rules in robots.txt, per user agent
- llms.txt and llms-full.txt validation
- Key content present in the raw HTML
- Alert when a deploy blocks an AI bot
Open source, scriptable, free to run.
How the CLI compares today. Web app and GEO rows are marked as soon because they are not shipped yet.
Competitor details are from their public product pages and may be out of date. Corrections welcome on GitHub.
Use it. Self-host it. Contribute to it.
Licensed under AGPL-3.0. The source is on GitHub and every crate is published to crates.io, so you can embed the crawler or the checks in your own project.