comparison· 16 min read· by Pramod Dutta

Percy vs BrowserBash: Visual Regression vs AI Verdicts

A Percy visual testing alternative that judges functional outcomes. Compare Percy snapshot diffs to BrowserBash AI pass/fail verdicts in CI.

If you have shipped a frontend in the last few years, you have probably been burned by a CSS change that looked harmless in the diff and quietly broke a checkout button two pages away. Percy exists to catch exactly that, and if you are evaluating a Percy visual testing alternative, the first thing to get straight is that Percy and BrowserBash answer two different questions. Percy asks "did the pixels change?" BrowserBash asks "did the flow still work?" Both are legitimate questions. The mistake teams make is assuming one tool covers both, then being surprised when it does not.

This is not a takedown of Percy. It is a mature, well-built product from BrowserStack, and for visual regression it does its job well. The goal here is to be honest about what each tool is actually for, show where they overlap (less than the marketing of either would suggest), and help you decide whether you want a pixel diff, a functional verdict, or both sitting side by side in your pipeline.

What Percy actually is

Percy is a visual testing and review platform. You add Percy to your existing test suite — Cypress, Playwright, Selenium, WebdriverIO, Storybook, and others — and at chosen points you call a snapshot command. Percy captures the rendered DOM, ships it to its cloud rendering service, rasterizes it across the browsers and widths you configure, and compares each render against an approved baseline. When pixels differ beyond your threshold, Percy surfaces a visual diff and blocks the build until a human approves or rejects the change.

The mental model Percy pushes is "visual review as part of CI." Your developers already open pull requests; Percy adds a visual approval step to that flow. A reviewer sees the before/after, eyeballs whether the change is intentional, and clicks approve. Approved snapshots become the new baseline. It is, at its heart, a managed pixel-diffing and human-review service with smart rendering to cut down on false positives from anti-aliasing, fonts, and dynamic content.

Percy is part of BrowserStack now, so it plugs into BrowserStack's broader testing cloud. Pricing, as of 2026, is screenshot-based: there is a free tier with a monthly screenshot allowance, and paid tiers scale with how many screenshots you render per month. Treat any specific number as a snapshot in time — BrowserStack moves its packaging, so confirm the current screenshot quotas and prices on their own pricing page before you budget around them.

The core thing to internalize: Percy is a hosted visual-regression service. It renders, diffs, and routes pixel changes to a human for approval. It does not, on its own, decide whether your login worked or your cart total is correct. It tells you what looks different and lets a person judge whether different is bad.

What BrowserBash actually is

BrowserBash is a free, open-source command-line tool (Apache-2.0) from The Testing Academy, built by Pramod Dutta. You install it with one command:

npm install -g browserbash-cli

Then you describe what you want in plain English, and an AI agent drives a real Chrome or Chromium browser step by step. There are no selectors, no page objects, no await page.click('[data-testid=...]'), and no snapshot calls sprinkled through a test file. You write the objective; the agent figures out how to accomplish it and returns a verdict plus structured results.

browserbash run "Log in with the demo account, add a laptop to the cart, complete checkout, and verify the page shows 'Thank you for your order!'"

That last clause is the whole point. BrowserBash does not hand you a pixel diff and ask you to decide. It carries out the flow and tells you whether the outcome you described actually happened. Pass or fail, with a reason.

The model story is the part that surprises people. BrowserBash is Ollama-first. By default it uses free local models running on your machine — no API keys, nothing leaving your laptop or your CI runner. It auto-resolves a local Ollama install first, then falls back to ANTHROPIC_API_KEY, then OPENROUTER_API_KEY if you have those set. So you can run a genuinely $0 model bill on local models, or bring a capable hosted model (Anthropic Claude, or free hosted models through OpenRouter like openai/gpt-oss-120b:free) when a flow is hard.

That brings me to the honest caveat I will repeat: very small local models (around 8B parameters and under) get flaky on long, multi-step objectives. They lose the thread, click the wrong thing, or declare victory early. The reliable sweet spot is a mid-size local model in the Qwen3 / Llama 3.3 70B class, or a capable hosted model for the genuinely hard flows. If you point BrowserBash at a tiny model and ask it to navigate a ten-step checkout, do not be shocked when it wobbles. Match the model to the flow.

No account is needed to run anything. There is an optional, opt-in free cloud dashboard (browserbash connect plus --upload) that gives you run history, video recordings, and per-run replay, and a fully local dashboard (browserbash dashboard) if you want to keep everything on your own machine. Free uploaded runs are kept for 15 days.

Pixels versus verdicts: the core distinction

Here is the framing that should drive your decision, because it is the one most comparison articles skip.

A visual regression tool answers a presentational question. It does not know or care what your app does. It knows what your app looks like and flags when that appearance changes. If a button moves three pixels, Percy notices. If the button still works perfectly but its border color shifted, Percy notices. If the button is completely broken — clicking it does nothing — but it looks pixel-identical to the baseline, Percy says nothing, because nothing looks different.

