seo-audit-skill

Из публичных источников

Комплексный инструмент командной строки для SEO-аудита с 332 правилами проверки в 20 категориях. Анализируйте любой веб-сайт на соответствие лучшим практикам SEO, Core Web Vitals, заголовкам безопасности, структурированным данным, доступности и многому другому.

Машинный перевод · Показать оригинал

A comprehensive SEO audit command-line tool with 332 audit rules across 20 categories. Analyze any website for SEO best practices, Core Web Vitals, security headers, structured data, accessibility, and more.

AI SkillКатегория: AI-навыки · Фронтенд · Маркетинг и SEO · БезопасностьOpen sourceданные проверены 15 окт. 2026 г.

Обзор

  • claude
  • claude-skills
  • seo
  • seo-audit
  • seo-audit-skill
  • website-audit

Установка

Команды только показываются, маркетплейс их не выполняет. Сверяйтесь с официальной документацией.
  • Официальный сайтИз публичных источниковиз метаданных каталога
    seomator.com/free-seo-audit-tool ↗
  • Реестр пакетов языкаnodejsИз публичных источниковиз манифеста пакета — публикация в реестре не проверена
    npm install @seomator/seo-audit

    Не проверено: перед установкой убедитесь, что пакет в реестре принадлежит этому проекту.

    www.npmjs.com/package/@seomator/seo-audit ↗
  • Сборка из исходниковИз публичных источниковиз метаданных каталога

    Сборка из исходников: проверенного рецепта сборки нет — следуйте инструкциям репозитория.

    github.com/seo-skills/seo-audit-skill ↗

Совместимость

«Неизвестно» значит, что доказательств не найдено, а не что продукт несовместим.
ПлатформаСтатусАрхитектураДоказательствоУверенность
Claude CodeНеизвестно———
Claude (web & desktop)Неизвестно———
OpenAI CodexНеизвестно———
ChatGPTНеизвестно———
CursorНеизвестно———
GitHub CopilotНеизвестно———
Gemini CLIНеизвестно———
Node.jsСовместимо—манифест пакета: package.json name0.60

Релизы

проверено 29 окт. 2026 г.
v5.0.0Последний5 сент. 2026 г.Официальный источник ↗

Файлы версии 5.0.0

К релизу не приложены файлы.

История релизов

Профиль качества

алгоритм quality-v1.0 · оценено 15 окт. 2026 г.
Оценка качества97
Оценка риска0
Уверенность 1.00
Оценка качества и оценка риска — разные показатели. Высокое качество не гарантирует безопасность.

Составляющие оценки

Поддержка · 2020
last activity 0 days ago
Документация · 1515
README 46143 chars, description present
Готовность к использованию · 1515
install instructions: yes; releases: yes
Метаданные · 1010
4/4 of description, homepage, license, topics
Релизы · 1010
3 release(s), latest 40 days ago
Точность категории · 1010
classifier confidence 0.97
Популярность · 107
587 stars (log-dampened, 10k = max)
Ясность лицензии · 55
SPDX MIT
Сообщество · 55
issues enabled, 75 forks

Лицензия

MIT
Лицензия известнапо данным хостинга репозитория

Это статус политики каталога, а не юридическое заключение.

Источники

github.com/seo-skills/seo-audit-skillОсновной★ 587 звёздактивность 15 окт. 2026 г.Основной репозиторий · Уверенность 1.00

Отзывы

Войдите, чтобы написать отзыв

Отзывов пока нет.

Альтернативы

one-skill-to-rule-them-allПохожий
Метанавык, который создаёт и совершенствует все ваши навыки, включая самого себя. Наблюдает за рабочими сессиями (автономными или под руководством человека), фиксирует паттерны, исправления и решения по суждению и превращает их в улучшения навыков и кандидатов в новые навыки для вашей проверки. Практическое применение AugmentedCC-BY-4.0 · AI-навыки
marketingskillsПохожий
Маркетинговые навыки для Claude Code и ИИ-агентов. Оптимизация конверсии (CRO), копирайтинг, SEO, аналитика и инжиниринг роста.MIT · AI-навыки
scientific-agent-skillsПохожий
Превратите любого ИИ-агента в ИИ-учёного. Самая популярная библиотека навыков агентов для науки, которой пользуются более 250 000 учёных по всему миру. 177 готовых проверенных навыков и более 100 научных баз данных по биологии, химии, медицине и разработке лекарств. Совместима с Cursor, Claude Code, Codex, Pi, AntigravMIT · AI-навыки
planning-with-filesПохожий
Постоянное файловое планирование для ИИ-агентов программирования и длительных задач. Устойчивые к сбоям markdown-планы, восстановление сессии после /clear и компактации, повторная подача плана на каждом шаге против деградации контекста, детерминированный шлюз завершения. В стиле Manus. Установка из npm, маркетплейса плагинов Claude Code или через npx skMIT · AI-навыки
AI-Research-SKILLsПохожий
Комплексная библиотека с открытым исходным кодом, содержащая навыки для AI-исследований и инженерии, подходящие для любой AI-модели. Установите навыки, и ваш агент Claude Code/Codex/Gemini станет AI-исследовательским агентом в полную силу. Поддерживается Orchestra Research.MIT · AI-навыки
fire-your-seo-agencyПохожий
Уволите своё SEO·GEO-агентство 🔥 Навык Claude Code, который самостоятельно проводит аудит и оптимизацию SEO·AEO·GEO·LLMO·NEO(Naver) — заменяет агентства «оптимизации для AI-поиска», которые берут 500 000–3 500 000 вон в месяц, работает на AI-агентахMIT · AI-навыки

