In this video· click a step to jump to it
Test recording
Prufa — app walkthrough
52,560 ms · 1,140,080 pixels changed
We built this regression test for app.prufa.dev — it's yours to keep, free.
Take this test with you
This is a real Playwright test, recorded against app.prufa.dev. Claim it into your own workspace and re-run it on every deploy — free.
export async function test(page, baseUrl, screenshotPath, stepLogger) {
const shot=(n,s)=>screenshotPath.replace('.png','-'+n+'-'+(String(s).replace(/[^a-z0-9]+/gi,'-').replace(/^-|-$/g,'').toLowerCase().slice(0,22)||'view')+'.png');
let idx=1, post=0;
const cap=async(s,full)=>{ stepLogger.log('Scenario '+idx+': '+s); await page.screenshot({path:shot(idx,s),fullPage:full!==false}); idx++; };
const accept=async()=>{ await page.getByRole('button',{name:/accept all|got it|^accept$|dismiss|^close$|skip|maybe later|not now|^ok$|continue/i}).first().click({timeout:1200}).catch(function(){}); };
const backfill=async(entry,MIN)=>{ if(post>=MIN) return; await page.goto(entry,{waitUntil:'domcontentloaded'}).catch(function(){}); await page.waitForTimeout(1800); const total=await page.evaluate(function(){return Math.max(document.body.scrollHeight,document.documentElement.scrollHeight);}).catch(function(){return 0;}); const vh=await page.evaluate(function(){return window.innerHeight;}).catch(function(){return 900;}); let y=0,seg=1; while(post<MIN && idx<=16 && y<total){ await page.evaluate(function(yy){window.scrollTo(0,yy);},y).catch(function(){}); await page.waitForTimeout(600); stepLogger.log('Scenario '+idx+': overview '+seg); await page.screenshot({path:shot(idx,'overview-'+seg),fullPage:false}); idx++;post++;seg++; y+=Math.floor(vh*0.9); } while(post<MIN && idx<=16){ await page.waitForTimeout(300); await page.screenshot({path:shot(idx,'view-'+seg),fullPage:true}); idx++;post++;seg++; } };
const APP='https://app.prufa.dev';
// 1. authed workspace
await page.goto(APP+'/',{waitUntil:'domcontentloaded'}).catch(function(){}); await page.waitForLoadState('networkidle',{timeout:7000}).catch(function(){}); await page.waitForTimeout(2500); await accept(); await cap('workspace'); post++;
// 2. a couple authed nav routes (DOM-discovered)
const navs=await page.$$eval('nav a[href], aside a[href], [role=navigation] a[href]', function(as){ return as.map(function(a){return a.getAttribute('href')||'';}).filter(function(h){return h.length>1&&!/logout|sign-out|signout|login|register|upgrade|billing|mailto/i.test(h);}); }).catch(function(){return[];});
const seen={}; for(const h of navs){ if(post>=4)break; const key=h.split('?')[0]; if(seen[key])continue; seen[key]=1; const u=h.startsWith('http')?h:(APP+(h.startsWith('/')?h:'/'+h)); const rr=await page.goto(u,{waitUntil:'domcontentloaded'}).catch(function(){return null;}); if(!rr||!rr.ok())continue; await page.waitForTimeout(1600); await accept(); const sl=h.split('?')[0].replace(/[^a-z0-9]+/gi,'-').slice(-18)||'nav'; await cap('app-'+sl); post++; }Checks run
Notes from the demo run
AI-generatedPrufa is an AI QA engineer that runs your real user flows (signup, login, checkout) in a real browser on a schedule and tells you when they break. The signed-in workspace is dense but well-organised: Flows, Monitors, Gremlin (chaos QA), Runs, plus an Agent surface (API keys, MCP server, API docs, agent skill) that makes the whole thing drivable from Claude/Cursor. The 'Run a free audit' box on the landing lets you see value before signing up.
- Agent-native QAExposes an MCP server + API + downloadable agent skill so an AI agent can author and run flows directly — a sharp fit for the 2026 'agent runs your tests' wave.
- Free audit hookThe landing's 'Run a free audit' lets a visitor get a result before creating an account — strong lead capture for a QA tool.
- Gremlin chaos modeA dedicated chaos-QA surface (they even blogged about running it on themselves) is a memorable differentiator vs vanilla uptime monitors.
- Dense first-runThe dashboard surfaces ~11 nav areas at once (Flows, Monitors, Gremlin, Runs, Agent surface, API keys, MCP, docs, account, billing) with no guided 'create your first flow' default — a one-line empty-state CTA would orient new users faster.
- Guessable deep links 404Direct navigation to app routes you haven't visited can 404 rather than redirecting to a sensible default — worth a catch-all.
3 visual changes
Share this run
Proof your app is not AI slop
This test was built for app.prufa.dev — claim it free
One click copies the test and baseline screenshots into your own Lastest workspace. Re-run on every deploy and catch regressions before your users do — free, no card required.








