seo-skills/seo-audit-skillMIT712 files

SEO Audit

Audit websites for SEO, technical, content, security, JS rendering, and AI readiness using SEOmator CLI. Returns LLM-optimized reports with health scores across 373 rules and 20 categories, and can diff two audits to show what a deploy changed. Use when analyzing websites, debugging SEO issues, checking site health, or comparing a site before and after a change.

Specification
Skill ID
seo-skills/seo-audit-skill/seo-audit
Publisher
seo-skills
Repository
seo-audit-skill
Installs
0
Files
712
License
MIT
Requires
Requires Node.js 20.3+ and npm. Chrome/Chromium optional for Core Web Vitals and JS rendering.
Synced
Sep 23, 2026
How to use it

Open any RiverX project, open the Skills panel in the chat, and search for this identifier. The files are fetched from the source repository at install time.

seo-skills/seo-audit-skill/seo-auditInstalls these files
  • .gitignore
  • .mcp.json
  • AGENTS.md
  • CHANGELOG.md
  • LICENSE
  • README.md
  • SKILL.md
  • TODOS.md
  • claude.md
  • docs/ELECTRON-APP.md
  • docs/PRD-design-system.md
  • docs/PRD-hint-coverage-expansion.md
  • docs/PRD-lighthouse-and-coverage-expansion.md
  • docs/PRD-local-web-dashboard.md
  • docs/README.md
  • docs/SEO-AUDIT-RULES.md
  • docs/STORAGE-ARCHITECTURE.md
  • docs/WEB-DASHBOARD.md
  • docs/ai-agent-integration.md
  • docs/configuration.md
  • docs/introduction.md
  • docs/quickstart.md
  • docs/technical-architecture.md
  • electron-builder.yml
  • electron/electron-vite.config.ts
  • electron/main/audit-bridge.ts
  • electron/main/db-bridge.ts
  • electron/main/electron-fetcher.ts
  • electron/main/index.ts
  • electron/preload/index.ts
  • electron/resources/brand/seomator-logo-white.svg
  • electron/resources/brand/seomator-logo.svg
  • electron/resources/brand/seomator-mark.svg
  • electron/resources/icon.png
  • electron/shared/ipc-types.ts
  • electron/tsconfig.json
  • package-lock.json
  • package.json
  • references/rules.md
  • reports/hints-catalog.json
  • reports/hints-mapping.json
  • scripts/clean.mjs
  • scripts/extract-hints.mjs
  • scripts/gen-icons.mjs
  • scripts/gen-tokens.mjs
  • scripts/generate-icon.mjs
  • scripts/hints-mapping.mjs
  • scripts/map-hints.mjs
  • scripts/resign-native.mjs
  • scripts/sync-docs.mjs
  • scripts/vite-plugin-tokens.mjs
  • skill/README.md
  • skill/SKILL.md
  • skill/references/rules.md
  • src/auditor.baseline.test.ts
  • src/auditor.regression-1.test.ts
  • src/auditor.test.ts
  • src/auditor.ts
  • src/cancel.test.ts
  • src/categories/index.ts
  • src/cli.ts
  • src/commands/analyze.regression-1.test.ts
  • src/commands/analyze.ts
  • src/commands/audit.regression-1.test.ts
  • src/commands/audit.regression-2.test.ts
  • src/commands/audit.ts
  • src/commands/compare.regression-1.test.ts
  • src/commands/compare.ts
  • src/commands/config.ts
  • src/commands/crawl.ts
  • src/commands/db.ts
  • src/commands/doctor.ts
  • src/commands/index.ts
  • src/commands/init.ts
  • src/commands/machine-error.test.ts
  • src/commands/machine-error.ts
  • src/commands/persistence.test.ts
  • src/commands/persistence.ts
  • src/commands/report.ts
  • src/commands/serve.ts
  • src/commands/unimplemented-flags.test.ts
  • src/commands/unimplemented-flags.ts
  • src/config/defaults.test.ts
  • src/config/defaults.ts
  • src/config/explicit-path.regression-1.test.ts
  • src/config/index.ts
  • src/config/loader.test.ts
  • src/config/loader.ts
  • src/config/rule-filter.regression-1.test.ts
  • src/config/schema.ts
  • src/config/unhonoured-keys.test.ts
  • src/config/url-filter-options.test.ts
  • src/config/url-filter-options.ts
  • src/config/validator.test.ts
  • src/config/validator.ts
  • src/config/writer.ts
  • src/crawler/cookies.ts
  • src/crawler/crawler-render.test.ts
  • src/crawler/crawler.test.ts
  • src/crawler/crawler.ts
  • src/crawler/fetcher.regression-1.test.ts
  • src/crawler/fetcher.test.ts
  • src/crawler/fetcher.ts
  • src/crawler/index.ts
  • src/crawler/playwright-fetcher.test.ts
  • src/crawler/playwright-fetcher.ts
  • src/crawler/politeness.regression-1.test.ts
  • src/crawler/robots.test.ts
  • src/crawler/robots.ts
  • src/crawler/sitemap.test.ts
  • src/crawler/sitemap.ts
  • src/crawler/url-filter.test.ts
  • src/crawler/url-filter.ts
  • src/crawler/user-agent.ts
  • src/dashboard/aggregate.test.ts
  • src/dashboard/aggregate.ts
  • src/dashboard/api.ts
  • src/dashboard/audit-session.test.ts
  • src/dashboard/audit-session.ts
  • src/dashboard/contract.ts
  • src/dashboard/counts.test.ts
  • src/dashboard/counts.ts
  • src/dashboard/errors.ts
  • src/dashboard/events.test.ts
  • src/dashboard/events.ts
  • src/dashboard/queries.test.ts
  • src/dashboard/queries.ts
  • src/dashboard/run-api.test.ts
  • src/dashboard/run-api.ts
  • src/dashboard/server.test.ts
  • src/dashboard/server.ts
  • src/dashboard/static.test.ts
  • src/dashboard/static.ts
  • src/dashboard/token.ts
  • src/design/no-hardcoded-colour.test.ts
  • src/design/no-var-alpha.test.ts
  • src/design/tokens.test.ts
  • src/design/tokens.ts
  • src/errors.ts
  • src/index.ts
  • src/page-snapshot.test.ts
  • src/page-snapshot.ts
  • src/reporters/banner.ts
  • src/reporters/coverage.test.ts
  • src/reporters/findings.test.ts
  • src/reporters/findings.ts
  • src/reporters/fix-suggestions.test.ts
  • src/reporters/fix-suggestions.ts
  • src/reporters/html-reporter.test.ts
  • src/reporters/html-reporter.ts
  • src/reporters/index.ts
  • src/reporters/json.ts
  • src/reporters/llm-reporter.test.ts
  • src/reporters/llm-reporter.ts
  • src/reporters/llm-surrogate.test.ts
  • src/reporters/markdown-reporter.ts
  • src/reporters/progress.ts
  • src/reporters/report-shape.test.ts
  • src/reporters/scale.test.ts
  • src/reporters/terminal-order.test.ts
  • src/reporters/terminal.ts
  • src/reporters/verdict-contract.test.ts
  • src/rules/a11y/accesskey-unique.ts
  • src/rules/a11y/aria-hidden-body.ts
  • src/rules/a11y/aria-hidden-focusable.ts
  • src/rules/a11y/aria-labels.ts
  • src/rules/a11y/aria-required.ts
  • src/rules/a11y/aria-valid.ts
  • src/rules/a11y/autocomplete.ts
  • src/rules/a11y/button-name.ts
  • src/rules/a11y/color-contrast.ts
  • src/rules/a11y/duplicate-id.ts
  • src/rules/a11y/empty-heading.ts
  • src/rules/a11y/focus-visible.ts
  • src/rules/a11y/form-labels.ts
  • src/rules/a11y/form-multiple-labels.ts
  • src/rules/a11y/heading-order.ts
  • src/rules/a11y/identical-links-purpose.ts
  • src/rules/a11y/iframe-title.ts
  • src/rules/a11y/index.ts
  • src/rules/a11y/input-image-alt.ts
  • src/rules/a11y/label-name-mismatch.ts
  • src/rules/a11y/landmark-regions.ts
  • src/rules/a11y/lighthouse-parity.test.ts
  • src/rules/a11y/link-text.ts
  • src/rules/a11y/list-structure.ts
  • src/rules/a11y/main-landmark.ts
  • src/rules/a11y/object-alt.ts
  • src/rules/a11y/presentation-role-conflict.ts
  • src/rules/a11y/redundant-alt.ts
  • src/rules/a11y/skip-link.ts
  • src/rules/a11y/svg-img-alt.ts
  • src/rules/a11y/tabindex-positive.ts
  • src/rules/a11y/table-caption.ts
  • src/rules/a11y/table-headers.ts
  • src/rules/a11y/touch-targets.ts
  • src/rules/a11y/valid-lang-element.ts
  • src/rules/a11y/video-captions.ts
  • src/rules/a11y/xml-lang-mismatch.ts
  • src/rules/a11y/zoom-disabled.ts
  • src/rules/content/article-links.ts
  • src/rules/content/author-info.ts
  • src/rules/content/broken-html.ts
  • src/rules/content/content.test.ts
  • src/rules/content/date-agreement.ts
  • src/rules/content/description-pixel-width.ts
  • src/rules/content/duplicate-description.ts
  • src/rules/content/duplicate-exact.ts
  • src/rules/content/duplicate-h1.ts
  • src/rules/content/duplicate-near.ts
  • src/rules/content/freshness.ts
  • src/rules/content/heading-hierarchy.ts
  • src/rules/content/heading-length.ts
  • src/rules/content/heading-unique.ts
  • src/rules/content/hidden-text.ts
  • src/rules/content/index.ts
  • src/rules/content/keyword-stuffing.ts
  • src/rules/content/meta-in-body.ts
  • src/rules/content/mime-type.ts
  • src/rules/content/mojibake.ts
  • src/rules/content/page-kind.ts
  • src/rules/content/placeholder-text.ts
  • src/rules/content/reading-level.ts
  • src/rules/content/shipped-text.test.ts
  • src/rules/content/stale-copyright.ts
  • src/rules/content/text-html-ratio.ts
  • src/rules/content/thin-vs-site.ts
  • src/rules/content/title-pattern.ts
  • src/rules/content/title-pixel-width.ts
  • src/rules/content/title-same-as-description.ts
  • src/rules/content/title-same-as-h1.ts
  • src/rules/content/unrendered-markup.ts
  • src/rules/content/utils/pixel-width.ts
  • src/rules/content/utils/stopwords.ts
  • src/rules/content/utils/syllable-counter.ts
  • src/rules/content/utils/text-extractor.ts
  • src/rules/content/utils/visible-text.ts
  • src/rules/content/word-count.ts
  • src/rules/core/canonical-attributes.ts
  • src/rules/core/canonical-conflicting.ts
  • src/rules/core/canonical-external.ts
  • src/rules/core/canonical-header.ts
  • src/rules/core/canonical-http-mismatch.ts
  • src/rules/core/canonical-loop.ts
  • src/rules/core/canonical-multiple.ts
  • src/rules/core/canonical-outside-head.ts
  • src/rules/core/canonical-present.ts
  • src/rules/core/canonical-to-homepage.ts
  • src/rules/core/canonical-to-noindex.ts
  • src/rules/core/canonical-valid.ts
  • src/rules/core/core.test.ts
  • src/rules/core/description-length.ts
  • src/rules/core/description-present.ts
  • src/rules/core/favicon-present.ts
  • src/rules/core/h1-present.ts
  • src/rules/core/h1-single.ts
  • src/rules/core/index.ts
  • src/rules/core/nosnippet.ts
  • src/rules/core/presence-weights.test.ts
  • src/rules/core/robots-directive-mismatch.ts
  • src/rules/core/robots-meta.ts
  • src/rules/core/title-length.ts
  • src/rules/core/title-present.ts
  • src/rules/core/title-unique.ts
  • src/rules/core/viewport-present.ts
  • src/rules/coverage-phase.test.ts
  • src/rules/coverage-rest.test.ts
  • src/rules/crawl/blocked-images.ts
  • src/rules/crawl/blocked-resources.ts
  • src/rules/crawl/canonical-chain.ts
  • src/rules/crawl/canonical-form-drift.ts
  • src/rules/crawl/canonical-loop.ts
  • src/rules/crawl/canonical-redirect.ts
  • src/rules/crawl/canonical-to-disallowed.ts
  • src/rules/crawl/canonical-to-noindex.ts
  • src/rules/crawl/crawl-blocked-images.test.ts
  • src/rules/crawl/crawl-crossref.test.ts
  • src/rules/crawl/crawl-delay.ts
  • src/rules/crawl/crawl-hreflang-graph.test.ts
  • src/rules/crawl/crawl-isolated.test.ts
  • src/rules/crawl/crawl-sitemap.test.ts
  • src/rules/crawl/crawlability.test.ts
  • src/rules/crawl/form-drift.test.ts
  • src/rules/crawl/hreflang-disallowed-target.ts
  • src/rules/crawl/hreflang-incoming-conflict.ts
  • src/rules/crawl/hreflang-reciprocity.ts
  • src/rules/crawl/hreflang-to-disallowed.ts
  • src/rules/crawl/hreflang-to-noindex.ts
  • src/rules/crawl/index.ts
  • src/rules/crawl/indexability-conflict.ts
  • src/rules/crawl/isolated-url.ts
  • src/rules/crawl/noindex-in-sitemap.ts
  • src/rules/crawl/pagination-broken.ts
  • src/rules/crawl/pagination-canonical.ts
  • src/rules/crawl/pagination-isolated.ts
  • src/rules/crawl/pagination-loop.ts
  • src/rules/crawl/pagination-noindex.ts
  • src/rules/crawl/pagination-orphaned.ts
  • src/rules/crawl/pagination-sequence.ts
  • src/rules/crawl/pdf-size.ts
  • src/rules/crawl/schema-noindex-conflict.ts
  • src/rules/crawl/site-page-utils.ts
  • src/rules/crawl/sitemap-cross-duplicates.ts
  • src/rules/crawl/sitemap-date-drift.ts
  • src/rules/crawl/sitemap-disallowed.ts
  • src/rules/crawl/sitemap-domain.ts
  • src/rules/crawl/sitemap-duplicate-urls.ts
  • src/rules/crawl/sitemap-in-robotstxt.ts
  • src/rules/crawl/sitemap-lastmod.ts
  • src/rules/crawl/sitemap-non-200.ts
  • src/rules/crawl/sitemap-non-canonical.ts
  • src/rules/crawl/sitemap-orphan-urls.ts
  • src/rules/crawl/sitemap-size-limit.ts
  • src/rules/crawl/sitemap-url-limit.ts
  • src/rules/define-rule.ts
  • src/rules/eeat/about-page.ts
  • src/rules/eeat/affiliate-disclosure.ts
  • src/rules/eeat/author-byline.ts
  • src/rules/eeat/author-expertise.ts
  • src/rules/eeat/citations.ts
  • src/rules/eeat/contact-page.ts
  • src/rules/eeat/content-dates.ts
  • src/rules/eeat/disclaimers.ts
  • src/rules/eeat/editorial-policy.ts
  • src/rules/eeat/eeat.test.ts
  • src/rules/eeat/geo-meta.ts
  • src/rules/eeat/index.ts
  • src/rules/eeat/nap-consistency.ts
  • src/rules/eeat/physical-address.ts
  • src/rules/eeat/privacy-policy.ts
  • src/rules/eeat/terms-of-service.ts
  • src/rules/eeat/trust-signals.ts
  • src/rules/eeat/ymyl-detection.ts
  • src/rules/geo/agents-md.ts
  • src/rules/geo/ai-bot-access.ts
  • src/rules/geo/content-signals.ts
  • src/rules/geo/content-structure.ts
  • src/rules/geo/geo.test.ts
  • src/rules/geo/index.ts
  • src/rules/geo/llms-txt.ts
  • src/rules/geo/markdown-page.ts
  • src/rules/geo/markdown-response.ts
  • src/rules/geo/noai-signals.ts
  • src/rules/geo/pay-per-crawl.ts
  • src/rules/geo/probe.ts
  • src/rules/geo/rsl-license.ts
  • src/rules/geo/schema-drift.ts
  • src/rules/geo/semantic-html.ts
  • src/rules/geo/well-known.ts
  • src/rules/htmlval/base-url.ts
  • src/rules/htmlval/htmlval.test.ts
  • src/rules/htmlval/index.ts
  • src/rules/htmlval/invalid-head.ts
  • src/rules/htmlval/lorem-ipsum.ts
  • src/rules/htmlval/missing-charset.ts
  • src/rules/htmlval/missing-doctype.ts
  • src/rules/htmlval/multiple-descriptions.ts
  • src/rules/htmlval/multiple-heads.ts
  • src/rules/htmlval/multiple-titles.ts
  • src/rules/htmlval/noscript-in-head.ts
  • src/rules/htmlval/size-limit.ts
  • src/rules/htmlval/title-outside-head.ts
  • src/rules/i18n/hreflang-conflicting.ts
  • src/rules/i18n/hreflang-incoming-invalid.ts
  • src/rules/i18n/hreflang-lang-mismatch.ts
  • src/rules/i18n/hreflang-multiple-methods.ts
  • src/rules/i18n/hreflang-relative-url.ts
  • src/rules/i18n/hreflang-return-links.ts
  • src/rules/i18n/hreflang-to-broken.ts
  • src/rules/i18n/hreflang-to-noindex.ts
  • src/rules/i18n/hreflang-to-non-canonical.ts
  • src/rules/i18n/hreflang-to-redirect.ts
  • src/rules/i18n/hreflang-x-default.ts
  • src/rules/i18n/hreflang.ts
  • src/rules/i18n/i18n.test.ts
  • src/rules/i18n/index.ts
  • src/rules/i18n/lang-attribute.ts
  • src/rules/images/alt-length.ts
  • src/rules/images/alt-present.ts
  • src/rules/images/alt-quality.ts
  • src/rules/images/background-seo.ts
  • src/rules/images/broken.ts
  • src/rules/images/dimensions.ts
  • src/rules/images/figure-captions.ts
  • src/rules/images/filename-quality.ts
  • src/rules/images/index.ts
  • src/rules/images/inline-svg-size.ts
  • src/rules/images/lazy-loading.ts
  • src/rules/images/modern-format.ts
  • src/rules/images/picture-element.ts
  • src/rules/images/responsive.ts
  • src/rules/images/size.ts
  • src/rules/index.ts
  • src/rules/js/blocked-resources.ts
  • src/rules/js/canonical-mismatch.ts
  • src/rules/js/console-errors.ts
  • src/rules/js/description-modified.ts
  • src/rules/js/document-write.test.ts
  • src/rules/js/document-write.ts
  • src/rules/js/failed-requests.ts
  • src/rules/js/h1-modified.ts
  • src/rules/js/index.ts
  • src/rules/js/js.test.ts
  • src/rules/js/noindex-mismatch.ts
  • src/rules/js/rendered-canonical.ts
  • src/rules/js/rendered-content.ts
  • src/rules/js/rendered-description.ts
  • src/rules/js/rendered-h1.ts
  • src/rules/js/rendered-links.ts
  • src/rules/js/rendered-title.ts
  • src/rules/js/ssr-check.ts
  • src/rules/js/title-modified.ts
  • src/rules/js/utils/compare-dom.ts
  • src/rules/legal/cookie-consent.ts
  • src/rules/legal/index.ts
  • src/rules/legal/legal.test.ts
  • src/rules/legal/privacy-policy.ts
  • src/rules/legal/terms-of-service.ts
  • src/rules/links/anchor-text.ts
  • src/rules/links/broken-fragment.ts
  • src/rules/links/broken-internal.ts
  • src/rules/links/chrome-inbound.ts
  • src/rules/links/dead-end-pages.ts
  • src/rules/links/depth.ts
  • src/rules/links/excessive.ts
  • src/rules/links/external-count.ts
  • src/rules/links/external-valid.ts
  • src/rules/links/https-downgrade.ts
  • src/rules/links/inbound-all-nofollow.ts
  • src/rules/links/inbound-anchor-text.ts
  • src/rules/links/inbound-low-quality.ts
  • src/rules/links/inbound-mixed-follow.ts
  • src/rules/links/inbound-shape.test.ts
  • src/rules/links/inbound.ts
  • src/rules/links/index.ts
  • src/rules/links/internal-present.ts
  • src/rules/links/invalid-links.ts
  • src/rules/links/links.test.ts
  • src/rules/links/local-file.ts
  • src/rules/links/localhost.ts
  • src/rules/links/nofollow-appropriate.ts
  • src/rules/links/nofollow-internal.ts
  • src/rules/links/non-http-protocol.ts
  • src/rules/links/onclick.ts
  • src/rules/links/orphan-pages.ts
  • src/rules/links/redirect-chains.ts
  • src/rules/links/site-graph.test.ts
  • src/rules/links/tel-mailto.ts
  • src/rules/links/weak-inbound.ts
  • src/rules/links/whitespace-href.ts
  • src/rules/loader.ts
  • src/rules/mobile/font-size.ts
  • src/rules/mobile/horizontal-scroll.ts
  • src/rules/mobile/image-maps.ts
  • src/rules/mobile/index.ts
  • src/rules/mobile/interstitials.ts
  • src/rules/mobile/mobile.test.ts
  • src/rules/mobile/multiple-viewports.ts
  • src/rules/mobile/parity.test.ts
  • src/rules/mobile/parity.ts
  • src/rules/mobile/utils/parity.ts
  • src/rules/mobile/viewport-content.ts
  • src/rules/mobile/viewport-width.ts
  • src/rules/pattern-matcher.test.ts
  • src/rules/pattern-matcher.ts
  • src/rules/perf/asset-cache-policy.ts
  • src/rules/perf/asset-compression.ts
  • src/rules/perf/asset-rules.test.ts
  • src/rules/perf/asset-size.regression-1.test.ts
  • src/rules/perf/asset-size.ts
  • src/rules/perf/brotli.ts
  • src/rules/perf/cache-policy.ts
  • src/rules/perf/cls.ts
  • src/rules/perf/css-file-size.ts
  • src/rules/perf/dom-size.ts
  • src/rules/perf/duplicate-js.ts
  • src/rules/perf/fcp.ts
  • src/rules/perf/font-loading.ts
  • src/rules/perf/http2.ts
  • src/rules/perf/image-encoding.ts
  • src/rules/perf/index.ts
  • src/rules/perf/inp.ts
  • src/rules/perf/js-file-size.ts
  • src/rules/perf/lazy-above-fold.ts
  • src/rules/perf/lcp-hints.ts
  • src/rules/perf/lcp.ts
  • src/rules/perf/legacy-javascript.test.ts
  • src/rules/perf/legacy-javascript.ts
  • src/rules/perf/minify-css.ts
  • src/rules/perf/minify-js.ts
  • src/rules/perf/page-weight.ts
  • src/rules/perf/perf.test.ts
  • src/rules/perf/preconnect.ts
  • src/rules/perf/render-blocking.ts
  • src/rules/perf/response-time.ts
  • src/rules/perf/source-maps.ts
  • src/rules/perf/text-compression.ts
  • src/rules/perf/ttfb.ts
  • src/rules/perf/video-for-animations.ts
  • src/rules/priority.test.ts
  • src/rules/priority.ts
  • src/rules/redirect/broken.ts
  • src/rules/redirect/case-normalization.ts
  • src/rules/redirect/http-refresh.ts
  • src/rules/redirect/index.ts
  • src/rules/redirect/javascript.ts
  • src/rules/redirect/loop.ts
  • src/rules/redirect/meta-refresh.ts
  • src/rules/redirect/redirect.test.ts
  • src/rules/redirect/resource-broken.ts
  • src/rules/redirect/resource-chain.ts
  • src/rules/redirect/resource-loop.ts
  • src/rules/redirect/resource.ts
  • src/rules/redirect/type.ts
  • src/rules/registry.test.ts
  • src/rules/registry.ts
  • src/rules/rule-filter.regression-2.test.ts
  • src/rules/schema/article.ts
  • src/rules/schema/breadcrumb.ts
  • src/rules/schema/entity-conflict.ts
  • src/rules/schema/entity-dangling.ts
  • src/rules/schema/entity-graph.test.ts
  • src/rules/schema/entity-graph.ts
  • src/rules/schema/entity-id.ts
  • src/rules/schema/entity-split.ts
  • src/rules/schema/entity-type-drift.ts
  • src/rules/schema/faq.ts
  • src/rules/schema/index.ts
  • src/rules/schema/local-business.ts
  • src/rules/schema/organization.ts
  • src/rules/schema/present.ts
  • src/rules/schema/product.ts
  • src/rules/schema/rating-scope.ts
  • src/rules/schema/required-fields.ts
  • src/rules/schema/review.ts
  • src/rules/schema/schema.test.ts
  • src/rules/schema/type.ts
  • src/rules/schema/utils.ts
  • src/rules/schema/valid.ts
  • src/rules/schema/video.ts
  • src/rules/schema/website-search.ts
  • src/rules/security/best-practices.test.ts
  • src/rules/security/brand-impersonation.ts
  • src/rules/security/cookie-flags.ts
  • src/rules/security/cookies.test.ts
  • src/rules/security/coop.ts
  • src/rules/security/csp-xss.ts
  • src/rules/security/csp.ts
  • src/rules/security/external-links.ts
  • src/rules/security/form-https.ts
  • src/rules/security/hsts.ts
  • src/rules/security/https-redirect.ts
  • src/rules/security/https.ts
  • src/rules/security/index.ts
  • src/rules/security/info-disclosure.ts
  • src/rules/security/leaked-secrets.ts
  • src/rules/security/mixed-content.ts
  • src/rules/security/obfuscated-script.ts
  • src/rules/security/password-http.ts
  • src/rules/security/paste-blocking.ts
  • src/rules/security/permissions-policy.ts
  • src/rules/security/protocol-relative.ts
  • src/rules/security/referrer-policy.ts
  • src/rules/security/sri.ts
  • src/rules/security/ssl-expiry.ts
  • src/rules/security/ssl-protocol.ts
  • src/rules/security/trusted-types.ts
  • src/rules/security/x-content-type.ts
  • src/rules/security/x-frame.ts
  • src/rules/social/index.ts
  • src/rules/social/og-description.ts
  • src/rules/social/og-image-size.ts
  • src/rules/social/og-image.ts
  • src/rules/social/og-title.ts
  • src/rules/social/og-url-canonical.ts
  • src/rules/social/og-url.ts
  • src/rules/social/share-buttons.ts
  • src/rules/social/social-profiles.ts
  • src/rules/social/social.test.ts
  • src/rules/social/twitter-card.ts
  • src/rules/technical/404-page.ts
  • src/rules/technical/4xx-non-404.ts
  • src/rules/technical/bad-content-type.ts
  • src/rules/technical/consent-mode.ts
  • src/rules/technical/duplicate-ga.ts
  • src/rules/technical/duplicate-gtm.ts
  • src/rules/technical/empty-html.ts
  • src/rules/technical/form-get-method.ts
  • src/rules/technical/index.ts
  • src/rules/technical/robots-txt-exists.ts
  • src/rules/technical/robots-txt-valid.ts
  • src/rules/technical/server-error.ts
  • src/rules/technical/sitemap-exists.ts
  • src/rules/technical/sitemap-valid.ts
  • src/rules/technical/soft-404.ts
  • src/rules/technical/technical.test.ts
  • src/rules/technical/timeout.ts
  • src/rules/technical/trailing-slash.ts
  • src/rules/technical/url-structure.ts
  • src/rules/technical/www-redirect.ts
  • src/rules/test-context.ts
  • src/rules/url/double-slash.ts
  • src/rules/url/http-https-duplicate.ts
  • src/rules/url/index.ts
  • src/rules/url/internal-search.ts
  • src/rules/url/length.ts
  • src/rules/url/non-ascii.ts
  • src/rules/url/parameters.ts
  • src/rules/url/repetitive-path.ts
  • src/rules/url/session-ids.ts
  • src/rules/url/slug-keywords.ts
  • src/rules/url/spaces.ts
  • src/rules/url/stop-words.ts
  • src/rules/url/tracking-params.ts
  • src/rules/url/underscores.ts
  • src/rules/url/uppercase.ts
  • src/rules/url/url-structure.test.ts
  • src/scoring.test.ts
  • src/scoring.ts
  • src/storage/audits-db/audits.ts
  • src/storage/audits-db/comparisons.test.ts
  • src/storage/audits-db/comparisons.ts
  • src/storage/audits-db/encodings.test.ts
  • src/storage/audits-db/index.ts
  • src/storage/audits-db/issues.ts
  • src/storage/audits-db/results.test.ts
  • src/storage/audits-db/results.ts
  • src/storage/audits-db/rule-diff.ts
  • src/storage/audits-db/run-profile.test.ts
  • src/storage/audits-db/run-profile.ts
  • src/storage/audits-db/schema.test.ts
  • src/storage/audits-db/schema.ts
  • src/storage/audits-db/scoring-version.test.ts
  • src/storage/audits-db/test-fixtures.ts
  • src/storage/crawl-store.test.ts
  • src/storage/crawl-store.ts
  • src/storage/index.ts
  • src/storage/link-cache.test.ts
  • src/storage/link-cache.ts
  • src/storage/migrations/index.ts
  • src/storage/migrations/json-to-sqlite.regression-1.test.ts
  • src/storage/migrations/json-to-sqlite.ts
  • src/storage/paths.test.ts
  • src/storage/paths.ts
  • src/storage/project-db/crawls.ts
  • src/storage/project-db/images.ts
  • src/storage/project-db/index.ts
  • src/storage/project-db/links.ts
  • src/storage/project-db/pages.ts
  • src/storage/project-db/projects.ts
  • src/storage/project-db/schema.ts
  • src/storage/report-store.ts
  • src/storage/save-audit.test.ts
  • src/storage/save-audit.ts
  • src/storage/sqlite-time.test.ts
  • src/storage/sqlite-time.ts
  • src/storage/types.ts
  • src/storage/utils/compression.ts
  • src/storage/utils/hash.ts
  • src/storage/utils/index.ts
  • src/types.ts
  • src/verdict.test.ts
  • src/verdict.ts
  • src/version.ts
  • tsconfig.json
  • tsup.config.ts
  • ui/App.tsx
  • ui/components/AuditList.tsx
  • ui/components/AuditRunner.tsx
  • ui/components/CategoryBar.tsx
  • ui/components/CategoryGrid.tsx
  • ui/components/CategoryRow.tsx
  • ui/components/CategorySection.tsx
  • ui/components/DomainStrip.tsx
  • ui/components/FilterTabs.tsx
  • ui/components/Header.tsx
  • ui/components/IssuesTable.tsx
  • ui/components/Logo.tsx
  • ui/components/PageError.tsx
  • ui/components/ProgressStream.tsx
  • ui/components/RuleCard.tsx
  • ui/components/ScoreCircle.tsx
  • ui/components/ScoreStats.tsx
  • ui/components/Sidebar.tsx
  • ui/components/TrendChart.tsx
  • ui/hooks/useAppInfo.ts
  • ui/hooks/useAudit.ts
  • ui/hooks/useTheme.ts
  • ui/index.html
  • ui/lib/api-client.ts
  • ui/lib/eta.test.ts
  • ui/lib/eta.ts
  • ui/lib/fix-suggestions.ts
  • ui/lib/format.ts
  • ui/lib/hooks.ts
  • ui/lib/http-api.ts
  • ui/lib/http-error.test.ts
  • ui/lib/ipc-client.ts
  • ui/main.tsx
  • ui/no-raw-html.test.ts
  • ui/pages/AuditDetailPage.tsx
  • ui/pages/ComparePage.tsx
  • ui/pages/HomePage.tsx
  • ui/pages/RunPage.tsx
  • ui/stores/audit-store.ts
  • ui/styles/globals.css
  • ui/styles/tailwind.css
  • ui/styles/tokens.css
  • ui/tsconfig.json
  • ui/verdict-parity.test.ts
  • vite.web.config.ts
  • vitest.config.ts

