vsCompare / BackstopJS

Keep the visual tests. Get a review page.

BackstopJS compares screenshots on the machine that runs it and writes an HTML report there. stateofpixel takes the screenshots in your CI, keeps the baselines and asks for review on the pull request.

Start free with GitHubSee the switch

Facts about BackstopJS checked on 27 September 2026, with 5 sources.

BackstopJSShutting down
Last release
6.3.25, 7 September 20241
Open issues
517 on 5 October 20262

One build, step by step.

300 stories at 3 viewports, run through BackstopJS and through stateofpixel.
BackstopJSstateofpixel
  1. 1
    Puppeteer or Playwright captures on your machine
    Your tests take screenshots900 screenshots
  2. 2
    Resemble.js compares locally
    The CLI hashes and compares them on the runner900 hashes
  3. 3
    An HTML report opens on that machine
    Only images we have not seen upload45 changed
  4. 4
    backstop approve copies the new images to the references
    The review page and the GitHub check
Free, you run it900countedEach screenshot in each build
Billed per GB stored0counted45 changed screenshots and their diffs stored

What changes when you switch.

The same pull request, reviewed with less in the way.
01A review page on the pull requestBackstopJS writes its report on the machine that ran it, and backstop approve copies the new images over the references. We set a GitHub check and show every change on one page that anyone with write access can approve.
02Baselines out of your repositoryBackstopJS keeps reference images in a folder you store yourself. We pick the baseline from your git history, so two pull requests never conflict over an image.
03MaintainedBackstopJS's last npm release was 6.3.25, in September 2024. stateofpixel is in active development.

What your reviewers get.

Each changed screenshot next to its baseline, with the changed pixels in green.
  • Four views. Side by side, diff, slider and flip.
  • Keyboard first. j and k to move, a to approve, r to reject.
  • One check. Green when every change is approved.
Try the review page
The stateofpixel review page, with the baseline and the new screenshot side by side and the changed pixels in green

stateofpixel and BackstopJS, row by row.

Every row about BackstopJS links to the page it came from.
stateofpixelBackstopJSWhat you pay forStorage. Snapshots, builds and seats are free.Nothing. It is MIT licensed software you run yourself.1Free plan10 GB stored. Snapshots are not charged.Not found in their docs.At the plan limitWarns at 80%. After 14 days over, new images are not stored and the check passes with a note.Not found in their docs.Who takes themYour CI.Your machine or CI, with Puppeteer or Playwright, optionally in its Docker image.3Where they are comparedYour CI. Only the images upload.Your machine or CI, with Resemble.js.34

Where BackstopJS is ahead.

We skip some features on purpose. If you need one of these, choose BackstopJS.
Offline, with no serviceBackstopJS captures, compares and reports on your machine, with no account anywhere.
Scenarios without test codebackstop.json drives clicks, hovers and key presses on a list of URLs. stateofpixel needs a test runner or Storybook to take the screenshots.
Compare two environmentsA referenceUrl compares one site with another, like production with staging. stateofpixel compares builds of the same repository.

Switch in one pull request.

Keep your tests. Change the step that sends screenshots to BackstopJS. The moving guide has the details.
  1. 1Install the GitHub AppPick the repositories. On GitHub Actions there is no token to copy.
  2. 2Move scenarios to PlaywrightEach scenario becomes a test that visits the URL and calls snapshot(). The reporter uploads when the run ends.
  3. 3Delete the reference imagesRemove backstop_data/bitmaps_reference. The first build on your default branch becomes the baseline.

Before

.github/workflows/visual.yml
steps:
  - run: npm ci
  - run: npx backstop test --docker

After

.github/workflows/visual.yml
permissions:
  contents: read
  id-token: write

steps:
  - run: npm ci
  - run: npx playwright install --with-deps chromium
  - run: npx playwright test
playwright.config.ts
import { defineConfig } from "@playwright/test";

export default defineConfig({
  reporter: [["list"], ["stateofpixel/playwright"]],
});

Questions.

What to know before you move from BackstopJS.
Is BackstopJS still maintained?

Its last npm release, 6.3.25, came out on 7 September 2024. The repository had 517 open issues on 5 October 2026.

Can I keep backstop.json?

No. stateofpixel does not run scenarios. Take the screenshots with Playwright, or any tool that writes PNG files, and upload the folder.

Do I need to commit reference images?

No. stateofpixel stores the images and picks each baseline from your git history.

Sources

Read on 27 September 2026. Prices are list prices before tax. The stateofpixel column comes from our docs.

  1. 1backstopjs on npm
  2. 2BackstopJS issues
  3. 3BackstopJS README
  4. 4BackstopJS package.json
  5. 5BackstopJS license

Every pixel, reviewed.
Nothing ships by surprise.

Start free with GitHubRead the quickstart