What you can do with Difora

Visual regression testing for teams that capture in their own CI and want screenshot comparison, storage and backups on EU-owned infrastructure.

Start with one screenshot suite. Add the workflow features you need as your team grows.

Set up your first visual review → · Open the in-app guide →

Bring screenshots from your tests

Use the Playwright fixture or screenshot helper, the Storybook test-runner hook, a Cypress recipe, or any tool that writes PNGs. Difora's public CLI uploads your suite and avoids transferring images already stored for the project.

Your CI runs the browsers. Capture each browser, viewport and theme you need, and give each variant a stable filename. Difora does not run a hosted browser farm.

Capture recipes · Open-source CLI on GitHub

Find and review identical changes

Jump to changed regions with zoom, outlines and keyboard navigation. Snapshots with exactly matching changes and capture settings form expandable groups, with explicit approve or reject actions and visible member counts.

Review regions and change groups

Investigate repeated capture changes

Stability history groups exact pixel outcomes across submitted runs of the same full commit and recorded environment. Inspect linked builds, returning outcomes, excluded observations and stabilization checks. Missing settings remain unknown; different commits do not establish a flake. The diagnostic leaves review decisions, thresholds and CI exit codes unchanged.

Stability evidence and capture recipes

Understand capture differences

With Difora 0.10.1+, opt in to record browser, viewport, color preference and other capture settings. Declare your app theme and environment label, and use explicit stable variants when capturing the same screen in different conditions. Existing filenames and PNG-only uploads keep working.

In review, the Variants panel combines Browser, Viewport, Theme, Variant and Environment filters. Expand Capture details to compare the exact baseline and current evidence. Earlier discussions retain their original settings, and missing fields remain “Not recorded.” Capture metadata is client-reported evidence; it does not prove reproducibility or automatically change approval decisions.

Metadata, variants and sidecar format →

See and review what changed

Inspect baseline and current screenshots side by side, highlight the diff, blend with onion view, swipe between versions, or focus on the current image. Zoom, pan, search, filter and use keyboard navigation to work through a build.

Approve or reject individual snapshots or selected groups. Review progress shows what remains. New and removed screenshots need a decision too. Choose system, light or dark appearance in the app.

Discuss a snapshot with your team

Open a build, select a snapshot and choose Discussions. Start a thread or reply alongside the comparison. Open counts and the With open discussions filter help you find questions that still need attention. Resolve a thread when it is settled, or reopen it to continue. Resolving a discussion does not approve the snapshot or change the CI result.

Comments are plain text, up to 5,000 characters. Edit or remove your own comments; organization owners can also remove comments. Copy a thread's link to share it with another organization member. The link preserves its destination through sign-in and does not make screenshots public.

Drafts stay in the current tab while you switch snapshots. If a save fails, the text stays available to retry. Leaving or reloading warns about unsent drafts; closing the tab loses them. Drafts are cleared on sign-out or loss of access.

After a comparison is rerun, Earlier discussions shows the original screenshots and comparison settings with their conversation. Earlier threads are read-only, with comment removal still available. Discussions expire with their build, including unresolved threads. Replies and discussion state changes do not send notifications.

Hand a review to a teammate

On a build that needs review, choose Assign reviewer, search your team by name or email, and select one colleague. You can also Assign to me, change the reviewer or remove the assignment. Only verified members of your organization can be selected.

The reviewer receives an email with a private link to the build. Assigning yourself does not send an email. The build list shows who is reviewing; use Assigned to me or Unassigned to find your next review. Expand Assignment history to see changes.

Re-running a comparison keeps a manually chosen reviewer and sends a fresh request if the new result needs review. A teammate who leaves the organization is shown as unavailable. Assignment does not grant approval rights: the project’s review policy decides who can approve. Every current team member can still reject. Email status shows whether the mail service accepted the request; it does not confirm that someone read it.

Organization owners can define snapshot ownership in Settings → Rules and choose any member, snapshot owners or named approvers in Settings → General → Review approvals. An optional automatic assignment chooses a reviewer only when exactly one available owner covers and can approve every pending snapshot. Manual assignments and manual clears take priority. Ownership and approval policies.

Keep branches in context

Approvals update the build's branch baseline. Approved feature-branch images are recognized when they arrive on the baseline branch. When a retained successful build exists at the exact merge-base commit, Difora uses it as the comparison anchor; otherwise the review shows the fallback.

Owners can clean stale branch baselines in Settings → Branches. Active builds and open reviews are protected.

Merge-base setup and cleanup rules

Gate your CI and connect your repository

Project read tokens connect scripts and dashboards to build results, comparison evidence and retained PNGs. Use difora builds or difora inspect, or the versioned HTTP API and OpenAPI reference. Discussion text is an optional token permission. Read tokens expire, can be revoked and cannot make review decisions.

The CLI uploads, waits for comparison, prints a review link and returns an exit code your CI can use. Branch and commit detection supports nine CI providers. Parallel shards combine into one build and review, with retries and upload progress.

GitHub, GitLab and Bitbucket Cloud can receive repository statuses and an updated PR/MR summary. Provider setup and permissions are required. The CLI's optional --post-status posts a status using CI credentials; PR comments require the server integration.

GitHub Actions · GitLab CI · Bitbucket Pipelines · Other providers · Sharding

Control noise with explicit rules

Set project thresholds, draw ignore rectangles in the viewer, and save per-snapshot rules. Or keep a versioned difora.config.json beside your screenshots so the rules travel with your code. Repository rules take priority over saved UI rules.

Comparison is deterministic. Ignore rectangles use original screenshot pixels, and image dimension changes still count. Stabilize animations, data and fonts in your capture tests.

Thresholds, patterns, ignore regions and JSON schema

Send results where your team works

Owners configure email, Slack and signed webhooks in project Settings → Notifications. Choose events, send a test and inspect delivery history. Failed deliveries retry automatically; members can view the history.

Repository summaries link to the authenticated review. Screenshot thumbnails are off by default. If enabled by an owner, their preview URLs are public to anyone who has the link, and repository image proxies may cache them outside the EU. Full screenshots remain authenticated.

PR/MR permissions and preview privacy

Review together and manage your data

Invite teammates with owner or member roles. Switch between organizations, manage project CI tokens, see monthly usage and plan limits, and delete projects or your account when needed. Image retention depends on your plan.

Screenshot processing, storage and backups run on EU-owned infrastructure. Optional repository and notification integrations receive the metadata you choose to send. See the privacy policy for the data boundary.

Current availability and limits

Each submitted snapshot counts once when a build starts comparison, including unchanged images and all shards, against your organization's UTC calendar-month allowance; a new build attempt counts again. Usage and retries.

Run pull requests and pushes to main only so a PR branch is not uploaded twice; each new build counts toward snapshot usage.

Free allows one project per organization; paid plans allow unlimited projects.

Get started → · Plans and pilot access →

Native and mobile captures

CLI 0.12.0 adds difora annotate <dir> --platform ios for declared device metadata. Record PNGs with your own tooling, keep stable variant names, then upload normally. See native, mobile and PDF capture recipes for flags, compatibility and verified toolchains.