Chromatic

chromatic.comcontributed by Samuele Ongaro

ALMOST

A weekend of work, and real gaps remain.

Visual testing for component libraries: it renders every Storybook story on each commit and shows you what changed visually, with a review step before merging.

Promptfree, for everyone, and the only version there is
Build me visual testing that replaces Chromatic — and know why this is ALMOST.

Rendering components and diffing screenshots is a weekend. **Making the diff mean something is not.** A rendering environment that produces identical pixels every run — same fonts, same animations stopped, same scrollbars, same GPU behaviour — is the entire product, and without it every run is full of false positives and the tool gets switched off in a fortnight. That, plus a review step a designer can use, is where the work is.

STACK
- Node 20+ with Fastify for the service
- SQLite through better-sqlite3, WAL mode
- Playwright with Chromium, **in a container**, for rendering
- odiff or pixelmatch for comparison, sharp for processing
- Caddy in front

THE DATA MODEL
- projects: id, name, repo_url, baseline_branch, config_json
- builds: id, project_id, commit_sha, branch, pull_number, parent_build_id, status, started_at, finished_at
- stories: id, build_id, story_id, title, viewport, theme, image_path, sha256, bytes, render_ms
- comparisons: id, build_id, story_id, baseline_story_id, diff_pixels, diff_ratio, diff_image_path, status — unchanged, changed, new, removed
- reviews: id, comparison_id, decision, actor, note, at — append-only
- baselines: project_id, branch, story_id, image_sha256 — what a story is expected to look like

DETERMINISM, WHICH IS THE PRODUCT
- Everything renders in one container image, pinned by digest. A font installed on a developer's machine and not in CI is the classic source of a phantom diff
- Fonts bundled in the image and loaded from disk; wait for the document's font loading to settle before capturing
- Animations and transitions disabled by an injected stylesheet, and any animation with a fixed frame set
- A fixed viewport, a fixed device scale factor, and a fixed colour scheme per capture — and capture each combination you care about as its own story rather than hoping
- Scrollbars hidden, caret hidden, and anything with a timestamp or random content stubbed at the story level
- Network requests intercepted: no external image, no analytics tag, no font from a CDN. A remote asset is a non-deterministic asset
- Then run the same commit twice and confirm zero diffs. Do that in CI as its own check — a suite that cannot reproduce itself cannot test anything

COMPARING
- Compare against the baseline for the target branch, not against the previous run on this branch
- A perceptual comparison with an anti-aliasing tolerance, not a raw pixel equality
- A threshold per story, because a component with a shadow will always differ by a few pixels
- Ignore regions by selector, for the parts that genuinely cannot be stabilised
- The diff image shows the before, the after, and the difference — all three, side by side and overlaid

THE REVIEW STEP
- One comment per pull request, edited in place, with the count of changed stories and a link
- A review page a designer can use: approve or reject each change, or accept all, with a note
- Accepting updates the baseline for that branch, and the update is recorded with who did it
- The build blocks the merge until every change is reviewed. That gate is what makes the tool worth having, and it is also what makes false positives intolerable — hence the determinism work above

OPERATIONS
- .env: DATABASE_PATH, STORAGE_PATH, BASE_URL, FORGE_TOKEN, SESSION_SECRET, RENDER_CONCURRENCY
- Migrations on boot, each once
- Images stored by content hash; unchanged stories store no new file
- Storage retention per project, and a disk watchdog
- Health endpoint that renders one fixture and compares it with itself

WHAT MATTERS MOST
Rendering the same commit twice with zero diffs. Achieve that before comparing anything, and treat any later flakiness as a bug of the highest severity.

What you lose

  • A rendering environment stable enough that a diff means a real change rather than a font rendering differently
  • A review interface where a designer approves a visual change without reading code
  • Parallel rendering of thousands of stories on every commit

If you would rather not build

  • Loki, if you already use Storybook

What it costs

read from their page 15 Aug 2026

PlanBilled monthlyBilled yearlyLast read
—$179/mo—15 Aug 2026

Their pricing page is where these came from. Seeing a different price? Tell us.

The escape hatch

open source · no votes, no paid placement

BackstopJS

$0

Visual regression testing with baselines and an HTML report.

garris/BackstopJSfree · open source

Playwright

$0

Has screenshot comparison built in, including a diff report.

microsoft/playwrightfree · open source

Why this verdict

our own opinion · changed only by a person

60/100

Verdict kinda at 60. The comparison is easy; making renders deterministic is the whole difficulty, and the prompt names each cause of flakiness.

History

tracked since 10 Aug 2026 · nothing is ever overwritten

Interest · last 30 dayspeak 2/day
views01230 Aug4 Sept9 Sept14 Sept19 Sept24 Sept28 Sept
— views— prompt copies none yet— votes none yet

Questions about Chromatic

answered from the record above

Is Chromatic free?

No — the plan we track is $179 a month. Starter at $179/month, priced on snapshot volume; a free tier covers 5,000 snapshots a month.

Can you replace Chromatic by building your own?

ALMOST. A weekend of work, and real gaps remain. Replacement score 60 out of 100, build time a weekend. Read what you lose before you decide.

How much does Chromatic cost?

$179 a month on Starter — $2,148 a year. Recorded 14 Aug 2026.

What do you lose by replacing Chromatic?

A rendering environment stable enough that a diff means a real change rather than a font rendering differently; A review interface where a designer approves a visual change without reading code; Parallel rendering of thousands of stories on every commit. If any of those carry weight for you, keep paying.

Is there an open-source alternative to Chromatic?

Yes: BackstopJS, Playwright. The prompt on this page is for when you want it your way instead.

Related entries

same category first, most replaced first

All 56 in Dev tools

Not sending yet

Every week, something stops being worth paying for.

New verdicts, prices that moved, entries added. One email a week. Unsubscribe in one click. Nothing is being sent yet — your address is kept here, and the first issue is the first thing it is used for.

free forever · no tracking pixel · stored here, never passed to anyone

Esc