What this skill tells the agent

SEO Audit Skill

Audit websites for SEO, technical, content, performance, security, JavaScript rendering, and AI readiness using the SEOmator CLI.

SEOmator provides comprehensive website auditing by analyzing website structure and content against 373 rules across 20 categories.

It provides a list of issues with severity levels, affected URLs, and actionable fix suggestions.

Links

What This Skill Does

This skill enables AI agents to audit websites for 373 rules in 20 categories, including:

  • Core SEO (24 rules): Canonical URLs, indexing directives, title uniqueness, canonical conflicts/loops
  • Performance (28 rules): LCP, CLS, FCP, TTFB, INP, compression, caching, minification, HTTP/2
  • Links (27 rules): Broken links, redirect chains, anchor text, localhost/fragment links, plus click depth and inbound internal links from the site graph (--crawl)
  • Images (14 rules): Alt text, dimensions, lazy loading, modern formats, alt length, background images
  • Security (26 rules): HTTPS, HSTS, CSP, external link safety, leaked secrets, SSL expiry/protocol, cookie flags and lifetime
  • Technical SEO (18 rules): robots.txt, sitemap.xml, URL structure, 404 pages, soft 404s, error codes
  • Crawlability (38 rules): Sitemap conflicts, indexability signals, canonical chains, pagination issues, sitemap lastmod quality
  • Structured Data (19 rules): Schema.org markup, Article, Organization, FAQ, Product, Breadcrumb
  • JavaScript Rendering (16 rules): Rendered DOM checks, raw vs rendered mismatches, SSR detection, console errors, failed resource requests
  • Accessibility (36 rules): ARIA labels, color contrast, form labels, landmarks, touch targets
  • Content (27 rules): Word count, readability, keyword density, duplicate detection, pixel widths
  • Social (9 rules): Open Graph tags, Twitter cards, share buttons, profile links
  • E-E-A-T (16 rules): Author bylines, citations, trust signals, about/contact pages, YMYL detection
  • URL Structure (14 rules): Keyword slugs, stop words, uppercase, underscores, session IDs, tracking params
  • Redirects (11 rules): Redirect loops, types (301/302), meta refresh, JavaScript redirects, broken redirects
  • Mobile (12 rules): Font sizes, horizontal scroll, interstitials, viewport, mobile-first parity (content, title, canonical, structured data, links) via --mobile
  • Internationalization (13 rules): lang attribute, hreflang validation (return links, conflicts, mismatches)
  • HTML Validation (11 rules): Doctype, charset, head structure, lorem ipsum, multiple titles/descriptions
  • AI/GEO Readiness (13 rules): Semantic HTML, AI bot access, llms.txt, schema drift
  • Legal Compliance (1 rule): Cookie consent

