Skip to content

Chromatic vs StoryShelf

View as Markdown

This page compares Chromatic (SaaS) and StoryShelf (self-hosted) factually. No recommendations — choose based on your constraints.

AspectChromaticStoryShelf
Pricing modelPer-snapshot billingFree (self-hosted, unlimited)
HostingSaaS only (Chromatic cloud)Self-hosted (your infrastructure)
BrowsersChrome, Firefox, Safari, Edge (branded, cloud)Chromium (default), Firefox, WebKit via Playwright (per-project browser)
TurboSnapYes (dependency graph)Yes — affected capture (dependency graph, on by default)
Modes / GlobalsYesYes — parameters.chromatic.modes / parameters.storyshelf.modes (Modes)
Accessibility testingYes (aXe)axe-core checks (on by default), shown in review and non-blocking
Interaction testsYes (play functions)Yes (play functions)
SSO / EnterpriseEnterprise planBetter Auth engine (OIDC/SAML via any IdP)
Vendor lock-inYes (proprietary)No (MIT, open source)
Data residencyUS / EU regionsYour choice (your infra)
ParallelizationAutomatic cloudManual (concurrency config)
Flake handlingBuilt-inflakyTest param + tags
Setupnpx chromaticstoryshelf server init + CI config

Chromatic (2024 pricing):

  • Free: 5,000 billed snapshots/month
  • Pro: $179/month for 35,000 billed snapshots
  • Enterprise: Custom pricing

Billed snapshots = visual snapshots + accessibility snapshots. TurboSnap copies count as 0.2 billed snapshots each.

StoryShelf:

  • $0 license (MIT)
  • Infrastructure cost only (your servers, databases, object storage)
  • Unlimited snapshots, projects, users
ChromaticStoryShelf
CaptureCloud browsersSelf-hosted on your infra: Playwright (Chromium/Firefox/WebKit) or lightweight Puppeteer (Chromium-only, chrome-headless-shell)
BaselinesGlobal + branchPer-branch with default-branch fallback
Baseline lookupTraverses git ancestry to find ancestor builds; rebase/squash can break itKey lookup on project/story/viewport/branch — no history walk, rebase- and squash-proof
StorageChromatic cloudYour S3-compatible or local filesystem
DatabaseChromatic managedYour SQLite/Turso/Postgres
QueueChromatic managedYour database (capture_jobs), no extra service
AuthChromatic accounts / SAMLLocal / social / SSO / passkeys / none
  • Visual regression testing via pixel diff (pixelmatch)
  • Storybook play function execution
  • Per-story controls: disableSnapshot, flakyTest, delay, diffThreshold, pauseAnimationAtEnd
  • Git provider status checks (GitHub, GitLab)
  • PR/MR comments with diff links
  • Branch-aware baselines
  • CI integration (GitHub Actions, GitLab CI, etc.)
  • Cross-browser gaps — Chromium (default), Firefox, and WebKit are selectable per project; list up to three with PATCH /api/v1/projects/:slug (browsers) to capture each build on every engine, with per-engine baselines. No branded Safari/Edge binaries.
  • Vite-only tracing — affected capture reads preview-stats.json (plus tolerant Webpack shapes). TurboSnap-equivalent skip rates on Vite Storybooks; custom builders without stats fall back to full renders.
  • Modes differ slightly — Mode values may only use characters Storybook’s globals URL arg accepts; baselines are keyed by mode name as in Chromatic.
  • Accessibility results are annotations only — On by default per project (runA11y, which a project admin can turn off in Settings > Tests); the runners inject axe-core into the story page and scan the story root with the WCAG A/AA and best-practice rules (honouring parameters.a11y). Violations are listed per story in the attempt log and shown on the snapshot in the build review and on the component page, but never fail or gate a build; there is no accessibility baseline, review workflow or accessibility snapshot billing.
  • No cloud parallelization — Concurrency limited by your server resources (testing.concurrency option).
  • No built-in flake detection — Relies on explicit flakyTest parameter/tags.
  • Unlimited snapshots — No per-snapshot billing ever (so skipping saves server CPU, not money — there is no 0.2× copy charge because there is nothing to bill).
  • Full data control — Your database, your storage, your network.
  • No vendor lock-in — MIT licensed, open source, standard APIs.
  • Flexible SSO — Any OIDC provider (Keycloak, Okta, Entra ID, Auth0, Cognito).
  • Self-hosted on any platform — Node, Bun, Deno, Fly.io, Railway, Render, Vercel, Cloudflare Workers, AWS Lambda, etc.
  • Per-branch baselines with fallback — Cleaner model for long-lived feature branches.

Coming from Lost Pixel instead? See the Lost Pixel migration guide.

If migrating from Chromatic:

ItemNotes
BaselinesNo export API in Chromatic. Requires re-acceptance on first StoryShelf run.
ParametersDual-key support: chromatic: and storyshelf: keys both work; storyshelf: wins on conflict.
TurboSnapNot replicated. Expect 5-10× more snapshots initially.
Modes/GlobalsSupported — existing parameters.chromatic.modes work unchanged (Modes).
Cross-browserChromium / Firefox / WebKit, up to 3 per project via browsers (per-engine baselines, sequential); no branded Safari/Edge.
Team workflowSimilar — PR status checks, review UI, approve/reject.

Choose Chromatic if:

  • You want zero infrastructure maintenance
  • You need branded Safari/Edge binaries or multi-browser matrices in a single build
  • You rely on TurboSnap’s Webpack tracing for a non-Vite builder
  • You need accessibility results as a reviewed, baselined gate rather than non-blocking annotations
  • Your team prefers SaaS over self-hosting

Choose StoryShelf if:

  • Snapshot costs are a concern (large Storybooks, frequent commits)
  • Data residency / compliance requires self-hosting
  • You want to avoid vendor lock-in
  • You already run infrastructure (Kubernetes, VMs, serverless)
  • You need flexible SSO with existing OIDC provider
  • You’re comfortable operating a Node.js service