From 228f70d0115a72cfcb63ed12617a090084c596d5 Mon Sep 17 00:00:00 2001 From: SnapOtter Date: Sun, 17 May 2026 09:25:12 +0800 Subject: [PATCH] feat: add static demo site at demo.snapotter.com - New apps/demo/ that reuses apps/web components with mocked API layer - Full UI shell: login, change password, analytics consent, dashboard, all tool pages - Stateful mock tracks session flow (password change, analytics consent) - Demo banner with link to GitHub repo - Processing attempts show info message with GitHub link - Deployed to Cloudflare Pages as static site (no backend) Also links demo across all surfaces: - README: "Live Demo" badge - Landing navbar: "Try Demo" CTA button (replaces "Book a Demo") - Landing hero: "No sign-ups. No credit card." tagline - Docs getting-started: "Try before installing" tip box Other changes: - Docs: move NVIDIA GPU section above GHCR, demote GHCR to collapsed details - Fix before-after slider checkerboard background for transparency - Fix remove-bg preview reset when no effects applied --- README.md | 1 + apps/demo/index.html | 23 ++ apps/demo/package.json | 25 ++ apps/demo/public/_redirects | 1 + apps/demo/public/apple-touch-icon.png | Bin 0 -> 54796 bytes apps/demo/public/favicon.ico | Bin 0 -> 9662 bytes apps/demo/public/favicon.png | Bin 0 -> 5787 bytes apps/demo/public/logo.png | Bin 0 -> 30068 bytes apps/demo/src/demo-banner.tsx | 32 ++ apps/demo/src/main.tsx | 56 +++ apps/demo/src/mock-api.ts | 351 ++++++++++++++++++ apps/demo/src/styles/globals.css | 108 ++++++ apps/demo/tsconfig.json | 14 + apps/demo/vite.config.ts | 21 ++ apps/docs/guide/getting-started.md | 20 +- apps/landing/src/components/hero.tsx | 3 +- apps/landing/src/components/navbar.tsx | 12 +- .../components/common/before-after-slider.tsx | 10 +- .../components/tools/remove-bg-settings.tsx | 2 +- pnpm-lock.yaml | 34 ++ 20 files changed, 697 insertions(+), 16 deletions(-) create mode 100644 apps/demo/index.html create mode 100644 apps/demo/package.json create mode 100644 apps/demo/public/_redirects create mode 100644 apps/demo/public/apple-touch-icon.png create mode 100644 apps/demo/public/favicon.ico create mode 100644 apps/demo/public/favicon.png create mode 100644 apps/demo/public/logo.png create mode 100644 apps/demo/src/demo-banner.tsx create mode 100644 apps/demo/src/main.tsx create mode 100644 apps/demo/src/mock-api.ts create mode 100644 apps/demo/src/styles/globals.css create mode 100644 apps/demo/tsconfig.json create mode 100644 apps/demo/vite.config.ts diff --git a/README.md b/README.md index 1e9a651f..9bc2a09d 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,7 @@ CI License Stars + Live Demo Discord Sponsor