A functional verdict tool answers a behavioral question. BrowserBash does not diff pixels. It carries out the objective and reports whether the goal state was reached. If the checkout completes and the confirmation text appears, it passes. If the button is broken and the order never goes through, it fails — even if every pixel on the page is identical to last week. It does not, by itself, flag that your brand color drifted from #0B5FFF to #0C5EFE, because that subtle shift does not change whether the flow succeeded.

You can see why pretending these are competitors is unhelpful. They catch different classes of bug:

Bug type Percy catches it? BrowserBash catches it?
Button visually shifted / restyled unintentionally Yes Usually not
Font, spacing, or color regression Yes Usually not
Layout broken on a specific viewport width Yes Sometimes (if it blocks the flow)
Login silently fails despite identical-looking page No Yes
Checkout button is dead but looks fine No Yes
Wrong cart total / wrong order confirmation No Yes
Form submits but shows the wrong success state No Yes
A modal never appears, blocking the next step Sometimes Yes

Read that table twice. The columns barely overlap. A pixel-perfect page can be functionally dead, and a fully working page can have an ugly visual regression. If you only run one of these tools, you are blind to an entire category of failure. That is the honest core of this whole comparison, and it is why "Percy visual testing alternative" is a slightly loaded search — the most accurate answer for many teams is "a functional-verdict layer that sits next to Percy," not "a drop-in replacement for it."

Authoring: snapshot calls versus plain-English objectives

Day to day, the authoring experience is where the two tools feel most different.

With Percy, you instrument an existing test. You already have a Playwright or Cypress spec that navigates somewhere, and you drop in a snapshot call at the moments you care about:

That means Percy inherits whatever you already wrote to reach each state. The functional driving — the clicks, the form fills, the waits — is still your Playwright or Cypress code with its selectors and maintenance burden. Percy adds the visual checkpoint on top; it does not author the journey for you.

With BrowserBash, there is no underlying script to maintain. You describe the journey itself in plain English and the agent drives:

browserbash run "Go to the pricing page, switch the billing toggle to annual, and confirm the Pro plan price updates to show a yearly figure"

No selectors. No data-testid. No waiting on a flaky animation by hand. When the UI gets restructured, you do not rewrite a locator — the agent re-reads the page and finds the toggle again, because you told it what you wanted, not which DOM node to click.

Committable Markdown tests

For teams that want something more structured and reviewable than a one-off command, BrowserBash supports committable Markdown test files. Each list item is a step, you can compose files with @import, and you can template values with {{variables}} — including secret-marked variables that get masked as ***** in every log line.

browserbash testmd run ./checkout_test.md

A checkout_test.md might read like a checklist a product manager could review: log in, add the item, go to checkout, fill the shipping form, submit, verify the confirmation. After each run, BrowserBash writes a human-readable Result.md so the artifact of a test is something a non-engineer can actually read. Percy's artifacts, by contrast, are visual diffs in a review UI — excellent for what they are, but a different kind of artifact for a different audience.

Output, CI, and the agent-mode story

This is where BrowserBash was built for a world Percy was not designed for: AI coding agents and pipelines that consume structured output.

Percy's primary output is a hosted review experience. A build gets a Percy status, a human opens the dashboard, and approves or rejects diffs. That human-in-the-loop step is a feature for visual review — you genuinely want a person eyeballing whether a redesign is intentional — but it is also a gate that does not fully automate. Someone has to look.

BrowserBash leans the other way. Agent mode emits NDJSON — one JSON event per line — on stdout, and it uses real exit codes so your pipeline can branch without parsing prose:

browserbash run "Sign in and confirm the dashboard loads the user's projects" --agent --headless

A CI job, a Makefile, or an AI coding agent can read those exit codes directly. There is no "wait for a human to click approve" in the loop unless you choose to add one. That makes BrowserBash a natural fit as the browser-driving, outcome-verifying layer inside a larger automated system — for example, an AI agent that just shipped a code change and wants to confirm the deployed app still completes a real user journey before it moves on.

If you want a deeper walk-through of structured output for pipelines, the BrowserBash learn section covers agent mode and exit codes, and the blog has CI patterns you can copy.

Recording, replay, and evidence

Both tools produce evidence, but the evidence is shaped by what they care about.

Percy's evidence is the diff: side-by-side renders across configured browsers and widths, with the changed regions highlighted. When you need to prove what looked different, that is exactly the artifact you want.

BrowserBash's evidence is the run. With --record, it captures a screenshot and a full .webm session video (via ffmpeg) on any engine, so you can watch the agent actually drive the flow:

browserbash run "Complete the password reset flow end to end" --record --upload

On the builtin engine, recording additionally captures a Playwright trace you can open in the trace viewer — network, console, DOM snapshots, the works. If you opt into the cloud dashboard, --upload gives you per-run replay and history; if you would rather keep everything local, browserbash dashboard runs a fully local dashboard with no account. When you need to prove that the flow worked (or show exactly where it broke), a video of the real session is the right artifact, the same way a pixel diff is the right artifact for a visual change.

