Diff

Every change, diffed. Pixels or any file.

Deterministic pixel diffs for screenshots. Text diffs for Markdown, JSON, YAML, HTML and ARIA snapshots. Every snapshot is compared to the baseline Argos picks from your Git history, and every diff is structured data your agents can read.

Screenshots

Only the real changes

The SDKs capture the same page the same way on every run, and Argos compares each screenshot to its baseline pixel by pixel. What reaches review is a change, not rendering noise.

Deterministic capture

Before the screenshot, the SDK waits for fonts, images and aria-busy to settle, hides carets and scrollbars, pauses GIFs on their first frame and pins sticky elements in place. Same page, same pixels, in every run.

A mask and a score, not a guess

Each comparison normalizes both images, runs several diff passes at different thresholds, clusters pixels to separate noise from change, and outputs a diff mask and a score. The engine is the open-source odiff library; the implementation is public too.

A threshold you set

threshold runs from 0 to 1, default 0.5: the higher, the less sensitive the comparison. Set it per screenshot in the SDK or per upload with --threshold.

Learn more

Mask what you can't control

data-visual-test="transparent" hides a date or an avatar and keeps its space, blackout masks it, removed drops it from the layout.

Learn more

Open source, no black box

Same input, same result, and the exact pixels that changed are visible. No model decides what counts, and nothing hides a small change.

Learn more
Any file

Not just screenshots

Upload text files with the CLI and Argos matches each one to its baseline like a screenshot, then diffs it as text. The Markdown an agent wrote, a JSON fixture, generated HTML: reviewed next to your visual diffs.

Text diffs for structured output

argos upload -f "**/*.{txt,json,yaml,yml,xml,html,md,css,js}" ./snapshots uploads plain text, JSON, YAML, XML, HTML, Markdown, CSS and JavaScript. Keep file names stable and each one gets a baseline of its own.

ARIA snapshots, diffed like code

Pass ariaSnapshot: true to argosScreenshot, or call argosAriaSnapshot, and the Playwright SDK captures the page's accessibility tree next to the screenshot. A renamed heading or a lost landmark shows up as a text diff even when the pixels don't move.

Snapshot any value from Vitest

argosSnapshot(value, { extension: ".json" }) serializes any value in a browser or Node test and diffs it across builds. No browser needed.

Learn more

Same build as your screenshots

Pass both globs to one argos upload and images and text files land in the same build, the same review and the same check.

Learn more

One file, one screenshot

Every snapshot in a build counts as one screenshot toward your plan, image or not, and each is limited to 50 MB.

Learn more
Storybook

Every story, every mode, in your CI

Argos captures your stories in your own CI with Playwright, through Vitest or the Test Runner. Each story becomes a snapshot with a baseline of its own, and each mode multiplies it.

Stories become snapshots

Every story is captured and compared to its own baseline, so a component regression is caught where it lives, not three pages later.

Learn more
One story, every mode

Declare parameters.argos.modes for theme, viewport or locale, and Argos captures one snapshot per mode name, each with its own baseline, without duplicating stories.

Learn more
Captured in your CI with Vitest

Screenshots are taken where your code runs, by the Vitest browser mode you already use. Nothing is rendered in a third-party cloud.

Learn more

Screenshots inside play functions

The play function runs before the capture. With Vitest, call argosScreenshot(ctx, name) inside it to capture a form before and after it is filled.

Learn more

Fit to content

Snapshots are cropped to the rendered component by default, with 16px of padding at 2x zoom. Set fitToContent: false to capture the whole page.

Learn more

Vitest, Test Runner, or legacy Storybook

Storybook's Vitest addon is the recommended path. The Test Runner and Storybook before v8 are supported too, each with its own quickstart.

Learn more
Any framework, any CI

Your tests, your CI, one baseline

Playwright, Vitest, Cypress, WebdriverIO, Puppeteer, or any tool that writes a screenshot to disk. Upload from any CI, Argos picks the baseline from your Git history, and every diff lands on the pull request as a check.

Screenshots stay in CI, not in Git

The reporter uploads what your tests captured, straight from the CI job. No binary files committed, no baseline folder to maintain, no local run to refresh it.

Every snapshot carries its context

URL, viewport, color scheme, browser, test title and location, retry, tags: the SDKs attach it all as metadata. It shows on the build page and in the CLI's JSON, so a reviewer or an agent knows what they are looking at.

The right baseline, from Git

Argos compares against the latest approved build on the commit your branch started from: the merge base with the base branch. Auto-approved branches like main keep the baseline current without a review.

Learn more

Shards in, one build out

Playwright shards join one build automatically, Vitest shards with a shared ARGOS_PARALLEL_NONCE. Elsewhere,ARGOS_PARALLEL and the nonce do it. One comparison, one status per commit.

Learn more

Any framework via the CLI

argos upload ./screenshots creates a build from any folder of images. The CLI reads the commit, branch and pull request from your CI environment.

Learn more
For AI agents

Diffs your agent can read

Every diff is structured data: status, score, diff mask URL, baseline and current files, and the metadata the SDK attached. An agent uploads from the CLI, reads the build back as JSON, and uses the diff as evidence before it approves anything.

Terminal
argos-cli
argos upload ./screenshots
argos upload ./snapshots \
  -f "**/*.{txt,json,yaml,yml,xml,html,md,css,js}"
argos build get <build>
argos build snapshots <build> --needs-review --json

Read-only with the CI token

build get and build snapshots work with the project token your CI already has. --needs-review --json returns only the diffs awaiting a decision.

Learn more

Inspect diffs from your editor

Connect Claude Code, Cursor or Copilot to mcp.argos-ci.com and the agent lists builds and inspects their screenshot diffs, with the projects:read scope and nothing more.

Learn more

Skills that know the diff

npx skills add https://argos-ci.com installs argos-pr-review, which inspects snapshots as evidence for a review, and argos-cli, which teaches the commands.

Learn more
Mermaid

A lot of what we test isn't a screenshot at all. Argos diffs our rendered output and the text behind it against a baseline, so we catch changes in structure, not just pixels.

Sidharth Vinod
Engineer at Mermaid

Frequently asked questions

One platform, from pull request to merge

A diff is the middle of the flow: deploy the pull request first, review what changed next, and stabilize the tests behind it.

Review

One place for humans and agents to approve what changed.

Explore Review

Stabilize

Kill flakes and debug failures with full per-test history.

Explore Stabilize

Deploy

Free preview URLs for your Storybook or static site on every PR.

Explore Deploy

Supercharge your product quality

See every change your team and your agents make. Review with confidence, and merge faster.