Catch the UI regressionstests miss
Buddy snapshots your rendered UI, compares every view against an approved baseline, and fails the pipeline when a layout shifts, a color drifts, or an element quietly disappears — in GitHub Actions, Buddy, or on your machine.
How Visual Tests work
Agents ship UI faster than anyone can eyeball it. Visual Tests are the checkpoint every change passes before it can touch your baseline.
- 01PlanA ticket, a prompt, a fix.
- 02Change landsAn agent or dev writes it.
- 03Visual TestsView diffed, pixel by pixel.
- 04Human reviewApprove, or send it back.
- 05Baseline updatedThe new reference is set.
What Visual Tests do
Six capabilities, one structural difference: every comparison runs in the pipeline that ships your code.
Pixel-perfect diffs.
Every changed region flagged against the approved baseline — thresholds down to a single pixel.
One baseline per branch.
Compared against the approved version from your branch's ancestor commit — you review each change once.
Every browser and device.
Chrome, Firefox, and Safari — from 4K desktop down to phones, each with its own viewport and pixel ratio.
Tame the noise.
Ignore dynamic regions by CSS or XPath, tune the diff threshold, and wait for late-loading content.
Gates the pipeline.
The approval action suspends the run; in GitHub, the commit status blocks the merge.
Approve in one click.
Baseline and current side by side, diffs highlighted, grouped into a filterable tree.
Set up your stack in 90s
Wrap your existing E2E run and Buddy captures snapshots as your tests navigate — or skip the test code entirely with Storybook.
Set up tests for Playwright
Wrap Playwright's test with the Buddy fixture, then call takeSnap() on any stable UI state.
import { test as base } from "@playwright/test";
import withVisualTestPluginFixture
from "@buddy-works/visual-tests-playwright";
const test = withVisualTestPluginFixture(base);
test("Homepage", async ({ page, visualTestPlugin }) => {
await page.goto("http://localhost:3000/");
await visualTestPlugin.takeSnap(page, "homepage");
});One CLI runs it all
Scriptless capture, wrapped E2E runs, CI gating — every flow above starts from the bdy CLI. Install it and capture your first snapshot.