Skip to content

Releases: vizzly-testing/cli

🧪 Vitest Integration v0.2.0

01 Jun 02:33

Choose a tag to compare

[0.2.0] - 2026-06-01

What's Changed

Added

  • Added automatic screenshot metadata for Vitest captures, including the current
    page URL, browser, viewport, viewport width, and viewport height.
  • Added support for Vitest and Playwright screenshot capture options such as
    animations, caret, mask, maskColor, omitBackground, scale, and
    timeout.
  • Added minClusterSize and failOnDiff options to toMatchScreenshot.
  • Added support for calling toMatchScreenshot with options only, without a
    screenshot name.

Changed

  • Visual diffs are now recorded without failing the assertion unless
    failOnDiff is enabled by the screenshot option, environment, or Vizzly TDD
    server configuration.
  • New screenshot baselines now pass after being created, so first-time captures
    do not fail the Vitest run.
  • vizzlyPlugin is now configuration-free; pass screenshot behavior through
    toMatchScreenshot options instead.
  • Package scripts and docs now use pnpm commands for installation and test
    workflows.

Fixed

  • Fixed element screenshots so fullPage is not passed to element capture or
    recorded as full-page metadata.
  • Fixed Vizzly-only options so they are sent to Vizzly as comparison metadata
    instead of being forwarded to browser screenshot capture.
  • Fixed reserved runtime metadata such as framework, Vitest marker, URL, and
    browser so user-provided properties cannot accidentally overwrite the current
    browser session values.

Full Changelog: vitest/v0.1.1...vitest/v0.2.0

📱 Swift SDK v0.1.0

01 Jun 03:12

Choose a tag to compare

[0.1.0] - 2026-06-01

What's Changed

This is the first tagged release of the Vizzly Swift SDK. It gives iOS and
macOS test suites a small Swift Package Manager client for sending screenshots
to Vizzly from XCTest, without needing each app to hand-roll the HTTP payloads
or local TDD server discovery.

Added

  • Added the Vizzly Swift package with two library products:
    • Vizzly, the core screenshot upload client.
    • VizzlyXCTest, convenience helpers for XCTestCase, XCUIApplication,
      and XCUIElement.
  • Added local TDD server discovery through VIZZLY_SERVER_URL,
    project-local .vizzly/server.json, global .vizzly/server.json, and the
    default TDD port fallback.
  • Added screenshot uploads with base64 PNG payloads, buildId support,
    request timeouts, and graceful disabling after connection or server failures.
  • Added XCTest-friendly metadata capture for platform, device, OS, viewport,
    and element type while still letting user-provided properties win.
  • Added comparison options for threshold, minClusterSize, and fullPage
    so Swift screenshots use the same option contract as the other SDKs.
  • Added failOnDiff support from explicit client configuration,
    VIZZLY_FAIL_ON_DIFF, and discovered TDD server settings.

Tested

  • Added Swift unit coverage for payload shape, comparison options, build IDs,
    metadata merging, disabled clients, and client state.
  • Added Swift SDK E2E coverage that runs through the real local Vizzly TDD
    server and verifies screenshots can be uploaded, repeated, and matched.
  • The release workflow builds and tests the Swift package before tagging the
    release.

📚 Storybook Plugin v0.8.0

01 Jun 02:30

Choose a tag to compare

[0.8.0] - 2026-06-01

What's Changed

Added

  • Added support and documentation for Storybook 10 projects.
  • Added a CLI-discoverable plugin entrypoint at @vizzly-testing/storybook/plugin.
  • Added --no-headless, --no-full-page, --timeout, and
    --request-timeout command options.
  • Added per-story screenshot metadata for cloud uploads, including story ID,
    story title, story name, viewport name, viewport size, browser, URL, and
    custom parameters.vizzly.screenshot.properties.
  • Added per-story support for screenshot threshold, minClusterSize,
    fullPage, omitBackground, timeout, and requestTimeout overrides.

Changed

  • Screenshots now default to full-page capture. Use --no-full-page or
    storybook.screenshot.fullPage: false for viewport-only captures.
  • Default concurrency is now auto-detected from CPU cores instead of using a
    fixed value.
  • Include, exclude, and interaction hook patterns now match against more story
    fields, including ID, title/name, title, name, and import path.
  • Cloud run configuration now honors shared comparison settings such as
    comparison.threshold and comparison.minClusterSize.
  • JavaScript install and build examples now use pnpm.

