Open sourceFree planWritten in RustAGPL-3.0

Know the moment your SEO breaks.

CodoSEO crawls your site, runs 44 SEO checks, scores it from 0 to 100 and shows exactly what changed since the last crawl. You hear about a broken page the day it ships, not when rankings drop.

Free · first 100 pages · no signupPrefer the terminal? Install the CLI
One engine, four ways in

Audit from a browser, a terminal or a chat.

The same crawler and the same 44 checks power the web app, the CLI, the MCP server and the REST API. A finding means the same thing wherever you see it.

Features

Everything you need to keep a site healthy.

Crawl, score, compare and alert. CodoSEO finds what broke, names the pages behind it and tells you when it happened.

44 SEO checks

Status codes, indexability, titles and descriptions, content, links, HTTPS, sitemaps, Open Graph and structured data.

Health score from 0 to 100

Each check is weighted by severity and by how many pages it affects, so one number tells you where a site stands.

Change tracking

Every crawl is compared with the one before: new and fixed issues, status codes, titles and redirect chains that changed.

Scheduled crawls

Crawl every week or every day. The hosted app runs them for you, so nothing has to stay switched on.

Alerts where you work

Get told about regressions by email, Slack, Discord or webhook, the same day the broken change goes live.

URL explorer

Filter every crawled URL by status, indexability, content type or check. See a SERP preview, inlinks and headers.

CI gates

--fail-on critical fails the build when a deploy breaks SEO. Works in GitHub Actions, GitLab CI or any shell.

Polite by default

Obeys robots.txt and Crawl-delay, backs off on 429 and 503, and identifies itself as CodoSEObot.

Self-host in three commands

The web app needs only Postgres: no Redis and no outside requests. Your crawl data stays on your servers.

Site audit

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.

Response

6 checks
  • 4xx and 5xx errors
  • Fetch failures
  • Redirect loops
  • Redirect chains

Indexability

6 checks
  • robots.txt blocking the site
  • Pages blocked by robots.txt
  • Canonical to non-200
  • Noindex and missing canonicals

On-page

12 checks
  • Missing or duplicate titles
  • Missing or duplicate descriptions
  • Missing H1s
  • Length violations

Content

3 checks
  • Duplicate content
  • Thin pages under 200 words
  • Missing image alt text

Links

6 checks
  • Broken links
  • Orphan pages
  • Links to redirects
  • Deep pages

Technical

3 checks
  • HTTP instead of HTTPS
  • Mixed content
  • Slow responses

Sitemap

5 checks
  • Sitemap pages not 200
  • Sitemap pages that are noindex
  • Pages missing from the sitemap

Social

1 check
  • Missing Open Graph title or image

Schema

2 checks
  • Invalid JSON-LD
  • hreflang missing self-reference
CriticalWarningNoticeFull check reference →
The CLI

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.

codoseo crawl https://example.com --format md
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

Crawl again tomorrow and see the diff.

Every crawl is compared with the last one. In the web app it happens on its own; on the command line, codoseo diff compares any two saved audits. New issues, resolved issues, score changes, status changes, title changes and redirect regressions.

before.json → after.jsonScore 84 → 79
Became noindex /pricing
− meta robots: index, follow
+ meta robots: noindex
Status changed /journal/old-trail-guide
− 200 OK
+ 404 Not Found
Title changed /tents
− Tents & Shelters | Northwind Outdoor
+ Tents
Redirect chain grew /sale
− /sale → /deals
+ /sale → /deals → /offers → /
CI/CD

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.

Fast and politeAsync crawling in Rust that still respects robots.txt and Crawl-delay, and backs off on 429 and 503.
Exit codes for CIGate a deploy on critical or warning findings, for crawls and for diffs.
Plain outputTable, JSON, Markdown and CSV. Audit files are portable and diffable.
Embed the cratesCore, crawler, checks and diff are published separately for your own Rust projects.
.github/workflows/seo.yml
- 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
Claude Code
# run it on your machine, no account
claude mcp add codoseo -- npx -y codoseo mcp

# or connect the hosted server
claude mcp add --transport http codoseo \
  https://codoseo.com/mcp

