Visual regression for site upgrades

See every page your upgrade changed.

visualdiff screenshots the same pages on two versions of your site (before and after a Craft, WordPress or Laravel upgrade, or any two git branches) and shows you what changed, pixel by pixel, worst first.

Coming soon See how it works

Coming soon · Apple Silicon · Node and Chromium built in · free for up to 10 pages per comparison

/products · before → after ·
Before the upgrade After the upgrade, revealed right of the divider BeforeAfter

Try it: drag the divider, switch views, pick another page. Real captures from the visualdiff demo site.

Finds your pages in Craft CMS 3, 4 & 5WordPress & multisiteStatamicLaravelFilamentany site with a sitemap

How it works

Point it at your project. Compare. Triage.

01

Point it at your repo

Pick the site's folder. visualdiff works out what it is, reads your .env and finds its pages: every page-builder page plus a sample from each section, product type and category.

02

Compare two versions

Two local sites, or any two git branches. Both sides are captured at once in a stabilised browser: animations off, lazy images loaded, trackers blocked.

03

Triage and report

Work down the list worst first. Mark each change expected, bug or fixed, then export the upgrade report as Markdown or CSV.

Worst first, so nothing slips through

Every page gets a heatmap of where it changed and the share of pixels that moved. Pages that broke come first: a 5xx, or an error page that still answers 200, like a Twig error rendered with a success status.

  • New JavaScript console errors, side by side
  • Side by side, swipe, onion skin and difference views
  • Jump straight to each changed region
Results list with heatmap thumbnails, statuses and percentage changed per page, newly broken pages at the top
$ vdiff compare main feature/craft-4
creating worktree vdiff-feature-craft-4
herd link acme-feature-craft-4 (+ -fr, -es)
cloning database acme → acme_vdiff_feature_craft_4
$ php craft up --interactive=0
shooting main and feature/craft-4 …
542 compared · 37 changed >1% · 2 newly broken

Compare branches, not just URLs

Name any git branch and visualdiff makes it a working site: its own worktree, served by Herd or PHP's built-in server, and its own copy of the database, so running migrations on the upgrade branch never touches the one you compare against.

Example output; your numbers depend on the site.

APIs and feeds, field by field

JSON endpoints, sitemaps and feeds are compared as data, not pictures. Read the changes like a pull request: additions in green, removals in red, with each environment's own hostname ignored and volatile fields like timestamps left out.

/api/products.json+9 −3
  {    "id": 1,    "name": "Integrated fridge",−   "price": 2499,+   "price": {+     "amount": 2499,+     "currency": "GBP"+   },    "inStock": true  },⋯ 3 unchanged items−   "inStock": true+   "inStock": false  "meta": {    "total": 6,+   "page": 1  }
Page marked as a bug with a note and ticket number, error page flagged on the after side

Review once, report in one click

Mark changes expected, bug or fixed with a note. Re-shoot a page after a fix and only that page is diffed again. Export the upgrade report for the client or the ticket.

Claude & MCP

Let Claude take the first pass

visualdiff is an MCP server. Connect it to Claude Code, Claude Desktop or Cursor in one click from the menu bar, and ask in plain language. Claude sees the before, after and difference images of each change, not just a percentage.

Reviews Claude makes show up in the app like anyone else's.

Compare main with feature/craft-4 in acme and triage what broke.
compare · get_results · get_page ×4 · review_page ×4
Two pages broke on feature/craft-4. /contact renders a Twig error but still returns 200: the form variable no longer exists in contact/index.twig. I marked it as a bug. The other changes are the new header spacing, marked expected.

Illustrative exchange.

Fast where it counts

Both sides shoot at once, each page is diffed the moment both screenshots exist, and an unchanging baseline is reused, so re-runs only capture the after side.

90s → 32s
24-page Craft 3 → 4 comparison
20s
re-run, reusing the baseline
visualdiff app icon

A Mac app with everything inside

Node and Chromium are built in. It lives in the menu bar, notifies you when a comparison finishes, and installs the vdiff command for your terminal.

Coming soon Coming soon for Apple Silicon Macs. Tell me when it's out

Ship the upgrade knowing what changed.

Free for up to 10 pages per comparison, no account needed. Yearly licences per seat for full sweeps.

Coming soon See pricing

Tell me when it's out

visualdiff for Mac is nearly ready. Leave your email and we'll send you one message when you can download it.

Just the launch email. No newsletter, and we never share your address.