Skip to content

Migrate from Lost Pixel

Lost Pixel is a visual-regression tool with an OSS engine (MIT) and a hosted platform that added a review/approval UI.

Lost Pixel is sunsetting

The team announced they are joining Figma and sunsetting the product; the GitHub repo was archived (read-only) in April 2026, and the OSS engine's last release (v3.22.0) was November 2024. The SaaS — where the central review UI and approval flow lived — is winding down. If you're on Lost Pixel, the hosted review experience is the thing you most need to replace.

Why Dungbeetle

Lost PixelDungbeetle
MaintainedNo — archived Apr 2026Yes
DiffPixelStructured tree (+ tolerant pixel fallback)
CaptureStorybook stories, page shotsWeb (DOM/a11y), terminal, desktop, API, performance, games
Central review UIYes — but in the sunsetting SaaSYesself-host or managed
PricingWas $100–$670/mo (going away)Free CLI · flat, unmetered cloud
Self-hostOSS engine only (no UI)Full server, incl. review UI

Dungbeetle is the closest replacement for what Lost Pixel's platform gave you — hosted baselines plus a review/approve/promote UI — except it's maintained and self-hostable.

Translate your config

Lost Pixel uses lostpixel.config.ts. The two common modes map directly:

Page shotspageShots.pages become web capture targets:

ts
// lostpixel.config.ts
export const config = {
  pageShots: {
    baseUrl: 'http://localhost:3000',
    pages: [
      { path: '/', name: 'home' },
      { path: '/pricing', name: 'pricing' },
    ],
  },
  failOnDifference: true,
};
json
// dungbeetle.config.json
{
  "version": 1,
  "project": { "name": "my-app" },
  "lifecycle": {
    "capture": [
      { "kind": "web", "name": "home",    "url": "http://localhost:3000/" },
      { "kind": "web", "name": "pricing", "url": "http://localhost:3000/pricing" }
    ]
  }
}

By default these are structured DOM snapshots (no browser needed). To match Lost Pixel's pixel screenshots as well, switch a target to the Playwright driver and enable screenshot — see Web snapshots:

json
{ "kind": "web", "name": "home", "driver": "playwright", "url": "http://localhost:3000/", "screenshot": true }

Storybook shots — point a web target at each story's iframe URL (?path=/story/<id>/iframe.html?id=<id>), or serve storybook-static and capture the stories you care about. (Dungbeetle has no Storybook auto-discovery yet; list the stories explicitly, the same way you'd list pages.)

Field mapping:

Lost PixelDungbeetle
pageShots.baseUrl + pages[].pathcapture[].url (full URL)
pages[].namecapture[].name
storybookShots.storybookUrla web target per story iframe URL
threshold (pixel)comparison.pixelTolerance.maxChangedRatio
failOnDifferencedefault — dungbeetle test/ci exit non-zero on any diff
lostPixelProjectId / apiKey (platform)Dungbeetle cloud repo client credentials

Re-baseline

sh
dungbeetle update     # capture fresh baselines → dungbeetle.snapshots/
dungbeetle test       # compare

Commit dungbeetle.snapshots/. Your old .lostpixel/baseline PNGs don't carry over (Dungbeetle's baseline is structural, not a pixel buffer) — re-baselining gives you structural diffs from the first run.

In CI

Replace the Lost Pixel GitHub Action / CLI step with:

sh
dungbeetle ci --json report.json --html report.html

It exits non-zero on any difference, so it gates a PR the same way.

Replace the platform's review UI

This is the important one — the Lost Pixel platform's approval flow is going away. Stand up a Dungbeetle cloud server (self-host or managed) and push runs to it:

sh
dungbeetle push --report report.json \
  --server "$DUNGBEETLE_SERVER_URL" \
  --client-id "$DUNGBEETLE_CLIENT_ID" --client-secret "$DUNGBEETLE_CLIENT_SECRET"

You get hosted baselines, a review → approve → promote UI, an append-only audit trail, and flakiness analytics — the platform experience, maintained and yours.

Next

Source-available: CLI under FSL-1.1-ALv2, cloud server under BUSL-1.1. See Licensing.