Recording of the visual regression run on classkeep.app · ClassKeep — app walkthrough.

In this video· click a step to jump to it

C
Passed

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++;
+34 more lines claim the test to get the full code.

Checks run

Run
Visual
3.90%
Text
DOM
Network
+1785 −1785
Console
A11y
A
Perf
60 drift
URL
30 diverged
Variables
Full report
Log in →
3,913
Diff px
1m 50s
Duration
A
Accessible
WCAG 2.2 · 93
A
Fast
Web Vitals · 100

Notes from the demo run

AI-generated

ClassKeep'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.

Highlights
  • 'Try with sample data' launch option
    The 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 step
    Payments 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 shell
    Schedule, 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.
Friction points
  • Onboarding help-widget overlaps the forward button
    The 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' control
    The 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

Step 11,800 px changed
Before
Before
After
After
Diff
Diff
Step 22,113 px changed
Before
Before
After
After
Diff
Diff

Share this run

Earned · Lastest awards

Proof your app is not AI slop

LASTEST
starter
tests
all passing
regressions
0
Badges stay live, ratchet upward, only downgrade on confirmed regression.
56,325 test runs recorded · 941 products tested with Lastest

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.