SEOmator Open-Source SEO Audit CLI and Claude Code Skill
Our free, MIT-licensed SEO audit CLI checks a site against 365 rules in 20 categories. Its Claude Code skill lets an AI agent run the audit and fix it.
SEOmator's open-source SEO audit tool is a free, MIT-licensed command-line program that checks a website against 365 rules in 20 categories, from canonicals and Core Web Vitals to AI-crawler access. You install it from npm as seomator. Its Claude Code skill lets an AI coding agent run the same audit, read the results and fix your code.
🧰
What You'll Need:
Node.js 20.3 or newer and npm
Chrome, Chromium or Edge, for Core Web Vitals and JavaScript rendering (the CLI finds the one you have)
A URL to audit, live or staging
Optional: Claude Code or another agent that reads skills
I built this tool. I've made 253 of the repository's 254 commits since the first release on 23 January 2026, so read this as the maker's account, with the bias that comes with it. On 15 October 2026 the GitHub repository had 531 stars and 69 forks, and the npm package had been downloaded 28,949 times.
Before writing this I ran the CLI on our own site. Every number below comes from that run, including the findings it got wrong.
Not everyone who does SEO wants a terminal, and you don't need one. If you'd rather paste a URL into a web page, use our free audit tool. If you want the whole site watched for you, that's the SEOmator platform. The CLI is for developers, technical SEOs and AI agents.
The SEOmator SEO audit CLI is a Node.js program that fetches a page, renders it in a headless browser and scores it against a fixed set of rules. Each rule returns pass, warn, fail or "not measured", and every failure comes with a specific fix. The same codebase gives you four ways in.
Surface
Command
Best for
CLI
seomator audit
Terminal, scripts, CI
Claude Code skill
npx skills add
Agents that audit and fix
Local dashboard
seomator serve
Browsing past audits
Desktop app
npm run electron:dev
Live visual progress
The skill installs with npx skills add seo-skills/seo-audit-skill, and you build the Electron desktop app from source. All four read and write one history file, ~/.seomator/audits.db. That shared file is why seomator compare can diff today's audit against last week's.
The package is @seomator/seo-audit on npm, under the MIT license. You can use it commercially, fork it, and read every rule before you trust its verdict.
📊
By the Numbers: As of 15 October 2026, @seomator/seo-audit has 18 published versions, 28,949 npm downloads since its 23 January 2026 launch, and 6,786 in the 30 days to 12 October.
On 21 May 2026 Tom Dörr shared the repository on X. His post quotes the README of the day, which listed 251 rules; version 5.1.0 ships 365.
We open-sourced the SEOmator audit engine because an audit you can't read is a black box, and you shouldn't hand a black box to an agent. When a rule fails, you should be able to open its source and see what it measured and which threshold it used. A closed tool asks you to take the verdict on trust.
The other reason is where site changes come from now. On the codebase behind this website, 310 of the 441 commits since April 2026 carry a Claude co-author line. When the audit lives in a separate dashboard, someone copies findings across by hand. When it's a command the agent can call, the agent runs the audit, edits the template and runs the audit again to check its own fix.
We still run SEOmator as a business, and our paid plans are how we pay for it. The CLI is the audit engine on its own: no account, no usage cap, no upsell in the output.
How is a rule engine different from a prompt-only Claude SEO skill?
A rule engine returns the same verdict for the same page every time. A prompt-only SEO skill asks the model to judge the page, and a model's judgment can drift between runs. A Claude Code skill is a folder of instructions, plus optional scripts, that the agent loads when a task matches; Anthropic's Claude Code skills documentation explains the format. Many SEO skills lean on the model's judgment. Ours is a thin wrapper around a deterministic program.
A model asked to "check the canonical" usually gets it right. It can still word the same finding differently on two runs, skip a check when its context fills up, or call a borderline case one way today and the other way tomorrow. With a rule engine, the model does the part it's good at: deciding what to fix first and writing the fix.
Prompt-only SEO skill
SEOmator skill + CLI
Who decides pass or fail
The model, each run
365 fixed rules
Same page, same result
Not guaranteed
Yes, within one release
Score you can track
Rarely
0 to 100, per category
Checks it couldn't run
Often dropped silently
Reported as "not measured"
Diff two runs
By hand
seomator compare
Commands it may run
Depends on the skill
Bash(seomator:*) only
Check the last row before you install any skill. Our SKILL.md declares allowed-tools: Bash(seomator:*), so the skill can only run the seomator command. Open the allowed-tools line of any skill you install. It takes ten seconds.
🔑
Key Takeaway: Let the rule engine decide what's broken and let the model decide what to fix first. A score that moves because the model changed its mind can't tell you whether your deploy helped.
What does the CLI check?
The SEOmator CLI's published release, 5.1.0, runs 365 rules in 20 categories. I counted the rule IDs in the shipped bundle, and the total matches the CLI's own --help. The main branch already has 373, so the README on GitHub says 373 while npm install gives you 365 until the next release.
Each category carries a fixed weight in the overall score. The weights come from the project's rule catalogue and add up to 100.
Category
Rules (5.1.0)
Weight
Example rule
Crawlability
37
5%
Canonical target not noindexed
Accessibility
35
7%
SVG images have a name
Performance
28
10%
LCP under 2.5 s
Links
27
8%
No broken internal links
Security
26
8%
HSTS header set
Content
25
5%
Title differs from H1
Core SEO
24
11%
One canonical, absolute
Technical SEO
18
7%
robots.txt returns 200
Structured data
18
5%
JSON-LD parses
JavaScript rendering
16
5%
H1 present without JS
E-E-A-T
15
3%
Author byline present
Images
14
8%
Alt text on every image
URL structure
14
3%
Lowercase URLs
Internationalization
13
2%
Hreflang return links
Mobile
12
2%
Viewport allows zoom
Redirects
11
3%
No redirect loops
HTML validation
11
2%
One title tag
AI/GEO readiness
11
2%
AI crawlers allowed
Social
9
3%
og:url matches canonical
Legal
1
1%
Cookie consent present
Two of these categories are rare in free tools. JavaScript rendering compares the raw HTML with the rendered page, so it catches a title, canonical or noindex that only appears after JavaScript runs. Google's JavaScript SEO basics explains why that gap matters. AI/GEO readiness checks whether AI crawlers can reach you, whether you publish an llms.txt, and whether your JSON-LD matches the visible page. Our llms.txt adoption study shows how few sites publish that file.
💡
Quick Insight: 29 rules only make sense across pages: orphan pages, canonical chains, hreflang reciprocity and the like. On a single-page audit they report "not measured" and they only run with --crawl. If a site-wide problem doesn't show up, check that you crawled.
How do you install and run it?
You install the SEOmator CLI once from npm, check your setup, and point it at a URL. A first single-page audit took 30 to 40 seconds on our homepage.
Install and first audit
npm install -g @seomator/seo-audit
seomator self doctor # checks Node, npm, Chrome and the data folder
seomator audit https://example.com
These are the flags I use most:
Common runs
seomator audit https://example.com --no-cwv # skip the browser render (see below)
seomator audit https://example.com -c core,security,perf # only some categories
seomator audit https://example.com --crawl -m 20 # crawl 20 pages for cross-page rules
seomator audit https://example.com --mobile # add a phone-viewport render
seomator audit https://example.com --format html -o report.html # console, json, html, markdown or llm
For a site you audit often, run seomator init to create a seomator.toml. It holds the crawl limits, the paths to skip and the rules to switch off, so every run uses the same settings. There are presets for blogs, e-commerce and CI.
CLI flags beat the local seomator.toml. That beats configs in parent folders, then ~/.seomator/config.toml, then the built-in defaults.
📌
Pro Tip: Set SEOMATOR_HOME to a project folder when you audit client sites. Each client's history and comparisons then stay separate from yours.
What did the CLI find when we audited seomator.com?
The CLI's HTML report for seomator.com, from @seomator/seo-audit 5.1.0 run without Core Web Vitals, captured 15 October 2026.
The SEOmator CLI gave our own homepage 91 out of 100 on 15 October 2026, with Core Web Vitals on: 277 rules passed, 41 warned, 10 failed and 37 weren't measured. Of the unmeasured ones, 29 need a crawl, 5 need --mobile, INP needs a real user, and 2 minification checks couldn't read the external files. The lab vitals were fine: LCP 0.39 s, CLS 0.000, TTFB 225 ms.
The score tells you little. The 10 failures tell you what to do, so I checked each one by hand.
Rule
Found
Our read
perf-page-weight
597 KB of HTML
Real: RSC payload
htmlval-size-limit
Over 500 KB
Real: same cause
perf-js-file-size
301 KB inline JS
Real: same cause
perf-dom-size
2,184 nodes
Real: footer list
a11y-svg-img-alt
16 of 24 SVGs unnamed
Real, easy fix
social-og-url
No og:url
Real, we missed it
social-og-url-canonical
Nothing to match
Same as above
content-description-pixel-width
About 1,005 px wide
Real: limit ~920 px
security-csp-xss
unsafe-inline
Known: report-only
perf-lazy-above-fold
Lazy images on top
Minor: 32 to 48 px logos
Three of the ten failures have one cause. Our homepage HTML is 611 KB, and 307 KB of it is the React Server Components payload that Next.js inlines into the page. Fix how that payload ships and three rules clear at once. I didn't expect that one, and it's going on our own to-do list.
⚠️
Common Mistake: Treating every fail as equal. Our lazy-loaded "hero" images are tiny logos and the page's LCP was 0.39 s, so that fail ranks below the missing og:url, which takes one line to fix and affects every share of the page.
What did a 20-page crawl add?
A 20-page crawl of seomator.com (--crawl -m 20 --no-cwv) scored 91 again and ran all 29 cross-page rules that a single-page audit leaves unmeasured. 24 of them passed. It's slow, though: 12 minutes for 20 pages, fine in CI and tedious at your desk.
The crawl turned one finding into a pattern. og:url is missing on 10 of the 20 pages: the homepage, pricing, the blog index and our tool pages. Blog posts, team pages and the customer story have it. So the gap is in one shared metadata helper, not ten templates, and a single-page audit could never have shown that.
Two crawl findings were wrong for our site:
403 on five canonicals. The last five pages crawled said their canonical URL returned 403. Fetched again afterwards, all five returned 200. Our host's bot protection had started refusing the crawler partway through. If your site sits behind a firewall, raise per_host_delay_ms in seomator.toml or crawl from an allowed IP.
Schema type drift. The rule flagged five tool pages for declaring one @id as SoftwareApplication on one page and WebApplication on another. Both pages declare the same two-item @type array. That's a bug in the rule, not in our markup.
The LCP-hint rule needed a closer read too. On blog posts it picked the 48 to 96 px author avatar in the byline as the LCP candidate, because that's the first image in the DOM. The real LCP element there is the cover image.
What does skipping the browser render cost you?
The --no-cwv flag skips the headless browser render, and on our homepage it saved about 5 seconds (39 s down to 34 s). It also moved 21 rules from measured to "not measured": the Core Web Vitals, the raw-versus-rendered JavaScript checks, console errors and failed requests. The score barely moved, from 91 to 90, because rules that didn't run don't count.
That's by design. A rule the CLI couldn't run never shows up as a pass; it's listed as "not measured", with the reason. INP is the clearest case. It needs a real person using the page, so no lab run can measure it. INP is a field metric, as web.dev's guide to Interaction to Next Paint explains, so read it from real-user data such as the Chrome UX Report. For a rough number, --simulate-interaction scrolls and clicks the page and reports a synthetic INP that doesn't count toward the score.
seomator compare won't let you mix the two modes up. When I compared our two homepage runs, it opened with a warning that they weren't measured the same way ("Core Web Vitals: true → false") before it showed any diff.
🚩
Red Flag: Don't compare a --no-cwv audit with a full one and call the change a regression or a win. Pick one mode per site and keep it, ideally in seomator.toml.
My rule: --no-cwv for a quick look, the full render for anything you'll act on. Five seconds is a fair price for 21 more measurements.
How do you use the SEO audit skill with Claude Code?
You install the SEOmator skill once, then ask Claude Code in plain words. The skill tells the agent which commands to run, which flags answer which question, and how to read the exit codes.
Run an SEO audit on https://example.com
Audit https://mysite.com and tell me what to fix first
Check SEO health of https://example.com with a 20-page crawl
/seo-audit https://staging.example.com
The agent runs seomator audit with --format llm, reads the report and proposes fixes in your codebase. The skill recommends plan mode, so the agent lays out every fix before it touches a file. Afterwards it can re-run the audit and call seomator compare to show which rules flipped.
You don't need the skill to use the format. Any model can read the report from a pipe:
Pipe the report to Claude
seomator audit https://example.com --format llm --no-cwv | claude "analyze and prioritize fixes"
Why does the LLM format matter?
The llm format is compact XML written for a model's context window. On our homepage the LLM report was 40.6 KB, against 190.7 KB for the JSON report of the same run, so 79% smaller. The Markdown report was 26.1 KB and the HTML one 411.9 KB.
The format also assumes the page you audit might attack the agent reading the report. Any text the CLI copies from the site, such as a title or an error message, goes inside a tag named with a random nonce made for that run. A notice at the top tells the model to treat those blocks as data, never as instructions. Our homepage report had 98 of them.
Hidden instructions in a web page are a real attack: prompt injection is first on OWASP's list of LLM risks. An SEO audit reads untrusted pages all day, so it needs that wall.
📊
By the Numbers: One homepage audit, four formats: JSON 190.7 KB, LLM 40.6 KB, Markdown 26.1 KB, HTML 411.9 KB (seomator.com, 15 October 2026). The LLM report keeps every issue, fix and affected URL in about a fifth of the JSON's size.
How do you catch SEO regressions in CI?
The SEOmator CLI's exit codes let a pipeline tell a bad page from a broken run. Add one audit step and the build fails when the score drops below 70.
Exit code
Meaning
0
Success: the score is 70 or above
1
The audit ran and scored below 70, or compare --fail-on-regression found a regression
2
The command failed: unreachable URL, HTTP error, bad config
130
Cancelled with Ctrl-C
Code 1 means the tool worked and is grading the site, so treat it as a failing grade, not a crash. Only code 2 means the audit couldn't run. With --format json or --format llm, a code 2 also prints a structured error with a stable code field a script can branch on.
The stronger gate compares two runs. Audit before and after a deploy, then run seomator compare example.com --fail-on-regression, which exits 1 if the score dropped or new failures appeared. It diffs by rule ID, so a rule that broke and a different rule that got fixed show up as two lines instead of cancelling out. Our SEO audit guide covers what to do with the findings once the gate trips.
Should you use the CLI, Lighthouse, our free audit tool or the platform?
Use the SEOmator CLI if you work in a terminal or with an AI agent, the free audit tool if you don't, and the SEOmator platform if you want the whole site audited for you on a schedule. Lighthouse sits beside all three as the best single-page performance profiler.
Lighthouse audits one page per run, in groups for performance, accessibility, best practices, SEO and, more recently, agentic browsing, which includes an llms.txt check. Its SEO group covers the basics. The CLI measures Core Web Vitals too, then adds crawlability, structured data, redirects, hreflang, security headers, E-E-A-T signals and AI-crawler access, across a crawl.
Lighthouse
SEOmator CLI
Free audit tool
Runs in
DevTools, CLI, PSI
Terminal, CI, agent
Browser
Pages per run
1
1, or a crawl
1
Checks
5 audit groups
365 rules
172 checks
llms.txt check
Yes
Yes
Yes
Diff two runs
No
Yes
No
Reports
HTML, JSON
5 formats
Web, PDF
Cost
Free
Free, MIT
Free
I use Lighthouse and the CLI side by side. Lighthouse's trace view is still where I go when one page is slow. The CLI is what I script, because it covers the crawl, structured-data and AI-crawler checks Lighthouse doesn't, and it remembers the last run.
🧪Not technical? Use the free toolNo install, no command line. Paste a URL, read every check in plain words, and hand the PDF to your developer.
📈Want more detail? Use the platformFull-site crawls on a schedule, history across deploys, fixes weighted by your Search Console clicks, and an agent that does approved work.
If you're an SEO who'd rather not open a terminal, start with our free SEO audit tool: it runs 172 checks in the browser and exports a PDF report. If you need more than one page at a time, the SEOmator platform crawls the whole site on a schedule, keeps every audit, and ranks fixes by the pages that earn clicks in your Search Console. If you run a B2B SaaS site, book a 30-minute demo and I'll study your site before we talk. Agencies with many client sites should also read our guide to SEO audit tools for agencies.
What are the CLI's limits?
The SEOmator CLI is a lab tool, and it has a lab tool's limits. Here's where I'd be careful.
Lab vitals aren't field data. The CLI measures one desktop load on your machine. Your Search Console Core Web Vitals report reflects real users, and Google ranks on that. Our guide to fixing a failed Core Web Vitals assessment covers the field side.
The defaults are small. A plain audit is one page, and --crawl stops at 10 pages unless you raise -m. Site-wide problems need a crawl, and a crawl takes time.
Rules are thresholds, not judgment. "DOM under 800 nodes" is a sensible default, not a law. Read each finding before you fix it, as our lazy-loaded logos showed.
Rules have bugs. Two of our crawl findings were wrong. Check a surprising result by hand before you hand it to a client.
The desktop app is source-only. You build it with npm. The CLI and the skill install with no build step.
Some checks need context no tool has. The CLI can tell you an author byline is missing, not whether the author knows the subject.
For a site you can't install anything on, or a whole site crawled the way Googlebot sees it, use the hosted SEO crawler instead.
Frequently Asked Questions
Is the SEOmator SEO audit CLI free?
Yes. @seomator/seo-audit is MIT-licensed, so you can install it, run it in CI, change it and use it commercially at no cost. There's no account, API key or usage cap. The SEOmator platform is paid, but the CLI doesn't depend on it.
I'm not technical. Should I use the CLI?
No. Use the free SEO audit tool on seomator.com instead: you paste a URL, it runs 172 checks in your browser, and it exports a PDF you can send to whoever builds your site. The CLI earns its keep when you want audits in scripts, CI or an AI agent.
Does the CLI send my audit data anywhere?
The CLI fetches the site you audit and stores results locally in ~/.seomator/audits.db. The project's documentation says seomator serve binds to loopback only and makes no outbound requests. I searched the published 5.1.0 bundle: the only analytics names in it, Google Analytics and Mixpanel, are patterns the rules use to detect trackers on the page being audited.
Does the skill add anything to my agent's output?
No. The LLM report contains the audit and nothing else. In our homepage report, every mention of seomator.com was the audited URL itself, and there was no promotional footer or added instruction.
Which AI agents can use the SEO audit skill?
The skill installs with npx skills add seo-skills/seo-audit-skill and works in Claude Code and in other agents that read the same skill format, such as Cursor. Any agent that can run a shell command can also call seomator audit --format llm without the skill.
Do I need Chrome installed?
For Core Web Vitals and the JavaScript rendering rules, yes. The CLI uses the Chrome, Chromium or Edge you already have, and seomator self doctor tells you which one it found. Without a browser, run with --no-cwv; the browser-only rules then report "not measured".
How many pages can it crawl?
As many as you set with --max-pages; the default is 10. Concurrency defaults to 3 requests, and by default the crawler waits between requests and respects robots.txt, so a large crawl stays polite to the server.
Why does the README say 373 rules when the CLI says 365?
The README follows the main branch, which has eight rules that aren't in the published 5.1.0 package yet. npm install gives you 365 until the next release. seomator --help always prints the count for the version you have.
Can I turn off rules I don't care about?
Yes. List them under [rules] disable in seomator.toml, with wildcards such as legal-*, or audit only some categories with -c core,security,perf. Disabled rules drop out of the score.
How is the CLI related to the SEOmator platform?
The CLI is our audit engine as a free, standalone tool. The platform runs audits across the whole site on a schedule and adds rank and AI-visibility tracking, team history and an agent that does approved tasks. Developers can start with the CLI and non-technical SEOs with the free audit tool; when you need the whole site tracked over time, that's the platform.
Who wrote it, what changed and how to tell us about a mistake.
Written by
Emre Elbeyoglu
Founder & Head of Growth, SEOmator
16+ years in B2B SaaS SEO and growth
Emre Elbeyoglu is founder and Head of Growth at SEOmator, and the founder and director of Next Marketing Technology Ltd, the London company that has owned and operated SEOmator since 2023. Emre has worked in B2B SaaS SEO and growth marketing for more than 16 years and builds every acquisition channel on search: that approach has generated $10M+ in total revenue from organic search across Emre's products, driven 300K+ monthly organic visitors and earned 10K+ referring backlinks.
In 2013 Emre co-founded Flatart, a digital marketing agency that ran SEO and growth programs for brands including Investing.com, Rakuten and EuroDNS. That consulting work turned into products: Popupsmart, an AI-powered conversion rate optimization platform used by 600+ clients, and LiveChatAI, an AI customer support tool covered by WIRED. Emre also publishes growth marketing experiments at GrowthMarketing.ai.
Wappalyzer went closed-source in 2023. Here are the free, open-source and paid alternatives, compared on detection method, verified pricing and API access — plus how to benchmark accuracy yourself.
Seven of nine SEO audit platforms offer white-label reporting — but almost never on the plan the roundups name. We checked every vendor's published pricing on 13 September 2026: the cost to unlock white label ranges from $50 to $1,089 a month, and two popular "white-label" tools do not offer it at all.