@foo-software/binoculars

A tool to measure web page SEO friendliness

Usage no npm install needed!

<script type="module">
  import fooSoftwareBinoculars from 'https://cdn.skypack.dev/@foo-software/binoculars';
</script>

README

@foo-software/binoculars

Binoculars Logo

A tool to measure web page SEO friendliness. Binoculars extends Google's Lighthouse to provide a more opinionated, SEO specific audit.

  • Choice of programmatic usage or CLI.
  • Run a single audit or multiple audits at once.
  • Upload reports to S3 via simple configuration.
  • Automatically post results as comments in GitHub via commits or pull requests (see options).
  • Automatically post results in Slack (see options).

Meaningful Content

Binoculars extends Lighthouse by adding the following audits in a custom group named "Meaningful Content".

  • Title Length: Title should be between 50 - 70 characters.
  • Description Length: Descriptions should be between 100 - 160 characters.
  • Keywords: Keyword phrases of at least 2 words should exist in the title, description and at least twice in the content of the page.
  • Headings: Has at least 1 <h1> tag and 1 <h2> tag.
  • Meaningful Text: Has sufficient textual content (300 characters).
  • Meaningful Tag Structure: Has at least 2 different informational HTML tags of the following types: <p>, <li>, <img>, <table>.

Metrics

Binoculars accounts for metrics from Lighthouse SEO and accessibility categories and weights them accordingly. It combines metrics from these categories with the "Meaningful Content" group detailed above. See the complete list of audits and weighting here.

Usage

Use programmatically or via CLI.

npm i @foo-software/binoculars

or

yarn @foo-software/binoculars

Programmatic Usage

const path = require('path');
const binoculars = require('@foo-software/binoculars').default;

(async () => {
  const results = await binoculars({
    url: 'https://www.foo.software',
 
    // example if you have an "artifacts" directory in your root directory
    outputDirectory: path.resolve('./artifacts'),
 
    // any other options go here
  });
 
  console.log('local report', results[0].localReport);
  // local report ./reports/report-1602194942162.html

  console.log('score', results[0].result.categories.binocularsSeo.score);
  // score 0.96
})();

CLI Usage

Arguments are represented in the options section. Any array type relies on the pipe symbol as shown with urls in the second example below.

binoculars --url https://www.foo.software --outputDirectory ./artifacts

Use a | when auditing multiple URLs like so:

binoculars --urls "https://www.foo.software|https://www.foo.software/register"

Options

Name Description Type Default Required
author For Slack notifications: A user handle, typically from GitHub. string undefined no
awsAccessKeyId The AWS accessKeyId for an S3 bucket. string undefined no
awsBucket The AWS Bucket for an S3 bucket. string undefined no
awsRegion The AWS region for an S3 bucket. string undefined no
awsSecretAccessKey The AWS secretAccessKey for an S3 bucket. string undefined no
branch For Slack notifications: A version control branch, typically from GitHub. string undefined no
commentAccessToken Access token of a user to post PR comments. string undefined no
commentUrl An endpoint to post comments to. Typically this will be from GitHub's API. Example: https://api.github.com/repos/:owner/:repo/pulls/:pull_number/reviews string undefined no
enableComments If true and commentAccessToken is set along with commentUrl, scores will be posted as comments. boolean true no
finalScreenshotAwsBucket The AWS Bucket for an S3 bucket. If this is defined, the final screenshot will be uploaded here string undefined no
minScore The required minimum score. If score is lower an error will throw. number undefined no
outputDirectory An absolute directory path to output report. You can do this an an alternative or combined with an S3 upload. string undefined no
pr For Slack notifications: A version control pull request URL, typically from GitHub. string undefined no
slackWebhookUrl A Slack Incoming Webhook URL to send notifications to. string undefined no
sha For Slack notifications: A version control sha, typically from GitHub. string undefined no
url A URL to run Binoculars against. string undefined yes
urls An array of URLs. In the CLI this value should be a pipe separated list (|). string[] undefined yes

Return Payload

binoculars is a promise that resolves an array. The reason it resolves with an array is because options allow url or urls. Because a consistent return is ideal, we return an array regardless if there is only one result or more. Each array item is an object with the below payload.

Name Description Type
finalScreenshot A URL to the final screenshot image. This will only be defined if finalScreenshotAwsBucket parameter was. string
localReport A local path to the report (if applicable). string
result A comprehensive result - the equivalent of what is returned when using the lighthouse module directly. object
report A URL to the report HTML file. string

Environment Variables

You can optionally provide environment variables as detailed below.

Name Description Type Default
BINOCULARS_CHROME_PORT The port for Chrome to run audits on. number 4000
BINOCULARS_INTEGRATION_SERVER_DOMAIN Domain of the integration server. string localhost
BINOCULARS_INTEGRATION_SERVER_PORT Port to run the integration server on. number 3000
BINOCULARS_INTEGRATION_SERVER_PROTOCOL Protocol of the integration server. string http
LOG_LEVEL The Winston log level (use "off" to run without logging). string info

Credits

This package was brought to you by Foo - a website quality monitoring tool. Automatically test and monitor website performance, SEO and accessibility with Lighthouse. Analyze historical records of Lighthouse tests with automated monitoring. Report with confidence about SEO and performance improvements to stay on top of changes when they happen!