In this video· click a step to jump to it
Test recording
frevoapp — freelance workspace walkthrough
94,173 ms · 72,943 pixels changed
We built this regression test for frevoapp.com — it's yours to keep, free.
Take this test with you
This is a real Playwright test, recorded against frevoapp.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, 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, 1100); await new Promise(r => setTimeout(r, 250)); await anim(max, 0, 650); })()";
await page.route(/googletagmanager|google-analytics|posthog|hotjar|clarity\.ms|segment\.io/, function (r) { r.abort().catch(function () {}); });
stepLogger.log('Scenario 1: frevoapp home');
await page.goto(baseUrl + '/', { waitUntil: 'domcontentloaded' });
await page.waitForTimeout(2500);
await page.evaluate(SCROLL_THROUGH).catch(function () {});
await page.waitForTimeout(400);
await page.screenshot({ path: shot(1, 'home'), fullPage: true });Checks run
Notes from the demo run
AI-generatedWe signed into frevoapp with Google, finished the professional-profile onboarding, and drove twelve authenticated surfaces: dashboard, leads, clients, proposals, time tracking, tasks, reports, services, documents, team and settings. We also captured a real lead through your Add lead dialog so the pipeline numbers on the recording are live data, not a seeded demo. The sidebar holds its state cleanly across every route and the session survived the whole walk.
- One workspace, genuinely end to endLead to client to proposal to time tracking to invoice all live under one sidebar. Most freelance tools in this space stop at invoicing; having bidding, AMC/recurring and a service catalogue in the same shell is a real differentiator.
- Lead capture is one dialog, not a wizardAdd lead takes name, company, email, phone, value, source, stage, follow-up date and notes in a single modal and writes straight into the pipeline totals. Open pipeline updated to $8,400 immediately.
- Reports arrive with real structureReports and Analytics opens on revenue, profitability, delivery, clients, rates and scope changes with a Last 6 months range and CSV export already wired, rather than an empty chart placeholder.
- Onboarding collects the right things onceThe professional profile asks for category, subcategory, skills, rate band and location up front, which is what makes the rest of the workspace usable. It is long but it is asked once.
- Every in-app route shows Loading for 5 to 8 secondsDashboard, leads, clients, proposals, tasks, services and settings each render the shell instantly then sit on a Loading placeholder for 5-8s before data arrives. Our first recorded run actually blew its time budget on this. Prefetching on sidebar hover, or skeleton rows instead of the word Loading, would make the app feel several times faster.
- Email signup requires a phone number for WhatsApp OTPThe /register form marks Phone Number (for WhatsApp OTP) as required, which is a hard stop for anyone without WhatsApp or unwilling to give a number to a tool they are still evaluating. Google signup skips it entirely, so the requirement is not load-bearing.
2 visual changes
Share this run
Proof your app is not AI slop
This test was built for frevoapp.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.





