In this video· click a step to jump to it
Test recording
offermax — app walkthrough
116,420 ms · 23,440 pixels changed
We built this regression test for offermax.me — it's yours to keep, free.
Take this test with you
This is a real Playwright test, recorded against offermax.me. Claim it into your own workspace and re-run it on every deploy — free.
export async function test(page, baseUrl, screenshotPath, stepLogger) {
await page.addInitScript((data) => { try { for (const k in data) localStorage.setItem(k, data[k]); } catch(e){} }, {"resume_app_sources": "[]", "resume_pdf_filename_settings": "{}", "resume_app_template": "\"modern\"", "resume_app_documents": "[]", "resume_app_token": "•••", "resume_app_user_id": "fdc309ab-38ae-478a-84a4-75cc5bcfe30b", "tour_seen_fdc309ab-38ae-478a-84a4-75cc5bcfe30b_dashboard": "1", "resume_app_sections": "{\"awards\":false,\"skills\":true,\"contact\":true,\"courses\":false,\"patents\":false,\"summary\":true,\"projects\":true,\"education\":true,\"interests\":false,\"languages\":false,\"experience\":true,\"testScores\":false,\"publications\":false,\"volunteering\":false,\"certifications\":false}"});
const shot = (n, slug) => screenshotPath.replace('.png', `-${n}-${slug}.png`);
async function settle() {
await page.waitForLoadState('networkidle').catch(function () {});
await page.locator('h1, h2, main, [role="main"]').first().waitFor({ state: 'visible', timeout: 6000 }).catch(function () {});
await page.waitForTimeout(500);
}
async function routeBlock() {
const pats = ['**/cdn-cgi/scripts/**/email-decode.min.js','**/sentry-cdn.com/**','**/browser.sentry-cdn.com/**','**/cdn.segment.com/**','**/connect.facebook.net/**','**/*.google-analytics.com/**'];
for (const p of pats) { await page.route(p, r => r.abort()).catch(function () {}); }
}Checks run
Notes from the demo run
AI-generatedWe signed into Offer Max and walked the whole job-hunt cockpit: a warm 'Good afternoon' dashboard with a clear 'Your story starts here → Generate your first resume' empty-state, plus Generate, Editor and Interview Prep in the top nav. We drove the two primary interactions — pasting a Senior Frontend Engineer JD into the resume generator and a PM role into Interview Prep — so the recording shows the product being used the way a job-seeker actually would, not just nav clicks.
- Guided empty-stateThe zero-state doesn't just sit blank — it names exactly what tracking begins once you generate (applications sent, interviews won, top companies, daily streak). It tells a first-timer what the product will become for them.
- Tight three-verb navGenerate / Editor / Interview Prep is the entire top nav — the product resists feature-sprawl and keeps the job-hunt loop to three obvious moves.
- Profile-gate on deep linksHitting an in-app route before the profile is filled shows a 'Let's finish setting up first — redirecting to onboarding' interstitial; a returning user deep-linking from an email can bounce through it. A soft banner over the target page would be smoother than a full redirect.
- Session stored only in localStorageAuth lives in a localStorage Supabase token rather than a cookie, so any tool/tab that starts a fresh context (or an evaluator like us) reads as logged-out until the token is present — worth mirroring the session to an HttpOnly cookie for resilience.
3 visual changes
Share this run
Proof your app is not AI slop
This test was built for offermax.me — 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.








