From eca07750d281ac0a60e9b5b739579ceff231114d Mon Sep 17 00:00:00 2001 From: jtricerolph Date: Wed, 29 Jul 2026 17:28:43 +0000 Subject: [PATCH] Add PWA manifest support and icons MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit App had no manifest, no service worker, and no icons — not installable as a PWA at all despite having PWA meta tags in index.html. --- frontend/package.json | 3 ++- frontend/public/icons/icon-192.png | Bin 0 -> 3234 bytes frontend/public/icons/icon-512.png | Bin 0 -> 8883 bytes frontend/vite.config.ts | 26 +++++++++++++++++++++++++- 4 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 frontend/public/icons/icon-192.png create mode 100644 frontend/public/icons/icon-512.png diff --git a/frontend/package.json b/frontend/package.json index 6b5c2a0..06caca8 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -19,6 +19,7 @@ "@types/react-dom": "^18.3.1", "@vitejs/plugin-react": "^4.3.4", "typescript": "^5.7.2", - "vite": "^6.0.5" + "vite": "^6.0.5", + "vite-plugin-pwa": "^1.3.0" } } diff --git a/frontend/public/icons/icon-192.png b/frontend/public/icons/icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..649dc9438484fc7b3c87c414ff922b8fb92c606d GIT binary patch literal 3234 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 literal 0 HcmV?d00001 diff --git a/frontend/public/icons/icon-512.png b/frontend/public/icons/icon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..b5972788b88f4d3e6de68e91893538d9cc3ff596 GIT binary patch literal 8883 zcmeHt`9IX(8}@sKq7YhaS&Aey=+(~7F zPvsJM5g(qn5~_cG{gd!^)7(rb?3Y5%u5{ujG~rXL+MWV!@f%JB*He1BE%)~R2P z@2@361feTD0fFe}t$nt-e0EwQc752VE48UEdo2Tg<~F8(=4rp%DF=JR`YCoBG9?AO zS~177Mj6e3p!N7lCJ5R*2Ld_`gP?R~2x7hgK^m7p?AJIUh$9q&{0tc(=(X_wn*48F z{vU#2rWXkrd-@V1v59t;vI`DBYVzaD&TN%1WD9JRAhXZ>vmCc?+54RM6)DWomiU2Ga*%yy zqogV2WjmNllDMVp1lo;y*3QyL@!r^JaoQw3*U|GL`CWAH{A0vbi-?GRYxy>pZrt(u zM$b7G8rmx@IbOOWQ&>X%) zUFoiYc@$4r&E$Hl{2KVPZLGF}M$nscXOKn_0$;vIJ+L`dI*{Ns;M}mbD8H1hftEv! zotAPu5qC8(?2!R>S6!mShe-#Yql-Ui-n@tW zpEQ&8NQ+Uvr>}NbKRNe?KRGd9GU5^wo}x>uh}nkd-vM} zuGqwuQ*lJ~2id43kwEj1rGm#Vua{@Wd=;3|P}&V>t_|kK{_5NHb%mKhaKFfP-rsJm zfx~}fRiYoJPAEpcC_hQ>My*E0RX(6fQwuFD(+DaRMJn<*yG$z{ed1Li>6gg(Wo%wo zM;Tk!Ek;P-pObmjcG`x5|71D zh1$19;{;UiPo1)Hg~RHbXJnK6GiQBE=i0ZQS%{bRtm81n^r}Hxh{-*Q95*jpoMmc4 zEkZVWlMsUfJA*Uf@p_D}T6X%zWv0mpaqBh?@5LdX`espY|L8A@9eVK7TT*4ySgk32 zyUl|Q``{m{@$<>PdJ|8-}dz zdEI{Oo_#f6mAmcqgm+YjJc7I3Mo}Sq4)?{~`FiMzR6hO?{IG$M|0vt09Uds z+|OlusApd#IFfS2UKc^9CyqJcUe>d@&&2$&QN%1NQwa^HZebhy946xmmyXDp<3z6U#n*R8h~YU^!kLVViQvmT-fm>iu96abv1?$6NL@ zmfI{88W-KsqY4Cwjj62P9H%~!Hw_S4{kI2w>P(}XT8vh>h4L=7AxV|>d8sNHLlx?FL=VRuWb*=P6q zk9<)%RdE(IsJ&r+h9>_u7<%(f#%#|ZZi&p&v-(kBcd3V~VC!_7bGr~?>nO61tu+uJ zf~vESWu!s5n_-lR8p64PoF4OU=LFsNYF?pOBQRon3xO<0$-GBRV00JyH<=Fh%`r-J+Fv z7I672n^VnLhm@Q$9G!w34!`Z(e-6f6Kjdy|J9{9aE%AZE&{Cjg6hcm6pd@0Brb=XC zbUIgWb?7TJjwm^Hh(Hb_h=oD+a6xg?F?PW!K!8LflVcqENXli~?Z>m*nREII!a2|C z6SbheucP=~_6UJo=e;Sj%LF(zYyp{20oLeL=_SjPW=-Wsy*nx|zN7vfXb4)~{ktZR zOj8tV$z21R+)apx3KyuBsQrvRA;kqRx{3}ttyVeVx6I=nX}NZJl{z&dATGATUx(uT z(W0R0b1U<(;c-PM%cYgmA;CUKb^Oj5)i8m z^(BTEuHieVHYwX+bGGgjP+9^9lU8X<`21rAWN;>Py!A$1iW+w~JoJtw_KhY{*n=ff zQ^$62v;7Mx0i{;ee0PI}KAH>&n(oo8Q=2<7`Z#D03k0%JLi{S#;;8-Kjr9*~wOl(J zhSr)FikZGLmi|r#0oPOalF+z)~)VYDM-5cv<%9X1*e8Ny|FDdn?StJlNqfQ^*jBCUPrzj0%=Nk46oMLI%`Vjr=Vd*-pscXo zd_(Sj)QJ3xgw7IR(C8ulK{9cNLV1pdGeP!{3vrLUnx@P)L&8?Yc2@wovoYp^DL&_k zTu~}N$7tnNm4S19DopV>ztOvJXVmmuGk0es@?rau&STOatPX|Cj00X2ijJBkU3Idq z<*mkAC*@;Vr;B1M$^fa>}+5QPE+0rLQ#m(YHMLzVGQYAV(q!AR?+d2 zb=2it+zgMqftgX6D&6s*JG?L*d*U}Q%=igw(=KsKTR3Ig(!l(me%8elh6P)`^g6X~ z;)`|%t;`t4d^JX^*b1bqi=HsWIGyZoR=0xiL+Jpm8v$o80v{g)L)y$gTKPCGtdzHI{&9GT-O^6dV3=u2x=aFmwna_7gj9 z`UXU$oAg<$PN~chNGx4?%nHKeK6AZ97rBsbOTs^w+!0;bIqFWGY&R}A1A2aKu_V?U zDGZ15;Hzfts#Zg(DmBH9SP-{`e#iR$azX@*xEJ82s^om;9OPJr_)sS!?_Qp~-+(Fv zLrG$tidTUu%AQtLIPRtnAGZ&hsCJkypW>k(Y+h8OHs_8j{vag}X2y8Uam2l@6o5IE zjC=QI21*3>#=1Jw038WuF8aYYgcIR+p?kHUM0 zJvhgW80#ZcgIu&pkBMvh4D9=j_S?M+@3PV0OgD(ZRy3iJX9ivbb;BymBR@-eaqbh- zhSk}<;8(q8@48f$jf-+X{W7d`h?<U}1^n1Fj#-J9-F4a`&QRDKSsY0?vF`V|u zwg$DR;N{6VuFP0(u62DzV6EAwd9&62Hic{6)yH|Fkf26uA@?^%_eI^G0?OTCDy*p? z6yN{`AD5z6&V{2ElMa0jZM6ofDDW3O-}oYHQ(2Z5j`>|E%Q|PdmC}b~l-7XEE=<~i zYYAvrL>uNA>O)mL(hm22762`wwBl1-0R}>#G^-2*C4a$t%QU$ zJ0I+$uD%+^%B9=Wfd1`Fd4-gGXZ%q*l;kruDnH7&gRTjZ``W`-5Iainabe7&60xKM zP;F(fMpUWSo;3E{FzIDGuG`Is!m-Z}a|+AvZoFCaRe=vH@G#a1SL3m|whFDpa zMtq%2)4`{5$yOLy8QA~EtSiMyazGEt)nX&OhDmK(Yc1FKlyd4&zg~tjx%kLn9G415Z3JBU_Yj}3EXvyB z3xzQzG>Z3A;Wlpgh#xdhN&NnbRDvt&`GRFu)}CFcTT0KW^|M>mS(ke2%cxN|x}cQR z)5NI3+6snW)Ye7n;QKFnUh@OCZ)q)+618%7!u0zqcE2$<8sM^e@FtIQ1qTy;9=Sbs z?K-tP9aZ7dTUbMpc{Eb_xCkW;v|CO0%qmI_14Xjbm%vA(Im z@F^Yubm7TO9H%K>EHoj!P=-r_JSNNs>sna!&==o&ERzAo5Z0&1ZEBv+h^f4oLPToH z!PAJnA)==E1JM=wH`^C`^na+Kb}ceH{KnGoG`;$gGOcwni8a)44wgmgIOzKhLlv{{ zZu{iv$eP0m>ze)ZYz#AG5Ua%9cTu1IVDp~%nJdePcdu5?J99#4sVFJ&tQ09{xx9aq zX@x)hopr=Zkstbzno{tzjwju(@_Qz9P!x{5E1>IwllX+<4+1l+D+ro@#P_@J=A&Fe z@v@rAGAq#+dv#vB1o~}}5_ywxoaW_)) z5OJ=RP`@sbLgS* zc{gHFBL6zF%mBHiQPJ4xU6}F#ecmiPXv_psWmPvL&Ne&YZ&Wf>|TSZTGAW z{s_Ft%W2Q@`Jj=8c<&8JITCU;`SIX^4uZg3zgWLOf(_aliucYqED8#r01h+D@ZcJ3 zSRnC+A?i>P%MJkZhyTYEX2qD;@4B%!NRDr=#%B>M#bf`Ly0UWy1AmRf&xdTACvUwi z__08`6-(%R8U8x1%uhK2*xH9BOw~pu|2iuksI(j9KK7gvw1E95_V_aM*?t`N)Mo!D z>)lUdgq1Us9De#N*gOfClcYY*Jokf`^+`W{5lCQ0hQIDn@8u}KP{)#KeD@KU`Vyrm z?4Iqf<07XfzgYt?gB z361`oQ5}>KW51!(ucvr0nub2BBcA#%r2Jn)evG|R&><1#)ae@kx~G${-#UL;N_*k+ z46a51K7OL=2jBmP!%#cENIzBgf z9O=3fxi;beb*Q9)8!B3?>};oc48IpI82_v1i;;(nX&L<5;$!o!5wiRT1;yS^N}3C` zJ~o?b2s}{=@}ilXgVew62RF{@rTrF$1bQt_K-?+}(k1)BpPC;$Rt^(#*G5v%+){3k z#j{;WE4Hvx_>7$w?)OHwKhI&9VdGC<*$x}!Hiz^)+%H%8!n zr(AMT&i#`8%HTKGA?5t8?OoR3U?G_LDN2c6)^T)7?5G{^x_*eAnJM#g<4WR|*Fjm0 z^Kc(O5(Z9O%KB3a7TC`;(_3$AUx>~1BmkFLTVc#E4rttSv^EGO(SHH@s0Aq_hM6U@ zD)$*75B;*b?3iB!5E^ik>GVyi0^iPlMgMi)x81A@(v!W z3CSrEnW=hJ()Cpuev9n)kU>qv!4h!vZ}*Dm;3qV0P&hQ|+|qMVi?@-Vux~UOH3IM^ zn&R>&CCGyCc?JGUl3Dt_fDOR^(WRe-A)t}*-G&dv*ns(?4|VTueKx>R}| z1&Vqb-YmD7;A#F-Jb=R|3`OgS6X#94N`m0M(WN|{aN;XyUdBStgY{_)H|#Ciru;eI z?=>J|IMSK@1Y0CzvU+Bn?tqwb^xnPtFTK7oWYmbth%HCiJCvkhnbU|LZr%}hD`}U6 zkf2M>*$LFJyWNGtL(7wH@7m>5yLEZ1LsO)U>fKwLOp9$%jS%DFx`NlimdFfaDnz~p zl_(kO^96lF{0f7ZOA+rM=m>x^6#Kg{=$Xss7?h5=pa{gV7&`DCwP>Z3g?(ejsF9Qr z>oK}*#%bDvWbB#>-LdXncV_#n1q>f-_%DfSzdDn`&gx(3z2(-h=nA<#Uy<)!2p z`Y$-E3b20iV58<5J7#k#ceq%U2t$cTi+LRn(>SeiF-FFU%ZX85!%=KNtLSoXq_))v9CA_baSV-R;vywgoS*u|XZoeztlo z8^-Al=ZvTNx;U)weg!Q8+6Dzt7cYXfXX>R)Hw+Bs2N|0kX_Ens<2J9li+-&vgSgv(mIXN|5M>=(>MI)1$fW<0A8IjTlvo)ItY@pT z1zL=04+I>6$@&wQPj+(o#T4>dKM2&w0+&V*Nl`J@ccu$b&OuV^%S&l?iq*{ZiJRFg z-?CAp))R|@uTn*TrOVn9zl^=x|4>MQsd;EpAy47u$BwcCZ+hE(X1_4G=NtZJxS{@m zkF$Lm#&erHZjU_4 z<{UDeA3G`T7&dbl*N@oZEVhY1QE^^eiLg=Azi`HSHyUNhE33y8sDD5CNd>CDcoyx2 zV-4VS8Thzz@UIY%OciLpykOj2bEMobBYnMeZG@QB^DVXEV*$l1o3<{?TW3P;i1L_qgQ8*e+W z9vj6vq5{a?ooHi2>OefjJ=F%+r!H8at*NZB5R=Wm_IAUfT+l!*C?FQOP_btJ9Ft;6 zHxC7QS$+?9c8hAz27z`8Y~0)ws3XJ&Z3Hf`ouJTMCE?>1QPWjXMw1FpW`RCBY+>tC zUanH%l$pG9td3U219OsYk)f?DY2C%E^YHc898pxD+ddn)l3b@!1?ZxhA0(mF&;_yM z316lv98M~Yn)*F(cq&{aQoG}kPF?^x2-jhom-MNni^DQwO0FYKh-<}s9;|cbVk}jFpDot?JIKgj7K4#HlVC|mjpL62L9$r*i#atdS1OF3;m^G= zceWvQ8hg1Q+mAeB((qjNZ$#jumHj1Ot$iQL{1^mv`Drrz|9a$I