The audit crawls the website, analyzes each page against audit rules, and returns a comprehensive report with:

  • Overall health score (0-100) with letter grade (A-F)
  • Category breakdowns with pass/warn/fail counts
  • Specific issues with affected URLs grouped by rule
  • Actionable fix recommendations

When to Use

Use this skill when you need to:

  • Analyze a website's SEO health
  • Debug technical SEO issues
  • Check for broken links and redirect chains
  • Validate meta tags, canonical URLs, and structured data
  • Audit security headers, SSL, and HTTPS
  • Check accessibility compliance
  • Analyze JavaScript rendering and SSR compatibility
  • Evaluate AI/GEO readiness (semantic HTML, llms.txt, bot access)
  • Detect duplicate content across pages
  • Validate hreflang and internationalization setup
  • Check HTML document structure and validation
  • Generate site audit reports in multiple formats
  • Compare site health before/after changes

Prerequisites

This skill requires the SEOmator CLI to be installed.

Installation

npm install -g @seomator/seo-audit

Verify Installation

Check that seomator is installed and the system is ready:

seomator self doctor

This checks:

  • Node.js version (18+ recommended)
  • npm availability
  • Chrome/Chromium for Core Web Vitals and JS rendering
  • Write permissions for ~/.seomator
  • Local config file presence