Fixed

  • Fixed Storybook story URL capture so uploaded screenshots include the isolated
    story preview URL.
  • Fixed Storybook navigation fallback when client-side story rendering does not
    complete before the configured timeout.
  • Fixed cloud run finalization so builds are marked failed when screenshot
    capture has errors and finalized successfully when no stories are found.
  • Fixed static Storybook server shutdown so open connections do not keep the
    process alive.

Full Changelog: storybook/v0.7.0...storybook/v0.8.0

🏗️ Static Site Plugin v0.3.0

01 Jun 01:43

Choose a tag to compare

[0.3.0] - 2026-06-01

What's Changed

Added

  • Added browser engine selection for static-site captures. Use --browser
    or staticSite.browser.type to run screenshots in chromium, firefox,
    or webkit.
  • Added --no-headless, --no-full-page, and --no-use-sitemap CLI flags
    for clearer opt-out control over browser visibility, screenshot mode, and
    sitemap discovery.
  • Added --request-timeout and staticSite.screenshot.requestTimeout for
    controlling the Vizzly screenshot upload request timeout separately from the
    browser screenshot timeout.
  • Added richer screenshot metadata, including browser, page URL, full-page
    mode, viewport name, and viewport dimensions.
  • Added support for the shared top-level comparison.minClusterSize option in
    static-site cloud runs.

Changed

  • Full-page screenshots are now the default. Use --no-full-page or
    staticSite.screenshot.fullPage: false to capture only the viewport.
  • Default concurrency is now CPU-aware instead of a fixed value, with automatic
    defaults between 2 and 8 workers.
  • Screenshot viewport dimension properties now use viewport_width and
    viewport_height naming.
  • Static Site examples and documentation now use pnpm commands and the updated
    programmatic SDK context shape.

Fixed

  • Fixed include, exclude, interaction, and page override pattern matching so
    paths work consistently with or without a leading slash.
  • Fixed URL generation for discovered .html pages so paths that already end
    in .html are not requested with a duplicate .html suffix.
  • Fixed cloud build finalization so runs with screenshot failures are marked as
    failed instead of successful.
  • Improved missing-browser errors with the exact Playwright install command for
    the selected browser.
  • Improved static server shutdown so lingering connections do not keep the
    process open.

Full Changelog: static-site/v0.2.0...static-site/v0.3.0

💎 Ruby Client v0.3.0

01 Jun 02:57

Choose a tag to compare

[0.3.0] - 2026-06-01

What's Changed

Added

  • Added fail_on_diff support for local TDD visual diffs. Configure it with
    Vizzly::Client.new(fail_on_diff: true), VIZZLY_FAIL_ON_DIFF=true, or
    the local TDD server setting to raise Vizzly::Error when a visual diff is
    detected.
  • Added per-screenshot build_id and request_timeout options, with
    snake_case Ruby names and camelCase aliases for JavaScript API parity.
  • Added VIZZLY_ENABLED=false support to disable screenshot capture from the
    environment.
  • Added richer Client#info output, including serverUrl, buildId,
    fail_on_diff, and failOnDiff.

Changed

  • Screenshot option handling now separates Vizzly options from user metadata.
    Reserved options passed inside properties are promoted to the correct
    request fields and emit a warning so properties can remain user metadata.
  • threshold now accepts numeric values and is documented as a Delta E
    comparison threshold.

Fixed

  • Fixed request handling for HTTPS server_url values.
  • Fixed screenshot option serialization for string-keyed options, camelCase
    aliases, zero values, fractional thresholds, and nested metadata hashes.
  • Fixed local TDD diff handling so both current successful diff responses and
    legacy 422 diff responses are handled consistently when fail_on_diff is
    enabled.

Full Changelog: ruby/v0.2.1...ruby/v0.3.0

🐹 Ember SDK v0.1.0

01 Jun 02:36

Choose a tag to compare

[0.1.0] - 2026-06-01

What's Changed

Added

  • Added per-screenshot comparison options to vizzlyScreenshot(): threshold and minClusterSize.
  • Added support for per-screenshot buildId and requestTimeout options, including forwarding them through the Ember screenshot server to Vizzly.
  • Added automatic screenshot metadata for the current page URL, browser, viewport width, and viewport height so captures are easier to group, compare, and link back to preview pages.

