From 801008adfeb70ff68ce28c49426f4835094b33c3 Mon Sep 17 00:00:00 2001 From: airent106 Date: Tue, 6 Oct 2026 22:18:08 -0600 Subject: [PATCH] Add favicon, shortcut icon, and apple-touch-icon matching app logo --- generate_icons.py | 78 ++++++++++++++++++++++ thread_ripper/server.py | 8 +++ thread_ripper/static/apple-touch-icon.png | Bin 0 -> 13862 bytes thread_ripper/static/favicon.ico | Bin 0 -> 10639 bytes thread_ripper/static/favicon.png | Bin 0 -> 13862 bytes thread_ripper/static/favicon.svg | 15 +++++ thread_ripper/static/index.html | 5 ++ 7 files changed, 106 insertions(+) create mode 100644 generate_icons.py create mode 100644 thread_ripper/static/apple-touch-icon.png create mode 100644 thread_ripper/static/favicon.ico create mode 100644 thread_ripper/static/favicon.png create mode 100644 thread_ripper/static/favicon.svg diff --git a/generate_icons.py b/generate_icons.py new file mode 100644 index 0000000..6579d2b --- /dev/null +++ b/generate_icons.py @@ -0,0 +1,78 @@ +import math +from PIL import Image, ImageDraw + +def create_icons(output_dir): + size = 256 + img = Image.new("RGBA", (size, size), (0, 0, 0, 0)) + + # Draw linear gradient on rounded rectangle + # Gradient: (31, 111, 235) to (137, 87, 229) + mask = Image.new("L", (size, size), 0) + draw_mask = ImageDraw.Draw(mask) + radius = int(size * 0.24) + draw_mask.rounded_rectangle([(0, 0), (size - 1, size - 1)], radius=radius, fill=255) + + grad = Image.new("RGBA", (size, size), (0, 0, 0, 0)) + draw_grad = ImageDraw.Draw(grad) + for y in range(size): + for x in range(size): + t = (x + y) / (2 * size) + r = int(31 * (1 - t) + 137 * t) + g = int(111 * (1 - t) + 87 * t) + b = int(235 * (1 - t) + 229 * t) + draw_grad.point((x, y), fill=(r, g, b, 255)) + + img = Image.composite(grad, img, mask) + + # Draw the white link chain icon in center + # Scale from 24x24 viewBox to fit nicely (about 130x130) + draw = ImageDraw.Draw(img) + stroke_w = int(size * 0.08) + + # To draw smooth link curves, we draw at 4x and downsample + hi_size = size * 4 + hi_img = Image.new("RGBA", (hi_size, hi_size), (0, 0, 0, 0)) + hi_draw = ImageDraw.Draw(hi_img) + + # Center = (hi_size/2, hi_size/2) + # The SVG path: + # Top-right link loop: center around (hi_size*0.58, hi_size*0.42) + # Bottom-left link loop: center around (hi_size*0.42, hi_size*0.58) + # We can draw the rounded pills rotated by 45 degrees + + # Create rotated pill for upper right link + link_w = int(hi_size * 0.28) + link_h = int(hi_size * 0.52) + pill = Image.new("RGBA", (link_w, link_h), (0, 0, 0, 0)) + pdraw = ImageDraw.Draw(pill) + pw = int(hi_size * 0.075) + pdraw.rounded_rectangle([(0, 0), (link_w - 1, link_h - 1)], radius=link_w // 2, outline=(255, 255, 255, 255), width=pw) + + # Rotate pill 45 deg + rot_pill = pill.rotate(45, resample=Image.Resampling.BICUBIC, expand=True) + + # Paste upper right link + offset_x1 = int(hi_size * 0.38) + offset_y1 = int(hi_size * 0.16) + hi_img.alpha_composite(rot_pill, (offset_x1, offset_y1)) + + # Paste bottom left link + offset_x2 = int(hi_size * 0.16) + offset_y2 = int(hi_size * 0.38) + hi_img.alpha_composite(rot_pill, (offset_x2, offset_y2)) + + # Downscale hi_img with anti-aliasing + icon_layer = hi_img.resize((size, size), Image.Resampling.LANCZOS) + img.alpha_composite(icon_layer) + + # Save outputs + # 1. High-res PNG (256x256) + img.save(f"{output_dir}/favicon.png", "PNG") + img.save(f"{output_dir}/apple-touch-icon.png", "PNG") + + # 2. Multi-size ICO (16, 32, 48, 64) + img.save(f"{output_dir}/favicon.ico", format="ICO", sizes=[(16, 16), (32, 32), (48, 48), (64, 64)]) + print("Generated favicon.png, apple-touch-icon.png, favicon.ico successfully!") + +if __name__ == "__main__": + create_icons(r"C:\Users\Chris\.gemini\antigravity\scratch\thread-ripper\thread_ripper\static") diff --git a/thread_ripper/server.py b/thread_ripper/server.py index ad5c94d..b63ed3a 100644 --- a/thread_ripper/server.py +++ b/thread_ripper/server.py @@ -115,6 +115,14 @@ def download_thread(thread_id: str, format: str): def health_check(): return {"status": "ok", "app": "Thread Ripper", "version": "1.0.0"} +# Direct favicon endpoint for browsers requesting /favicon.ico +@app.get("/favicon.ico", include_in_schema=False) +def get_favicon(): + fav_file = os.path.join(static_dir, "favicon.ico") + if os.path.exists(fav_file): + return FileResponse(fav_file) + return Response(status_code=404) + # Mount static frontend directory static_dir = os.path.join(os.path.dirname(__file__), "static") if os.path.exists(static_dir): diff --git a/thread_ripper/static/apple-touch-icon.png b/thread_ripper/static/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1fc81b7dd8e13e705ed41d7076939d99d79b707f GIT binary patch literal 13862 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 literal 0 HcmV?d00001 diff --git a/thread_ripper/static/favicon.ico b/thread_ripper/static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..0c4dce158f63cfd8261f6b93379cb8dd5cee8712 GIT binary patch literal 10639 zcmaiYRZtzkvMufw9D=*My9al7cMZXH!^YhmLU4C?O>lSHI6*h=aC7eYc^|Lp&d1Dj zcU9Na)T~*(8Ug|m0tNyD1LEHxgW!gSfROpmj_kj78$1Mr-#;H4+kfpD6bJ|oWC#c` zvH#lfUmzeL@gX3hRF%J>A`v3}^Pys)(r))&(dkFT{@%xx z(dwF9?pjVvOFQgx`JbkceaALheGYUyh}8O%^G^o}w+TCmv?`k<+%)!GnFTDj(Bn zlXCZ4>ztx}tKN@F<)&TRYMaTa&60&vLVDKT+XRushP6e1&21-_%$3}hv^7q_)kscj z(GJNPd%Eys)~hVU+)gnqYD)C68qp1Zp04StZ!dfw+G&LVvN9)VvwC~{@*iLE%LvN_ zu=>^K(y3K5lIdHb&FmVcverD%h#B0>0%_m1hFT_2C-ZV5D7u}I%wq#p|}qD|ebBiT4xSa#Jru751Jws5crD}SsW6QCS@ z-XXXqpMx>{btkn|x~ECmAV;-pp3J43-`n{(8bqR`JAa}qMez>~5OUJWQneDMA^#uH zko^mj{V!fH7&S2#dlF_< zLO`Szg=%HAxgrHain=^S*&lXkYRF_RatuT~pe;R`wuVFv9F%jmtg1d?awO@OU%#R% zXSudluY0{bZCC`nmS?IJh>vDAvpU@SuJYY`-KVL+ON_8De~!&GyecL8kAkv@7 z%40$RQ^|Uv$p|)WVyS8RRHn6dWRWmeVCEdM>x6x(`yTXQ*BGTuNT0bN11Hkkwk>pb z3+x70#kzxaV4g{w3H{goPzirb0YNpXTjW_@eQ%o!$aNfuA*pwO%eGT)q=NaHRe8~j zJD7eAxnSE~(CNnA<0(r?Vj|2R*K%XVt_oyLmTmT@+b}sRKz4{h=QdNR9S5TO>nLO&xk(P*b>0sKxCK<9%tS>&@_3*irsw=^cEc`vAuDQQer zS3s2%i_L>9B^@kGqfIQN`wi)DN9O_toqWZn$rHw}3`&1UGkDoBn){zZ-5)Wgp22f`wV;{P>>nlEz zE9U6+y#mT^)x~>z|E=?}>TT7+B{_{PN_-rM#YX%F()p&2pDXjr=9>il2&0^B=J&1- zWsp^RwzM~hlik01EyMzAbU{S9Prbj1)$+RVkVa(QaW}UDTu_HRG8~?{B=0g1fNv?#@YuNR7wo`&)65g*PytK0egm z-VMdf-}S#5bnej|P>sVzna6X|h}$$(p$KR-GWwYM?jlqYmZ>ZYyyg~|2%7*)uy7Y` zT?c`o@B4gi9AwwK*2o)e)Zign8Mjsm^DTj|=pwqIu*g5Scuw1|0DRRL6>&yy8ORe< z)W`knO{e@#=0;6pjr@qe;k0=T@I~?>bkM#-UY)3Zwr9^+_tlIHQf^?bwgqADtfq@O zRE2Gbl8l}vgpBwEV=^7KYBbn*^Z z!EsKj#3m{~*=nK$Jo26(0Xd0i36}Y14#gM`s9QZp8k}otj&cREh6>*;oZS!dC#JWh z_>Jdi$_pWQ@bSb`KZn26LdImAFl5T+iWZj}`X>{bbx4B=)xB z(0beH!|&SB>tIr2)IB7LSSzpYLQJh^qulP{(!H_1D^e=8O!H!hs|Gs7Br3f=U0%{- z5)-3c_KAkeX4YFa#ItVVh1SAL|DEEM=PdT5Y)=)ic=;ZC`PcsySQv46H^FZrJ74+e zDn5ObJl?z0APg8CC8KFSV^<2XgWWi`6@6KJLaET==k-oUh-u7tO_?P_N1m6JO?C&U zv{M>345ND{?44)*lCM$Lq;tLW|9J9;n<4E`v*)}~tgl^^1!rBbU0ot;v!+6PJVufI~)v5$#4+9_TAH>Llj^gi%^_xfYKC=cV*z-Mg`3ujzelCqbDj*LZiS^jF-=*;JV^83Y*R&pByTntJE$#bq7>L25kp4XwP#=6J91J41E(;)USi?5Hlk_@O48Xko3&> z^Ke4&5|KS%`92@BTQJ^SIrVZ#{vr;Pt#}(5kfi7Iz@juumpK*w;-CdXRYFpp@JIoI zbueLm%Y8#TEm307y=(d1$NhqE^z6(;p|iZsrqJy$l(uzkE_W8Ic?aWb1VV zCyyc@<4UCFpzEGvjIVCO8X{#lP7qW_=(1_t zHk}sro>LKR_S|a_=$iF8xIS((>dZC|xk@nhdDEVd?<0c3Qlm2=W_u`B1M~_5K2hTiDHTR9UW#T|Elyu?53!6FOBJaBQ9I^T_>78uV=8utu_!;aSVZI>QPM+0h=@jFXMsfF*l*OD_IgJ zNvXx*(F}hHpzP&Qf6u8RJssiT_HvI)7{v`dq6Ha`en6usw=x!ETE;hZP5phBu$?K1 zlF7!LCmcul8p4Xr%~Hd8-T#Y<#`x>?l)+ql!QE_U7gpEKiMfMoP&u%Pnm;|xP(%Mn zH3L3;mJXL&#>jqeF2cdptOYnP)=_Pi9m4!8Rc0#;PMb+?w^2dSadjCWm3lW0xn8z$ z7qGQ)6+vc-NM_f3O}m7$&HM_f2ogjVX;;OVfp#t+`5j$CkBt;P4j-tE<}1=qBo8iy z5x7B$v8Hx?9--N647Wle65iddI6@;5Fq9FZ0r%LsZSpWrOQZ^$PB-%bHZDwg0~arnQ*Qhr^don=jbEO9Qgbzq5g_qrDL z9P{Fo^r+0seh-V?=18U&M=D|`Mk^R@XkiNK3wp;2 z9@BP(WeN*V?>kX=MPqirBi5-1rHQ`<+4c(lq*A4`wG>E2*M#05U6rMUF^s^kjIftm zKP?`fZY9e16FEj^_9wSiO4$E4QRTywuY#ibH4phIAL0g@2ZiVG`OyiBE)9EIRIG{) zs)+sE0ZyAm>DDVA8E(HRX&KbMx|A)cKnDCIVYBchdfds7X;6^N{W6P_E_zHg5-8?a zq{d*kS}G>Q;63lCJ%9n_x6R=CY>NN!PR}cK-9)N0pWF>ufnhY zl1DRqb7+@eR+cUxY&|s)@@O=yq7Ks@Xibz-7qjoDmcO1g zRB1&IC#mT(F-!+DuiHjG1ejzgdTXE;k&R4WCNf!JmGwN1`pdb;=UW^r+;uBUGfdEu z!jIop!Gtaov^6+$rC_m$z+mY|Xti7=qu=gikD@elICo>7-*grblY){8%;aDnwGdI3 z&;?)!)U&Ybs{d-C{=J^B0=Rf~et7rMT77he%;SemDMhuXT}y$7oAn3TXabGY9YAvt ztYS*~zYO6}I5UN8Q`;-|lDSntIoSb~hT7!A2V#-5PzssklCaEq$+l~07G~Cyimr&s z<;nP;7YH9OGPD%wmS@0x3$$=2S<2!#Ez}BUa53WVrPZz-@xpS~DJ>p*R<0-h?_cMI z;u@@U(jC%EVlAlhpNVj~B3OH=g5{dIYaK6hkS9lIUIudQMaY`(BDP?5}p%E_PD z?I#xLcoO`B32}+UwCmF!mtv03 zKRycoNjK0K>_97(q!_l2_jHbhM;f3i!NkDllA8`cjg)WiLl0g%KD<1a*Ul6aj^7bZ zlcqr6ur?@J%ZQ?gVz7(NVPyJu1%86iUiR%1Z7}Spb^)u3eH5ryb3(=KN2Ms5{k{Q5 z005T?>nv1QvZi0e-b)x4r;R;PR_q|B6Tc^QeFd~aB1WreWih*RB}NFB%3~x$Uh-%j zD!o)un&mk!RM06h`i$cws7aDVr%bA?=lVIzJD8j9wGA@Y{;~cxOh|h(<;H;>mTR(V z&!)VRYM`?sF;hO6{@?R6{uzwARZ&O|+g5&^fp_zCKndTb7`K1gz%#!D_t+M+Yxe0U z{dO^>Y^hQiIB;vTj-GG|nWCGS6s3%uz0%O8l)#C9O6J5XS}@e)#BUObM0&`v4((D= z{ba`t&(!m6KyI@2A;Sc8JH&FqPDYYaE-&jjRGS;Fp&2PdjTadJK&RJ2gY&mVMEXVB z<_S9F?aEx2-A~0U&+qFJi8741VH^h&Hv(ZOTKmKA3A$gE0Xs!}zhJoI9D=6SGV*6^ za5`@YOCd{DV~$Q#ZgG50t3gA7$(;-=^??ewb=_+tSV^Xq52TYSzs$@qpL1EIo<#0b z1iwsSYLN))TYu8*){%S_7h+NKd^@J^TF4~wv)m2j>0#LFo#~nVXnh@ote7r@ePZlk zYOoE&^jfCPni*5FrI;o`s%QS0sPkkRR3S)CtpV78IfS2C_)W7Srs;yDRHk0WiVFXo zQC}`;F{*udv=rrWfrAZYHVpZVu)KxawCtx40&nXdkHON=V7$*W4qQzX`$Kv0NhQB4 zXms4m%xl6lV5Gcp@IsFsj>KYw1lKX&ZqkIR51W4`z@hfui>bV&;AS@KQQ^RSNvO(* zegzw&K;ABH?l8HOvZM)6hoZWJ36+!GC^Qg@M2^cOOQA)5y`Im4jf}L@K6rFPHnLP* zQ2fzR7pX2zE^%H0hfbpJps_A7@Vp3Iz9N_>*^f%5&^~8fpEFUcr-tEing(;GNlfPE z^?Q|$&aG9b1prJG)JOp{t&H9G`n2YA?$D(EsnkwI#nD%C^aq~Xm1sykA6z>-o}{m? z7+3~8HrFo>c|@z&!_{^QY~D~L+Uco)Hj%aXc+U}`9lyT@9ArC`yxCH?l$J*pZMh)WFT;ttNGe1CJahraWji9ifJ&}6U zM!bDN)sNFK+IyRazg=1`Dl^8Fz*Q&V~y{?`)}LcM(!YeCB+`~ONlPhxi}(}E3}mA~)J zBg)6<%42m`QP~}0oG{R$7Ps2yXhK@|6}B~bX96!zbp|rk&i4s=@1d8iJms(x%8qfP z_UWlewBr(t(dgT}rv_N>h$|`N&sYx&K~%DJzQ!n{$1UpWvT3o)*+xdRZJ(7^PxGz5 zf5M!|_RItjKahG{*BX913N~c7Zj39JrH5!FrAjrX4G2R#6|OpjEyF|y*<-X|4r0I& zwYeKv+)6ue<;}u-hteUNcd1P*GY>7dkDL>$ZW}K|B5cSLrpL}U1U*VgA{sxWnAuI^ zPdP~em$!|}QoBO?c|(4zhw{(*tDHT{DHL@df21}2Jfuk7I)ijc1=c_F-3r;~_dC=O zOX8E}%&#)0Il6fXU!Uq%YaQGo`@L@-_3@cbwhZ?-^86oiM(kf)?0@AFN^ng zy^|;0$cA~gcBIjH%LoQfo_cnfx%F&Sp8SVys{XewgmT-m;Gc;Z2Zx6Nn|?EE&jo%n z69KHO>@5EEdMPZ2VS4%PLXVgQEG(Em>{PFGY4u;C|B45Zx5fT+Ueo5Nj9oKk>B5)US*EEx=E=Nz@Cj;hInuDuFp?y7f+5)SrYjfH051 zy+MoH$>`2|ij12~48@t3PeE|Wg*wt`dvi@@(v0WiPHW&foD&v4VH>_}-kDL$!Bb1D z&ZXI4+@QPbKrs4x3C19AvJCF?o06!%^Ic9{oB_)HWU95DB;i*+UdG+S!!S4!^$^Zc z^4oc~YI!^PWC(-DuqgEWw-6^<9&cgNu2{EQ324&5h}6NF$at>XwRoSL0^)lj_-uZ! z9-6;LRAcX9DEZ20qs18+!7IQc>uDMm0ezR7XkxJ8H2!KBim@LYoNQ>0g!i-Frs+}M zW;I)X@smZU4(G5$P{CI)HX~vR8?;xpVq+FV_dR9zEn0qHfQBMTjs*IrQR#pw{(8ux zh~EQf=~K}cm^H(dm5L?iCM?T8jpt1WKsQ7nOG{_tSH;?oTygbK@k)@YG!XL@vx3!F z`Mcc&OS(Cu$pXzkU>WYi{^jS=r+>)Rn5?D@{zqjm6zW0|zUZ=))8B zld9KFC~7TtrgmFyJ=f` zRC_4-UY?*VlrOHe15N$eIdJuN+xDy4tlqxNkV>A2-LHV6{J!tGVN$59h8le+y4#w_ z;b`Z!XKKk9t%#wpbsMTwkjLvY?qpk(bKo(AQpNhkYJ0F{aNwOfVNOuC%(o2H8R|;@ z%WUEyn@@_PGyh0n1U4dOpZ%Fu1SjN7Gb;Zv2$>*D>K#?BehM=^4XCyyou5q#ba?!_VC-Y;HHg6cK?5j^7*|Dn z2i(hD0ORJ3IpH;agwu;XMW`5^+El%pL7VSK-LWQp8e-LuP7dbjyFO;K018a+kKChY zh#6=o1`3pGhCc3g*xw@G=eEgB2?`@w+hraXhY14fnM7g zJ372w4*Hm${tgJz-Ut>PLu1zg4ubL{ZRev!R~S{J5pZaY6qM^#u6F~KD`+4XXw=0~ zPR||tKIw0k%LH?hn^qh8hcyRB)-#$yf`!1!bd#EK zLToS@9@DnGPAu9n#O)<(#i@G+IRdh~wRZQ6Yoa4}7%J%Qp0uJNDITY+9f+ig1T_2!;)M4aa$?&m+n*;I3@;aGYGIEmXUyg zq=I8HA;P;#pvV$4PGb2KMgu<4w_jBTWDAsOejA_hp?Q8yrvx`UT(Hh{L1NJ1ILpn8}ytqf%+vXn8*4Z!-pL2(!k2Lsh;NjH-$tqy5h#jpngEo#o6N9L9A* zRWI4Bvg5{dHvU-oEop|buEKhTgXlxL0+YkO;Vm*4>GbmB)AhuT>-{i!8i8@1q=ROj zz|8bb3ww_ss-~kJIHBGx96>}NM{b3(S`_z-SU%QR?P1hNgdo;5dX1t3GQLjwH{jv_ zYFSa+YV=8+f0)j<7R^cVetbj|;XADp4{QyOs0H4hq~EYeZsVCxPT8^4ZOgQ{ZtMhc7BHYy?;HZMHY)M z`oeCG!V#t-*yoX$z1UBxp#)7vn+g$b=(H@^yMDN1Q61$QT+9u%8FQtP4eU; zz`Oxp_ZG;8i~3Qs()2X);H;_rfS!-@Rh*yf>DOsIt(GGxPY74!%$pC&?eXwj8fG8{ zHk3&v8jZ!%bT&XPQ)q0oFx02ocrBhX$aN_o?9ic+HB}f6R*l*%)rYX(<PbCVUM>z(IZKuyxUFr!U`DttP3x58Kfq6PG>Qb7qnpY$#$Oap4bh zl%XiNW%EsqqFF^RoTX;(?5>Bg|xEvaXO;nV& z_VmYY9Qy9#vl){d^icK{O@m8;2@|4?N85)TwM+s};)Hk&U6NMW>31vYf2T~9pRLOV z4uqgPlCa_=4Fs>OAW+qSx*G*Um!v|BTS{!8Fe8Kgj)v1zmb1+4v?GFHvgcYHlD$9K zoEC0(Bw;i)ITU+nLj0#qxGC(^M_K>8-0>Gz^Av~Ub3CaEM$spUIe6@R92c`9Qd4a% z;Q!vDLagXbR%JUqSY{&2fNlLO>%-qO0SAp5nLWn4XD&17@nMT#fjjds(ezWFmM&3x zZ+|q(5_2JX!BYXL3stmfgCkLi1otZ0bgKA>mzJ6X`@?H|w*&*}4_zH)DUvj)nytW8 zav>)USmlA=Xp??2j8HpkJyuoy*#%U-nd4Wk?1~T+7aN%?;_%Ht`Rfwf#vmtwjg%yQ z{?3M}+?lJOBB#qbQ%v#qs{LkqgZ)*;dmjiKzaKNYG1G4&n}kywEpZh+$Zai`_2B{C zPqa|Y>ThKyDj}qZ!A_3$3m!D78&RIsGX!s_DaG&)`XnH%PGtGSm?DS-6Xe&}YVs9^ zjT<=;+>6$%rfNI6IF(Di*QA}u`qn#z>)Iaj31sU&`fGnkWK0#E_um$46K8S2v^sN=*{i=c95&#|6(gHlFb zTI8&VBJ_JM(S^)nGugfKZwZ3}x9XN|3qIzfSXbvdQI$I`ZX{uLcJhhFiRbMA*ZWSB zJ%aHLwJ|^Yikc)rhZkGkhc;Uum}{nuo#Ip7eMY?u0`uo%)WbI^Gu z6s@qRBZ$1aT+4~?`I5Jo*ZL^1+1EZs(SdPd=XzxSw%GL{b246j7vU2*W*53{QG6B( z?tZ}4Hi*QfFH2*urtLQd;$jfjATpfF3g1lNQAvIKRPouJY@`o!4Ua0fa{GRHY=$$( z&1Y_m3*Dmt%2dVz8~^D<-V8(29QGj)OTd zr%_V^9z)t&`)xVy7RQda`y)8J)^j4zf?j}a&g^XcQ1_2L?nm*)*ODJD4O5xxHmqS) zBKg{+U(j*auyCATC9jqvOfw39Im*v>FQ#v9W&=|t7>2>j|SXGcCsQEc_Ob{S4vw{Eg aaHNEXdV2f(3ENO_73z#Us`>wRWBv#9%SV_1 literal 0 HcmV?d00001 diff --git a/thread_ripper/static/favicon.png b/thread_ripper/static/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..1fc81b7dd8e13e705ed41d7076939d99d79b707f GIT binary patch literal 13862 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 literal 0 HcmV?d00001 diff --git a/thread_ripper/static/favicon.svg b/thread_ripper/static/favicon.svg new file mode 100644 index 0000000..e93e363 --- /dev/null +++ b/thread_ripper/static/favicon.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/thread_ripper/static/index.html b/thread_ripper/static/index.html index f7c49ea..34a92be 100644 --- a/thread_ripper/static/index.html +++ b/thread_ripper/static/index.html @@ -4,6 +4,11 @@ Thread Ripper - Stitch Threads into Single Posts + + + + +