The Percy alternative with free pixel snapshots.
Compare every screen with an approved baseline, in the browser and on real devices. Pixel snapshots cost no credits, and AI checks cover the screens where exact pixels don't matter.
1,000 credits, no card, 14 days.
Deterministic pixel checks + AI checks
Use exact pixels when every pixel matters, and a plain-language check when you only care that the screen is right.
Pixel checks
Every pixel is compared with the approved baseline. You set how different a pixel must be and how much of the screen may change, and mask clocks, ads and anything else that moves.
- Up to 20 ignore regions per check
- A size change always counts as changed
- Pixel snapshots cost no credits
AI checks
Write what must be true on the screen in plain language. A model says pass, fail or unsure, and you decide what unsure means for that check.
- "The plan shown is Team and usage reads 12%"
- Compare with the baseline, or the new screen alone
- 1, 4 or 12 AI-check credits by model
See what changed. Decide in one click.
Baseline, new and difference
Three panes side by side with zoom and the changed regions boxed.
A wipe slider
Drag across the screen to see exactly what moved.
Approve or reject in one click
Approve as the new baseline, reject, or confirm it as a bug. Every decision can be undone.
A review queue per suite
Changed screens wait in one list, with bulk approve and reject.
Baselines without the busywork
The first screen becomes the baseline automatically. Undo it if it was wrong.
Real devices too
On phones the screenshot is taken on the device, with system bars left out by default.
Two lines in the tests you already have
Works with Playwright, and with WebdriverIO and selenium-webdriver suites on the Kifas hub through @kifas/appium.
npm install --save-dev @kifas/playwrightimport { kifas } from '@kifas/playwright'
await kifas.visualCheck(page, 'checkout-page', { mask: ['.timestamp'] })
await kifas.visualCheck(page, 'billing', {
mode: 'ai',
prompt: 'The plan shown is Team and usage reads 12%',
compareTo: 'none',
})One call changes. Your tests stay.
Swap the snapshot call, keep the names you use today, and move ignored areas to the mask option.
import percySnapshot from '@percy/playwright'
await percySnapshot(page, 'Checkout')import { kifas } from '@kifas/playwright'
await kifas.visualCheck(page, 'Checkout')Kifas and Percy
Questions teams ask before switching
Is it a drop-in for Percy?
Not line for line. Each percySnapshot(page, name) call becomes kifas.visualCheck(page, name), and options like ignored areas move to the mask option. Most suites change with a find and replace.
Are pixel snapshots really free?
Yes. Pixel snapshots cost no credits, however many you take. AI checks use AI-check credits: 1, 4 or 12 depending on the model.
Does it work on mobile apps?
Yes. With @kifas/appium, WebdriverIO and selenium-webdriver suites on the Kifas hub get the same pixel and AI checks. The screenshot is taken on the device, so nothing is uploaded from your CI.
How do I stop noisy diffs?
Mask the parts that change on every run, like clocks and ads, and tune the sensitivity and the share of pixels allowed to change. For screens where exact pixels do not matter, use an AI check instead.
Catch visual bugs before your users do.
Start free with 1,000 credits. Pixel snapshots cost nothing.
1,000 credits, no card, 14 days.
BrowserStack and Percy are trademarks of their respective owners.