Setup

Running seomator init creates a seomator.toml config file in the current directory.

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

If there is no seomator.toml in the directory, CREATE ONE with seomator init before running audits.

Usage

AI Agent Best Practices

YOU SHOULD always prefer `--format llm` - it provides token-optimized XML output specifically designed for AI agents (50-70% smaller than JSON).

When auditing:

  1. Prefer live websites over local dev servers for accurate performance and rendering data
  2. Use `--no-cwv` for faster audits, but know what it costs: it skips the browser render, so Core Web Vitals, the JavaScript rendering rules, js-console-errors, js-failed-requests and all mobile-parity-* rules report unmeasured rather than passing or failing
  3. Match the flags to the question. Rules that need more than one page or more than one render are unmeasured without the right flag:
To checkRun with
Click depth, inbound internal links--crawl (builds the site graph)
Mobile-first indexing parity--mobile (second render at a phone viewport)
JS errors, failed subresources, Core Web Vitalsdefault (omit --no-cwv)
What a deploy changedrun before and after, then seomator compare <domain>
  1. Scope fixes as concurrent tasks when implementing multiple fixes
  2. Run typechecking/formatting after implementing fixes (tsc, eslint, prettier, etc.)

Website Discovery

If the user doesn't provide a website to audit:

  1. Check for local dev server configurations (package.json scripts, .env files)
  2. Look for Vercel/Netlify project links
  3. Check environment variables for deployment URLs
  4. Ask the user which URL to audit

If you have both local and live websites available, suggest auditing the live site for accurate results.

Basic Workflow

# Quick single-page audit with LLM output
seomator audit https://example.com --format llm --no-cwv

# Multi-page crawl (up to 50 pages)
seomator audit https://example.com --crawl -m 50 --format llm --no-cwv

# Full audit with Core Web Vitals + JS rendering analysis
seomator audit https://example.com --crawl -m 20 --format llm

Advanced Options

Audit specific categories only:

seomator audit https://example.com -c core,security,js --format llm --no-cwv

Save HTML report for sharing:

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

Verbose output for debugging:

seomator audit https://example.com --format llm -v

Exit codes

An agent must be able to tell "the audit failed" from "the site scored badly". Every command uses the same three:

CodeMeaning
0Success
1The run worked, and the result is below a threshold — audit/analyze scored under 70, or compare --fail-on-regression found a regression
2The command failed: unreachable URL, HTTP error, missing crawl, bad --config path
130Cancelled with Ctrl-C

A non-zero exit is not automatically a failure. 1 means the tool worked and is telling you something about the site. Only 2 means it could not do the

Use this skill in a project

Open any RiverX project, search the Skills panel for seo-skills/seo-audit-skill/seo-audit, and install it in one click.

Use this skill