README

Из seo-skills/seo-audit-skill · лицензия MIT · загружено 29 окт. 2026 г.

SEOmator SEO Audit Tool & Skill

[npm version] [npm downloads] [node] [license: MIT]

SEOmator is a comprehensive SEO audit tool that scans any website against 373 rules across 20 categories — technical SEO, Core Web Vitals, structured data, accessibility, security headers, and AI/GEO search readiness — and returns a prioritized, actionable report. It ships as a command-line tool, an Electron desktop app, and a Claude Code skill, so you can run an SEO audit from a terminal, a visual dashboard, or directly inside an AI coding agent.

Prefer a web interface? Try our Free SEO Audit Tool for a visual, browser-based SEO analysis.

Contents

  • Features
  • Installation
  • Desktop App
  • Quick Start (CLI)
  • Commands
  • Categories & Rules
  • Configuration
  • Output Formats
  • CI/CD Integration
  • Programmatic Usage
  • Claude Code Skill
  • FAQ
  • Requirements

Features

  • 373 SEO Audit Rules across 20 categories
  • Desktop App - Visual audit dashboard with real-time progress, interactive results, score history, and light/dark theme
  • CLI Tool - Single page & crawl mode with 5 output formats
  • Core Web Vitals - LCP, CLS, FCP, TTFB, INP measurement via Playwright
  • JavaScript Rendering Analysis - Compare raw vs rendered DOM for SPA/CSR sites
  • Per-Asset Checks - Cache policy, text compression, image sizing, and redirect chains for every subresource loaded during render
  • 5 Output Formats - Console, JSON, HTML, Markdown, and LLM-optimized XML
  • Actionable Reports - Every rule ships a specific fix suggestion; unmeasurable checks report as "not measured" instead of fake passes
  • AI/GEO Readiness - Check semantic HTML, AI bot access, and llms.txt
  • Redirect Chain Detection - Loops, broken redirects, meta/JS redirects
  • HTML Validation - Doctype, charset, head structure, lorem ipsum detection
  • Cross-Page Analysis - Sitemap URLs cross-checked against status/canonical/robots.txt, canonical chains & loops, hreflang target validation and reciprocity, duplicate content & H1s, orphan & isolated pages, inbound link quality
  • Concurrent Crawling - Fast multi-page audits with configurable concurrency
  • SQLite Storage - Persistent crawl data with compression and audit history
  • CI/CD Ready - Exit codes, JSON output, GitHub Actions & GitLab CI examples
  • TOML Configuration - Project-level settings with presets and inheritance

Installation

From npm (recommended)

# Install globally
npm install -g @seomator/seo-audit

# Run audit
seomator audit https://example.com

Note: The CLI automatically uses your system Chrome, Chromium, or Edge browser for Core Web Vitals measurement. No additional browser installation is required if you have Chrome installed.

From source

git clone https://github.com/seo-skills/seo-audit-skill.git
cd seo-audit-skill
npm install
npm run build

# Run directly
./dist/cli.js audit https://example.com

# Or link globally
npm link
seomator audit https://example.com

Desktop App

The desktop app provides a visual audit dashboard with real-time progress streaming, interactive results, score history, and light/dark theme support.

Running

# From source
git clone https://github.com/seo-skills/seo-audit-skill.git
cd seo-audit-skill
npm install
npm run rebuild:electron   # Compile native module for Electron
npm run electron:dev                          # Launch with hot reload

Building

npm run electron:build    # Production build
npm run electron:pack     # Build + package distributable

Desktop App Features

  • Real-time progress - Live category-by-category progress as the audit runs
  • Score dashboard - Overall score circle, category grid, and issues summary table
  • Interactive results - Expandable rule cards with rule descriptions, affected items, page URL badges, and inline fix suggestions
  • Filter & navigate - Filter by status (All/Failures/Warnings/Passed), click issues to jump to details
  • Score history - Track audit scores over time per domain with trend charts
  • Light/dark theme - Follows your system preference or toggle manually

Quick Start (CLI)

# Basic audit
seomator audit https://example.com

# Skip Core Web Vitals (faster)
seomator audit https://example.com --no-cwv

# Audit specific categories
seomator audit https://example.com -c core,security,perf

# JSON output (for CI/CD or parsing)
seomator audit https://example.com --format json

# HTML report
seomator audit https://example.com --format html -o report.html

# LLM-optimized output (pipe to Claude)
seomator audit https://example.com --format llm --no-cwv | claude "analyze and prioritize fixes"

# Crawl multiple pages
seomator audit https://example.com --crawl --max-pages 20

# Full options
seomator audit https://example.com --crawl -m 50 --concurrency 5 --timeout 60000 --format json -o results.json

Commands

seomator audit <url>

Run SEO audit on a URL.

OptionAliasDescriptionDefault
--format <type>-fOutput format: console, json, html, markdown, llmconsole
--output <path>-oOutput file path-
--categories <list>-cComma-separated categories to auditAll
--json-jOutput as JSON (deprecated, use --format json)false
--crawl-Enable crawl mode for multiple pagesfalse
--max-pages <n>-mMaximum pages to crawl10
--concurrency <n>-Concurrent requests3
--timeout <ms>-Request timeout in milliseconds30000
--no-cwv-Skip Core Web Vitals measurementfalse
--mobile-Second render at a mobile viewport + mobile-first parity checks (single-page)false
--simulate-interaction-Scroll and click the page so INP can be measured (reported as synthetic, unscored)false
--staging-Audit a staging site: waive the noindex and robots.txt caps, and crawl past robots.txtfalse
--verbose-vShow progressfalse
--config <path>-Config file path-
--no-save-Do not store this audit in your history-
--json-report-Also write the legacy JSON report to .seomator/reports/false

