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

In this video· click a step to jump to it

P
Passed

Test recording

PublishNode — app walkthrough

68,335 ms · 87,937 pixels changed

We built this regression test for publishnode.com — it's yours to keep, free.

Take this test with you

This is a real Playwright test, recorded against publishnode.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 = (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/**', function (r) { r.abort(); }).catch(function () {});
  await page.route('**/*sentry-cdn.com/**', function (r) { r.abort(); }).catch(function () {});

  // ── 1. Public marketing home ────────────────────────────────────────────
  stepLogger.log('Marketing home');
  await page.goto(baseUrl, { waitUntil: 'domcontentloaded' });
  await page.locator('h1, main').first().waitFor({ state: 'visible', timeout: 15000 }).catch(function () {});
+98 more lines claim the test to get the full code.

Checks run

Run
Visual
53.52%
Text
DOM
Network
+144 −0
Console
A11y
A
Perf
URL
108 diverged
Variables
Full report
Log in →
87,937
Diff px
1m 08s
Duration
A
Accessible
WCAG 2.2 · 92
A
Fast
Web Vitals · 100

Notes from the demo run

AI-generated

We registered on PublishNode with email and password, confirmed via the Supabase link, then drove the whole signed-in app: dashboard, the single-post composer, bulk upload in both publishing modes, the publishing history with its three filters, and the Add Sites form which we filled with a sample site. The shell is genuinely nice. Sidebar, stat cards, empty states and the collapsed-sidebar mode all behave, and the free plan visibly hands you 10 credits up front. The problem is that none of those 10 credits can be spent until a WordPress site is connected, and connecting one needs WP admin access plus a plugin install. That is a long way to walk before seeing anything work.

Highlights
  • Empty states that actually instruct
    Every gated screen says exactly what is missing ('No sites available. Please add a site from the dashboard first.') instead of rendering a dead form. That is better than most launch-week apps.
  • The plugin explainer is well judged
    On Add Sites you spell out what the plugin does, that it collects no data, and the five install steps, before asking for credentials. Asking for a WP application password without that panel would feel much worse.
  • Bulk mode is a real differentiator
    The 'publish articles to different sites, selected per document' toggle is the thing an agency would actually pay for. It is currently buried one click inside Bulk Upload.
Friction points
  • Ten free credits you cannot spend
    The dashboard grants 10 credits on signup, but Single Post and Bulk Upload both hard-stop on 'no sites available', and adding a site needs WP admin plus a plugin install. Anyone evaluating you in five minutes sees four locked screens. A demo site, or letting the composer run against a sandbox and preview the AI draft without publishing, would let the credits do their selling.
  • WordPress credentials are kept in the browser
    The Add Sites panel says 'Credentials are stored locally in your browser for now. Connect a secure backend later.' That is an honest note, but it means a WordPress application password sits in local storage and is exposed to any XSS on the page. Worth moving server-side (encrypted at rest) before this gets much traction, and worth not saying out loud on the form in the meantime.
Couldn't reach
  • Save Credentials·We filled the connect-a-site form to show it working but deliberately did not submit fake WordPress credentials into your database.
  • Download Plugin·Skipped the file download rather than trigger a real artefact fetch during the run.

5 visual changes

Step 6289 px changed
Before
Before
After
After
Diff
Diff
Step 7289 px changed
Before
Before
After
After
Diff
Diff
Step 1026,774 px changed
Before
Before
After
After
Diff
Diff
Step 1160,296 px changed
Before
Before
After
After
Diff
Diff
Step 12289 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.
56,846 test runs recorded · 1,040 products tested with Lastest

This test was built for publishnode.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.