Recording of the visual regression run on syncpost.social · SyncPost — app walkthrough.

In this video· click a step to jump to it

S
Passed ✓

Test recording

SyncPost — app walkthrough

64,730 ms · 29,653 pixels changed

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

Take this test with you

This is a real Playwright test, recorded against syncpost.social. 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 UA = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36';
  await page.context().setExtraHTTPHeaders({ 'User-Agent': UA });
  for (const p of ['**/cdn-cgi/scripts/**/email-decode.min.js','**/sentry-cdn.com/**','**/browser.sentry-cdn.com/**','**/cdn.segment.com/**','**/connect.facebook.net/**']) {
    await page.route(p, function (r) { r.abort(); }).catch(function () {});
  }
  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); })()";
  let n = 1;
  const pageShot = async function (slug) {
    await page.waitForLoadState('networkidle').catch(function () {});
    await page.locator('h1, h2, main, [role="main"]').first().waitFor({ state: 'visible', timeout: 6000 }).catch(function () {});
+50 more lines — claim the test to get the full code.

Checks run

Run
✓
Visual
20.60%
Text
—
DOM
✓
Network
—
Console
✓
A11y
B
Perf
135 over
URL
✓
Variables
—
Full report
Log in →
29,653
Diff px
1m 05s
Duration
B
Accessible
WCAG 2.2 · 86
A
Fast
Web Vitals · 100

Notes from the demo run

AI-generated

We signed into SyncPost (Google/Emergent OAuth) and drove the full cross-posting workspace: composed a post in the studio, saved it as a draft, and confirmed it landed in the Posts list, then walked Calendar, Accounts, Content Studio, and Settings. The app shell is polished — a persistent left nav, a 'Trial active' badge, and a per-network composer with X/TikTok/YouTube/Threads/Bluesky toggles.

Highlights
  • Compose-to-draft actually works end-to-end
    We typed a post in the composer, hit Save draft, and it appeared in Posts under the Drafts filter with the correct network icons and timestamp — the core loop is solid, not a mockup.
  • Clean multi-surface workspace
    Dashboard / New post / Calendar / Posts / Accounts / Content Studio / Settings are all real, navigable surfaces with consistent styling — the product feels complete for a build-in-public launch.
Friction points
  • Empty accounts state before first connect
    Every network shows '(not connected)' until a social account is linked; a one-click 'connect your first account' nudge on the dashboard would shorten time-to-first-real-post.

4 visual changes

Step 125,763 px changed
Before
Before
After
After
Diff
Diff
Step 42,037 px changed
Before
Before
After
After
Diff
Diff
Step 51,852 px changed
Before
Before
After
After
Diff
Diff
Step 71 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,604 test runs recorded · 1,174 products tested with Lastest

This test was built for syncpost.social — 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.