Regions in Local TDD and Storybook SDK Performance Fixes

Hot spot regions now work in local TDD mode for smarter auto-approval. We also fixed some Puppeteer issues in the Storybook and Static-Site SDKs by migrating to Playwright, plus a handful of CI quality-of-life improvements.

The local hot spot feature in this post is no longer part of Vizzly. The Playwright and CI updates still apply.

A few updates from the past week. The big one is that hot spot regions now work in local TDD mode. We also fixed some performance issues in the Storybook and Static-Site SDKs, and made the CLI more resilient in CI environments.

Regions Now Work in Local TDD

Hot spot regions let you mark areas of your screenshots that change frequently (timestamps, avatars, ads) and Vizzly auto-approves diffs that fall within those regions. It’s been one of the more useful features for reducing noise in visual tests.

The limitation was that regions only worked in cloud mode. If you were running locally with vizzly tdd, you’d still get flagged on every timestamp change. That meant the local development experience didn’t match what you’d see in CI.

Now when you download baselines from the cloud, your confirmed regions come bundled with them. They’re saved to .vizzly/regions.json alongside your baselines. During local comparisons, if 80% or more of the diff falls within confirmed regions, it auto-passes as “region-filtered.”

To see where regions are defined, press G in the fullscreen viewer. Green boxes overlay the screenshot showing exactly what’s being filtered. The threshold and intersection logic match the cloud behavior, so what passes locally should pass in CI.

Storybook & Static-Site SDK Performance

We ran into issues with Puppeteer’s newer headless mode causing timeouts during parallel screenshot capture. Screenshots that should complete quickly were hanging for 60+ seconds in CI, then failing. After some investigation, we traced it to how we were managing browser contexts.

The fix was migrating both SDKs to Playwright. Playwright’s BrowserContext handles parallel workers more reliably — screenshots now complete in under a second.

While we were in there, we made a few other improvements:

  • Client-side navigation for Storybook: Instead of doing a full page reload for every story, we now load the page once and navigate between stories using Storybook’s internal API. This dropped capture time from 94 seconds to about 2 seconds for a 10-story test suite.
  • Browser flag cleanup: Some deprecated Chrome flags (--disable-gpu + --disable-software-rasterizer) were causing issues in headless mode. We removed those and added flags for screenshot consistency (--force-color-profile=srgb, --hide-scrollbars).
  • Viewport sorting: Tasks are sorted by viewport now, so the browser resizes less often.

If you’ve been seeing flaky timeouts in CI with the Storybook or Static-Site SDKs, upgrading should help.

Fullscreen Review Queue Filters

When you applied filters in the table view (viewport, browser, status, custom metadata), they weren’t carrying over to the fullscreen review queue. You’d filter down to what you wanted, enter fullscreen, and see everything again.

Filter state now syncs between views. The fullscreen queue respects whatever filters you set in the table. Custom metadata filters (component, feature, testSuite) work too. Everything syncs to the URL so you can share filtered views with your team.

We also added auto-switching: when you approve all items in a filtered view, it switches to the “All” tab automatically instead of leaving you on an empty queue.

CI Resilience

A few changes to make the CLI behave better in CI:

Resilient finalize command: If you ran vizzly finalize with a parallel ID that had no matching build (tests skipped, ID mismatch, etc.), it would exit with code 1 and fail your pipeline. Now it warns and exits 0 by default. Pass --strict if you want the old behavior.

VIZZLY_BUILD_NAME environment variable: You can now set build names via environment variable instead of CLI flags:

export VIZZLY_BUILD_NAME="PR #${PR_NUMBER} - ${BRANCH_NAME}"
vizzly run "npm test"

Graceful 5xx handling: If the Vizzly API returns a 5xx error, the CLI now warns and continues instead of failing your pipeline. Temporary issues on our end shouldn’t break your builds.

SSO Domain Auto-Join

For enterprise teams: users signing up with email/password now automatically join your organization when their email domain matches a configured SSO domain. Previously this only worked with Google OAuth signups.


Check out the changelog for the full list of recent updates, or run vizzly tdd to try the local visual development workflow.

Ready to improve your visual workflow?

Start using Vizzly today and bring visual regression testing into the workflow described in this article.