/seo-lint

A robust SEO Linter / Checker for Local HTML Files

Primary LanguageTypeScriptMIT LicenseMIT

seo-lint: A Robust SEO Linter / Checker for Local HTML Files

This package offers both a CLI and a library to help you with linting HTML for over 50 common SEO issues.

This SEO tool was spun out of Elder.js' plugin called seo-check.

Tester (Library Usage)

The library exports a Tester method which returns an object with 2 methods: folder and test.

Recursive Folder Linting: folder

If you have a folder of .html files you're looking to check for common SEO issues, you just need to specify the folder and seo-lint will recursively check all of the .html files for issues.

const { Tester } = require('./Tester');
const tester = Tester({ siteWide: true, host: 'example.com' });
const results = await tester.folder('public'); // relative to process.cwd()

Raw HTML Linting: test

If you have a build process that generates HTML, such as a static site generator, and want to lint that html generated for common SEO issues you can do the following:

const { Tester } = require('./Tester');
const tester = Tester({ host: 'example.com' });
const results = await tester.test(html, relPermalink);

// results will be an object with issues by url and sitewide issues.

CLI

$ npm i -g  @nickreese/seo-lint

Usage:

seo-lint <dir> [options]

Options

  • -H, --host Set the expected host for internal links. (example.com)
  • -v, --version Displays current version
  • -c, --config Set a custom config to specify rules.
  • -w, --write Location to write a report to a JSON file.

CLI config

// const { defaultPreferences, rules } = require('@nickreese/seo-lint');
// available if you want the defaults from the package.
module.exports = {
  rules: [],
  preferences: {},
  writeLocation: `./report.json`, // if this is set it assumes you want the report written.
  display: ['errors', 'warnings'],
};

Advanced Example:

$ seo-lint public -H example.com -c seo-lint.config.js -w report.json

Checks

Sitewide

These are only checked when Elder.js runs in build mode.

  • check for orphaned pages (no incoming internal links)
  • check for broken internal links.
  • check for duplicate title tags
  • check for duplicate meta descriptions

Canonical

  • canonical tag exists
  • canonical tag matches request.permalink

Title Tag

  • Title tag exists
  • Title tag innerText and innerHTML are the same. (no html tags in your title tag)
  • Only one title tag per page
  • Title tag is less than 70 chars
  • Title tag is more than 10 chars
  • Title doesn't include common stopwords.
  • Title tag doesn't have null
  • Title tag doesn't have undefined
  • checks for stop words.

Meta Description

  • meta description exists
  • only one meta description tag per page
  • Meta description doesn't have null
  • Meta description doesn't have undefined
  • Meta description is longer than 10 chars
  • Meta description is less than than 120 chars
  • Meta description is longer than 300 chars (sometimes things go REALLY wrong and this helps catch it.)
  • Meta description includes at least one the keywords of the title tag.

HTags

  • h1 Exists on page
  • only a single h1 per page.
  • h1 has at least one word from your title tag
  • h1 is less than 70 chars
  • h1 is more than than 10 chars
  • H2 or H3 don't exist if an H1 is missing.
  • H2 exists on the page
  • h2 is less than 100 chars
  • h2 is more than than 10 chars
  • At least one of your h2s contains a single word from your title tag.
  • h3 is less than 100 chars
  • h3 is more than than 7 chars
  • h4 is less than 100 chars
  • h4 is more than than 7 chars
  • If no h2s checks for h3s.
  • If no h3s checks for h4s.
  • If no h4s checks for h5s.
  • If no h5s checks for h6s.

Images

  • Checks images for alt tags.

Links

  • Internal links are lowercase
  • Internal links have trailing slash
  • Internal links are not nofollow
  • Notifies if there are more than 50 outbound links on the page.
  • check for trailing index.html
  • internal fully formed links include 'https'

Misc

  • Checks for width=device-width, initial-scale=1.0 meta viewport.

Credits:

Written by Nick Reese. Initially written to audit Elder Guide.

Contributing

  • We could add a way to filter out rules based on name.

License

This project is licensed under the MIT License - see the LICENSE file for details.