Changed

  • Aligned the Ember SDK screenshot option contract with the other Vizzly JavaScript SDKs: Vizzly routing, comparison, timeout, and build options now stay as explicit options, while properties remains the custom metadata bag.
  • Updated screenshot capture behavior so requested viewport dimensions are applied before capture.
  • Changed full-page handling so fullPage only applies to page captures; app, container, and selector captures are element-sized.
  • Updated cloud upload guidance to run Ember tests through vizzly run so uploads can be finalized correctly.
  • Updated JavaScript package-management examples and test-app workflow from npm commands to pnpm commands.

Fixed

  • Fixed selector screenshots so page-only fullPage options are not passed to element screenshots.
  • Fixed cloud-mode/no-server messaging to point users to vizzly tdd start for local runs or vizzly run for cloud uploads.
  • Fixed stale .vizzly/playwright.json behavior by removing the generated Playwright config when no launcher options are provided.
  • Simplified Chromium CI launch arguments while retaining the stability flags needed for CI environments.

Full Changelog: ember/v0.0.3...ember/v0.1.0

✨ v0.35.0

31 May 23:12

Choose a tag to compare

What's Changed

Added

  • Added consistent screenshot option handling across the CLI and SDKs for
    threshold, minClusterSize, fullPage, buildId, and requestTimeout,
    with warnings when reserved options are accidentally placed in properties.
  • Added fail-on-diff propagation for local TDD flows across the JavaScript
    client, Vitest, Ember, Ruby, and Swift SDKs.
  • Added request timeout support to SDK screenshot calls and Storybook,
    static-site, Ember, Ruby, and Swift integrations.
  • Added --min-cluster-size support to vizzly upload and environment
    overrides for VIZZLY_THRESHOLD and VIZZLY_MIN_CLUSTER_SIZE.
  • Added a VizzlyXCTest Swift Package library target for XCTest helpers.

Changed

  • Aligned Storybook and static-site cloud runs to pass build metadata,
    comparison settings, pull request numbers, and parallel IDs consistently.
  • Updated SDK metadata so browser, viewport, URL, framework, and custom
    properties are sent consistently across Storybook, static-site, Vitest,
    Ember, Ruby, and Swift.
  • Improved Storybook and static-site options for browser visibility,
    screenshot timeouts, request timeouts, concurrency validation, and pattern
    matching.
  • Updated JSON output behavior and documentation so structured payloads are
    clearer and progress-style messages do not pollute stdout in JSON mode.

Fixed

  • Fixed vizzly upload --wait so failed comparisons return a non-zero exit
    code.
  • Fixed vizzly upload --upload-all so it bypasses SHA deduplication and sends
    every screenshot.
  • Fixed vizzly run, vizzly upload, and vizzly tdd to honor configured
    build branch, commit, message, build name, comparison, and parallel options.
  • Fixed vizzly preview --base path handling and JSON output fields.
  • Fixed vizzly api --data validation so request bodies require --method POST.
  • Fixed static-site capture for .html paths and leading-slash pattern matches.
  • Fixed Vitest screenshot matching so new baselines pass and visual diffs only
    fail assertions when fail-on-diff is enabled.
  • Fixed vizzly project link to honor the global --token override.

Developer Experience

  • Expanded TypeScript definitions for screenshot results, upload options,
    build results, failOnDiff, requestTimeout, and related SDK contracts.
  • Expanded SDK and CLI test coverage for aligned option handling, JSON output,
    uploads, TDD behavior, Storybook, static-site, Vitest, Ember, Ruby, and Swift.
  • Updated README and integration docs for linked projects, upload options,
    JSON output, browser flags, and SDK metadata conventions.

Full Changelog: v0.34.0...v0.35.0

✨ v0.34.0

27 May 23:10

Choose a tag to compare

What's Changed

Added

  • Added a packaged Vizzly agent skill so coding agents can understand Vizzly as screenshot memory, including baselines, diffs, review state, dynamic regions, and public screenshot URLs.
  • Added vizzly init --agent-skill to install the repo-local Vizzly skill.
  • Added vizzly init --agent-guidance to install the skill and add project-scoped AGENTS.md guidance for visual UI work.

