In this video· click a step to jump to it
Test recording
buttondown — app walkthrough
60,230 ms · 30,604 pixels changed
We built this regression test for buttondown.com — it's yours to keep, free.
Take this test with you
This is a real Playwright test, recorded against buttondown.com. Claim it into your own workspace and re-run it on every deploy — free.
export async function test(page, baseUrl, screenshotPath, stepLogger) {
const CFG = {"appEntry":"/emails","publicMaxNav":0,"fullPage":true,"steps":[{"goto":"/emails","dismiss":true,"waitMs":2000,"label":"emails-list"},{"goto":"/emails/new","waitMs":3200,"label":"compose-new-email"},{"fill":[{"sel":"input[placeholder=\"Subject\"]","value":"Welcome to My Awesome Newsletter","seq":false}],"waitMs":1200,"label":"subject-typed"},{"fill":[{"sel":".tiptap.ProseMirror, [contenteditable=\"true\"]","value":"Hey there — thanks for subscribing. Here is what to expect each week.","seq":true}],"waitMs":1800,"label":"body-typed"},{"goto":"/subscribers","waitMs":1800,"label":"subscribers"},{"goto":"/inbox","waitMs":1600,"label":"inbox"},{"goto":"/analytics","waitMs":1800,"label":"analytics"},{"goto":"/emails/imports/new","waitMs":1800,"label":"import-sources"},{"goto":"/settings","dismiss":true,"waitMs":1800,"label":"settings"}]};
const shot = function(i, s){ return screenshotPath.replace('.png', '-' + i + '-' + s + '.png'); };
page.setDefaultTimeout(6000);
// single combined noise-abort route (1 action instead of ~10)
await page.route(function(u){ return /sentry|segment\.com|googletagmanager|google-analytics|hotjar|posthog|connect\.facebook|cdn-cgi\/scripts/.test(u.toString()); }, function(r){ r.abort().catch(function(){}); }).catch(function(){});
let n = 1;
const FP = CFG.fullPage !== false;
const GOTO = 11000;
const wait = function(ms){ return page.waitForTimeout(ms||500); };
const dismiss = async function(){ const d = page.getByRole('button', { name: /skip|dismiss|maybe later|not now|got it|close|no thanks|continue|get started/i }).first(); if (await d.isVisible().catch(function(){return false;})) { await d.click({ timeout:2000 }).catch(function(){}); await wait(400); } };
const clickByText = function(src){ return page.evaluate(function(s){Checks run
Notes from the demo run
AI-generatedButtondown is newsletter software "for people like you" — write in a clean editor, manage subscribers, send, and read analytics, with a strong indie/dev sensibility. After signup the app is refreshingly uncluttered: a left rail (Home / Inbox / Subscribers / Emails / Analytics) plus API and Settings, and a genuinely nice compose surface — a monospace editor with a live Email/Web preview split. Writing an email is the product, and it's the first thing you can do.
- Compose is a joy and it's front-and-centreThe new-email editor is a clean monospace writing pane with a live Email/Web preview beside it — typing a subject and body instantly renders a real newsletter preview, so the core loop (write → see it) is obvious immediately.
- API is a first-class nav item"API" sits in the primary nav next to Settings — a clear signal to the developer-leaning audience Buttondown targets that automation is supported, not hidden.
- Import paths for Substack & MailchimpThe email-import flow offers one-click Substack and Mailchimp sources, removing the biggest switching-cost objection for a newsletter tool.
- Onboarding modal blocks /homeA multi-field welcome questionnaire (username / display name / import source / archetype) overlays the Home dashboard on first login; it can be skipped, but it sits between signup and the app, and other routes (/emails) are cleaner entry points.
- "Confirm your email" banner persistsAn unverified-email banner sits atop the app until the address is confirmed — reasonable, but it competes for attention with the first compose.
5 visual changes
Share this run
Proof your app is not AI slop
This test was built for buttondown.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.














