In this video· click a step to jump to it
Test recording
Chess ML Coach - app walkthrough
77,738 ms · 511,709 pixels changed
We built this regression test for chess-ml-coach.onrender.com — it's yours to keep, free.
Take this test with you
This is a real Playwright test, recorded against chess-ml-coach.onrender.com. Claim it into your own workspace and re-run it on every deploy — free.
export async function test(page, baseUrl, screenshotPath, stepLogger) {
const SITE = baseUrl.replace(/\/+$/, '');
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, 1200); await new Promise(r => setTimeout(r, 280)); await anim(max, 0, 600); })()";
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' });
for (const pattern of ['**/cdn-cgi/scripts/**/email-decode.min.js', '**/sentry-cdn.com/**', '**/cdn.segment.com/**', '**/connect.facebook.net/**', '**/googletagmanager.com/**']) {
await page.route(pattern, function (r) { r.abort(); }).catch(function () {});
}
// ─── Scenario 1: the training cockpit (session replayed) ──────────────────
// Render free tier cold-starts, so the first load gets a generous settle.Checks run
Notes from the demo run
AI-generatedWe created an account, confirmed by email, pointed Chess ML Coach at a Chess.com username and within about fifteen seconds it had ingested the history and built a training plan: 1,902 analyzed moves, 117 due puzzles, and a Pipeline panel reporting Analysis, Puzzles, Model and Report all Ready. The Practice board then served a real position out of those games (MagnusCarlsen vs Philippians46, 37.Rxc6, tagged Indian Game 2.Bf4 b6 A45) with Adaptive and Quick modes and a Show-next-best-move escape hatch. Six surfaces, all populated from one username.
- One username, a full curriculumNo manual PGN upload, no tagging, no configuration. Typing a Chess.com handle produced puzzles, an openings tree of 34 lines across 12 families, and a personalised model. That is the shortest time-to-value we have measured on a training tool.
- Puzzles carry their provenanceEvery position shows the game, the move number and the ECO code it came from. 'Train on your own games' is a common claim; showing the source move is what makes it believable.
- The Pipeline page is honest about costSync, Analyze (Stockfish), Features, Puzzles and Train are exposed as separate stages with their own Run buttons and a readiness state. Letting the user see and re-trigger the expensive parts is a better answer than hiding it behind a spinner.
- The confirmation email sends you to the Render URL, not your domainThe Supabase redirect_to points at chess-ml-coach.onrender.com, so confirming from the inbox drops you off chess.srbmaury.com and onto the raw host. Pointing redirect_to at the custom domain keeps the branding and the session on one origin.
- Cold starts serve a blank page, not a loaderOn the free Render tier the first request returned a fully blank body for roughly thirty seconds before the app appeared. A static shell or a loading state would stop a first-time visitor concluding the site is broken and leaving.
- Pipeline Run actions·Re-running Stockfish analysis on someone else's dyno is not a polite thing to do in a demo.
2 visual changes
Share this run
Proof your app is not AI slop
This test was built for chess-ml-coach.onrender.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.