Changed

  • Documented the agent setup flow in the README and JSON output docs.
  • Updated the CLI release workflow to generate release notes from the real release diff using Codex, while keeping the output concise and changelog-style.

Developer Experience

  • Hardened GitHub Actions around the current pnpm and GitHub runner environment by pinning Node 22.13.1, refreshing Corepack before preparing pnpm, and restoring Node after Codex release-note generation.
  • Built the package explicitly before npm publish and disabled publish lifecycle scripts so release builds do not fall back to the runner's older Node runtime.

Full Changelog: v0.33.0...v0.34.0

✨ v0.33.0

27 May 04:59

Choose a tag to compare

What's Changed

v0.33.0 is a polish and infrastructure release for the Vizzly CLI. The big theme is making the local visual review experience feel more current while tightening the package/install path for everyone working with the CLI and SDK clients.

Reporter UI refresh

  • Aligned the CLI reporter with the new BearDen design system, so local reports, comparison views, screenshots, filters, stats, settings, and fullscreen review all share the newer Vizzly interface.
  • Removed the old embedded Observatory-era reporter design system code in favor of the shared BearDen package.
  • Kept CLI-specific reporter behavior local, while moving shared styling and tokens to the released package.

Package manager and workflow hardening

  • Migrated JavaScript installs across the repo to pnpm with a single workspace lockfile.
  • Updated CI, release, reporter, SDK, and client workflows to use frozen pnpm installs.
  • Added dependency supply-chain guardrails, including pnpm minimum-release-age settings, build-script allowlists, and Dependabot cooldowns.
  • Removed the old npm lockfiles from the CLI, examples, test site, and framework clients.

CLI positioning and docs

  • Refreshed the README so it leads with Vizzly as a visual testing and regression review platform.
  • Tightened CLI help text and package metadata to match the updated product positioning.
  • Added the Vizzly inspector mascot asset to the published package assets.

Maintenance

  • Updated the Vizzly organization avatar asset.
  • Pulled in routine dependency updates, including React, Vite, Playwright, Zod, Tailwind, TanStack Query, and Vizzly Observatory updates.
  • Released @vizzly-testing/bear-den as a runtime dependency of the CLI reporter.

Upgrade Notes

  • Contributors should use pnpm for local installs and repo scripts going forward.
  • The CLI package itself remains published as usual; users installing or running the released CLI do not need to change normal CLI usage.

Verification

Highlights from the merged changes:

  • pnpm run build
  • pnpm run lint
  • pnpm test
  • pnpm run test:types
  • pnpm run test:reporter
  • npm --cache .tmp/npm-cache pack --dry-run

Full Changelog: v0.32.0...v0.33.0

✨ v0.32.0

23 May 19:52

Choose a tag to compare

Local TDD now understands cloud dynamic content

This release tightens up one of the most annoying local visual-testing gaps: pulling a cloud baseline into local TDD should behave like the cloud review path, especially around dynamic content.

Before this, local TDD could download the baseline images but still miss the dynamic-content context the cloud was using. That meant timestamps, generated values, and other already-known noisy regions could show up locally as scary diffs even when the cloud would ignore them. Not great for humans, and especially not great for agents that treat every red diff like a five-alarm fire.

Now, when you pull a baseline from Vizzly, the CLI also brings down the dynamic-content metadata that belongs with it.

What changed

  • vizzly tdd run --baseline-build ... now saves cloud hotspot and confirmed-region metadata locally alongside the baseline images.
  • Local comparisons can pass as region-filtered when the changed pixels are inside confirmed dynamic regions.
  • Local context/report data now carries the dynamic-region details agents need to understand why a diff passed.
  • Static report generation works correctly from the packed CLI package.
  • Honeydiff was upgraded to the latest released performance build.

Why this matters

If your team has already taught Vizzly which parts of a screenshot are dynamic, local TDD now benefits from that same knowledge. You should see fewer false local failures after pulling a cloud baseline, and agent workflows should stop overreacting to known dynamic content.

Real visual changes still show up. The local filter only passes changes that match the confirmed dynamic-region rules closely enough.

Upgrade

npm install -g @vizzly-testing/cli@0.32.0

Full Changelog: v0.31.0...v0.32.0