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.
- Start free without an invitation or credit card. Verify your email and review the terms and DPA in Agreements before your first upload.
-
Install
difora from npm (or
read the
GitHub README if
npm does not load) with
npm install --save-dev difora(Node 24.22.1+). Follow the getting-started guide to capture, upload and review your first screenshots. - Capture runs in your CI. There is no hosted browser/device farm, scheduled URL scanner or live Storybook hosting.
- Difora compares PNGs. It does not run accessibility audits, compare DOM/text snapshots or diagnose the source-code cause of a change.
- Approval from the assigned reviewer is not mandatory. SSO/SAML and audit-log export are not available yet.
- Use distinct filenames for browser and viewport variants; these are not separate identity fields.
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.