Pixel-only visual testing drowns teams in false positives. A font re-hint or
an anti-aliasing shift between machines lights up as a change, people spend
their week re-approving noise, and eventually someone turns the whole thing
off.
TestivAI pairs every screenshot with a snapshot of the DOM. When the pixels
differ but the structure is identical, the report says so instead of crying
wolf. When something really did change, you get a verdict you can act on,
like div.card:nth-of-type(2) shifted +8px
vertically, content unchanged.
DOM-aware noise detection
Identical structure with different pixels reads as render jitter. Identical
DOM with changed computed styles reads as a style change on the element,
never as noise.
Element-level attribution
Reports name the element that moved and by how much, derived from layout
rather than guessed from pixels. Injected banners show up as everything
below y=80 shifting together.
Local first
Capture, diff and report generation all run on your machine. No account,
no API key, no upload. Baselines live in your git history.
Framework adapters
Playwright in TypeScript, JavaScript and Python, plus WebdriverIO and
Selenium, with Java experimental. Every language shares one set of
baselines and one report.
Approvals in the pull request
A GitHub Action posts the diff on the PR and updates baselines from a
/testivai approve comment, so approval
stays a human decision.
Eyes for coding agents
An MCP server and a versioned
results.json let Claude Code or Cursor
read what changed and fix it, without a hosted model in the loop.
npm install -D @testivai/witness-playwright @playwright/test
npx testivai witness http://localhost:3000
visual-report/index.html
✓ styles changed on button.cta (DOM identical)
✓ div.card:nth-of-type(2) shifted +8px vertically