Recording of the visual regression run on recruiter.weone.io · weone - recruiter app walkthrough.

In this video· click a step to jump to it

R
Passed ✓

Test recording

weone - recruiter app walkthrough

133,106 ms · 22,848 pixels changed

We built this regression test for recruiter.weone.io — it's yours to keep, free.

Take this test with you

This is a real Playwright test, recorded against recruiter.weone.io. Claim it into your own workspace and re-run it on every deploy — free.

export async function test(page, baseUrl, screenshotPath, stepLogger) {
  const APP = baseUrl.replace(/\/+$/, '');
  const WWW = 'https://weone.io';
  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, 1200); await new Promise(r => setTimeout(r, 250)); await anim(max, 0, 600); })()";

  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 ['**/googletagmanager.com/**', '**/cdn.segment.com/**', '**/connect.facebook.net/**', '**/browser.sentry-cdn.com/**']) {
    await page.route(pattern, function (r) { r.abort(); }).catch(function () {});
  }

  const settle = async function (ms) {
+113 more lines — claim the test to get the full code.

Checks run

Run
✓
Visual
14.99%
Text
—
DOM
✓
Network
+56 −56
Console
✓
A11y
A
Perf
308 over
URL
✓
Variables
—
Full report
Log in →
22,848
Diff px
2m 13s
Duration
A
Accessible
WCAG 2.2 · 100
C
Fast
Web Vitals · 70

Notes from the demo run

AI-generated

We signed up as a solo recruiter with Google, landed in the workspace in seconds, and walked the whole ATS: dashboard, jobs, candidates, interviews, analytics, placements, notes, company branding, clients, billing and integrations. The shell is genuinely well built - consistent, fast, a command palette on every screen, and a live job-post preview that updates as you type. Then we tried to post a job, which is the first thing the dashboard asks you to do, and could not finish step 1 of 10.

Highlights
  • Google sign-in to a working workspace in under 30 seconds
    No email verification, no card, no setup wizard before the product. A personal workspace was created automatically and the trial banner tells you exactly how long you have. That is a very low-friction front door for a category that usually demands a sales call.
  • The job wizard has a live preview pane
    As we typed the job title, the right-hand card rendered the actual candidate-facing post with skills, benefits and language. Showing the output next to the input is the right design for a ten-step form.
  • The dashboard asks for the next action, not for attention
    Post a job, Add candidate, Schedule interview as three primary buttons, plus a checklist (add a client, connect Google Calendar, connect your email sender). Every empty state points somewhere concrete.
  • Interviews and placements are first-class
    Most lightweight ATS products stop at a pipeline board. Having placements as its own ledger, with analytics behind it, is what makes this usable for an agency rather than just a hiring team.
Friction points
  • A new solo recruiter cannot get past step 1 of the job wizard
    The required 'Who is this job for?' select renders two options, an empty placeholder and 'My own company' - and both carry value="". Because the only real choice has an empty value, the controlled select never registers a change, Continue stays inert, and the wizard sits on step 1 of 10. We confirmed it three ways: selecting by index, selecting by label, and forcing selectedIndex=1 with a dispatched change event all left the value as an empty string. Giving that option a real value (or defaulting solo accounts to their own company) unblocks the product's primary action.
  • Email signup returns a generic error
    Entering an address on /register/recruiter and pressing Continue with email returned 'Something went wrong. Please try again.' with no detail. Google worked first try, so the email path is the one costing you signups, and the message gives the visitor nothing to act on.
Couldn't reach
  • /settings/billing checkout·Paid plan checkout - never exercised

6 visual changes

Step 29,845 px changed
Before
Before
After
After
Diff
Diff
Step 31,650 px changed
Before
Before
After
After
Diff
Diff
Step 72,706 px changed
Before
Before
After
After
Diff
Diff
Step 84,605 px changed
Before
Before
After
After
Diff
Diff
Step 102,756 px changed
Before
Before
After
After
Diff
Diff
Step 121,286 px changed
Before
Before
After
After
Diff
Diff

Share this run

Earned · Lastest awards

Proof your app is not AI slop

LASTEST
starter
a11y
WCAG AA
regressions
0
Badges stay live, ratchet upward, only downgrade on confirmed regression.
57,300 test runs recorded · 1,174 products tested with Lastest

This test was built for recruiter.weone.io — 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.