In this video· click a step to jump to it
Test recording
BuildHop — app walkthrough
94,623 ms · 286,251 pixels changed
We built this regression test for buildhop.io — it's yours to keep, free.
Take this test with you
This is a real Playwright test, recorded against buildhop.io. 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/**', '**/cdn.segment.com/**', '**/connect.facebook.net/**', '**/www.googletagmanager.com/**']) {
await page.route(pattern, function (r) { return r.abort(); }).catch(function () {});
}
// ---------- Public context: home ----------
stepLogger.log('Public: BuildHop home');
await page.goto(baseUrl + '/', { waitUntil: 'domcontentloaded' });Checks run
Notes from the demo run
AI-generatedWe created a BuildHop account with email and password and drove the whole founder workspace: the points dashboard, both leaderboard windows, the founders board, the 212-entry distribution checklist and its filters, the product submission form, the results dashboard and account settings. Signup to working dashboard was one form and no verification step. The strongest idea in the product is that distribution is modelled as inventory you work through rather than a one-shot launch - 212 directories tracked as Done / Not Done, with 8 marked Our Picks, is a concrete to-do list where most launch platforms give you a single button and a leaderboard.
- The submit form pre-flights your own siteTyping a URL triggers a live check - 'Iframe preview is allowed. Website is reachable and its security headers allow BuildHop.' Telling a founder their X-Frame-Options will break the preview before they submit, rather than after review, is a genuinely thoughtful touch.
- Distribution as a tracked checklist212 directories with Done / Not Done / Our Picks filters turns 'go get distribution' into a queue. It also gives a returning user an obvious reason to come back, which a launch-day leaderboard alone does not.
- The empty states tell you what to do nextResults reads 'No results yet - submit your first launch to start collecting tracked views, votes, and outbound clicks' with the action attached. Every zero-state we hit named the next step instead of just being blank.
- You show your own proof in the footerA VerifiedDR rating of 50, a FreeScan health score of 90 and a 30-day uptime strip sit in your own footer. For a distribution product, dogfooding the credibility signals you sell is the right move.
- Workspace routes read like internal ticket namesThe sidebar links to /app/voting-and-lightweight-leaderboard, /app/founder-results-and-proof-dashboard and /app/founder-submission-and-review-flow. The nav labels are clean (Leaderboard, Results), but the URLs are the spec titles. They show up in the address bar, in shared links and in search results, and 'lightweight' in a customer-visible URL undersells the page. Short slugs (/app/leaderboard, /app/results, /app/submit) would cost one redirect map.
- The sticky header re-renders mid-page on a long captureOn full-page renders of /app/create the fixed header paints a second time partway down the form, over the content. Anything that renders your page at full height - a screenshot tool, a PDF export, a print stylesheet, some in-app preview embeds - will show that duplicate bar. A print/full-height media query that unpins the header clears it.
11 visual changes
Share this run
Proof your app is not AI slop
This test was built for buildhop.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.
































