In this video· click a step to jump to it
Test recording
EditCanvas — app walkthrough
68,028 ms · 39,313 pixels changed
We built this regression test for app.editcanvas.ai — it's yours to keep, free.
Take this test with you
This is a real Playwright test, recorded against app.editcanvas.ai. 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,s)=>screenshotPath.replace('.png','-'+n+'-'+(String(s).replace(/[^a-z0-9]+/gi,'-').replace(/^-|-$/g,'').toLowerCase().slice(0,22)||'view')+'.png');
let idx=1, post=0;
const cap=async(s,full)=>{ stepLogger.log('Scenario '+idx+': '+s); await page.screenshot({path:shot(idx,s),fullPage:full!==false}); idx++; };
const APP='https://app.editcanvas.ai';
const click=async(re)=>{ try{ const b=page.getByRole('button',{name:re}).first(); if(await b.isVisible().catch(function(){return false;})){ await b.click({timeout:3000}); return true; } }catch(e){} return false; };
const clickText=async(t)=>{ try{ const e=page.getByText(t,{exact:false}).first(); if(await e.isVisible().catch(function(){return false;})){ await e.click({timeout:3000}); return true; } }catch(e){} return false; };
const fit=async()=>{ await page.keyboard.press('Escape').catch(function(){}); await click(/fit|zoom to fit|reset zoom|fullscreen/i); await page.evaluate(function(){ var b=Array.prototype.slice.call(document.querySelectorAll('button')).filter(function(x){return (x.innerText||'').trim()==='−'||/zoom out/i.test(x.getAttribute('aria-label')||'');}); for(var k=0;k<5;k++){ if(b[0]) b[0].click(); } }).catch(function(){}); await page.waitForTimeout(500); };
await page.goto('https://editcanvas.ai/',{waitUntil:'domcontentloaded'}).catch(function(){}); await page.waitForLoadState('networkidle',{timeout:6000}).catch(function(){}); await page.waitForTimeout(1500); await cap('home');
await page.goto(APP+'/editor',{waitUntil:'domcontentloaded'}).catch(function(){}); await page.waitForLoadState('networkidle',{timeout:8000}).catch(function(){}); await page.waitForTimeout(3500); await page.keyboard.press('Escape').catch(function(){}); await cap('editor-blank'); post++;
await click(/menu pool/i); await page.waitForTimeout(1800); await cap('menu-pool-templates'); post++;
await page.evaluate(function(){ var imgs=Array.prototype.slice.call(document.querySelectorAll('img')).filter(function(i){return i.offsetParent&&i.width>40&&i.height>40;}); if(imgs[0]) imgs[0].click(); }).catch(function(){}); await page.waitForTimeout(2500); await page.keyboard.press('Escape').catch(function(){}); await fit(); await cap('template-applied'); post++;Checks run
Notes from the demo run
AI-generatedEditCanvas turns any menu image or PDF into a fully editable design you can publish to QR, print or screen. The editor loads instantly (even before sign-in) as a full design canvas with size presets, background controls, a Menu Pool of templates, Smart Create, and one-click text/object insertion — auto-save is on by default once you're signed in. It's a focused, Canva-for-menus surface that gets you designing in seconds.
- Product-first onboardingThe editor canvas is usable before you create an account — you design first and sign in to save/export, which is exactly the right order for a creative tool.
- Menu-specific presetsSignage-horizontal/portrait/landscape size presets and a Menu Pool of starting templates mean a restaurant owner isn't starting from a blank artboard.
- Auto-saveAUTO-SAVE ON in the toolbar removes the classic 'did I lose my work' anxiety for non-technical users.
- Dense toolbar for first-timersInstant Menu, Smart Create, Insert, Menu Pool, Add text, Magic, Clone all sit in one bar with terse labels — tooltips or a 30-second intro would help a first-time restaurant owner.
5 visual changes
Share this run
Proof your app is not AI slop
This test was built for app.editcanvas.ai — 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.














