From cf8c57fdac261699cbb9716ab09b3ed2887bddc9 Mon Sep 17 00:00:00 2001 From: Anto01 Date: Tue, 20 Jan 2026 13:12:12 -0500 Subject: [PATCH] chore: Add Atomizer launcher and utility scripts - atomizer.ico: Application icon - launch_atomizer.bat: One-click launcher for dashboard - create_desktop_shortcut.ps1: Desktop shortcut creator - restart_backend.bat, start_backend_8002.bat: Dev utilities --- restart_backend.bat | 14 ++ start_backend_8002.bat | 6 + tools/atomizer.ico | Bin 0 -> 11502 bytes tools/create_desktop_shortcut.ps1 | 209 ++++++++++++++++++++++++++++++ tools/launch_atomizer.bat | 65 ++++++++++ 5 files changed, 294 insertions(+) create mode 100644 restart_backend.bat create mode 100644 start_backend_8002.bat create mode 100644 tools/atomizer.ico create mode 100644 tools/create_desktop_shortcut.ps1 create mode 100644 tools/launch_atomizer.bat diff --git a/restart_backend.bat b/restart_backend.bat new file mode 100644 index 00000000..fbe6380e --- /dev/null +++ b/restart_backend.bat @@ -0,0 +1,14 @@ +@echo off +echo Killing processes on port 8001... +for /f "tokens=5" %%a in ('netstat -ano ^| findstr ":8001.*LISTENING"') do ( + echo Killing PID %%a + taskkill /F /PID %%a 2>nul +) + +echo Waiting for port to free up... +ping 127.0.0.1 -n 3 >nul + +echo Starting backend... +cd /d C:\Users\antoi\Atomizer\atomizer-dashboard\backend +call C:\Users\antoi\anaconda3\Scripts\activate.bat atomizer +python -m uvicorn api.main:app --port 8001 diff --git a/start_backend_8002.bat b/start_backend_8002.bat new file mode 100644 index 00000000..b25fd61e --- /dev/null +++ b/start_backend_8002.bat @@ -0,0 +1,6 @@ +@echo off +title Atomizer Backend (Port 8002) +echo Starting Atomizer Backend on port 8002... +cd /d C:\Users\antoi\Atomizer\atomizer-dashboard\backend +call C:\Users\antoi\anaconda3\Scripts\activate.bat atomizer +python -m uvicorn api.main:app --port 8002 --reload diff --git a/tools/atomizer.ico b/tools/atomizer.ico new file mode 100644 index 0000000000000000000000000000000000000000..0fcb6787b4ffda5902f5372f11d2e9008edc4719 GIT binary patch literal 11502 zcmbVy2{@GN`~N%kB}*l;j#BAVOo@q zu|t?!^S)H)e82sE*Y*2%U0wCQ&-2{db1$F!eg}e3kPrm_K|$)! zwY3nm5Bz`Y*2U)wVCe&Rr>?&E93conSWO6$m0f(^EC4}On;_`At&N40gpvd}DrLEU z&tZ5K{wpQ|{&BvT;RZkX9=6yGz5Jju0v?3icUkX(px1Gd+>^rKS=?v8qb~$WSHXW# zwS2^S`n{G_(w~M2(VI|kY6_Q=ugJxEdM(bzRw6V{GQ_Tj_NJ?hsTN3chw2U z!!!mim1_Kc2<=i-+HJju{G!xFrM=D1$*^nuK(m*PJ?^83RjP}5nZfk5inGx?6C8g<9>G){g_E%pmBEJ|FFuT^A~Z@nkr)En)d zgy%EfmY;n5Hb>W{7O!zs@QTfnb8NIduNfS5;FQVLz7U;KxgPz)j;;DT3)2a?p;t5r z^0m*UwtB8CS0>ItIXh6HHB9sFt8edio2P}j2u9|0+15&>FjTb|qslKH^%wN@KFCA4 zc?kqoG1Oe!HiS3sB&O`1u^ln1)w*hB@$3UbSqt5p;nMdXyVekUjxpoK6yoktck&g` zw#7BuJO$r(3NfRoCgsnqAp&RglFWVSOD=eWRuF+qE_3J zd->z#R*jsY3+X-4FK6cc?Q51%!W|Q#9;Pzyc)0P)%O79o6L%e32qL%-6wnnGjar45 z^eNt9YuurCWO&ejWn&kfHz8hyS!5kWk$=+Wz~ot$n@%eetKyD@X}Ws9?!7>uihoid zMp2m>_S7}K)vCSsTg|akibND*1$}OwP|1leid)78pCv_)*ORHU!i%jIgFz>sr z8ZFPa`k9nT(Br=B_I^9Ftajed*UJofU(&<3d6N{Al*d(D`QwfM<#i}~syHo`*&eJw zdUR~c%UFP!Vek`ujZh_$yh4dlCHe4akFuY0>ro|L$oE`1Z)rO@A^qLE#uuXnFY{{7 z2Fk9a;v}CKOyzfuRVEPlKeH_0q{I*1d`@3{>XyB~@9^QDGb=mF^-UHyAbPHyZ(-=K z_U{-jp=XQ2cEm-H#&u|av`k_DhxMDJvcl*viD6)QeJ%^JMHoF>J3Ipe{SUI?xRa7* zrcm|I4H?!44wv1T*jYv3NC8)94G`e?(-ah-pYtau@V*Ef)6;of#{}MwM!QZWL1jst zEXgMUf9Ra!EH{#QH7V4T@clv%rz$5a^D6~t|4uL~EJXBhJ5J9Xa@YP2QZ>bT()@25X!;D%#vljcN-^ z`IX}-PBX8f`k|nu9L~2Yn{Q&D*L?4bXO{cI-?T!miCi~4S56{1$rW5ypTxXofzrl9|0==jQC zht}{Se{5Lj{)gD};lTT3lO!8Mm9Ux#*<2Z3b<6iem(k zCWO^Nz8=58EU_R3-~asOnjx#x5I#rs4f}0r?Q2O{;s&?c^q&6woo+9SqO}EOOX)JA zq)|yTAbfYvEwf{=0+-Shl4zQM;%RWH4kD#VFGZ}T+& zYAi%uMj@iaKynIE3CbBB#;E=|!tU_Fzh#Qv#FHVUg2fvDX=6C2tRF}5X#=mRVN3f1 zos%xI^}TB}sgGRpR=u8+hI2r&FxPuYmV&-7xv7*3IRkV{Xmoq|7b8@tJ+l@A!Idtq z&p)#zmRHkoC*BQuk&Sq_V=)?KI)t=5tA2@ZhTf$w&D4S*I+>>}xJdbJ+|t?;y`ynF8~<^zKAZD- z1Mq(2@O_rP_M%)@+uBAfNPUCjn$JKLMHbsw?MrvIElc_F1J(JsWhx6XtBcHUr}|4F zI*W2`B%xQ6Ad&?*CG^I>VCwaxX1oXl=ikXISbr1*XEAFiS)cp&IOB955I%I^+PDsc zoY&+sW)D^iKwphxLBTbR<77TpS-6$xz^4%vAvo1FD)XNG;LuCyoj$J$Hb~8H3Qt0E zVWS4@*h@SdxN@awnz+e#lq3{03aiR}1wlq}r(is@ow&&ps2BBNr*n}oU743wOZ~BE z#KVnQ4-GSt;&6>++;hP(?zCMc%OFtd%7;`zR{AC%gOiyX%Oi4g20GH?(q@YLT53Ni z@gQa+Cj9!aFhD8*Zt<>nlzEM)E~HubGqAt)1jxiNWQAZ#%Eb0>TM9q!oO23s)uUxzO~ zy?U7KPTP0h>1?K2#C|Zzn4EA~$;BR@C_L|{LZ90Y!eTk41cL7dP$mp8IbUBg{+MCS zf2bXq>h{HbvGx>i9n7I7?Jlu|rBlReFHzO+P5)>-SIlu-V27C{Ox9CNFNfb<2RJvt z-m=J9gSXim<11>lgRPLP*5cv>vAcM=?qjMe#R`81!Gl#Ig)OOpX4%c82eN0}DQOsJ zRMNHIb*JbZ`NlA6@;*dOtQx;d;M08{B)D!SKQ-$8m{6R2KJ=u!7+$DsZq88Xg(V!~ zOier-&{P$EQRxVeJxvZ#!gpAUUij#|Kd*3NT&L0>*~Y?i8ZG7FRHI*uOS{C5kFrs{ z2>hZzV=To;2o>NAXk=GW=iq?io#mE(uCX(kvoaTrGa!D+0hfCBwAb*_-uPvb?-JJo zm4mr2wBP`VtHDVTwYo7~!;;w8|ZfXT34-w{=t&)JNoag+)x3SaMXhMr*#d;l0zK{oY|ZQ{Tv`x2zGf;ZG`U2x zd+*UiCv*~JaZ4`&5eFZad|*B`Z}3G4J0!Hzu5@v+FCIw^cD`(Fs`I;zhNw?5^Ui!G<-x4Mqnc$5r(_$HmOo%cx?`V{m788Za=33vREy9ibxTlp#8p2iwU zEv!W$o315A({dvCm82WTpztKk@V0Nr$dqa4fnG>URx>boVWiW%t}(H1<7N0$T+rBZ)c=M zz(Ayrq8Vks^Tn%lf&%eBWndvPc)G`S=DpRYH{CK^^PXwGs*1XSD+MRZe_$(p;-;}w zieExpmH%~WB)Ko~q_c=h(8zN-VI^F#|7j4aG#Az^C7ER~UI2nYQ2*8>za{fM`~BCi z^Moy^v(~UtCc`O3kajF^!tXr>ICum|Ka%i}SkqUY+RIe1ATXs)dWW4}VOt#aDM-u| z!|4Owa(v~IX~>c!F|c0_EvmLkv@zAm*ZhG3al7Cvm))Q)Cxe<0>-r~1H8JLAd4nIsL3BFRQVXCT)+he5=qxxix=U@LA202+(!_CN#O#DjI;s?;1dt-d zzIRaE!*m(?FvAyPLE&7z+O`ijEPfIsB9$__1>jV60d?LwA5P|QA4be%+RdPCKsYqK z(@!LEhaNb2jH%L{MVw2?=Q$>H9Fq2toxiZ~xrPg=6x{|>p6@%$r%gKsrbIW&Am=L-$=?Gk)ibTKaqqE^Of8R&BvQ1H`-sfh9l~S5qgxp>s}J4bJ4Z ziDtagNGVArJMLwP(E?-Vxtx*uRUqKodkG$J>PMyyN*o6-YyL1sio`%ikLK8F3qGEE z>j<=O?{$ES7{VJTh}C1d&RLLVL-+>As3sH6bNIlIO{!NIpO5Qs#aUVM-x`hdNI1AL z4ZSnG3(tF$H#WSaCh`K*@;Z38EUS`bDU;tt)MaJ&+yUw&bcXN&6p}A}q7gA83KNaO zDiYJ-N{mbZJbKgp!;FA|@@9AdY`xZJ8&8MM;X~U7U{_V(Zam4X6& znGt|B;Y-c6c{wi9hfSWFI4IrbF2H@;+~||?9{*KIpKFW?&T;*2%Z;2&S&&9Ejm<_k zqqx1p;-&12aa%WP%dL16eAlK~oRi--@8@I}Y2J+E`)!h;0W8qSvSYuIp3^doNU5@n zqUeD{@tu7osd@0@R}G66J_pCYDq3K=qTGt(**rOC{*d%(`(?Pf%84cYAbl3xsZ?Km zb~GtegtfsMLPsWd64e*(-p(`ReAT_uwl2I;kce4qCZeN~pK6XrZ5?I2P^YaEr}Z)I z7*uH(Kp0CuSbQRU}~O#5Eb@tk07Z*4YK(S>JcWra2E_BsW;Tj|8>ns z8x{JPNf|8?S|WXeG!@HI2NnT0d?8DmrpFn%tirB&Y&)2loV<&62msJ1%D`e>7 zes(q+eOuZ$UjwC}aWiphvFA(agYQ_T`j12(#MxH>nDJWkUeGkQaVWH+MEN|NYbvql&5_`x=AEbOUpm&%ai$}N0# zYYCdvG#bJP0z5{#kgbnLOk8%C*^-rSZZPMWnjDgxAn?_=`~w)U{iA>6*i_=;Iwb~% zvu_bk%u@BC61oMqcTwe}sN|g!hYcu%&%;9utUihm8_QH>D_>E%bc<9 z4lhp1KDZpgEp5PB;*AsJGc6tF0b)u3bV)9~-bB37Q*f$fHs=DqgK0qnLx$h0;5M=B zE~}+}$N4wgs0$;C)r;a82_tyw7Ni_~KgA}al3^VX5x{mw zxO0F`qXf}tF0s3C*7Yq@l5+{*spM7Md#Vc!Lx4zz&nv;_7dj?6>tJ9C4#Su%Sr4JX18FE6_UHRd3sAd4X6+kC0{6&S3le4Gy`LMa{b{^^)DBPYErUv=swE^? z{lT0$R*vp%rfz0z()c!^2*h(T8?kC_>Dmb$TD5M3IO0ahjI1ys@&|+3JXsTWhCH|o6&CMIuY-}22jH@)RCkDab z0yZiPTB=hiRWe5}MkddFl&LIUX27{S;@n&NO%oWXq^K?=J%0EWWS&Jq;#Xiz5|hVk zWxR%Wtx=d#02vN8lt(WC0cWtRVEA^;f)rQcwgAb^K`{CRQ% zdSTU~(ZHnbTwfW}=F~^kD+*p8@gnL#GZ|qp{R;%VnQFEye=Y@lI8+SWUe4_9#ANQ5E$Re$ z;JKV8CKwXJXVWhyORxfl>izFQi#NK4o}SJ+--GVSJebhx6ce5l4a3kqTrDkxz6YH$ zG0x;!O!qQ+pr!J_3-DyR($(-H%5Z z$-oEG`_fHyRt%mgPf2yxxkXvpCWUPKl1c$Zk)meu)F?M4d1J^+%xQU$4-j?N@?=3* z=o~;|*OFkHI9B2s2Prdk%(8+s#kq@$uO{JQ&piy6tH+;&!)fN#xX3_&--fdrKquJF zvUBKK(F5xCu=Flz)6E=JdFYDFDpH08DH%XtGXh7M)h@xBxTP&K67_lsbY=)Brk}8{JnjgN79ay|Le% zc6AW1{TmRJ;#$K@RS~8pAU6d8SQ*Kwc1@5WBo{A|^Pnprd$4)avDd#a_?Dj)+FOb^ z9f;0Bl{n1c>Q4OQ?)m97A%O9U1Vgg+RN@>yW!9orfJ&)AVSlqvz*u`pzQr_TkS!;C;1^1m#f zdIcHSQ;|_9@GqLTeY@U;V=a9&ufYC8!n?~(XrA^QKe8Pm_=_4Xs@m|j7dZc+;$TG!7HW;e+<$!F;5c^ zeeuuNskOpekL|2ER4np?|Jw?E|39~a3>n85dgUUpI7@_e*v)J@b_wMtCD(Sb>%tH7 zc#D5}J;f(y7D4uL?;p3D9DCIJE)n?vx2TVBQzARoQ*y{bp`5F5IoiPQ7kJuR0zMT* zQMF=Ag3@EPY3UaXmy7)nA@W@!IkYOXxklJ0jIMPE^c&x=(n%%oeEXxKCnr%&>}9{# z7=!}JP~S^6=yLfJQ|UOL`PLD|E#A6ZVa&n1e#^?|4lZ4tq^;48nRb44P?yoccH0!?rnv)4 zD>13|ml`tjx`JCq)V8P!ERH&1;|Vks#a`&U)3;y;&)$GjFz!Rg+gr24?kUG5z2sGH z2=6+u$M=EyXwO8~jrPr2(ey09)L`G8l+qXiuGuNeO zIZDA4*Qw{>h)Wp8I(EEXU)a;W%*5(RF(t4I7%Mgj`DQ#Bp6os1HA?21KJ$F?>SY!s za77cMAS%y^Eyd5&vYDBT-bzq@XhL}VtoQy)Uhf59F zD=jtOfeF$G4q3}Rc686DD>=ni#4A?zS7$?Ihv;qhJcd+XZEH0a&#cE4q9xFc@3N=^9POrS;OsDQ!p zGM#%eu9~6z$upU^gKOU8SENF(q(2GE@bt)6wvX!SEi~@n{AGK1Ww{8areg1-_zVpP zo&0i#+&a|xaM8H3*{eA#E}iDx34E|@Z7f{nMEf1Gr>C?;SiCXNT=BQD zrR_d@`sU+@!k4+PQsWM56ozWY-MxD2pte&~qj0#gYz(uwSMiaIc&w?4N5b>Uc(V3c zfd>)MYgVB(&;y?q_8uA1ZKcX-Rm79up|+G)ola|=t&sGPbM4m)DoD|J17%CP%JZ7` zUc7!VjGyk85QSRK&s)2hc>u~`(s=Gx1}lHdZ#PeB`FqE@geVL)N4=2tSuls`Iy|zj zuEoC0wibK4`0uKj`e$@s)YEg2Jtx(nuF6X7Nav0Y|HKpf^pZ+`;plil_JN-^G7f9o zY($6d7f$uyHp=BmUw=lcw;2+Aa9Om)uf#!JIx{}G?u-ytUy!m1k_@fV3bwpWOZn_a zO{KVz9=S)g3%g#94twl>=!?D3`TeTk>2OmDjOlzR%p_Wx%#fQztkn**@guHntL>arM5{^=vPMrD}*Rg5? zxCITS>!+>lcF`DS6#aK-AH5>CwL*K!`r$_sH}nqew4(%WYIptfSqrUlhsxC1wy z+`L&iBv7uQD#)ab;_4DLGhX7i3Sr29i4sN_M?@qtsguu5CCMxGf{T?rq?yVf=~{W&o}-t;?lRKqre~*TO&VM7tNTgZEzv(XvEcHDS;|$% zJi|>7W`}Ip5pBHO&MgBt%jvXZf0|g%kZV8Pe*DXyiE_J79^fcF6B=H-K6=9$cVRKN zAh8qiN%S?h>FPe#7l$JHV=r`gNOMQla(_^@e6NqcInq*f5<@!-)jc-o z#<6ePDm>%dDvgSX&B?tuqZfWv^8>VeZQE3-ogNVK$3g=j}@2WG8 zd49qK)w_ZQk?2Rd82(H9wgBgf0Z3&)DE5PC%Y9OCU7$+sGs9YD+o5IQA>Aky3n^vm z7cJY3w}dsR)pcdPITctxoUc-jDw)}kj!Jpe)%@s5Vg77i9C&|CrCd7JYB2w0R}6!A z9VJcOcDdR%yJYX!`8niTf%QPEp&+BjlbaaXG4| zX0nP^YjGG&=3qC}N*kVSKhuzWYPL1i|C)|k)ojoQ`JT|dtI8!}M~`B@vh8Mq>Smg1 zL>dO_^L^Hv=>_(ups6(ucEAd`{@++@(`o`J~OJ~ikz8@MWR-`q)ea{$D6ESn;pB_ zOM*~v1lrC0bz9J_O27MA=c-ncvlfmRCb)4{5_c?ghz@qH4i@a zRFE&uH+ucOAUrCue3pO-Rs&)6zZHF1uq=zjAbOI2^8Y6WQRQ$98sL)dT4Mxvt*#v! z*5C-8a5~P`t5mpsO|aPslM(;X-YT_S@ZDYsSY zpy>SYhyZ@fcQ=7zf7F$j>uc`d3o9Z{3I}F9H7Bu+y6=!6$ zK4bUSlX33?c36sxmMm*~wd}s3#C=)e$t|dsWta2SFXwv*ys%?5tq2rNMNjTH*sJ@- z>P?nPi9cI7oox82n4>LxwIUj|ts{+QbNxzDu)N3euCEQCSJ#SocpksDzM{WR2Jaw) zjiGIbTWu?rvweHVbCI?)Wu~QE`HH#gy6SJew7Qnt_iw*8mJn)t#LwcoNLySCD$+ZI zY-(`ZV7^z-UfOha{x71v;Aj^iyxPR`<+&N>JB@OWy83AcHU nul 2>&1 +if %errorlevel% equ 0 set BACKEND_RUNNING=1 + +netstat -ano | findstr "LISTENING" | findstr ":%FRONTEND_PORT% " > nul 2>&1 +if %errorlevel% equ 0 set FRONTEND_RUNNING=1 + +REM If both running, just open browser and exit immediately +if %BACKEND_RUNNING% equ 1 ( + if %FRONTEND_RUNNING% equ 1 ( + start "" %URL% + exit + ) +) + +REM Show brief splash while starting +echo. +echo Starting Atomizer Dashboard... +echo. + +REM Start backend (hidden window) +if %BACKEND_RUNNING% equ 0 ( + echo [1/2] Backend... + start /min "Atomizer Backend" cmd /c "cd /d %~dp0\..\atomizer-dashboard\backend && C:\Users\antoi\anaconda3\envs\atomizer\python.exe -m uvicorn api.main:app --host 0.0.0.0 --port %BACKEND_PORT%" +) + +REM Start frontend (hidden window) +if %FRONTEND_RUNNING% equ 0 ( + echo [2/2] Frontend... + start /min "Atomizer Frontend" cmd /c "cd /d %~dp0\..\atomizer-dashboard\frontend && npm run dev" +) + +REM Wait for frontend to be ready (poll until port responds) +echo. +echo Waiting for servers to start... +:WAIT_LOOP +timeout /t 1 /nobreak > nul +netstat -ano | findstr "LISTENING" | findstr ":%FRONTEND_PORT% " > nul 2>&1 +if %errorlevel% neq 0 goto WAIT_LOOP + +REM Small extra delay to ensure Vite is fully ready +timeout /t 2 /nobreak > nul + +REM Open browser +start "" %URL% + +REM Close this launcher window +exit