Recording of the visual regression run on notincluded.in · NotIncluded — app walkthrough.

In this video· click a step to jump to it

N
Passed ✓

Test recording

NotIncluded — app walkthrough

30,827 ms · 1 pixels changed

We built this regression test for notincluded.in — it's yours to keep, free.

Take this test with you

This is a real Playwright test, recorded against notincluded.in. 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, slug) => screenshotPath.replace('.png', `-${n}-${slug}.png`);
  const SCROLL_THROUGH = "(async () => { const ease = t => 1 - Math.pow(1 - t, 3); const max = Math.max(0, document.body.scrollHeight - window.innerHeight); if (max < 40) return; const anim = (a, b, ms) => new Promise(res => { const t0 = performance.now(); const step = now => { const p = Math.min(1, (now - t0) / ms); window.scrollTo(0, a + (b - a) * ease(p)); p < 1 ? requestAnimationFrame(step) : res(); }; requestAnimationFrame(step); }); await anim(0, max, 1400); await new Promise(r => setTimeout(r, 350)); await anim(max, 0, 800); })()";
  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' });
  for (const pattern of ['**/cdn-cgi/scripts/**/email-decode.min.js','**/sentry-cdn.com/**','**/browser.sentry-cdn.com/**','**/cdn.segment.com/**','**/connect.facebook.net/**','**/*.reddit.com/**','**/googletagmanager.com/**']) {
    await page.route(pattern, r => r.abort()).catch(function(){});
  }

  stepLogger.log('Scenario 1: Home');
  await page.goto(baseUrl, { waitUntil: 'domcontentloaded' });
  await page.waitForLoadState('networkidle').catch(function(){});
  await page.locator('h1, main').first().waitFor({ state: 'visible', timeout: 6000 }).catch(function(){});
+76 more lines — claim the test to get the full code.

Checks run

Run
✓
Visual
1px
Text
—
DOM
✓
Network
+90 −90
Console
✓
A11y
A
Perf
✓
URL
✓
Variables
—
Full report
Log in →
1
Diff px
31s
Duration
A
Accessible
WCAG 2.2 · 92
A
Fast
Web Vitals · 100

Notes from the demo run

AI-generated

NotIncluded's dashboard leads with the numbers a freelancer actually cares about: revenue recovered, awaiting-approval, and approved change orders. The new-project flow is the standout: pre-built SOW templates (Web Development, Graphic Design, Copywriting) auto-fill scope, exclusions, and a revision policy so the anti-scope-creep guardrails exist before the first client email.

Highlights
  • Template-driven SOW
    Picking 'Web Development' pre-fills included scope, explicit exclusions, and a 2-round revision policy. That framing is the product's whole value proposition, delivered in one click.
  • Dashboard zero-state
    Empty state names the exact next action ('Create a project, set revision limits') instead of a blank slate, so a new user isn't left guessing.
Friction points
  • Logged-out nav on /dashboard/projects/new
    The new-project page server-renders 'Log in / Start free' in the header even for an authenticated session, while the dashboard renders the user menu. Looks like the nav isn't reading the session cookie on that route's SSR pass, worth a one-line check.
  • Verify-email banner persists
    The 'Please verify your email' banner stays pinned across the dashboard, but it doesn't block usage. Consider softening it once a project is created.

Visual change

Step 11 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.
57,525 test runs recorded · 1,174 products tested with Lastest

This test was built for notincluded.in — 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.