In this video· click a step to jump to it
Test recording
Two Cents — app walkthrough
108,507 ms · 363,656 pixels changed
We built this regression test for twocentsbox.com — it's yours to keep, free.
Take this test with you
This is a real Playwright test, recorded against twocentsbox.com. Claim it into your own workspace and re-run it on every deploy — free.
export async function test(page, baseUrl, screenshotPath, stepLogger) {
const PROJECT = '/app/p/prj_xzzyj7f57fpp5ursv2vt';
const WIDGET_KEY = 'pk_sb1r8grwabmreek05ri4rxi6';
const STAMP = Date.now().toString(36);
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' });
await page.route('**/cdn-cgi/scripts/**/email-decode.min.js', function (r) { r.abort(); }).catch(function () {});
await page.route('**/sentry-cdn.com/**', function (r) { r.abort(); }).catch(function () {});
await page.route('**/cdn.segment.com/**', function (r) { r.abort(); }).catch(function () {});
Checks run
Notes from the demo run
AI-generatedWe signed up for Two Cents, created a project, wrote a question, pasted nothing anywhere, and still had feedback landing in the inbox inside two minutes — the /demo?k= sandbox is doing a lot of quiet work for you. The install page is unusually honest: it tells people the CSP directives up front and explains that a strict policy kills the widget silently. The whole authed surface is four tabs and no dead ends.
- The widget sandbox is the onboarding/demo?k=<key> runs the real widget against the real API before anyone touches their own codebase. Our run opened it, filed an idea, and watched it arrive in the inbox — that loop closed in about 20 seconds with zero setup.
- Questions carry a stable keypricing-friction-<x> stays put while the wording changes, and you store the wording people actually read next to each answer. That's the detail that makes an old answer still readable a year later, and most feedback tools get it wrong.
- Shadow DOM with a real accessible nameThe launcher sits in an open shadow root with aria-label="Open feedback", so Playwright found it by role on the first try. Plenty of widgets ship a div soup here; yours is driveable by a screen reader and by a test.
- CSP section written for the person who will hit it"A strict CSP blocks the widget silently — no error on the page, just nothing appearing." That sentence will save someone an hour.
- The confirmation email stands between signup and the productCreate account lands on "Check your email" — nobody sees a project, an inbox or the sandbox until they switch to a mail tab and come back. Letting the account in unverified and gating only the outbound bits (or the first embed) would put the sandbox in front of people while they're still interested.
- The empty inbox points at the embed, not the sandboxA brand-new project's zero-state says "Add the script to your site and the first message will land here" with a "Get the embed code" button — but Preview widget is one click away and needs no site at all. Leading the zero-state with the sandbox would let someone see a real message before they own a deploy.
- /app/billing·Plan page — we stop short of anything that looks like checkout on someone else's product.
13 visual changes
Share this run
Proof your app is not AI slop
This test was built for twocentsbox.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.






































