In this video· click a step to jump to it
Test recording
HalvingJobs — app walkthrough
104,252 ms · 12,987 pixels changed
We built this regression test for halvingjobs.com — it's yours to keep, free.
Take this test with you
This is a real Playwright test, recorded against halvingjobs.com. 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://halvingjobs.com/en/candidate/dashboard").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://halvingjobs.com/en",{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://halvingjobs.com/en/candidate/dashboard",{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-generatedHalvingJobs is a Web3/AI jobs platform with a role-segmented onboarding (Job Seeker / Employer / AI Buyer / Contributor) and a structured candidate workspace. After verifying email, the candidate dashboard centers on a guided 'Create Your Web3 Profile' builder (title, level, years, work mode, contract type), backed by applications, saved jobs, a talent directory and a crypto-news feed.
- Role-segmented signupPicking Job Seeker vs Employer up front tailors the entire dashboard — the candidate never wades through employer-only features. Clean segmentation for a two-sided marketplace.
- Guided profile builderThe first authenticated action is a single well-scoped form (title, level, years, work mode, contract) rather than an empty dashboard — strong activation design.
- Post-register redirect stallsThe signup API returns 201 successfully, but the SPA stays on /register instead of routing to a 'check your email' screen — a user can think signup failed and re-submit. A redirect-on-201 would fix it.
- Email field typed as textThe register email input is type=text (not type=email), so mobile keyboards won't show the @ layout and browser email validation is skipped.
3 visual changes
Share this run
Proof your app is not AI slop
This test was built for halvingjobs.com — 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.








