In this video· click a step to jump to it
Test recording
gymsly — app walkthrough
129,919 ms · 16,973 pixels changed
We built this regression test for app.gymsly.fit — it's yours to keep, free.
Take this test with you
This is a real Playwright test, recorded against app.gymsly.fit. 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`);
async function settle() {
await page.waitForLoadState('networkidle', { timeout: 3000 }).catch(function () {});
await page.waitForTimeout(1200);
}
async function routeBlock() {
const pats = ['**/cdn-cgi/scripts/**/email-decode.min.js','**/sentry-cdn.com/**','**/browser.sentry-cdn.com/**','**/cdn.segment.com/**','**/connect.facebook.net/**','**/*.google-analytics.com/**','**/*.googletagmanager.com/**'];
for (const p of pats) { await page.route(p, r => r.abort()).catch(function () {}); }
}
const SCROLL = "(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,900); await new Promise(r=>setTimeout(r,250)); await anim(max,0,600); })()";
async function contentLen() { return await page.evaluate(() => (document.querySelector('main, [role="main"]') || document.body).innerText.trim().length).catch(() => 0); }Checks run
Notes from the demo run
AI-generatedWe signed into Gymsly as 'Demo Fitness Club' and walked the full gym-operations surface: the dashboard leads with four revenue cards (today / week / month / year), then membership-expiry and overdue-payment panels — a genuinely well-organised operator cockpit. The left rail is comprehensive (Members, Classes, Access Control, Billing, Finance, Staff & Payroll, CRM, Broadcasts, Member Portal, Inventory, Analytics) and every route we opened rendered its own populated layout rather than a stub.
- Operator-first dashboardRevenue at four time horizons plus expiring-memberships and overdue-payments panels are the first thing an owner sees — exactly the numbers a gym runs on, no dashboard-clutter.
- Breadth of modulesAccess Control, Staff & Payroll, Member Portal and Inventory in one product is unusually complete for an indie gym SaaS — it reads as a full back-office, not an MVP.
- Trial banner reads '938 days left'The free-trial countdown shows 938 days — almost certainly a seeded/demo value; on a real account that number would undercut urgency. Worth pinning to the true trial length.
- Empty-state currency lockAll revenue cards render ₹0.00 with no way to switch currency from the dashboard — fine for an INR-first launch, but a visible currency toggle would help the first non-INR operator.
10 visual changes
Share this run
Proof your app is not AI slop
This test was built for app.gymsly.fit — 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.





























