Compare the tools
Every row is one YAML file in the repository, with a date it was last checked and links to the vendor's own documentation for each claim. Pricing is listed as a model, never as numbers, because numbers are the first thing to go stale. Click a row for the details, the sources, and a link to correct it.
The column most comparisons leave out is machine-readable results: what a tool running after the tests can read. Most tools leave you image folders and nothing else, hosted services keep the results inside their app, and a few write a JSON report. The manifest column says whether a tool writes the run manifest itself, has a converter in visual-regression-manifest, or fits the generic image-triple converter.
| Tool | Category | Runs | Review | Baselines | Pricing | Machine-readable results | Manifest |
|---|---|---|---|---|---|---|---|
| Applitools Eyesproprietary | Hosted review services | cloud | web app, pull request | service | custom quote | none, results stay in the service | none |
| Argos | Hosted review services | cloud | pull request, web app | service | free tier, paid plans | none, results stay in the service | none |
| BackstopJS | Runner integrations | local | local files | repository | free | JSON report | converter |
| Chromaticproprietary | Hosted review services | cloud | pull request, web app | service | free tier, paid plans | none, results stay in the service | none |
| cypress-image-diff-js | Runner integrations | local | local files | repository | free | JSON report | generic converter |
| cypress-image-snapshot | Runner integrations | local | local files | repository | free | images only | converter |
| cypress-visual-regression | Runner integrations | local | local files | repository | free | images only | converter |
| Detox | Mobile and native | local | local files | repository | free | none | none |
| Flutter golden tests | Mobile and native | local | local files | repository | free | images only | generic converter |
| Happoproprietary | Hosted review services | cloud | pull request, web app | service | per screenshot | none, results stay in the service | none |
| jest-image-snapshot | Runner integrations | local | local files | repository | free | images only | converter |
| Loki | Runner integrations | local | local files | repository | free | images only | generic converter |
| looks-same | Diff engines | local | local files | repository | free | none | none |
| Lost Pixel | Hosted review services | local or cloud | local files, pull request, web app | repository or service | free tier, paid plans | images only | generic converter |
| Maestro | Mobile and native | local or cloud | local files, web app | repository | free tier, paid plans | images only | generic converter |
| Meticulousproprietary | Hosted review services | cloud | pull request, web app | service | custom quote | none, results stay in the service | none |
| odiff | Diff engines | local | local files | repository | free | none | none |
| Paparazzi | Mobile and native | local | local files | repository | free | images only | generic converter |
| Percyproprietary | Hosted review services | cloud | pull request, web app | service | free tier, paid plans | none, results stay in the service | none |
| pixelmatch | Diff engines | local | local files | repository | free | none | none |
| pixsame | Runner integrations | local or cloud | local files, pull request | repository | free tier, paid plans | run manifest | writes it |
| Playwright toHaveScreenshot | Runner integrations | local | local files | repository | free | JSON report | converter |
| React Native Owl | Mobile and native | local | local files | repository | free | images only | generic converter |
| reg-suit | Hosted review services | self-hosted | pull request, web app | service | free | JSON report | generic converter |
| Resemble.js | Diff engines | local | local files | repository | free | none | none |
| Roborazzi | Mobile and native | local | local files | repository | free | JSON report | converter |
| Sauce Visualproprietary | Hosted review services | cloud | web app, pull request | service | custom quote | none, results stay in the service | none |
| Shot | Mobile and native | local | local files | repository | free | images only | generic converter |
| swift-snapshot-testing | Mobile and native | local | local files, IDE | repository | free | images only | generic converter |
| Vitest toMatchScreenshot | Runner integrations | local | local files | repository | free | images only | converter |
| Vizzlyproprietary | Hosted review services | local or cloud | local files, pull request, web app | service | free tier, paid plans | JSON report | generic converter |
How to read it
- Runs: where the comparison happens. Local tools diff on the machine running the tests; cloud services take screenshots or DOM snapshots and diff on their side; self-hosted means you run the service.
- Review: where a human looks at the diff. Local files means opening the images yourself; pull request means a comment or check on the PR; web app means the service's own UI.
- Baselines: where the reference images live. In the repository they version with the code; in a service they version with the service's notion of a branch.
- Pricing: free, a free tier with paid plans, per screenshot, per seat, or a custom quote. Check the vendor for the numbers.
Adding or correcting a tool
Open a pull request with a YAML file under apps/site/data/tools/. Every field is validated at build time, every claim needs a source URL from the tool's own documentation, and lastVerified is the day you checked. Vendor contributions are welcome and are held to the same standard as everyone else's.
Choosing a tool
The four questions that narrow the field, the trade-offs between local tools and hosted services, and what to look for so you can change your mind later.
The run manifest
One JSON file per test run that lists every screenshot comparison, built upon CTRF, written by several tools and read by PR bots and review apps.