> Audit example.com and list the pages
  with broken links.
For AI agents

Ask your agent to audit the site.

CodoSEO ships an MCP server, so Claude, Cursor or any MCP client can crawl a site, pull the pages behind an issue, check a redirect chain and compare two audits from a single prompt.

Local, no accountcodoseo mcp runs over stdio on your machine and can reach staging and internal hosts.
Hosted for your sitesConnect codoseo.com/mcp with an API key to ask about the sites you monitor.
Pricing

Start free. Stay free if you like.

The hosted free plan monitors one site. The CLI, the MCP server and the self-hosted web app are free and open source. Paid plans for more sites and bigger crawls are coming soon.

Free

Available now
$0forever

Hosted monitoring for one site.

  • 1 monitored site
  • Up to 500 pages per crawl
  • A scheduled crawl every week
  • 1 manual crawl a week
  • 30 days of history
  • Email alerts
  • 100 API calls a day
Create a free account

Pro and Agency

Coming soon
Coming soon

For agencies and growing teams.

  • More monitored sites
  • Larger and longer crawls
  • Daily scheduled crawls
  • Slack, Discord and webhook alerts
  • A year of history
  • Higher API limits
Pricing coming soon

Self-hosted

Open source
$0AGPL-3.0

The full web app on your own servers.

  • Unlimited sites
  • Up to 100,000 pages per crawl
  • A scheduled crawl every day
  • Unlimited manual crawls
  • 365 days of history
  • Email, Slack, Discord and webhook alerts
  • No API call limit
  • Your data stays on your servers
Read the self-hosting guide

Want to try it first? Run a one-off audit of up to 100 pages from the box at the top, no signup needed. The CLI is free and has no page cap of its own.

Documentation

Up and running in minutes.

Guides for every way to run CodoSEO, from a first crawl to a self-hosted install. The docs live with the code on GitHub.

Install the CLI your way

Prebuilt binaries for Linux, macOS and Windows are on the releases page, each with a checksum. Every crate is on crates.io, so you can embed the crawler or the checks in your own project.

Install
# Homebrew (macOS, Linux)
brew install safrowlabs/codoseo/codoseo

# npm
npx codoseo --help

# Cargo (Rust 1.88+)
cargo install codoseo

# Docker
docker run --rm ghcr.io/safrowlabs/codoseo crawl https://example.com
FAQ

Questions, answered.

Something else on your mind? Open an issue on GitHub and we'll get back to you.

Is CodoSEO free?

Yes. The CLI, the MCP server and the self-hosted web app are free and open source under AGPL-3.0. The hosted app has a free plan for one site. Paid plans for more sites and bigger crawls are coming soon.

Do I need an account?

Not for the CLI or the local MCP server, and not for a one-off audit of up to 100 pages in the hosted app. A free account lets you monitor a site on a schedule and get alerts.

How do I install the CLI?

Run brew install safrowlabs/codoseo/codoseo, npx codoseo, or cargo install codoseo (Rust 1.88 or newer). Prebuilt binaries for Linux, macOS and Windows are on the GitHub releases page, and a Docker image is at ghcr.io/safrowlabs/codoseo.

What does CodoSEO check?

44 checks across 9 categories: response codes and redirects, indexability (noindex, canonicals, robots.txt), on-page (titles, meta descriptions, H1s), content (thin and duplicate pages, image alt text), links (broken links, orphan pages, click depth), technical (HTTPS, mixed content, slow responses), sitemaps, Open Graph and structured data (JSON-LD, hreflang).

Will crawling slow down my site?

CodoSEO is built to be polite. It obeys robots.txt and Crawl-delay, slows down on its own when a server answers 429 or 503, and identifies itself as CodoSEObot so you can spot it in your logs.

Does it work with AI assistants?

Yes. CodoSEO includes an MCP server. Run codoseo mcp on your machine, or connect the hosted server at https://codoseo.com/mcp, and Claude, Cursor or any MCP client can run audits and read the results.

Can I self-host the web app?

Yes. Docker Compose brings it up in three commands and it needs nothing but Postgres. The self-hosting guide covers email, sign-in, reverse proxies, upgrades and backups.

Run your first audit in a minute.