Each screenshot is stored with the page's DOM and computed styles. A diff
is reported as a kind of change, with the element it belongs to:
"style-only change on button.cta", "likely render noise",
"layout shift". MIT-licensed and free to use, including commercially.
Runs on your machine and in CI; no account.
Fine when a pixel count answers the question. Where it does not:
--update-snapshots rewrites every snapshot the run touched. TestivAI approves from a reviewed PR comment, write access verified.maxDiffPercent or a pixel budget. Optional auto-pass for likely render noise, labeled in the report.button.cta". Styles not recorded: "styles not compared". Browser or OS changed, page unchanged: "rendering drift". A font or stylesheet failed to load (Playwright, testivai witness): "unhealthy capture", never noise./testivai approve: baselines are committed back, and the reply names the run you approved.fail-on-diff makes it a hard gate.Pixels, DOM, computed styles, and which element owns each changed region. One verdict per snapshot.
explain_snapshot hands it the evidence. No hosted AI, no API key. Example payload →One capture call in the tests you already have.
No test suite: npx testivai witness http://localhost:3000 captures each page it finds. For AI-built apps →
pip install "testivai[playwright]"gem "testivai"testivai-report plugin shows the whole report in Claude Code.@testivai/mcpMIT-licensed, free to use. Start with one page.