From bd1bc5e020f7bf14446dcaab1c8f99aa40153a95 Mon Sep 17 00:00:00 2001 From: Eric Wagoner Date: Mon, 3 Aug 2026 16:59:27 -0400 Subject: [PATCH] Home-screen icon: the piper replaces iOS's letter tile MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit iOS asks for apple-touch-icon when saving to the home screen and we served nothing — hence the gray "B". A 180x180 PNG cropped from the mascot logo is linked from the shell, served from /static/, and also answers the cookie-less root probes (/apple-touch-icon*.png) the guard already treats as public. apple-mobile-web-app-title trims the clip name to "bggpipe". Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_016jXZFSTZQKzAC8fqpWSz9g --- src/bggpipe/static/apple-touch-icon.png | Bin 0 -> 40137 bytes src/bggpipe/templates/shell.html | 2 ++ src/bggpipe/webreview.py | 11 +++++++++++ tests/test_webreview.py | 11 +++++++++++ 4 files changed, 24 insertions(+) create mode 100644 src/bggpipe/static/apple-touch-icon.png diff --git a/src/bggpipe/static/apple-touch-icon.png b/src/bggpipe/static/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..cdbfecb030b721a56f2a114f465d1890e300dd48 GIT binary patch literal 40137 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%0D4B_q zrsQ&st5&W;hOK}F1N@$U11`BPSEzOo@wgUBDG+o0X!pIp{Oa?wp1AEs#H=wBC!Kuy z=}$cN$fbY&W2lhNrDd7g;0dT6fX@MdhhM4m_V-R?Ab$}C9tK~p`{|$d0vLx*ZT$e| z_h7>q7%0B_@~aA=uF)M|-*>M^AAWe@(%zn)zC}wHEn2#0=of8-hBf3y4j;br&bxf^ zD|`R`)KlinnYZnhW44$%jr&zb!4bob2T{W~5e99G`0fpYVb%a*AWYRxA^v)>UKbyW zffA#7!%C(jWiw`q#f*s(3TE-fGP7VNX5(0zxbjN+3p< zCAhRqi}MiV*esiwR^$gniL_(&70MWdkHBkw>c*jgtcddvgC4LUxJ+7!VyW->7oI~1 z?XbHS$UcPQ2zV;LchfT#=j=FWJA-gp-*4mTO%xx%puhA*M z?|*FTj&~o#0o6_--91(c@U!rRok+d(+A}=^C1N?#x7a#V5LLl=Cy)>tlww*}8R26s zeX+6JC^juS2qF`3UW{Xy+dF;7JzykMsn}B}X0kbisUk)g@p7qDC=@uTdPbB&??=xG zm2=;CZL`g{YN%^KhBHtoG7Cn_e7Y-c5$bUfa2P8c$-ngG8+i?;-F~Z?#h&FE41%_% zEHGjWQwp(g!F`zg$ag8 zDudBC=e!}p>d5x`3FAg9=@S*Xm4UcNqvwi)nqaIy6hhBlriCYt{x<4oXEp-5QALJPs!rp`1%**xh{tFV2Sab?l_6xu(|siZ21E z@!pxV|AyO$5xaw$^zmhY!D(iSRwagpvXW6ypG~e@vgpp6uSWv7fRO-zfd%aiU0RJL z6k*&YPzCxHFL-LvyroN)UU}1P>zh5gkrqq}k860^ork{n*2^y-gr-cI*w)$@g&xMz zq=rSAMGccMimAy=2I5ChiMPz;>uMnA`%mv2ET}t zc!osAF;^{q_lN_(^~Bw`ASsX(3ERq~lG#kEE|borGg-arve{f+x;~w992>^yM3D#r zV6&pnV(GbMx`Jm?QX1%6y=)24okz4gw&nVHgAtJDiO0{zN2vx9YEUvGEcwFAbIK7P zH>z!mt+qgnr0R3FWkTDI7%=iPsDyqwaQ&p64m8MCNh}aaW^<-#d%mlbOxQ5&zFIBv z&?gLwC^8`cQXmgY=yf;T{MuXZ-hKaL2Ylm;Lrf6#VV~u_U#>e?PEU*sxpYkHmDk>? zx>2gBea04BdjUxF>&EH7GvfR`Yc28op}%XRZeyh{5%{^3)wg2dQ9nF*<-9qR!K~#( zB5Bz+qz63Is!(yjgMs>{r zHyNuyRHlI(Sh4E9`uaSWurYd+>!VrEy&Ad|Ku<%{1o!oHXC1QJ zj@u-YN!PCuY;uY0R8~gl$){d@_^~JE&tD>xs>^0Joj&=?d+plM-s+X}kiJ1x3*NcHyvKFoVp42WF=TmXw^ER5u{FT98_9yNYK+wc+Ps%w}A zaJ`_UzaHb*0RGCCuy~66OV~!X$EQ~@flmSpy zpK;-+Nx1khQ3IYWMBd@PJ|M&asy@Lwf zP|0+z{`J@9op$!$o_hM#>KctWbkp4r{p0ehe*M$K4*2F*++vSqQG_B&Ny)7g%2gp{ zOGkU$P}2c{gxL0j)d1EMIrNGXr6GhgT)t_VD^{(3{>7J(Qd@4lt>Yw0yS4vbJ4^=2hGfcq_K`>5c;+c=7)gU9O+!SHq_!?^Krq2IB1qd56lWN8i=ZX| z^#I=sVFcZ0BvK0jCI-|qc(8n5AHX9r>88dyB_O)ix)RWFjt2?qK@Ga$4pZO5T-u&C zaoD2nIr&0<=oRCUH3^2239EDT$ng`$24Ns1PGy^BJ@x95zyAHw?*1f7j%35qP6NV5 zHLRAyzJ)87{p8p)`??FiI`Vs!@+xLg4#sEzc?71tfWi}3$k6aoqS+7e`7#LFs}-Nt zemsMhQ~O`2$O>uMb+cce+ui3OD=~Tc=8=G2E{E2g5sT1#;x)vHT=xRve*?ix;#aFU zj4)M}VIk9$(02k%Yb>iC!*($wvCw4({E~1i<7#0-BvcdGdHz8H704~1W@~;<>8{)-74_<|8U;L6UU9* zd#|nfOMS?25}5{D3lIdA3U~`<1R*!x6FJs2`1L5(bwAwN{{fSHp{WG=1<$ff4{hQpoNZ_)UxHMOjqD@j{KhT z>b_uA0T+nLScpZ0ZvNLzd+oU;lFYV}Z@s&)J72;CJ@e`tK?v^Fwrm~-&_91~`BHs| z=tM0n#RzHra2 zzTq3v=dDdF;k;6%S)b{NG3*(7(RaV@TB8Z3Vt$~KJC2oU!1d`jx~<1pEfczMU{zV zi3NRc&KY>QfL4d78o#)M&`vvV$3bK~Q7lw`ebjNwR`r>d@%XG49(d@HFMVN$YPAZ& zm9YP`pIFbcjN4wdpWzCpQrVYYdVB7IMF`O;GiM?wu?VS$)Dc}M+X%PxBOkOP@PJdv zv}M_%vZi6M_AP$ToWVFl)ICF(#F)?LsU|#q21`>aB;*H5DMODdD3`0nVky;}5xz&E zTQwN->z|h(kYYw$5NrTaHm!-tYf#-i%Gg=W-2_!{80uF$GA1zCXwqx~cNL_Z>tWttX#-xlj)3 zT1U*-avMJsgc%C-$Tgv}7QuW%=kbyBK+PDl9NV(&s&2bz+SgFzwB|gj@i1a|gRcE+ zG;dfc7C_b&eFiHIG<7acU@$f4&XkIkLcTb%y~!6Pm=o|`%SIeVUt2){iq#7iEI<16 zvmScl1*DLLOao=J#P)dLR)R-oz4qj+*=HPg?1Zl2`Fu%HG~nhJubem9kQuv98Bw{v z6r$?4zw@2rj{ceNd#1sqj0*jghKA86oOtT3_dg*K`rd)x*nY>Ie}BTMQ@UDgK*7LP zH%%r)6r)wv%}v(s*sa^Ah3QaMz8pUB)C(A)37c%%F?>WZgo;co8Vr~oh-N;q^H^Wm zT_H&gliEON6EN#80q1&rp*1I0YeNm$3k>zqy2c1`&#mCk=2(g65rFRi5KY+8(N64S zrRw(QYclLQCW=Sc0h$J)5PcX4PLiqYE3d!x)1MtTXW6P0$~KxE!%`FL6YZF?kb2#f zg-ZustBBrfue;*j+pqb-fqPwi<9(&-ir1^v0k*Kt$R(PyAq9P{WP%vHROnj~nK+QB zscqba7hQAVKdKFC^s*DOOPVjw3S z&+ASkGfzDC)^jhtsW91b*WC@<;XxTQzzS*THQqScie_@us_%m^?6qH2O6UPM*4Otg z6bRe;P2=ID>wcOVssX-&kIbPz6(Qug9{y~G@x);c$R$B#S+sYwXS4PB)zw9d7O5S# z&~8nCx;3A+RtIL5GjINqAN}muMa#Nd>4=f3shy3JvZ_S}3=S5@8;F(wDM86^AMoXL znw@<7FSgos=j(5||M{n$TTys>H78`LB}|Bdso(~R5)6dC8yeegzx%$E&p1mWJhf}& z1%E!(A;Rrl+L%gl44tZ&V25<*vzF}0dtyM1D$;=jBv~M;%fc|QseSi-4}?;sn%lSC zX=hIhKn$8gJThn9it4|$AWn-l3~M;SxTm;gT&TjzOgMFQ^+RJAhc5bqpHU6tq5&xa z=9vh&0n;Hr`O=py2#k6}u3KqntncjVd};NvciveN>sQApilHD$N7n>1t5gksb0B?U)^(??;rl1N~I`0f1f>e*kOmQ=e;xU z;rkxA?Y4WDt}3|!8rjyk^Y&W@e&~n1p<~1oFT8ftF{k)p)Y4e@xAXqkluJd`ft0DR zs0h&XjB{yK>pKlrAlJf(#NW{PX{jhNbiqzZAsr{()0=<(rP&CfFYoi!w$_f`YJg3n zh6#;P&ua%)|Ly|sA7kL+JE*}_ai=A&p9?7r!^+lWYK<5z20UclHR(r?om=ZM0oJgV z&K3)K7#D#)gQXN@nppu1Rca6`(4ra(7B6$%kQtVg9`NJVST_l!%%qdY{r=>qXU|O- zR<5z#$f9?;U$sT5*=bLvQ{8U&+lATvX!XSL9mk*iGbKt&hPLhGS1-o~n?7m8%xOP9 z4K;ipZ{T1el%~6z-40wNQg%vx2)uyH~#DGca|VRQn@;67!n1s-E03il+}D} z>sW{Urwin3X2(bo0eZN$;!{Q{PMMQTrH8bZKos^pk7ey4-!StWhWW(DXth`bI4b(| zmxeD0E+Yr9DCpFaj(_9D7b#(L=e)Ia+49cLmOx_x#u7UpX^rObL4fj^}GBXijWdqGLj7m|Jv${n3 z8~f~)bj;$wfLAJHo7Efk-`O8I`>q)P>;>w-({Ce}~(N!qP#3#Ex25P;TQVzRR2E?l^5{J4$~T-n+e3R^V_JSTR&$ynt3Zs_HE zUCLNvYs=%$y>jR;f4^dR4<_W0gAd++{{wJPNTur}aESzuIAZaG6O;kDUTfYlJ?;pG zO+ieDFc5Nqi~};Aai~OI&P6cUV5j%nLA<$`;F!LC$_g<_#nE(QS%yM)nWmX$~( zP1~R?O%}W;6&$iu@D1@4Mrdj3{_x;i$9}Q~Nz*PIMn4A|$8*$bDudYG+LUZP|4hQ2 zM97wrZOP+*{qrYpxs6$wwrq=EDF)no;K4`s{K8gPfD)08ngHc%Qd%h#cGz;p-_AMe z-GwWygxS#8l1yZ#Ox^UtOD?n;w<|TW`7R^;cfqZtEG_Z#iS~_)*Dh+N7#dErl|K zsiUD_x)~S-5oL@}0&~1USV36`xUK={zLF40n9&1cyksib^ulXz-*D%{Dcm@=ZhFN0 zxvOVCcmJ)A-226yzI4EV7lF?LR3V+>;o?p?#4x*56w@|itd6(w!wnHcL=U`tluAd z)RX_ZJH=Xu;o(zSrY<$+_qi({d-}QVzCv>*?S(GX0pRx`-=l=`h=2WS`)cN)$pwt4 zLWrF7yPsg>Kk~@4M;!KzA07VvQoe^#7%?11fg%RMHb(;HG-BxnK{AuGtkklV{b!x@ z*IRD6x1zNvUh_`z!{z>f=FD7)8VVYMqlv5o7Kv&);&xKcAmFQ$%wE@Q1*w1ya^;M9?ZX?n=#JmS8$ zQMj^$o}=cVG(%F0d23`iZcf;j|LOEg{(4pt*N?NtZ{EBeA@(t3V-ND`7%Q7NK#S9b3=b zZ08-e*ka4gn;Pmc;(_nFUd1*|$wQsxkx(FJ*uDr2h7ImpP>NLCPQEl}@i)KwYu`oF z8+MqK*_@kvSz+;;y|4C(WnVt%yT3jCjGjVZCo-H5Y4~Y&6dD{%Gl-POKv;nGXrv-U zrI2BLI$7%OzUG1pZolSA=>b=frSYgqU76;(j?rx`txb+&v3Q7`Rwa_arsl3&WrQt$ zW9dWxdKhz3m(DU9bHu@KNJ5~55fk%k2RgI_Wn@}LrRo=pT6j%zb=j$>KCBi7^Dfh!0?MHFBd z3XxDWn3=g_-hJerM`eWr$`zT~9CWP_`txgf4xQpayBM%Q2vZ~SJ;^uDu`(EHtO>J# zWG169VO#wJy?_7fUldY~WjEJ13e2S?WF%8geRD8kW%b<`U!C*N(@*aEg>5j@LOetY5{?|$rAfyjT6f!d=dHJxK7IPMY&!Lq3od{1nV0KYT6WuGhp+FoD|6jyp+C{s_}B|` z?!5cS1a9t3PR>Nl7O#tBg%V?Y!_;EXw6?qm%2qaJbZ)X8rbnbYmlo!%2#Z%-f9)4`oB_BFP$C4-Gy%aMmL1@C*v72wT)faZ&Zu@OFwM@^e ztO6j2VOPt24fV+@{_)rIF1+k-mt2*v_yVBHhHY6O`kcbvSDl?yAEFIaTJIcJ`5)OGrrm?8^L&s}$R#=F{FsVaIw=^~%f925C@!3^t);2aZN>PcclVP>Y zNDSy)!HLac5pc8k_jgen!!84h}FP?e&)x&#{LanPCcRjId(QV6z zDtT^8OqBz>wWge_$#iqI12j{$k2EVuieqWJu5IGCq12g6y##a5+)Yu#{nlhNll4rr z#i7&#oNTta{)QK%bLr3o(s(#TODmQ3-I?)`*|E{#kN$b^*}W4VjV?{yzOiYGU&siz zc=77%{}J!4ThsFD@fUpG*0PFGtYyRqD~GY;q#Z9E#_IIx3un$>EL4Kc8`pnh$9953 z6_*k=fPsXR)b_BXmVizWmWUiD2rChfkd_W4R461OWDx-X1w@F=rH%zk_-Tdd+dY?0 zo;vgH0U;9>+u)UBkUNm8hb?PzW`Ya80D}0Ei`u`4x8&6PQCo{iD&mBqLzJO#jbsiSq*eF z%F~Rkgme(05)PEu*O;%L$XK5`18O|xmIg*{siycg)ps*F9rDY4O3?S}*2k_SoYam%tn-oDW>zVZet}!>f zRZ!5Ov;Zy6{A$hl29p}{aoiKqD2#&}>Ug^b69Ey7P-)!4O2LLRVP2&g4fg#Rp+u9{ z)Ib_kRS{w&#Ee;}RAYJn8jPwj61=~F)sBb4--R<*2OwfK%( zmfkr(vpj|C&R*(&{D}h`Dv+dB4#J*9D#ler!K*{<#K>5_eedCI+rRfr`*Ve2fSIc- z3evaK1ZGecL2%B;I=jBU^RaW?J=Ivx6e|5!uB06ISI0Xa{_0lW1rxH#piiod3YgH=u5^ly?!$>&aX zz633(8K~CAao7T0jqfMMMsgi(Z9J%Gq&MEZVd0|Ys;C%(oV1nl3Dq3hlE|U4VK>&8 z-2d;#Y^p-h# <!--TITLE--> + + diff --git a/src/bggpipe/webreview.py b/src/bggpipe/webreview.py index 81e821f..41ef90b 100644 --- a/src/bggpipe/webreview.py +++ b/src/bggpipe/webreview.py @@ -1089,8 +1089,19 @@ def create_app( "logo.jpg": "image/jpeg", "logo-full.jpg": "image/jpeg", "favicon.png": "image/png", + "apple-touch-icon.png": "image/png", } + @app.get("/apple-touch-icon.png") + @app.get("/apple-touch-icon-precomposed.png") + def apple_touch_icon() -> Response: + # iOS probes these root paths (cookie-less) when saving to the + # home screen; the guard already treats them as public + data = ( + resources.files("bggpipe") / "static" / "apple-touch-icon.png" + ).read_bytes() + return Response(content=data, media_type="image/png") + @app.get("/static/{name}") def static_asset(name: str) -> Response: media_type = _STATIC.get(name) # allowlist: no traversal possible diff --git a/tests/test_webreview.py b/tests/test_webreview.py index 774c753..70f3f7b 100644 --- a/tests/test_webreview.py +++ b/tests/test_webreview.py @@ -1048,3 +1048,14 @@ def test_lan_403_is_html_for_navigations(tmp_path): res = phone.get("/titles", headers={"accept": "text/html,application/xhtml+xml"}) assert res.status_code == 403 assert "access key needed" in res.text # a person sees prose, not JSON + + +def test_home_screen_icon_is_served_and_public(tmp_path): + cfg = make_cfg(tmp_path) + app = create_app(cfg, client=unauthorized_client(tmp_path), lan_token="sekret") + phone = TestClient(app, base_url="http://192.168.1.99:8377") + # iOS probes cookie-less; both the root probe and the linked path work + assert phone.get("/apple-touch-icon.png").status_code == 200 + assert phone.get("/static/apple-touch-icon.png").status_code == 200 + page = phone.get("/?k=sekret", follow_redirects=True) + assert 'rel="apple-touch-icon"' in page.text