In this video· click a step to jump to it
Test recording
ClassKeep — app walkthrough
109,502 ms · 3,913 pixels changed
We built this regression test for classkeep.app — it's yours to keep, free.
Take this test with you
This is a real Playwright test, recorded against classkeep.app. 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');
const ORIGIN=new URL("https://classkeep.app/dashboard/lastestdemonlsh").origin; const MINPOST=9;
await page.context().setExtraHTTPHeaders({ 'User-Agent': "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" }).catch(function(){});
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$|let me start|show me|continue/i}).first().click({timeout:1500}).catch(function(){}); await page.keyboard.press('Escape').catch(function(){}); };
const is404=async()=>{ const b=await page.locator('body').innerText().catch(function(){return '';}); return /\b404\b|page not found|page you.{0,6}looking for|doesn.t exist|couldn.t find|lost in the/i.test(b); };
// 1. Public home
await page.goto("https://classkeep.app",{waitUntil:'domcontentloaded'}).catch(function(){}); await page.waitForLoadState('networkidle',{timeout:6000}).catch(function(){}); await page.waitForTimeout(1500); await accept(); await cap('home');
// 2. Post-login dashboard (authed via replayed storage_state)
await page.goto(APPENTRY="https://classkeep.app/dashboard/lastestdemonlsh",{waitUntil:'domcontentloaded'}).catch(function(){}); await page.waitForLoadState('networkidle',{timeout:8000}).catch(function(){}); await page.waitForTimeout(2600); await accept(); await page.waitForTimeout(600); await cap('dashboard'); post++;Checks run
Notes from the demo run
AI-generatedClassKeep's signup is fast (email + password, no verify wall) and drops you straight into a polished five-step onboarding wizard - studio type, branding, how it runs, payments, launch - with a thoughtful 'Try with sample data' option that seeds example classes and clients so the app isn't empty on first login. The authenticated surface is a complete studio-management shell: Schedule, Bookings, Class types, Resources, Clients, Instructors, Credit Packages, Payments, a Page builder for the public booking page, and Settings.
- 'Try with sample data' launch optionThe final onboarding step lets you seed example classes and clients (removable later) - a first-login dashboard that already shows the product working, rather than an empty state.
- Skippable Stripe stepPayments onboarding has an honest 'I'll do this later' escape - you reach the product without being forced through a Stripe connect first.
- Broad, coherent studio shellSchedule, Bookings, Class types, Resources, Clients, Instructors, Credits and a Page builder for the booking page is a real operations suite, not a single-screen MVP.
- Onboarding help-widget overlaps the forward buttonThe support_agent chat bubble renders over the bottom-right area where the wizard's Continue control sits, and can intercept clicks mid-onboarding.
- Icon-only 'Continue' controlThe wizard's forward button is an unlabelled arrow_forward icon - fine visually, but it has no accessible text name, which hurts keyboard/screen-reader users.
2 visual changes
Share this run
Proof your app is not AI slop
This test was built for classkeep.app — 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.





