Recording of the visual regression run on buttondown.com · buttondown — app walkthrough.

In this video· click a step to jump to it

B
Passed ✓

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){
+55 more lines — claim the test to get the full code.

Checks run

Run
✓
Visual
50.91%
Text
—
DOM
✓
Network
+11 −11
Console
✓
A11y
A
Perf
55 over
URL
✓
Variables
—
Full report
Log in →
30,604
Diff px
1m 00s
Duration
A
Accessible
WCAG 2.2 · 93
C
Fast
Web Vitals · 70

Notes from the demo run

AI-generated

Buttondown 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.

Highlights
  • Compose is a joy and it's front-and-centre
    The 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 & Mailchimp
    The email-import flow offers one-click Substack and Mailchimp sources, removing the biggest switching-cost objection for a newsletter tool.
Friction points
  • Onboarding modal blocks /home
    A 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 persists
    An 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

Step 17,638 px changed
Before
Before
After
After
Diff
Diff
Step 21,303 px changed
Before
Before
After
After
Diff
Diff
Step 32,961 px changed
Before
Before
After
After
Diff
Diff
Step 917,399 px changed
Before
Before
After
After
Diff
Diff
Step 111,303 px changed
Before
Before
After
After
Diff
Diff

Share this run

Earned · Lastest awards

Proof your app is not AI slop

LASTEST
starter
regressions
0
Badges stay live, ratchet upward, only downgrade on confirmed regression.
57,322 test runs recorded · 1,174 products tested with Lastest

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.