diff --git a/apps/demo/index.html b/apps/demo/index.html new file mode 100644 index 00000000..3d1709c0 --- /dev/null +++ b/apps/demo/index.html @@ -0,0 +1,23 @@ + + + + + + SnapOtter Demo + + + + + + + + + + + + + +
+ + + diff --git a/apps/demo/package.json b/apps/demo/package.json new file mode 100644 index 00000000..2277e56b --- /dev/null +++ b/apps/demo/package.json @@ -0,0 +1,25 @@ +{ + "name": "@snapotter/demo", + "version": "1.17.0", + "private": true, + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview" + }, + "dependencies": { + "@snapotter/shared": "workspace:*", + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.0.0", + "@types/react": "^19.0.0", + "@types/react-dom": "^19.0.0", + "@vitejs/plugin-react": "^4.3.0", + "tailwindcss": "^4.0.0", + "typescript": "^5.7.0", + "vite": "^6.0.0" + } +} diff --git a/apps/demo/public/_redirects b/apps/demo/public/_redirects new file mode 100644 index 00000000..7797f7c6 --- /dev/null +++ b/apps/demo/public/_redirects @@ -0,0 +1 @@ +/* /index.html 200 diff --git a/apps/demo/public/apple-touch-icon.png b/apps/demo/public/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..084ec2a612eb51145e6e25c6e95daefd7c99cc4c GIT binary patch literal 54796 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%0AySSQ$~bUEZ;LUp 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 Hu0mjf|LoK5 literal 0 HcmV?d00001 diff --git a/apps/demo/public/favicon.ico b/apps/demo/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..030576fc5271af9f0dedf182b75c696d8582975a GIT binary patch literal 9662 zcmaKyRZtv2o3#fB?(R%*2p*h);0f-ogS)$17zpm}gkS>%cXx;2ZoxIU1ZMN^ck$os z?nU>h)7{k+06^EjHBQd|_-rBo zfEF77_@<)t1rv=7?cY&MSs5v{fBNqR01gV$zZrM~Gx;Z|&N8}g0027v{~K_CtQ-;m z06|DrN?gM`#|$ins4$Y_ivpC!KnJ3|!K~h?YH4Y8v@LG_@tyic-bkt5MCxPdxZpLu zTyRN}WW7g89|%nz*jnY+vWHGfYx_Y>VX!9#`&NCfn+f&At_|!|xoieX7W<6H z)nB4}kxdo_%ymXcK7M{!4lh?8p9?!#diq$Zj~k#u9EL)ND3=v5SSGody&YQd1}y!% z^qcI2Q)lr-0^j5yeG2d*&_P}q7_hZ!$CujNV0qpOstJ7J%^x^Uzw={IYCM5XG;YlS zyC1f{mcgvn&S1()p6kVU!Y>&i>h?^1fR{3(*X?h^e6O%+UZ1tt#k7Sb#cMrn5by%E z)3b2;Wn=S+w=~~)>mD|ocmM;#SxwSCd*GPzUlxd= zPn)Ig_aZk3FWDYp492tWC|;lGXron>+@^o8cG3%7F8#3G96`NnYx$(UH-2wlGQBZN z#6e@~x@mpr;A5)h7El^E5e3q_@NqjQCDG~eeOOuxBaIkq=3)0C?{wdtqadNqOC-=RKyx4Rgm_D}_~0bf+1DZ*kfDkVrW#3y)}(QNiZezc-d zHP(AbGW`7&s}ED>w;4C7pEpE~-R1Y6#mIcqoU1o)&CIN%k^3M8hz#x&L5L1f|5_Pm zWz<}4d~PYSRpFC$fk?TEm3Z-9Fj5U;l9O8uFER&dY)TJ9&;IHNe!S2Y3E-P%z@v2H zjruQI09k1zscH#u=>L$z_y4xv|91}Ee0^{Kng1z==*0iYVU@Ozj=DAx_Hxbme0i=G zB5h>;nXHi(A2r=Oyif>bf0EdHlXOEBobM*MiD*pO`r_iT;PsQAk?=GY+C=ChMJS;% zHqzr|l9Y)#PwBbTcBN{G8iCkR4Z1|7f6?iPAw0euwJ7K07U^K`kB9bl8ORh9X$NDv>ou{Z^-g z0xdaTn&*%)IU|qi*&Z%UiFlkgB#WPn;Ekf`F_u%pjf+03-5l>Y&O*m5n-3$^57~}A zhuR*kt!fyRslT?P^ydN90}6&Cdib%HoC)gvsjknADpQJq(azGW-xp^BxvjoE`3^zl zm>J3%Q-!lOr3^%+Zdg9aT_;Q=`9#3&NKN6fK1%x9 z$J@~niH2Cy8}Qa#=f>hpbDjL6;Kgl|$DLYk(oNsFiJ1T)A%!eeuih{GpiGxS&|Uuqxak*%DYF7Lh>FkYJtUNBTBom z)FU!S$1hN?kV4}H!|}%mXi3g+b|5s_T^QM;-K+xeleM@5J8{|y$b7q%skPj|YiUfI zwzCQ0CU#d}Had({;GZm+ePvTi5Iu6ga24*qi>$^yWawo_RFH7e@U`k8uE}I?6ya=J zf9m%&vIPx_*7WPMo~tUQH&p#?J7~2Kn|CZtswXz7tP%6vS(A6}Ec6MUxVP=m_in;v zTUWLwkACYSIMtq-)`xI<iyaACR;OLyrCfDQ=PUo&#z;G z60T!MW}hD>bx(6=&2h9JU)g8h$XC^vS=aKm;x@Hr5?Nu|LMT~QZGpI>!}PdmvL3Sb zWzqaOqzZ$Qi4h;x<8%@5-YQ5Fowcjt+8gASgf95P2e+CC)Ro+JXqSBgl^V8zb0uwY zr>GpCFoi@e157shvmfBzznyjNT|4DNiBbz_o0Djzg&V6Zt)n@cgw|vq@cUU>Rq2)e zI3$up4>iZ1=vq94<@mbtku18bbp_TUWzovmms}?TmCSvJNpxL}Yna0a*Y_sZF)znoH&`-Yi>4QupOK6;35R>u9**|rG}z|j zPB=ta$x9KTEXjPZpxwW!=|x*nj?Jt?CPndQQ42>QoY$LMMg?{_5gzGX+7Hg<8t%6p zVAnk1V@NmMq7JK2`pNvIDHswq`ymIS#4;j9Qq>|ib9KG0pPMw4b65T|Y-xi}l*mv? zF^!a1z%s1Lr?!pMh^iof``PcKh?WRQL=OS>R8B}m;9}7aN(-BJ+i+L&ryCSHFBh3= zCv%4mc1C8t#I>T#>@TC^_GF?D2n}J05X75u#`xG|P&+h_m6P~Wq^UbKJ@;_af3{@N zVj^%XIEcOAj1@^Y+_pn$#*Zmr9s;1P^A?zvqORKsBF@Ewz|d3S+fqF9VpMB^iwZvG zSj+04NaOoS#_mp+Z>bHf5uE&XX z;)Ju=wb`kLMR!mt>RO9GD%+i2X=AjPRbKKli%lJI%Hv5-nGUKR9%ex!Ck5FHwJIP1=Rg= zDwVT3G(8%PLTUxX3WWLXoQ-Q{(4SGGdhYlve#k=#xN{6(MZP7&Nh~nJMf~${Ji&ZF zmNDZ--h&lBXoX~%$J}*0@b8aZ;sV&@yfZ7Zw)$};eD17m{R&ovO3rVrz1MUT(*nFa z?9|@hjWu9rAR;^3qF7gQ)LCSI+e%Oy6hik!;^lcFA|A62=_Uq#Eut|8-3TnGY7yB= z>{E-O8Xb{vI4qUMslPO_2bY;0FnrS^gYhtbLQc;SKzc!%hNXcqfAF* z0bdB(9qMNl{MfK|Q1{oJ#|6%mf)93Rs^KhuQ?KqA_8moB0yxgIBVHLmNH>vziUk(U zrR3AMlO-xp*u5pK1RDfin)BhdFSFGnp{kkxD8fA*h+#pzq1fByoAU!{a>s7xk%&+? zHh;`sazJQhM%&K3_?w+2$g^x>Gfq8hiix-EUJvujc`DF%MV~*x^z>Qa$*d-$J$tXL zH}@{`bVm=5krin2_{bLA>-PR!QE$HtiLjuIGfiyws8aMEJAA=b1c%BOga(4WgY%^RN7`C|>j zt`fQ`p6vH%1+_TxLdhM@?SJkh=Z-v#-`};4HWNLY4R$AYC#DgYGieF>*@a>oTjWXyiF{ z`KE%P6CCx!0mO{0PI?yB4nn))#I!8228Dd)5p6Fa&T!(izM+{-#u$fJtMavKAk7y8 z_TGqeej7xiwo-0LfZC1@?92dF(b?Ekn#wh zjzMHN*QyQ~L-RHvw&h7SGC1Gx7t3st1)#kmk5StXlt)gTyq#Pv&0BQPhp*D+?fI%Q z#-l?CU9Ps)Ft)IQYMY`UeCsv}zY>#fFOu4*GHL4$I*i=*zwtd=Mg78ebFxh*P1jr@ zy`WoJ_gP125Q*e>-Akpu5NiyVn zs5sE~C5n4Thyz;n^tLS`BOW8c+|@O%z8q*b!aDuFPIDXeD}ErQ6}g-I5?{6c8iNak zRdZ#CHF;`S?TQC}v*0xdeq1>;<2tk<)^Ju{?(b_GEg%KHgUELeE~@W$H7D3FQ!T^j zla&0HdBD_S0A1y_L5BqxEw7iD`iC%C-_Gk^Bfh)^jON=uf4Y|wUr=%8YfxgS@b??W zBek#rx2mUn)Q2EAj6)W0BlSOU|G4@8g6x0gFo5&FAzK^%DdK;DY$C<~K=!%bKghOP zjGsI9=RTj$Y-^wqhl;&VNPQ17r#9KbLxD?5_(@v_QC#VxVG4zhV)_t86N-YyRLN9U z795OTbO!I}QK?l~B60DQ_b#JpF5n<@3b^H!$2i@2={o(Idna<~7bfv4%9e18ZNUB@ zGT(nCtXyK9c(MmzI$r5{sk5o6Dw-BaYMG!OnG9@bM)Gu7| zCV4Z&+(6=-ULulBSJn)(B1#FQRKvGAp=4$(%C(7AEeZC_wgo>su+(*SKYUc55i|AX zQ)QK2phFiY8H}po8P;)>M!bZPu&F(Ap@r8q9dImi9S-3ibzsrtE`1-rWo4XM*K3HO zs4)1G$4IKli;om4tA z2KFKBD^4_#0YuDedWOsGc-F#~$S&LYne(%K&k8+F+a@oV|x|{r%=N(=< z$5gp=5OB8es!5j;Hn<}g`({O*L|)JfgD2reWnr`idenVTwv;>a#$y>)P% zn?yWW&$@qmY^ihkKEItLT6@v&b0@gTL^p|uEXmakrm&y-+8*oU7dHCR3VRt{k$JI~ zsvqTNzLxss6+}q|y|F`raD`bbe!FhX@t9~IWwg%kPHrffDH_6Eb`Zu$_;pzh+&Ouo zIla8VkMISHj$QJn#V>ATBQmvJ*=G?g*uTHrb7k3DTXMIPRaKpRx%o>REs>Ngp(dA= z<3ER8wdhsVr~f>Cr03gwQrA%-t5Bn^R(`7tgW$Lw^k=r8&GDJ=AFDjwWert}xpN@d zo^5AnDnzWT^E@In;}O_}xPLmVSzD-g@f)X2AlT}V#nA|&xnwEpxLcZd{$|$B5hy;- z+r$m>EZWgD+|$(oQiW(}(GP| zepN zuRJf|v%aJB{vf*Bo)Or1AdAt})FjxPZcn`&&E=Xo*iHlxacs#4s#cAxY1m}Ldmj{5 zmt5OvKK#y7=cgJNzofSa)BAOz8h+5sgHhb9sq`w{>k~LQq!Ny6@Ac_1T0o{C0+VKY zHOxsR68gsgIj4R8A-0~=JsxZPp|DU=j4JQKBXa~VF)*5*Ao+?XUJZV-SYdqr94?Iz z>xYS<*#jU}|`in5$y;OD9a8x?8Q+LDW-1M^9*F##` zRy6(ueCo0gh1B`XB9*d-kK;9F@KL@5nc?{!TIvaIo8F%sisFn~FLh=gZcSZW_Fa9} zlB?y*<7ql4cTEdH{UkoRG9iAW`C{q>xI)DmJE}rtW3TfjAm!rek5CJVt@aA@ShGdi zD0O@0L}sB|bgc}8nqj={E1oyOsBpi$AE=kHCLF0evz_nNxx@yW%DIGv#9ZBBN~>A3A24DbMb_a%hr~(^lemu4z!6ngg-GcatasA z5cTOfa9_Niq9#-*y1@8TQW8!4!y<>Io$t*Rsg0pK#bREuYv4t*n0RRUPi)(!kKsKN z!AU@Q&%B_#{VwhPwg|V>k2f0$+7|(@`hik}#w+KaCVbK|;Q_KnSNAu3-o8Hk!fQZO z?3-AtHu|xjc~Q)1H)c|Xl{5E3s3&KXX6BUzd){QC;+x7PYOu#-qMpolZJf-ak1^DK zSu{deF|l4Z`>$})1cjxUu|jQJDNvi|mK*&(f{61#TX? zmq^3E-4`79bz2!pW%bjADPawOj#K7|7>%>rwBQUeLFU92O=8M(O5P8*9~HJvzt$jO zO&i2(gaK6h!cYw=k9Ha%uEsUrZ`~C{A%tQdVUM05cQ< zuip)L{OHF$pZ`!}3;f(<4eG2nnK{)b1Wa>Gc4XOxYbQ_sdooXNk8V^d%A1^4qBm5T z^M;Dw!smRqLMP$(A!Js>*6og!v>zW82`T|4Ks2sPb?*;bIMdtwyJZ)KB+)oC*cY#> z^tJMdG|X_)m&FYwL3$`N{fEN_a;ulW2;-+~dM*Sv%)Pc^zs5G5IPhOn>YJWv%{9?6C}9T`N%vpKc=d+njLbwfHx2;9-vPkw~xp z9%!(GVz&QjM7qSWu5|;U5EXd}tD8Ue3uHV5eViLlG~Jtv)^OT_YT0^Tz8V}%CZir$#?JHTQnz$(#1&5)|z&Q6qq2$ zzv2Ko7!!%uxRcgNhrOwg6%Wt7WLROJp_vH}h7()(!6Uc#47DBEJQyos-iP)+E1W+# zOB%9QgrBh-JCJmmot$eV;2fe-AAyz)if7iG>-V3#d+rhb7-3^(EbsB$fPv(B6wV>D zhFCwhl!?)vvaVVl05pCp=*AmP5zW|B2-hb<>l}OiSCA6U#3tJxA}E-NtW_NWW<4KP z@gDg5M`k~TdTFk6&l_mLWDVjA+1(`UWw%bn~A)E_TOPPw<8Wduu^D0 z5JJ3VAH&+}u_SVrQ`FY5x}oeQEHp@j^6rEpuIfYmRojgD<-G6BJS3TUNY9(yQu6B=36dDFS z6YXG5DmX>s4?z1_3XeI~z?4MLUtV4V+4k(rN~(Q?j8aQ%LK!XC>$M;!v(@mIw`>S-Z>GNAI405VDJPKqC&7)YBJxtMcT= zbHbxoH3*Uuk84WjJO7SwkM%4LbKjRQ)jC7>Urr;iLm_s!N6uaiyQG^AdaS^8<+R0X zHj21|*43a%eiVt?%5e9s=4e=V-blC^S(vE5vNCf7^F6w5w&4*V&8vHGi7s9uNG z%Ay&{w@9j@IdpXE-OJ~Uf=-oo+^W^5Hu8{GBv^W4L8O9cTa!eXOa$A0;=`uh-1Ils}2_6#f4Y!&R4=~vG6nip};%(l|z&%_C^sUz$ za8L_K9|i5>_;BtBL2lpdWBO06L@~pl>Sl515!s zW~qt3iFHs_XcWaBdzg&f8FT7V=DlH-20p(S8&8J4SfFGYszZGY_S3g;-HNJhD*M`1S}mkm-!C)xlZqY}xiW z!)}K+4)fO|&5v`Hnr;O{iqWg9JR;foqbU3b?qW84xfbkqeg5?(ze6)f74-z?@QXvw z+|{zGelycr`KK0&5MZ7cvY1FzV1#{hTct{@=n)epa~v*ClrJ2sL#jnn+bhR-p-BIP zS<;mMQPKQ&%BV?xjKQqd>Y zf%Y-6`Xeau2MxKhYGQ0@#Rw!x!?L|kGoeY0u#C8{Fs%mTi@><$oV})y3{`e~z}be- zA6YPqz`@<9&e~ADhKt)S`FliYVvP*TwUz_J9 zcDb2)Jm3beP^Lib6DV)gGoB(HLg6U~1%XXgW*!8{dUiB2t)E z9o;D+{>g%QF)_F6Gj1`;?85}KZOv%LWh)@j{#ZS%_*+T$=a((oM44MFwzdac4&;Ny zwnaRjI=pf}6EuxUmx!U2G3&Q74Q{j@feW(&o*+DJ*d7YOz!wF8d2* z*p#?ynikI5+f7!}w3cXEqdYXT67sJ9Wo^S8*q=bGW@R) z928F337Dp}%@OWtIS&kO##pH`V;7bulnuJ!+FKtOOp}ir((wq$D@NQfVKG5J-Gj?& z0XLgW^xN3}zB3yVM>f<#i8s_E^2VK~r>t>Fs&95FWCUHER!-R>Eg3DMICYvao%@$l zE?@z@b0GV>zBADv^wlJ+cla(;8vgOQ>cm8AbNw&qF=lyySy*2T8Hjk^5N$I_pd9q` z#|8f%OaF~6e<8-ysa#CeQS&=))Muy5k{SrjaEbDy!(jWu2HF;0hf=8O#3A?tDP=?S z#T6qG@NNkOYRxNeoohji0q?iOsqANiRi((q~{J0aKrsg1}zQQ6Zf^_OZ^)6tc&(mc~n1cj(xfL(hY)9(HTD4^$L%QQYSiuY06HB=~F_y zzG6)>CRX!H=P-!=o&UgnISgMdkLFwXpwKm-&WI%1N$ wXphNDrJpiF90?NRuDu7Bgc2WE?_W96%3!Cr-2$joUR2Vsf8VM8e{1@`01&jJh5!Hn literal 0 HcmV?d00001 diff --git a/apps/demo/public/favicon.png b/apps/demo/public/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..0ccaa93b14a81091de605ea04ea075a3a68caa4e GIT binary patch literal 5787 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 Z^uIU>9(Nu^{}TWJ002ovPDHLkV1lRwIXM6T literal 0 HcmV?d00001 diff --git a/apps/demo/public/logo.png b/apps/demo/public/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..02115384ed8f72b1467756f6d692d0f393ca6221 GIT binary patch literal 30068 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 b{0n{u3@3@Y)6ox#00000NkvXXu0mjf*^8Hy literal 0 HcmV?d00001 diff --git a/apps/demo/src/demo-banner.tsx b/apps/demo/src/demo-banner.tsx new file mode 100644 index 00000000..c9d22d10 --- /dev/null +++ b/apps/demo/src/demo-banner.tsx @@ -0,0 +1,32 @@ +import { useState } from "react"; + +export function DemoBanner() { + const [dismissed, setDismissed] = useState(false); + + if (dismissed) return null; + + return ( +
+ + This is a live demo. Processing is disabled.{" "} + + Self-host SnapOtter + {" "} + for full functionality. + + +
+ ); +} diff --git a/apps/demo/src/main.tsx b/apps/demo/src/main.tsx new file mode 100644 index 00000000..e1862151 --- /dev/null +++ b/apps/demo/src/main.tsx @@ -0,0 +1,56 @@ +import { installMocks } from "./mock-api"; + +installMocks(); + +import { StrictMode } from "react"; +import { createRoot } from "react-dom/client"; +import { App } from "@/App"; +import { DemoBanner } from "./demo-banner"; +import "./styles/globals.css"; + +const DEMO_MARKER = "demo instance"; +const GITHUB_URL = "https://github.com/snapotter-hq/SnapOtter"; +const GITHUB_LABEL = "github.com/snapotter-hq/SnapOtter"; + +function patchDemoErrors(root: Element) { + const observer = new MutationObserver(() => { + root.querySelectorAll(".text-red-500, [data-type='error']").forEach((el) => { + if (!(el instanceof HTMLElement)) return; + if (!el.textContent?.includes(DEMO_MARKER)) return; + if (el.dataset.demoPatch) return; + el.dataset.demoPatch = "1"; + el.classList.remove("text-red-500"); + el.style.color = "#3b82f6"; + el.style.fontSize = "13px"; + el.style.lineHeight = "1.5"; + + const text = el.textContent; + const parts = text.split(GITHUB_LABEL); + while (el.firstChild) el.removeChild(el.firstChild); + el.appendChild(document.createTextNode(parts[0])); + + const link = document.createElement("a"); + link.href = GITHUB_URL; + link.target = "_blank"; + link.rel = "noopener noreferrer"; + link.textContent = GITHUB_LABEL; + link.style.fontWeight = "600"; + link.style.textDecoration = "underline"; + link.style.textUnderlineOffset = "2px"; + el.appendChild(link); + + if (parts[1]) el.appendChild(document.createTextNode(parts[1])); + }); + }); + observer.observe(root, { childList: true, subtree: true, characterData: true }); +} + +const rootElement = document.getElementById("root"); +if (!rootElement) throw new Error("Root element not found"); +patchDemoErrors(rootElement); +createRoot(rootElement).render( + + + + , +); diff --git a/apps/demo/src/mock-api.ts b/apps/demo/src/mock-api.ts new file mode 100644 index 00000000..95c24ac5 --- /dev/null +++ b/apps/demo/src/mock-api.ts @@ -0,0 +1,351 @@ +const PERMISSIONS = [ + "tools:use", + "files:own", + "files:all", + "apikeys:own", + "apikeys:all", + "pipelines:own", + "pipelines:all", + "settings:read", + "settings:write", + "users:manage", + "teams:manage", + "features:manage", + "system:health", + "audit:read", +]; + +const FEATURE_BUNDLES = [ + { + id: "background-removal", + name: "Background Removal", + description: "Remove image backgrounds with AI", + status: "installed", + installedVersion: "1.0.0", + estimatedSize: "4-5 GB", + enablesTools: ["remove-background", "passport-photo", "transparency-fixer"], + progress: null, + error: null, + }, + { + id: "face-detection", + name: "Face Detection", + description: "Detect and blur faces, fix red-eye, smart crop", + status: "installed", + installedVersion: "1.0.0", + estimatedSize: "200-300 MB", + enablesTools: ["blur-faces", "red-eye-removal", "smart-crop"], + progress: null, + error: null, + }, + { + id: "object-eraser-colorize", + name: "Object Eraser & Colorize", + description: "Erase objects from photos and colorize B&W images", + status: "installed", + installedVersion: "1.0.0", + estimatedSize: "1-2 GB", + enablesTools: ["erase-object", "colorize", "ai-canvas-expand"], + progress: null, + error: null, + }, + { + id: "upscale-enhance", + name: "Upscale & Enhance", + description: "AI upscaling, face enhancement, and noise removal", + status: "installed", + installedVersion: "1.0.0", + estimatedSize: "4-5 GB", + enablesTools: ["upscale", "enhance-faces", "noise-removal"], + progress: null, + error: null, + }, + { + id: "photo-restoration", + name: "Photo Restoration", + description: "Restore old or damaged photos", + status: "installed", + installedVersion: "1.0.0", + estimatedSize: "800 MB - 1 GB", + enablesTools: ["restore-photo"], + progress: null, + error: null, + }, + { + id: "ocr", + name: "OCR", + description: "Extract text from images", + status: "installed", + installedVersion: "1.0.0", + estimatedSize: "3-4 GB", + enablesTools: ["ocr"], + progress: null, + error: null, + }, +]; + +const STATE_KEY = "snapotter-demo-state"; + +function loadState(): { + passwordChanged: boolean; + analyticsEnabled: boolean | null; + analyticsConsentShownAt: number | null; +} { + try { + const raw = localStorage.getItem(STATE_KEY); + if (raw) return JSON.parse(raw); + } catch {} + return { passwordChanged: false, analyticsEnabled: null, analyticsConsentShownAt: null }; +} + +function saveState(patch: Partial>) { + const state = { ...loadState(), ...patch }; + localStorage.setItem(STATE_KEY, JSON.stringify(state)); +} + +function json(data: unknown, status = 200): Response { + return new Response(JSON.stringify(data), { + status, + headers: { "Content-Type": "application/json" }, + }); +} + +function matchRoute(url: string, method: string): Response | null { + const path = new URL(url, "http://localhost").pathname; + + if (path === "/api/v1/config/auth" && method === "GET") { + return json({ authEnabled: true, oidcEnabled: false }); + } + + if (path === "/api/auth/login" && method === "POST") { + localStorage.setItem("snapotter-token", "demo-token"); + return json({ token: "demo-token" }); + } + + if (path === "/api/auth/session" && method === "GET") { + const token = localStorage.getItem("snapotter-token"); + if (!token) return json({ error: "Unauthorized" }, 401); + const state = loadState(); + return json({ + user: { + id: 1, + username: "demo", + displayName: "Demo User", + role: "admin", + permissions: PERMISSIONS, + mustChangePassword: !state.passwordChanged, + analyticsEnabled: state.analyticsEnabled, + analyticsConsentShownAt: state.analyticsConsentShownAt, + analyticsConsentRemindAt: null, + loginMethod: "local", + hasLocalPassword: true, + }, + }); + } + + if (path === "/api/auth/logout" && method === "POST") { + localStorage.removeItem("snapotter-token"); + localStorage.removeItem(STATE_KEY); + return json({ ok: true }); + } + + if (path === "/api/v1/health") { + return json({ status: "ok", version: "1.17.0" }); + } + + if (path === "/api/v1/settings" && method === "GET") { + return json({ + settings: { + disabledTools: "[]", + enableExperimentalTools: "false", + defaultToolView: "sidebar", + defaultTheme: "system", + }, + }); + } + + if (path === "/api/v1/features" && method === "GET") { + return json({ bundles: FEATURE_BUNDLES }); + } + + if (path === "/api/v1/config/analytics" && method === "GET") { + return json({ + enabled: true, + posthogApiKey: "", + posthogHost: "", + sentryDsn: "", + sampleRate: 0, + instanceId: "demo-instance", + }); + } + + if (path === "/api/v1/user/analytics" && method === "PUT") { + saveState({ analyticsEnabled: true, analyticsConsentShownAt: Date.now() }); + return json({ ok: true }); + } + + if (path.startsWith("/api/v1/tools/") && method === "POST") { + return json( + { + error: + "This is a demo instance. To process images, self-host SnapOtter from GitHub → github.com/snapotter-hq/SnapOtter", + }, + 403, + ); + } + + if (path === "/api/v1/upload" && method === "POST") { + return json( + { + error: + "This is a demo instance. To upload files, self-host SnapOtter from GitHub → github.com/snapotter-hq/SnapOtter", + }, + 403, + ); + } + + if (path === "/api/v1/files" && method === "GET") { + return json({ files: [], total: 0 }); + } + + if (path === "/api/v1/files" && method === "DELETE") { + return json({ deleted: 0 }); + } + + if (path.startsWith("/api/v1/admin/")) { + return json({ error: "Admin actions are disabled in this demo." }, 403); + } + + if (path === "/api/auth/change-password" && method === "POST") { + saveState({ passwordChanged: true }); + return json({ ok: true }); + } + + if (path.startsWith("/api/v1/pipelines") && method === "GET") { + return json({ pipelines: [] }); + } + + if (path.startsWith("/api/v1/pipelines") && method === "POST") { + return json({ error: "Pipelines are disabled in this demo." }, 403); + } + + if (path.startsWith("/api/v1/audit") && method === "GET") { + return json({ entries: [], total: 0 }); + } + + if (path.startsWith("/api/v1/users") && method === "GET") { + return json({ + users: [ + { + id: 1, + username: "demo", + displayName: "Demo User", + role: "admin", + createdAt: new Date().toISOString(), + }, + ], + }); + } + + if (path.startsWith("/api/v1/teams") && method === "GET") { + return json({ teams: [] }); + } + + if (path.startsWith("/api/v1/apikeys") && method === "GET") { + return json({ apiKeys: [] }); + } + + if (path.startsWith("/api/v1/roles") && method === "GET") { + return json({ roles: [] }); + } + + if (path.startsWith("/api/")) { + return json({ ok: true }); + } + + return null; +} + +const originalFetch = window.fetch.bind(window); + +export function installMocks() { + window.fetch = async (input: RequestInfo | URL, init?: RequestInit): Promise => { + const url = typeof input === "string" ? input : input instanceof URL ? input.href : input.url; + const method = init?.method?.toUpperCase() || "GET"; + + const mock = matchRoute(url, method); + if (mock) return mock; + + return originalFetch(input, init); + }; + + const OriginalXHR = window.XMLHttpRequest; + const MockXHR = class extends OriginalXHR { + private _url = ""; + private _method = ""; + + open(method: string, url: string | URL, ...args: unknown[]) { + this._method = method.toUpperCase(); + this._url = typeof url === "string" ? url : url.href; + // @ts-expect-error -- variadic override + super.open(method, url, ...args); + } + + send(body?: Document | XMLHttpRequestBodyInit | null) { + if (this._url.startsWith("/api/")) { + const mock = matchRoute(this._url, this._method); + if (mock) { + setTimeout(async () => { + const responseText = await mock.text(); + Object.defineProperty(this, "status", { value: mock.status, writable: false }); + Object.defineProperty(this, "readyState", { value: 4, writable: false }); + Object.defineProperty(this, "responseText", { value: responseText, writable: false }); + Object.defineProperty(this, "response", { value: responseText, writable: false }); + this.dispatchEvent(new Event("loadstart")); + this.dispatchEvent(new ProgressEvent("progress", { loaded: 100, total: 100 })); + if (this.upload) { + this.upload.dispatchEvent(new ProgressEvent("progress", { loaded: 100, total: 100 })); + this.upload.dispatchEvent(new ProgressEvent("load", { loaded: 100, total: 100 })); + } + this.dispatchEvent(new Event("load")); + this.dispatchEvent(new Event("loadend")); + if (typeof this.onreadystatechange === "function") { + this.onreadystatechange(new Event("readystatechange") as ProgressEvent); + } + if (typeof this.onload === "function") { + this.onload(new ProgressEvent("load")); + } + }, 100); + return; + } + } + super.send(body); + } + }; + + window.XMLHttpRequest = MockXHR as unknown as typeof XMLHttpRequest; + + const originalSubmit = HTMLFormElement.prototype.submit; + HTMLFormElement.prototype.submit = function () { + if (this.method.toUpperCase() === "POST") { + const target = this.action || window.location.href; + const url = new URL(target, window.location.origin); + window.location.href = url.pathname; + return; + } + originalSubmit.call(this); + }; + + const OriginalEventSource = window.EventSource; + window.EventSource = class extends OriginalEventSource { + constructor(url: string | URL, init?: EventSourceInit) { + const urlStr = typeof url === "string" ? url : url.href; + if (urlStr.startsWith("/api/")) { + super("about:blank", init); + setTimeout(() => this.close(), 0); + return; + } + super(url, init); + } + } as typeof EventSource; +} diff --git a/apps/demo/src/styles/globals.css b/apps/demo/src/styles/globals.css new file mode 100644 index 00000000..04621971 --- /dev/null +++ b/apps/demo/src/styles/globals.css @@ -0,0 +1,108 @@ +@import "tailwindcss"; +@source "../../../web/src/**/*.tsx"; +@source "../../../web/src/**/*.ts"; + +:root { + font-family: + "Inter", ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, + "Segoe UI", "Noto Sans", "Noto Sans CJK SC", "Noto Sans CJK TC", + "Noto Sans CJK JP", "Noto Sans CJK KR", "Noto Sans Arabic", + "Noto Sans Devanagari", "Noto Sans Thai", sans-serif, + "Apple Color Emoji", "Segoe UI Emoji"; +} + +@theme { + --color-primary: #3b82f6; + --color-primary-foreground: #ffffff; + --color-background: #ffffff; + --color-foreground: #0f172a; + --color-muted: #f1f5f9; + --color-muted-foreground: #64748b; + --color-border: #e2e8f0; + --color-card: #ffffff; + --color-card-foreground: #0f172a; + --color-sidebar: #f8fafc; + --color-sidebar-foreground: #334155; + --color-accent: #3b82f6; + --color-destructive: #ef4444; +} + +.dark { + --color-background: #0f172a; + --color-foreground: #f8fafc; + --color-muted: #1e293b; + --color-muted-foreground: #94a3b8; + --color-border: #334155; + --color-card: #1e293b; + --color-card-foreground: #f8fafc; + --color-sidebar: #1e293b; + --color-sidebar-foreground: #cbd5e1; +} + +input[type="range"] { + -webkit-appearance: none; + appearance: none; + height: 4px; + border-radius: 9999px; + background: var(--color-muted); + outline: none; + cursor: pointer; +} + +input[type="range"]::-webkit-slider-thumb { + -webkit-appearance: none; + appearance: none; + width: 12px; + height: 12px; + border-radius: 50%; + background: var(--color-foreground); + cursor: pointer; + border: 2px solid var(--color-background); + box-shadow: 0 0 0 1px var(--color-border); + transition: transform 0.1s; +} + +input[type="range"]::-webkit-slider-thumb:hover { + transform: scale(1.15); +} + +input[type="range"]::-moz-range-thumb { + width: 12px; + height: 12px; + border-radius: 50%; + background: var(--color-foreground); + cursor: pointer; + border: 2px solid var(--color-background); + box-shadow: 0 0 0 1px var(--color-border); +} + +input[type="range"]::-moz-range-track { + height: 4px; + border-radius: 9999px; + background: var(--color-muted); +} + +[dir="rtl"] { + direction: rtl; + text-align: right; +} + +[dir="rtl"] input[type="text"], +[dir="rtl"] input[type="password"], +[dir="rtl"] input[type="email"], +[dir="rtl"] input[type="number"], +[dir="rtl"] input[type="search"], +[dir="rtl"] textarea, +[dir="rtl"] select { + text-align: right; +} + +[dir="rtl"] input[type="range"] { + direction: ltr; +} + +[dir="rtl"] pre, +[dir="rtl"] code { + direction: ltr; + text-align: left; +} diff --git a/apps/demo/tsconfig.json b/apps/demo/tsconfig.json new file mode 100644 index 00000000..4a49bb11 --- /dev/null +++ b/apps/demo/tsconfig.json @@ -0,0 +1,14 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "jsx": "react-jsx", + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "outDir": "./dist", + "baseUrl": ".", + "paths": { + "@/*": ["../web/src/*"] + }, + "noEmit": true + }, + "include": ["src/**/*", "../web/src/**/*"] +} diff --git a/apps/demo/vite.config.ts b/apps/demo/vite.config.ts new file mode 100644 index 00000000..2fa363e7 --- /dev/null +++ b/apps/demo/vite.config.ts @@ -0,0 +1,21 @@ +import path from "node:path"; +import tailwindcss from "@tailwindcss/vite"; +import react from "@vitejs/plugin-react"; +import { defineConfig } from "vite"; + +export default defineConfig({ + plugins: [react(), tailwindcss()], + resolve: { + alias: { + "@": path.resolve(__dirname, "../web/src"), + }, + dedupe: ["react", "react-dom"], + }, + server: { + host: true, + port: 1352, + }, + build: { + outDir: "dist", + }, +}); diff --git a/apps/docs/guide/getting-started.md b/apps/docs/guide/getting-started.md index bd22e74c..4d217bfe 100644 --- a/apps/docs/guide/getting-started.md +++ b/apps/docs/guide/getting-started.md @@ -4,6 +4,10 @@ description: Install SnapOtter with Docker in one command. Includes Docker Compo # Getting Started +::: tip Try before installing +Explore the full UI at [demo.snapotter.com](https://demo.snapotter.com) -- no signup or install required. +::: + ## Quick Start ```bash @@ -12,14 +16,6 @@ docker run -d --name SnapOtter -p 1349:1349 -v SnapOtter-data:/data snapotter/sn You will be asked to change your password on first login. -::: tip Also on GHCR -```bash -docker run -d --name SnapOtter -p 1349:1349 -v SnapOtter-data:/data ghcr.io/snapotter-hq/snapotter:latest -``` - -Both registries publish the same image on every release. -::: - ::: tip NVIDIA GPU acceleration Add `--gpus all` for GPU-accelerated background removal, upscaling, OCR, face enhancement, and restoration: @@ -30,6 +26,14 @@ docker run -d --name SnapOtter -p 1349:1349 --gpus all -v SnapOtter-data:/data s Requires the [NVIDIA Container Toolkit](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html). Falls back to CPU automatically. See [Docker Tags](/guide/docker-tags) for benchmarks. ::: +::: details Also on GHCR +```bash +docker run -d --name SnapOtter -p 1349:1349 -v SnapOtter-data:/data ghcr.io/snapotter-hq/snapotter:latest +``` + +Both registries publish the same image on every release. +::: + ## Docker Compose ```yaml diff --git a/apps/landing/src/components/hero.tsx b/apps/landing/src/components/hero.tsx index 6abcd50e..c8930790 100644 --- a/apps/landing/src/components/hero.tsx +++ b/apps/landing/src/components/hero.tsx @@ -126,7 +126,7 @@ export function Hero() {

-
+
+

No sign-ups. No credit card.

diff --git a/apps/landing/src/components/navbar.tsx b/apps/landing/src/components/navbar.tsx index 54f6b891..8e2a4e17 100644 --- a/apps/landing/src/components/navbar.tsx +++ b/apps/landing/src/components/navbar.tsx @@ -92,10 +92,12 @@ export function Navbar() { )} - Book a Demo + Try Demo @@ -142,10 +144,12 @@ export function Navbar() { Star on GitHub - Book a Demo + Try Demo diff --git a/apps/web/src/components/common/before-after-slider.tsx b/apps/web/src/components/common/before-after-slider.tsx index 239c48a4..41aa5184 100644 --- a/apps/web/src/components/common/before-after-slider.tsx +++ b/apps/web/src/components/common/before-after-slider.tsx @@ -117,8 +117,14 @@ export function BeforeAfterSlider({ {/* After image (clipped, top layer) */}