Audits are stored in ~/.seomator/audits.db by default, which is what seomator report, seomator compare and the desktop app read. Set SEOMATOR_HOME to keep that data elsewhere, or [output] save = false in seomator.toml to opt a project out.

seomator serve

Run the local dashboard: every audit you have run, in your browser.

seomator serve                   # opens http://127.0.0.1:7360
seomator serve --port 0          # pick a free port
seomator serve --no-open         # do not open a browser

It reads the same ~/.seomator/audits.db the CLI writes, binds to loopback only, and makes no outbound requests. Every /api request needs the per-launch token, which is printed once and written to ~/.seomator/serve.json for agents:

TOKEN=$(jq -r .token ~/.seomator/serve.json)
curl -s -H "X-SEOmator-Token: $TOKEN" http://127.0.0.1:7360/api/audits | jq

Full reference: docs/WEB-DASHBOARD.md.

seomator init

Create a seomator.toml config file.

seomator init                    # Interactive setup
seomator init -y                 # Use defaults
seomator init --preset blog      # Blog preset
seomator init --preset ecommerce # E-commerce preset
seomator init --preset ci        # Minimal CI config

seomator crawl <url>

Crawl website without running analysis. Saves data for later analysis with seomator analyze.

seomator crawl https://example.com -m 20

seomator analyze [crawl-id]

Run rules on stored crawl data.

seomator analyze                           # Analyze latest crawl
seomator analyze --latest                  # Stored in your history by default
seomator analyze 2026-01-23-abc123         # Specific crawl

seomator report [query]

View and query past audits. Reads your history, falling back to the legacy JSON reports under .seomator/reports/.

seomator report --list                     # List stored audits
seomator report --project mysite           # Filter by project
seomator report 2026-09-02-a1b2c3          # Show one audit

seomator compare [domain]

Compare the latest audit of a site against a previous one, so you can see what a deploy changed. Requires at least two stored audits of the same domain.

seomator audit https://example.com           # run before the deploy
seomator audit https://example.com           # run after

seomator compare example.com                 # diff the two most recent runs
seomator compare example.com --trend         # score history for the domain
seomator compare example.com --against 2026-08-31-a1b2c3
seomator compare example.com --json          # machine-readable diff
seomator compare example.com --fail-on-regression   # exit 1 if worse (for CI)

Rules are diffed by ID, so a rule that broke and a different one that got fixed are reported separately rather than cancelling out in a count.

seomator config [key] [value]

View or modify configuration.

seomator config --list                     # Show all config
seomator config crawler.max_pages 50       # Set value
seomator config validate                   # Validate config

seomator db

Database management.

seomator db migrate              # Migrate JSON to SQLite
seomator db migrate --dry-run    # Preview migration
seomator db stats -v             # Database statistics
seomator db restore              # Rollback migration

seomator self doctor

Check system setup and dependencies.

seomator self doctor -v          # Verbose diagnostics

Exit Codes

CodeMeaning
0Audit passed (score >= 70)
1Audit failed (score < 70)
2Error occurred

A page that cannot rank fails whatever its other checks score. In a single-page audit, the overall score is capped while a page-level condition holds: noindex or a robots.txt block (20), an empty page (30), fewer than 20 words of main content (49), no <title> (69). A crawl takes the noindex and robots.txt caps of its start page, so a site blocked everywhere fails. The report prints the cap under the score, and JSON keeps the uncapped average in scoreCap.uncappedScore.

A staging site is blocked on purpose: audit it with --staging. That waives the noindex and robots.txt caps, crawls past robots.txt, and lists what it waived as the launch checklist.

Categories & Rules (373 total)

Core (24 rules) - 11% weight

RuleDescription
core-title-present<title> tag exists
core-title-lengthTitle should be 30-60 characters
core-description-presentMeta description exists
core-description-lengthDescription should be 120-160 characters
core-canonical-presentCanonical URL exists
core-canonical-validCanonical URL is valid absolute URL
core-viewport-presentViewport meta tag exists
core-favicon-presentFavicon link exists
core-h1-presentAt least one H1 exists
core-h1-singleOnly one H1 exists
core-canonical-headerHTML canonical and Link header match
core-nosnippetDetects nosnippet/max-snippet:0 directives
core-robots-metaChecks noindex/nofollow directives
core-title-uniqueTitles should be unique site-wide
core-canonical-conflictingHTML and header canonicals should not conflict
core-canonical-to-homepageCanonical should not always point to homepage
core-canonical-http-mismatchCanonical protocol should match page protocol
core-canonical-loopDetects circular canonical chains
core-canonical-to-noindexA noindexed page should not also canonicalize to a different URL
core-canonical-outside-headNo canonical element outside the <head>
core-canonical-attributesCanonical elements carry only rel and href attributes
core-canonical-multipleMultiple canonical elements should agree
core-canonical-externalCanonical pointing to a different host (worth verifying)
core-robots-directive-mismatchRobots directives in meta tags and X-Robots-Tag header should be consistent

Performance (28 rules) - 10% weight