Where the browser runs: providers and cross-browser

Percy renders snapshots across the browsers and widths you configure, in its cloud rendering pipeline. Cross-browser visual coverage is genuinely one of its strengths — it is built to show you how a page renders in different engines at different breakpoints.

BrowserBash defaults to driving your local Chrome, which is fast and free, but it is not locked to your machine. One flag changes where the browser runs:

browserbash run "Verify the signup form rejects an invalid email" --provider lambdatest

Providers include local (default, your Chrome), cdp (any DevTools endpoint), browserbase, lambdatest, browserstack. So you can run the same plain-English check on a managed grid for broader OS/browser coverage when you need it. That said, be honest with yourself about the difference: BrowserBash's cross-browser story is about running the functional check in another environment, not about rendering and diffing pixels across a matrix of browsers and viewport widths the way Percy does. If pixel-accurate cross-browser visual coverage is the job, that is Percy's lane, not BrowserBash's.

Honest overlaps and honest gaps

Let me name the overlaps and the gaps plainly, because credibility matters more than a clean win.

Where they genuinely overlap: both can be wired into CI to gate a build, both give you per-environment runs, and both reduce the "did this deploy break the site?" anxiety. If your only goal is "fail the build when something is wrong on the page," either tool can be part of that — they just define "wrong" differently.

Where Percy is the better fit, full stop:

If those describe you, Percy is doing exactly what it was built for, and a functional-verdict tool will not replace it. Do not rip it out.

Where BrowserBash is the better fit:

The honest gap in BrowserBash: it does not do pixel-level visual regression. It will not flag that your button drifted from blue to a slightly different blue, because that does not change whether the flow succeeded. If subtle visual drift is the bug you lose sleep over, BrowserBash is the wrong tool to lose sleep with. That is not a knock — it is just a different category, and you already knew that from the table.

A realistic CI setup using both

The most defensible answer for a serious frontend team is not either/or. The two tools cover different failure classes, so run both and let each do what it is best at.

A concrete division of labor:

When a deploy goes out, BrowserBash tells you the checkout still completes and the confirmation text appears. Percy tells you the checkout page did not unexpectedly reflow on mobile. If the button silently broke, BrowserBash catches it and Percy stays quiet. If the button got accidentally restyled, Percy catches it and BrowserBash stays quiet. You are now covered on both axes instead of pretending one tool covers both.

If you want to see how teams structure that handoff, the case studies walk through real flows, and the pricing page lays out what is free (almost everything) and what the optional cloud dashboard adds.

When to choose Percy

Choose Percy if:

If most of those describe you, a "Percy visual testing alternative" is not really what you are looking for — you want Percy, and you should keep it.

When to choose BrowserBash

Choose BrowserBash if:

The features page breaks down the providers, engines, and recording options if you want to go deeper before installing.

FAQ

Is BrowserBash a real Percy visual testing alternative?

Only partly, and it is worth being precise about it. BrowserBash verifies functional outcomes — it drives a real browser and tells you whether a flow worked — while Percy does pixel-level visual regression and human-reviewed diffs. They catch different classes of bug, so BrowserBash is a strong complement to Percy and a replacement only if your actual need was "confirm the flow works," not "catch subtle visual changes." Many teams run both.

Does BrowserBash do pixel-diff visual regression like Percy?

No. BrowserBash judges whether the objective you described in plain English succeeded, not whether the rendered pixels changed against a baseline. It will not flag a small color or spacing shift that leaves the flow working, which is exactly the kind of regression Percy is built to catch. If pixel-accurate visual diffing is your core requirement, Percy is the right tool for that specific job.

How much does BrowserBash cost compared to Percy?

BrowserBash is free and open-source under Apache-2.0, with no per-screenshot or per-run pricing. On local models your model bill is genuinely $0 because you use compute you already own and nothing leaves your machine; if you use hosted models you pay your provider directly with no markup. Percy uses screenshot-based pricing with a free tier and paid tiers that scale with monthly screenshot volume as of 2026, so confirm current numbers on BrowserStack's pricing page.

Can I use BrowserBash and Percy together in the same pipeline?

Yes, and for many frontend teams that is the strongest setup. Run BrowserBash to confirm flows actually work — login, checkout, forms — gating builds with exit codes, and run Percy on the same builds to catch visual regressions across your configured browsers and widths. Each tool covers a failure class the other misses, so together they close gaps that neither closes alone.

Ready to add a functional-verdict layer next to your visual tests? Install it with npm install -g browserbash-cli and run your first plain-English check in minutes. An account is entirely optional — everything runs locally out of the box — but if you want run history, videos, and replay, you can sign up for the free dashboard whenever you are ready.

Try it on your own appnpm install -g browserbash-cli
Start learning