Runs on your machine v0.1.3 available

A crawler, and the diagnostics around it.

Consuela walks your whole site the way a search engine does, then audits every page for the issues that affect indexing and ranking. Everything stays on your machine — no upload, no account, no crawl credits to count.

v0.1.3Latest release Runs on your machineNo upload, no account Windows · macOS · LinuxSingle binary
Consuela acme.com
9,214 rows · 142 URL/s Export
Critical 38 Warning 116 Info 640 Pass 8,420
Address Status Title 1 Time
acme.com / 200 Acme — Home 84 ms
acme.com /blog/old-post-redirect 301 — 41 ms
acme.com /blog/technical-seo-audit-checklist 200 SEO audit 55 ms
acme.com /products/enterprise-widget 200 Products 92 ms
acme.com /products/widget/pro-pricing 200 Pricing 96 ms
acme.com /pricing?plan=enterprise 200 Pricing 102 ms
acme.com /about/team 200 About us 67 ms
acme.com /careers/senior-engineer 200 Careers 73 ms
acme.com /docs/getting-started 200 Documentation 61 ms
acme.com /docs/legacy-api-v1 404 — 38 ms
acme.com /help/contact-support 200 Help center 88 ms
acme.com /blog/2025/seo-audit 200 SEO audit 79 ms
acme.com /partners/integration-guide 200 Partners 71 ms
acme.com /press/product-launch-announcement 200 Press 68 ms
acme.com /support/kb/server-error 500 — 3011 ms
9,214 crawled · 64s elapsed · 142 URL/s · Complete
What it does

Built for the work that actually moves rankings

Consuela is not a longer checklist. It is a crawler that turns a site into data you can query, rank by impact, and plug into the systems you already run.

Critical 38
Warning 116
Notice 640
Pass 8,420
Issues ranked by impact Every issue is scored by severity so you fix what blocks indexing and traffic first, not whatever happens to appear first in a list.
Source HTML<div id="app"></div>
→
Rendered DOM<h1>Acme</h1>
<p>Enterprise widgets …</p>
Crawl what the crawler sees Headless Chrome renders the page, so SPAs, lazy-loaded content, and client-side routing are audited the way a modern search engine sees them.
Build
Tests
Crawl
Deploy
3 critical
CI-native from day one Run the same binary in a pipeline. Fail on critical or warning with JUnit XML output, so a regression never makes it to production twice.
>SELECT url, status FROM pages WHERE status >= 400
urlstatus
/legacy404
/admin500
Query your crawl with SQL The crawl is a SQLite file on disk. Slice it by status, depth, section, or change over time with the tools you already know.
Beyond the crawl

More than a list of broken links

The crawler is the foundation. These are the diagnostics built on top of it.

Accessibility

WCAG 2.1 and 2.2 auditing via axe-core. Violations with impact levels, WCAG tags, and fix guidance — not a simplified check.

Security scanning

Integrations with Semgrep, CodeQL, Trivy, and ZAP. OWASP Top 10 rulesets alongside the SEO audit, in the same tool.

Structured data

JSON-LD, Microdata, and RDFa validation. Google Rich Results eligibility checking against the actual specification.

Content analysis

Thin content detection, content-to-HTML ratio, readability scoring, duplicate and near-duplicate detection via SimHash.

Custom extraction

CSS selectors, regex with capture groups, and real XPath 1.0. Extract any data from every page during the crawl.

TLS inspection

Certificate chain validation, expiry detection, and security header analysis. HSTS, CSP, X-Frame-Options, Referrer-Policy.

Internal linking

PageRank computation, orphan page detection, link depth from seed, and link region classification (content vs navigation).

MCP server

Query crawl data from Claude, Cursor, or any MCP-compatible AI assistant. 16 tools for pages, links, issues, and analysis.

Local first

Some sites you are not allowed to send to a third party

Consuela runs on your machine. The crawl file is yours to keep, the concurrency and per-host rate limits are yours to set, and nothing is uploaded.

$ consuela https://acme.com --concurrency 8 --db acme.db
crawling https://acme.com (max 500 urls)...
9,214 URLs · 64s elapsed
→ acme.db (84 MB)
$ consuela https://acme.com --format junit --fail-on warning
3 check(s) at or above 'Warning' threshold