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 Pixel | Dungbeetle | |
|---|---|---|
| Maintained | No — archived Apr 2026 | Yes |
| Diff | Pixel | Structured tree (+ tolerant pixel fallback) |
| Capture | Storybook stories, page shots | Web (DOM/a11y), terminal, desktop, API, performance, games |
| Central review UI | Yes — but in the sunsetting SaaS | Yes — self-host or managed |
| Pricing | Was $100–$670/mo (going away) | Free CLI · flat, unmetered cloud |
| Self-host | OSS 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 shots — pageShots.pages become web capture targets:
// lostpixel.config.ts
export const config = {
pageShots: {
baseUrl: 'http://localhost:3000',
pages: [
{ path: '/', name: 'home' },
{ path: '/pricing', name: 'pricing' },
],
},
failOnDifference: true,
};// 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:
{ "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 Pixel | Dungbeetle |
|---|---|
pageShots.baseUrl + pages[].path | capture[].url (full URL) |
pages[].name | capture[].name |
storybookShots.storybookUrl | a web target per story iframe URL |
threshold (pixel) | comparison.pixelTolerance.maxChangedRatio |
failOnDifference | default — dungbeetle test/ci exit non-zero on any diff |
lostPixelProjectId / apiKey (platform) | Dungbeetle cloud repo client credentials |
Re-baseline
dungbeetle update # capture fresh baselines → dungbeetle.snapshots/
dungbeetle test # compareCommit 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:
dungbeetle ci --json report.json --html report.htmlIt 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:
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.