In this video· click a step to jump to it
Test recording
Twinen — app walkthrough
180,969 ms · 581,986 pixels changed
We built this regression test for twinen.com — it's yours to keep, free.
Take this test with you
This is a real Playwright test, recorded against twinen.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 = (i, slug) => screenshotPath.replace('.png', '-' + i + '-' + 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); })()";
const UA = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36";
await page.context().setExtraHTTPHeaders({ 'User-Agent': UA });
for (const pattern of ['**/sentry-cdn.com/**', '**/browser.sentry-cdn.com/**', '**/cdn.segment.com/**', '**/connect.facebook.net/**', '**/*.posthog.com/**', '**/googletagmanager.com/**', '**/google-analytics.com/**', '**/*.clarity.ms/**', '**/doubleclick.net/**']) {
await page.route(pattern, function (r) { r.abort(); }).catch(function () {});
}
const dismiss = async function () {
for (const rx of [/^accept$/i, /accept all/i, /got it/i, /allow all/i, /^ok$/i, /skip for now/i, /maybe later/i, /^later$/i, /not now/i, /^close$/i, /^dismiss$/i]) {
await page.getByRole('button', { name: rx }).first().click({ timeout: 1200 }).catch(function () {});
}Checks run
Notes from the demo run
AI-generatedTwinen's /auth offers Google, Apple, or email plus a handle you claim at signup. Google sign-in landed on /feed with an onboarding stack (profile photo, claim your handle) that both dismiss cleanly with 'Skip for now' and 'Later'. The feed carries the positioning: Global/Following toggles, chronological ordering, a composer with Media/Link/Twin/Poll modes, and Daily Challenges giving a brand-new account something to do.
- Handle claim is deferred, not blockingYou get a temporary @user_... and can post immediately - 'Later' genuinely works. Most social products make the handle a hard gate on first run.
- The 'no algorithm' promise is visible in the product/feed exposes Global and Following as explicit toggles with chronological ordering, so the landing-page claim is something you can see rather than take on trust.
- A new account is not an empty roomDaily Challenges (0/3, 'earn up to 60 coins') plus named starter tasks - Tune your AI Twin, Make your profile yours, Post something real, Find your circle - replace the usual blank feed.
- /profile and /ai both 404The product talks about your profile and your AI Twin constantly, and both obvious URLs return 'Oops! Page not found'. The real paths are /u/<handle> and the in-app Twin panel; two redirects would catch a lot of typed-URL traffic.
- The temporary handle leaks into the header@user_5fe15e35 shows in the nav until claimed. A friendlier placeholder, or showing the display name until the handle is set, would read less like a bug.
- /feed Post·Would publish public content on the founder's network - we drafted in the composer and stopped
4 visual changes
Share this run
Proof your app is not AI slop
This test was built for twinen.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.











