See every unintended UI changebefore your users do.
Verity writes Playwright visual tests that reach a stable state of each key screen, mask volatile regions like timestamps and avatars, and compare a screenshot against a baseline committed in your repository. A change over your threshold is flagged as changed — you approve the new baseline or fix the regression.
What it checks
Layout and styling drift
Broken grids, overlapping elements, missing icons, wrong colours after a CSS or dependency change.
Key screens and components
Full pages or a single component, each in its own focused spec.
Noise-free comparisons
Dynamic content is masked and one suite-wide threshold controls how much pixel drift is allowed.
First-run baselines
A new test captures its baseline in CI and hands it back as an artifact to commit — same OS as later runs.
How it works
- 01
Paste a URL
Verity picks stable states worth snapshotting and writes one spec per state.
- 02
Run once to capture baselines
Download the captured images from the CI artifact and commit them next to the specs.
- 03
Every PR compares
Changes over your threshold are reported as changed snapshots with the diff.
import { test, expect } from "@playwright/test";
test("pricing page looks right", async ({ page }) => {
await page.goto("https://staging.example.com/pricing");
await page.getByRole("heading", { name: "Pricing" }).waitFor();
await expect(page).toHaveScreenshot("pricing.png", {
fullPage: true,
mask: [page.getByTestId("live-chat")],
});
});Why teams choose Verity
Unlimited snapshots
Baselines live in your repo and run in your CI, so there is no per-screenshot fee.
Standard Playwright
toHaveScreenshot, the same API your team already knows.
One threshold to tune
Set the allowed drift once in CI Setup instead of in every test.
One place for every test type
UI, API, visual, AI-agent, load and security results share one run history and one verdict per release. Every plan includes all six.
Frequently asked questions
Where are visual baselines stored?
In your repository, next to each spec. CI compares against them; you update them by committing new images.
Why do baselines need to be captured on the CI OS?
Fonts and anti-aliasing render slightly differently per operating system. Capturing baselines on the same OS as CI (Linux on GitHub-hosted runners) avoids false diffs — Verity's first run does exactly that.
How do you avoid flaky visual tests?
Specs wait for the key element, mask volatile regions, and use a suite-wide pixel-drift threshold rather than an exact match.
Related
Try it on your own app.
Free plan, no credit card: 15 AI-written tests a month and unlimited runs in your CI.