RuleDescription
cwv-lcpLargest Contentful Paint (<2.5s pass, >4s fail)
cwv-clsCumulative Layout Shift (<0.1 pass, >0.25 fail)
cwv-inpInteraction to Next Paint (<200ms pass, >500ms fail)
cwv-ttfbTime to First Byte (<800ms pass, >1800ms fail)
cwv-fcpFirst Contentful Paint (<1.8s pass, >3s fail)
perf-dom-sizeDOM under 800 nodes passes; over 1500 nodes fails
perf-css-file-sizeCSS files should be reasonably sized
perf-font-loadingFont-display: swap should be used
perf-preconnectPreconnect hints for third-party origins
perf-render-blockingScripts should use async/defer
perf-lazy-above-foldAbove-fold images should not be lazy-loaded
perf-lcp-hintsLCP element should be preloaded
perf-text-compressionResponses should use gzip/Brotli compression
perf-brotliPrefer Brotli over gzip for better compression
perf-cache-policyStatic assets should have cache headers
perf-minify-cssCSS should be minified
perf-minify-jsJavaScript should be minified
perf-response-timeResponse time under 500ms passes; over 1000ms warns
perf-http2Site should serve over HTTP/2
perf-page-weightHTML document under 100KB passes; over 300KB warns
perf-js-file-sizeTotal inline JavaScript under 50KB passes; over 150KB warns
perf-video-for-animationsUse <video> instead of animated GIFs
perf-asset-compressionText assets >2KB should be gzip/Brotli compressed (requires render)
perf-asset-cache-policyStatic assets should have cache max-age of at least 1 hour (requires render)
perf-legacy-javascriptNo polyfills modern browsers do not need
perf-duplicate-jsA known library is not loaded from more than one script URL
perf-source-mapsNo sourceMappingURL comment or SourceMap header
perf-image-encodingImages should be <100KB and not legacy BMP/TIFF (requires render)

Links (27 rules) - 8% weight

RuleDescription
links-broken-internalInternal links should return 200
links-external-validExternal links should be reachable
links-internal-presentPage should have internal links
links-nofollow-appropriatenofollow used appropriately
links-anchor-textAnchor text should be descriptive
links-depthClick distance from the entry point ≤3 (requires --crawl)
links-dead-end-pagesPages should have outgoing internal links
links-https-downgradeHTTPS pages should not link to HTTP
links-external-countWarn if >100 external links
links-invalidNo empty, javascript:, or malformed hrefs
links-tel-mailtoValid tel: and mailto: link formats
links-redirect-chainsLinks should not go through redirects
links-orphan-pagesPages have enough inbound internal links (requires --crawl)
links-localhostNo localhost/127.0.0.1 URLs in production
links-local-fileNo file:// protocol links
links-broken-fragmentFragment links should match element IDs
links-excessiveLimit internal links per page
links-onclickNo onclick-based navigation instead of <a> tags
links-whitespace-hrefNo whitespace in href attributes
links-non-http-protocolNo anchor links with non-HTTP protocols (ftp:, intent:)
links-inbound-all-nofollowAll inbound internal links nofollow, so no link equity (requires --crawl)
links-inbound-mixed-followMixed followed/nofollowed inbound links (requires --crawl)
links-inbound-low-qualityNo inbound internal link passes link equity (requires --crawl)
links-inbound-anchor-textAll followed inbound links use generic anchor text (requires --crawl)
links-nofollow-internalSame-host links should not carry rel=nofollow
links-weak-inboundA non-entry page has more than one dofollow inbound link (requires --crawl)
links-chrome-inboundAt least one inbound link sits outside the nav, header, and footer (requires --crawl)

Images (14 rules) - 8% weight

RuleDescription
images-alt-presentAll images should have alt attribute
images-alt-qualityAlt text should be descriptive
images-dimensionsImages should have width/height
images-lazy-loadingBelow-fold images should use lazy loading
images-modern-formatUse WebP/AVIF formats
images-sizeImages should be <200KB
images-responsiveUse srcset for responsive images
images-brokenImages should not return 404
images-figure-captionsFigure elements should have figcaption
images-filename-qualityUse descriptive filenames
images-inline-svg-sizeInline SVGs should be <5KB
images-picture-elementPicture elements must have img fallback
images-alt-lengthAlt text should be under 125 characters
images-background-seoContent images should use <img>, not CSS background

Security (26 rules) - 8% weight

