🎨 Owner Studio

Your app icon — upload, generate, or keep the custom one we made.

Current icon

Current app icon

This is what customers see when they install your app.

OPTION 1

✨ Use the custom one we made

Our designers made a custom icon for your business at build time. One tap puts it back.

OPTION 2

📤 Upload your own

Got a logo? Upload any PNG or JPG — we'll size it for the app automatically.

OPTION 3

🤖 Generate with AI

Describe the icon you want — our AI draws it, you approve it.

Generated preview
ADD-ON

🎨 AI Theme Studio $5/mo

Describe any look — our AI re-themes your whole website instantly. Swipe through everything you've created, or jump back to the original we made you anytime (free).

Activate — $5/mo
ADD-ON

📅 Book + Pay Ahead $5/mo

Your customers book time slots and pay ahead — right from a link you share. You set the services + prices; we handle the booking page.

Activate — $5/mo

📲 Accept tap-to-pay

Take contactless payments in person — perfect for barber shops, salons, markets. Request a tap reader and we set it up.

'; d.innerHTML='' +'
'+t.name.replace(/' +'
'+(t.source==="elite"?"✨ made by us":(t.created_at||"").slice(0,10))+(j.current_id===t.id?' · LIVE':"")+'
' +(j.current_id===t.id?"":'') +'
'; car.appendChild(d); }); car.querySelectorAll("[data-apply]").forEach(function(b){ b.onclick=function(){themeAction("apply",{theme_id:b.getAttribute("data-apply")});}; }); }catch(e){} } async function themeAction(action,payload){ tMsg("Working…"); try{ var r=await fetch("/api/site-theme",{method:"POST",headers:{"Content-Type":"application/json"}, body:JSON.stringify(Object.assign({site:SITE,token:TOKEN,action:action},payload||{}))}); var j=await r.json(); if(j.ok){tMsg("✅ "+(j.note||"Done."),true);themeList();} else if(j.need_sub){tMsg("⚠️ "+j.error);} else tMsg("⚠️ "+(j.error||"Failed.")); }catch(e){tMsg("⚠️ Network error.");} } document.getElementById("bThemeCheck").onclick=function(){ var em=document.getElementById("themeEmail").value.trim(); if(!em){tMsg("Enter the email you paid with.");return;} themeAction("subscribe",{email:em}); }; document.getElementById("bThemeReset").onclick=function(){themeAction("reset",{});}; document.getElementById("bThemeGen").onclick=async function(){ var p=document.getElementById("tPrompt").value.trim(); if(!p){tMsg("Describe the look first.");return;} tMsg("AI is designing your theme — ~20 seconds…"); try{ var sys="You are a CSS theme generator. Output ONLY raw CSS, no markdown, no explanations. Theme a small business website. Always style: body{background+color+font-family}, h1/h2{color}, button, .btn, input[type=submit]{background,color,border,border-radius,padding}, a{color}, .card,.section,section{optional}. Keep it clean and modern."; var r=await fetch("https://text.pollinations.ai/"+encodeURIComponent(sys+" Theme request: "+p+" Output only the CSS.")); var css=await r.text(); css=css.replace(/```css|```/g,"").trim(); if(css.length<20||!css.includes("{")){tMsg("⚠️ AI returned junk — try describing it differently.");return;} var name=p.length>40?p.slice(0,40)+"…":p; themeAction("save",{name:name,css:css,prompt:p}); }catch(e){tMsg("⚠️ Generation failed — check connection and try again.");} }; /* ---------- BOOK + PAY AHEAD ---------- */ var BOOK_LINK="https://buy.stripe.com/3cI00b6hk1mj17j0cEfw414"; function bkMsg(t,ok){var e=document.getElementById("bkMsg");e.textContent=t;e.style.color=ok?"#7ee2a8":"#ffb3b3";} async function bookLoad(){ try{ var r=await fetch("/api/site-book?site="+encodeURIComponent(SITE)+"&action=sub_status&token="+encodeURIComponent(TOKEN)); var j=await r.json();if(!j.ok)return; if(j.sub_status!=="active")return; document.getElementById("bookGate").style.display="none"; document.getElementById("bookApp").style.display="block"; var bl=document.getElementById("bookLink"); bl.href="/book/?site="+encodeURIComponent(SITE);bl.textContent="eliteaisuite.com/book/?site="+SITE; var r2=await fetch("/api/site-book?site="+encodeURIComponent(SITE)+"&action=owner_list&token="+encodeURIComponent(TOKEN)); var j2=await r2.json();if(!j2.ok)return; var sl=document.getElementById("svList");sl.innerHTML=""; (j2.services||[]).forEach(function(sv){ sl.innerHTML+='
'+String(sv.name).replace(/ — $'+Number(sv.price_usd).toFixed(2)+' · '+sv.minutes+' min
'; }); if(!(j2.services||[]).length)sl.innerHTML='

No services yet — add your first above.

'; sl.querySelectorAll("[data-svdel]").forEach(function(b){b.onclick=function(){bookPost("service_del",{id:b.getAttribute("data-svdel")});};}); var kl=document.getElementById("bkList");kl.innerHTML=""; (j2.bookings||[]).forEach(function(b){ var stc=b.status==="confirmed"?"#7ee2a8":(b.status==="awaiting_payment"?"#ffd54a":"#8a94a6"); kl.innerHTML+='
'+String(b.slot_date)+' '+String(b.slot_time)+' — '+String(b.svc||"service").replace(/'+String(b.name).replace(/ ['+b.status+']' +(b.status==="awaiting_payment"?'':"") +(b.status!=="canceled"&&b.status!=="done"?'':"") +'
'; }); if(!(j2.bookings||[]).length)kl.innerHTML='

No bookings yet — share your booking link.

'; kl.querySelectorAll("[data-bk]").forEach(function(b){b.onclick=function(){bookPost("booking_status",{id:b.getAttribute("data-bk"),status:b.getAttribute("data-st")});};}); }catch(e){} } async function bookPost(action,payload){ bkMsg("Working…"); try{ var r=await fetch("/api/site-book",{method:"POST",headers:{"Content-Type":"application/json"}, body:JSON.stringify(Object.assign({site:SITE,token:TOKEN,action:action},payload||{}))}); var j=await r.json(); if(j.ok){bkMsg("✅ "+(j.note||"Done."),true);bookLoad();} else if(j.need_sub)bkMsg("⚠️ "+j.error); else bkMsg("⚠️ "+(j.error||"Failed.")); }catch(e){bkMsg("⚠️ Network error.");} } document.getElementById("bBookCheck").onclick=function(){ var em=document.getElementById("bookEmail").value.trim(); if(!em){bkMsg("Enter the email you paid with.");return;} bookPost("subscribe",{email:em}); }; document.getElementById("bSvAdd").onclick=function(){ bookPost("service_add",{name:document.getElementById("svName").value,price_usd:document.getElementById("svPrice").value,minutes:document.getElementById("svMin").value}); }; bookLoad(); /* ---------- TAP-TO-PAY FOR BUSINESS ---------- */ document.getElementById("tapGo").onclick=async function(){ var m=document.getElementById("tapMsg"); m.textContent="Sending…"; try{ var r=await fetch("/api/tap-request",{method:"POST",headers:{"Content-Type":"application/json"}, body:JSON.stringify({site:SITE,token:TOKEN,name:document.getElementById("tapName").value,contact:document.getElementById("tapContact").value})}); var j=await r.json(); m.textContent=j.ok?"✅ "+j.note:"⚠️ "+(j.error||"failed"); }catch(e){m.textContent="⚠️ Network error.";} };