RuleDescription
security-httpsSite should use HTTPS
security-https-redirectHTTP should redirect to HTTPS
security-hstsStrict-Transport-Security header
security-cspContent-Security-Policy header
security-x-frame-optionsX-Frame-Options header
security-x-content-type-optionsX-Content-Type-Options: nosniff
security-external-linksExternal target="_blank" links have noopener/noreferrer
security-form-httpsForm actions use HTTPS
security-mixed-contentNo HTTP resources on HTTPS pages
security-permissions-policyPermissions-Policy header present
security-referrer-policyReferrer-Policy header present
security-leaked-secretsNo exposed API keys or credentials
security-password-httpLogin forms served over HTTPS only
security-protocol-relativeNo protocol-relative URLs (//example.com)
security-ssl-expirySSL certificate not near expiration
security-ssl-protocolTLS 1.2+ required; no TLS 1.0/1.1
security-cookie-flagsSession cookies set Secure, HttpOnly and SameSite
security-cookie-lifetimeCookies stay within the 400-day browser cap
security-coopCross-Origin-Opener-Policy header isolates the page
security-csp-xssCSP should actually constrain script execution
security-info-disclosureHeaders should not advertise server software/version
security-paste-blockingInput fields should not prevent pasting
security-trusted-typesCSP should require Trusted Types for DOM XSS sinks
security-sriCross-origin scripts and stylesheets set an integrity hash
security-obfuscated-scriptNo long high-entropy inline script calls eval, Function, or atob
security-brand-impersonationBrand sign-in links point at the brand or this host

Technical SEO (18 rules) - 7% weight

RuleDescription
technical-robots-txt-existsrobots.txt should return 200
technical-robots-txt-validrobots.txt should have valid syntax
technical-sitemap-existssitemap.xml should exist
technical-sitemap-validSitemap should have valid XML structure
technical-url-structureURL should use hyphens, lowercase
technical-trailing-slashConsistent trailing slash usage
technical-www-redirectwww/non-www should redirect to one version
technical-404-pageCustom 404 page should exist
technical-soft-404Soft 404 pages should return proper 404 status
technical-server-errorNo 5xx server errors
technical-4xx-non-404No 400, 403, 410 client errors
technical-timeoutPages should respond within timeout
technical-bad-content-typeContent-Type header matches actual content
technical-empty-htmlPage should return meaningful, non-empty HTML
technical-form-get-methodForms should not submit with the GET method
technical-duplicate-gtmNo multiple Google Tag Manager containers
technical-duplicate-gaNo multiple Google Analytics property IDs
technical-consent-modeA Google tag is paired with a consent update

Crawlability (38 rules) - 5% weight

RuleDescription
crawl-schema-noindex-conflictSchema.org and noindex should not conflict
crawl-pagination-canonicalPaginated pages should self-canonicalize
crawl-sitemap-domainSitemap URLs should match host domain
crawl-noindex-in-sitemapNoindexed pages should not be in sitemap
crawl-indexability-conflictrobots.txt and noindex should not both block
crawl-canonical-redirectCanonical should not point through redirects
crawl-sitemap-url-limitSitemap should have <50,000 URLs
crawl-sitemap-size-limitSitemap should be <50MB
crawl-sitemap-duplicate-urlsNo duplicate URLs in sitemap
crawl-sitemap-orphan-urlsSitemap URLs should be linked internally
crawl-blocked-resourcesCritical resources not blocked by robots.txt
crawl-crawl-delayExcessive Crawl-delay slows indexing
crawl-sitemap-in-robotstxtrobots.txt should reference sitemap
crawl-pagination-brokenPagination links should not be broken
crawl-pagination-loopNo circular pagination chains
crawl-pagination-sequenceNo gaps in pagination sequence
crawl-pagination-noindexPaginated pages should not be noindexed
crawl-pagination-orphanedPaginated pages should be linked from content
crawl-sitemap-lastmodSitemap lastmod values are valid, not future-dated, and not bulk-identical
crawl-blocked-imagesImage URLs should not be disallowed by robots.txt
crawl-pagination-isolatedPaginated URLs should have incoming internal links (requires --crawl)
crawl-sitemap-non-200Sitemap URLs should return 200 when crawled (requires --crawl)
crawl-sitemap-non-canonicalSitemap URLs should not canonicalize to a different URL (requires --crawl)
crawl-sitemap-disallowedSitemap URLs should not be disallowed by robots.txt (requires --crawl)
crawl-sitemap-cross-duplicatesURLs should not be declared by multiple sitemaps (requires --crawl)
crawl-canonical-to-noindexCanonical target should not itself be noindex (requires --crawl)
crawl-canonical-to-disallowedCanonical target should not be disallowed by robots.txt (requires --crawl)
crawl-canonical-chainCanonical target should not canonicalize elsewhere (requires --crawl)
crawl-canonical-loopCanonical targets should not form a loop (requires --crawl)
crawl-hreflang-to-noindexHreflang should not point to noindex URLs (requires --crawl)
crawl-hreflang-to-disallowedHreflang should not point to robots.txt-disallowed URLs (requires --crawl)
crawl-hreflang-disallowed-targetDisallowed pages should not receive hreflang annotations (requires --crawl)
crawl-hreflang-incoming-conflictIncoming hreflang annotations should not conflict (requires --crawl)
crawl-hreflang-reciprocityHreflang targets should annotate this page in return (requires --crawl)
crawl-isolated-urlPage should be reachable via ordinary internal links (requires --crawl)
crawl-canonical-form-driftCanonicals agree on www, scheme, and trailing slash (requires --crawl)
crawl-sitemap-date-driftSitemap lastmod and schema dateModified fall on the same day
crawl-pdf-sizeLinked PDF files are at most 10 MB

Structured Data (19 rules) - 5% weight

RuleDescription
schema-presentJSON-LD or microdata should exist
schema-validJSON-LD should be valid JSON
schema-type@type field should be present
schema-required-fieldsRequired fields for schema type
schema-articleValidates Article schema properties
schema-breadcrumbChecks BreadcrumbList on non-homepage
schema-faqValidates FAQPage schema structure
schema-local-businessValidates LocalBusiness for local SEO
schema-organizationValidates Organization schema
schema-productValidates Product schema for e-commerce
schema-reviewValidates Review/AggregateRating schema
schema-videoValidates VideoObject schema
schema-website-searchChecks WebSite sitelinks searchbox
schema-entity-idOrganization, WebSite, Person, and Business entities use an absolute @id
schema-rating-scopeAggregateRating stays on the page it describes, and ratingValue is visible
schema-entity-conflictOne absolute @id does not carry two logos or two phone numbers (requires --crawl)
schema-entity-danglingpublisher, author, and isPartOf @ids are declared in the crawl (requires --crawl)
schema-entity-type-driftOne absolute @id keeps the same @type (requires --crawl)
schema-entity-splitOne organization or person name is not published under two absolute @ids (requires --crawl)

JavaScript Rendering (16 rules) - 5% weight

RuleDescription
js-rendered-titleTitle present in rendered DOM
js-rendered-descriptionMeta description present in rendered DOM
js-rendered-h1H1 present in rendered DOM
js-rendered-canonicalCanonical present in rendered DOM
js-canonical-mismatchCanonical matches between raw and rendered HTML
js-noindex-mismatchNoindex consistent between raw and rendered HTML
js-title-modifiedTitle not changed by JavaScript
js-description-modifiedDescription not changed by JavaScript
js-h1-modifiedH1 not changed by JavaScript
js-rendered-contentMain content present without JavaScript dependency
js-rendered-linksNavigation links present without JavaScript
js-blocked-resourcesCritical JS not blocked by robots.txt
js-ssr-checkServer-side rendering detected
js-console-errorsNo uncaught JavaScript exceptions or console errors while rendering
js-failed-requestsScripts, stylesheets and other subresources load successfully
js-document-writeInline scripts should not use document.write()

Accessibility (36 rules) - 7% weight

RuleDescription
a11y-aria-labelsInteractive elements have accessible names
a11y-color-contrastColor contrast issues detected
a11y-focus-visibleFocus indicator styles present
a11y-form-labelsForm inputs have associated labels
a11y-heading-orderHeading levels don't skip
a11y-landmark-regionsProper landmark regions (main, nav, footer)
a11y-link-textDescriptive link text (no "click here")
a11y-skip-linkSkip-to-content link for keyboard navigation
a11y-table-headersData tables have proper headers
a11y-touch-targetsMinimum 44x44px touch target sizing
a11y-video-captionsVideos have captions or transcripts
a11y-zoom-disabledViewport doesn't disable user zoom
a11y-iframe-titleIframes and frames have title attributes
a11y-object-alt<object> elements provide a text alternative
a11y-empty-headingNo empty or inaccessible headings
a11y-input-image-altImage inputs have alt text
a11y-main-landmarkExactly one <main> landmark
a11y-list-structureLists contain only list items
a11y-duplicate-idNo duplicate element IDs
a11y-tabindex-positiveNo tabindex greater than 0
a11y-accesskey-uniqueNo duplicate accesskey values
a11y-form-multiple-labelsForm controls have at most one label
a11y-aria-validARIA roles and attributes are valid
a11y-aria-hidden-focusablearia-hidden not on body or focusable elements
a11y-svg-img-altSVGs with img role have accessible names
a11y-presentation-role-conflictrole="none"/"presentation" not negated by ARIA
a11y-valid-lang-elementElement lang attributes are valid BCP 47 tags
a11y-redundant-altAlt text doesn't duplicate adjacent text
a11y-table-captionData tables use <caption>
a11y-identical-links-purposeSame link text should point to same destination
a11y-label-name-mismatcharia-label should contain the visible text
a11y-button-nameButtons and role=button controls have an accessible name
a11y-autocompleteEmail and tel inputs set the matching autocomplete token
a11y-xml-lang-mismatchlang and xml:lang on html name the same language
a11y-aria-hidden-bodyhtml and body are not aria-hidden
a11y-aria-requiredExplicit ARIA widget roles have their required parent and child roles

Content (27 rules) - 5% weight

RuleDescription
content-word-countPage should have 300+ words
content-reading-levelFlesch-Kincaid reading level check
content-keyword-stuffingDetects excessive keyword repetition
content-article-linksChecks link-to-content ratio
content-broken-htmlDetects malformed HTML structure
content-meta-in-bodyMeta tags should be in head
content-mime-typeValidates Content-Type header
content-duplicate-descriptionDescriptions should be unique site-wide
content-heading-hierarchyProper heading hierarchy (H1>H2>H3)
content-heading-lengthHeadings should be 10-70 characters
content-heading-uniqueHeadings should be unique
content-text-html-ratioText-to-HTML ratio should be >10%
content-title-same-as-h1Title and H1 should differ
content-title-same-as-descriptionTitle and meta description should differ
content-title-pixel-widthTitle pixel width for SERP display (<580px)
content-description-pixel-widthDescription pixel width for SERP (<920px)
content-duplicate-exactDetects exact duplicate content across pages
content-duplicate-nearDetects near-duplicate content via simhash
content-duplicate-h1H1 text should be unique across crawled pages (requires --crawl)
content-mojibakeVisible text is not UTF-8 decoded as Latin-1 or Windows-1252
content-unrendered-markupNo literal Markdown such as bold outside code
content-placeholder-textNo unrendered template syntax or TODO/FIXME notes
content-stale-copyrightFooter copyright year is the current year
content-date-agreementdatePublished, time datetime, and a URL year agree
content-hidden-textNo long text hidden with an inline style
content-thin-vs-siteA page is not far shorter than the median page of the same kind (requires --crawl)
content-title-patternThe title keeps the suffix most of the site uses (requires --crawl)

Social (9 rules) - 3% weight

RuleDescription
social-og-titleog:title meta tag
social-og-descriptionog:description meta tag
social-og-imageog:image with valid URL
social-og-image-sizeog:image dimensions (1200x630)
social-twitter-cardtwitter:card meta tag
social-og-urlog:url meta tag
social-og-url-canonicalog:url matches canonical
social-share-buttonsSocial share buttons present
social-profilesSocial profile links present

E-E-A-T (16 rules) - 3% weight

RuleDescription
eeat-about-pageAbout page exists
eeat-affiliate-disclosureAffiliate links have disclosure
eeat-author-bylineAuthor attribution present
eeat-author-expertiseAuthor credentials/bio present
eeat-citationsLinks to authoritative sources
eeat-contact-pageContact page exists
eeat-content-datesPublication/modification dates present
eeat-disclaimersYMYL content has disclaimers
eeat-editorial-policyEditorial policy page exists
eeat-physical-addressBusiness address present
eeat-privacy-policyPrivacy policy link present
eeat-terms-of-serviceTerms of service link present
eeat-trust-signalsTrust badges, reviews, certifications
eeat-ymyl-detectionYMYL content detection
eeat-geo-metaPages with local-business schema also set a geo meta tag
eeat-nap-consistencyOne organization name keeps a single phone and address (requires --crawl)

URL Structure (14 rules) - 3% weight

RuleDescription
url-slug-keywordsURL slug contains keywords
url-stop-wordsURL should not have stop words
url-uppercaseURLs should be lowercase
url-underscoresUse hyphens, not underscores
url-double-slashNo consecutive slashes in path
url-spacesNo spaces in URL
url-non-asciiNo non-ASCII characters in URL
url-lengthURL should be under 2048 characters
url-repetitive-pathNo repetitive path segments
url-parametersExcessive query parameters
url-session-idsNo session IDs in URL
url-tracking-paramsTracking parameters should use canonical
url-internal-searchInternal search URLs should be noindexed
url-http-https-duplicateHTTP/HTTPS versions should canonicalize

Redirects (11 rules) - 3% weight

RuleDescription
redirect-meta-refreshNo <meta http-equiv="refresh"> redirects
redirect-javascriptNo JavaScript-based redirects
redirect-http-refreshNo HTTP Refresh header redirects
redirect-loopNo circular redirect chains
redirect-typePrefer 301 over 302 for permanent moves
redirect-brokenRedirects should not lead to errors
redirect-resourceNo redirects on CSS/JS/image resources
redirect-case-normalizationRedirect uppercase URLs to lowercase
redirect-resource-brokenRedirected resources should not resolve to 4xx/5xx (requires render)
redirect-resource-loopResources should not be caught in redirect loops (requires render)
redirect-resource-chainResources should not go through multi-hop redirect chains (requires render)

Mobile (12 rules) - 2% weight

RuleDescription
mobile-font-sizeMinimum 16px body text
mobile-horizontal-scrollNo horizontal scrolling
mobile-interstitialsNo intrusive interstitials
mobile-viewport-widthNo fixed viewport width
mobile-multiple-viewportsSingle viewport meta tag
mobile-image-mapsNo <map>/<area> image maps
mobile-viewport-contentViewport directives: width, initial-scale, no minimum-scale
mobile-parity-contentMobile render carries as much content as desktop (--mobile)
mobile-parity-titleTitle and meta description match mobile vs desktop (--mobile)
mobile-parity-canonicalCanonical matches mobile vs desktop (--mobile)
mobile-parity-structured-dataJSON-LD present on mobile as on desktop (--mobile)
mobile-parity-linksComparable internal link count mobile vs desktop (--mobile)

Internationalization (13 rules) - 2% weight

RuleDescription
i18n-lang-attributeHTML lang attribute present
i18n-hreflangHreflang tags for multilingual sites
i18n-hreflang-return-linksHreflang targets link back to source
i18n-hreflang-to-noindexHreflang should not point to noindexed pages
i18n-hreflang-to-non-canonicalHreflang should point to canonical URLs
i18n-hreflang-to-brokenHreflang should not point to broken URLs
i18n-hreflang-to-redirectHreflang should not point through redirects
i18n-hreflang-conflictingNo duplicate hreflang for same language
i18n-hreflang-lang-mismatchPage language matches hreflang code
i18n-hreflang-multiple-methodsUse single hreflang method
i18n-hreflang-relative-urlHreflang annotations should use absolute URLs
i18n-hreflang-x-defaultLanguage annotation targets same URL as x-default (insight)
i18n-hreflang-incoming-invalidIncoming hreflang annotations use valid language codes (requires --crawl)

HTML Validation (11 rules) - 2% weight

RuleDescription
htmlval-missing-doctype<!DOCTYPE html> must be present
htmlval-missing-charset<meta charset> must be in head
htmlval-invalid-headOnly metadata elements in <head>
htmlval-noscript-in-head<noscript> in <head> contains only link, style, and meta
htmlval-multiple-headsSingle <head> element only
htmlval-size-limitHTML under 250KB passes; over 500KB fails
htmlval-lorem-ipsumNo placeholder lorem ipsum text
htmlval-multiple-titlesSingle <title> tag only
htmlval-multiple-descriptionsSingle meta description only
htmlval-title-outside-headNo <title> element outside of <head>
htmlval-base-urlAt most one <base> element with a valid href

AI/GEO Readiness (13 rules) - 2% weight

RuleDescription
geo-semantic-htmlUses semantic HTML elements
geo-content-structureProper heading hierarchy and lists
geo-ai-bot-accessCitation crawlers stay allowed; training crawlers such as GPTBot are reported and not penalised
geo-llms-txt/llms.txt file for AI discovery
geo-schema-driftJSON-LD matches visible content
geo-content-signalsContent-Signal in robots.txt is valid and consistent
geo-noai-signalsReports noai and noimageai without penalising them
geo-agents-mdAGENTS.md exists and is not an HTML fallback
geo-well-knownAn MCP or agent-card manifest exists under .well-known
geo-rsl-licenseA robots.txt License URL resolves to a license document
geo-markdown-responseThe origin serves a Markdown representation of /
geo-markdown-pageA non-root URL has a Markdown representation
geo-pay-per-crawlAn HTTP 402 response includes payment terms

Legal Compliance (1 rule) - 1% weight

RuleDescription
legal-cookie-consentCookie consent banner present

Configuration

Create a seomator.toml config file with seomator init:

[project]
name = "my-website"
domains = ["example.com", "www.example.com"]

[crawler]
max_pages = 100
concurrency = 3
timeout_ms = 30000
respect_robots = true
delay_ms = 100
include = []
exclude = ["/admin/**", "/api/**"]
drop_query_prefixes = ["utm_", "gclid", "fbclid"]

[rules]
enable = ["*"]
disable = ["perf-inp"]  # Supports wildcards: "core-*"

[output]
format = "console"  # console, json, html, markdown, llm

Config priority (highest to lowest):

  1. CLI arguments
  2. Local ./seomator.toml
  3. Parent directory configs
  4. Global ~/.seomator/config.toml
  5. Built-in defaults

Output Formats

FormatFlagBest For
Console--format consoleHuman terminal output (default)
JSON--format jsonCI/CD, programmatic processing
HTML--format htmlStandalone reports, sharing
Markdown--format markdownDocumentation, GitHub
LLM--format llmAI agents, piping to Claude

Terminal Output

╔══════════════════════════════════════════════════════════════╗
║  SEOmator Audit Report                                      ║
╚══════════════════════════════════════════════════════════════╝

URL:       https://example.com
Score:     88/100  [A]

┌──────────────────────────┬───────┬────────┬──────────┬────────┐
│ Category                 │ Score │ Passed │ Warnings │ Failed │
├──────────────────────────┼───────┼────────┼──────────┼────────┤
│ Core                     │ 97    │ 18     │ 1        │ 0      │
│ Performance              │ 85    │ 18     │ 3        │ 1      │
│ JavaScript Rendering     │ 100   │ 13     │ 0        │ 0      │
│ ...                      │       │        │          │        │
└──────────────────────────┴───────┴────────┴──────────┴────────┘

JSON Output

{
  "url": "https://example.com",
  "overallScore": 88,
  "categoryResults": [
    {
      "categoryId": "core",
      "score": 97,
      "passCount": 18,
      "warnCount": 1,
      "failCount": 0,
      "results": [...]
    }
  ],
  "timestamp": "2026-01-23T16:00:00.000Z",
  "crawledPages": 1
}

CI/CD Integration

GitHub Actions

name: SEO Audit

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  audit:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'

      - name: Install SEOmator
        run: npm install -g @seomator/seo-audit

      - name: Install Playwright browsers
        run: npx playwright install chromium

      - name: Run SEO Audit
        run: seomator audit https://your-staging-url.com --format json -o seo-report.json

      - name: Upload Report
        uses: actions/upload-artifact@v4
        with:
          name: seo-report
          path: seo-report.json

GitLab CI

seo-audit:
  image: node:20
  script:
    - npm install -g @seomator/seo-audit
    - npx playwright install chromium
    - seomator audit https://your-staging-url.com --format json -o seo-report.json
  artifacts:
    paths:
      - seo-report.json

Programmatic Usage

import { Auditor, createAuditor } from '@seomator/seo-audit';

const auditor = createAuditor({
  categories: ['core', 'security', 'perf'],
  measureCwv: true,
  onCategoryComplete: (categoryId, name, result) => {
    console.log(`${name}: ${result.score}/100`);
  }
});

const result = await auditor.audit('https://example.com');
console.log(`Overall Score: ${result.overallScore}`);

Claude Code Skill

Use SEOmator directly in Claude Code as an AI skill for automated SEO auditing.

Setup

npx skills add seo-skills/seo-audit-skill

Usage

"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 20-page crawl"

FAQ

What is SEOmator?

SEOmator is an SEO audit tool that checks a website against 373 rules across 20 categories — covering technical SEO, Core Web Vitals, structured data, accessibility, security headers, content quality, and AI/GEO search readiness — and returns a scored, prioritized report of what to fix first. It's available as an open-source CLI, an Electron desktop app, and a Claude Code skill.

How is SEOmator different from Lighthouse or PageSpeed Insights?

Lighthouse and PageSpeed Insights focus on performance and Core Web Vitals for a single page. SEOmator includes CWV measurement but covers far more ground: crawlability, indexability, structured data validation, redirect chains, hreflang, E-E-A-T signals, and AI/GEO readiness (AI crawler access, llms.txt, semantic HTML) — across a full multi-page crawl, not just one URL.

Does SEOmator check AI search / GEO readiness?

Yes. The AI/GEO Readiness category checks whether AI crawlers like GPTBot and ClaudeBot are allowed in robots.txt, whether an /llms.txt file exists, whether heading structure and semantic HTML are AI-extractable, and whether JSON-LD schema matches the page's visible content.

Is SEOmator free to use?

The CLI (@seomator/seo-audit) is MIT-licensed and free to install and run locally or in CI/CD — see Installation. A hosted, no-install version is also available at seomator.com/free-seo-audit-tool.

Can I run SEOmator in CI/CD?

Yes. It returns exit code 0 for a passing score (≥70), 1 for a failing score, and 2 on error, plus JSON output for parsing. See the GitHub Actions and GitLab CI examples.

Can I use SEOmator with Claude or other AI agents?

Yes. The --format llm flag outputs token-efficient, injection-hardened XML designed for AI agents, and the Claude Code skill lets you run audits directly from a prompt like "Audit https://example.com and tell me what to fix first."

Requirements

  • Node.js 20.3+ (required by better-sqlite3 and AbortSignal.any(); uses native fetch API)
  • Playwright (for Core Web Vitals and JS rendering analysis)

After installing, run npx playwright install chromium to install the browser for CWV measurement.

For the desktop app, better-sqlite3 must be compiled for Electron's Node version:

npm run rebuild:electron

License

MIT

Открыть репозиторий ↗