From 19276ba33176b635091c799bd28e8e137150172a Mon Sep 17 00:00:00 2001 From: Joao Henrique Machado Silva Date: Fri, 12 Jun 2026 08:02:17 +0200 Subject: [PATCH] =?UTF-8?q?fix(web):=20add=20favicon=20set=20=E2=80=94=20/?= =?UTF-8?q?favicon.ico=20no=20longer=20404s=20(SQLR-72)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds the Next 15 app-dir icon files: icon.svg (the orange play-glyph brand mark from og.tsx / .brand-mark), favicon.ico (16/32/48 PNG-in-ICO raster so direct /favicon.ico requests return 200), and apple-icon.png (180x180 full-bleed for iOS). Documents the favicon surface and the regeneration path in web/README.md. Co-Authored-By: Claude Fable 5 --- web/README.md | 9 +++++++++ web/src/app/apple-icon.png | Bin 0 -> 1472 bytes web/src/app/favicon.ico | Bin 0 -> 1362 bytes web/src/app/icon.svg | 5 +++++ 4 files changed, 14 insertions(+) create mode 100644 web/src/app/apple-icon.png create mode 100644 web/src/app/favicon.ico create mode 100644 web/src/app/icon.svg diff --git a/web/README.md b/web/README.md index f603aed..81262c3 100644 --- a/web/README.md +++ b/web/README.md @@ -43,6 +43,14 @@ Each public route ships full search/social metadata. The pieces: [`src/lib/og.tsx`](src/lib/og.tsx) so each route just supplies a page-specific eyebrow / title / subtitle. The brand mark is inlined as SVG (Satori's dynamic-font fallback 400s on uncommon glyphs). +- **Favicons** — Next 15 file conventions in `src/app/`: + [`icon.svg`](src/app/icon.svg) (the orange brand mark, served as the + ``), `favicon.ico` (16/32/48 raster fallback so direct + `/favicon.ico` requests return 200 instead of 404), and `apple-icon.png` + (180×180, full-bleed — iOS applies its own corner mask). The `.ico` and + the apple icon are rasterized from the same play-glyph mark used in + [`src/lib/og.tsx`](src/lib/og.tsx) and `.brand-mark`; regenerate them + from `icon.svg` (e.g. with `sharp`) if the mark ever changes. - **`/sitemap.xml` + `/robots.txt`** — Next 15 metadata routes ([`src/app/sitemap.ts`](src/app/sitemap.ts), [`src/app/robots.ts`](src/app/robots.ts)). Add a route to the `ROUTES` @@ -91,6 +99,7 @@ web/ ├── src/ │ ├── app/ │ │ ├── globals.css # design tokens + utility CSS (ports the original design's styles.css) +│ │ ├── icon.svg # favicon (brand mark; favicon.ico + apple-icon.png are rasterized from it) │ │ ├── layout.tsx # root layout, fonts (Inter + JetBrains Mono via next/font) │ │ ├── page.tsx # landing │ │ ├── docs/page.tsx # /docs diff --git a/web/src/app/apple-icon.png b/web/src/app/apple-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..685d11abb1bf28975453c274a3eb2e26d2037236 GIT binary patch literal 1472 zcmeAS@N?(olHy`uVBq!ia0vp^TR@nD4M^IaWitX&oCO|{#S9F3${@^GvDChdfq}Ki z)5S5QV$Rz;hO1OV1=t?kbl|r+lI3_LXNE^ylG#L!j70}smPtu)H1~KHa5A^CwdEaj zeZl0z+sm_Mk#czE4jzriulIeQ6aJiAYqrCxeZg1$#y@WUV>Rniv(BYv_Pzg^r^u;X z5Qtz&baobaTK(XOL;{CaL)!so4{50;oqNpc#~GXh7)@B@oNiqZNckvdVaX=Z#I->2 zgTSS>Hiho*2TmFu5C~!5ZET-lX2KG=huyD_v26iU28T_{mW7HZ9@!QY@ffg(IygU2 zT*AxiDE7W_a&m*>3I-`Ae#P7jj!hN(b7Yu#99b_2RB&WEJ5M-DV<-H*&kesnjbw8Qb$owh1d0{=ruaJ+wetqBn^Y7|^&B2Uc z=JD3XZO>o-_PGDTQ;hP{cx%}&EU&8AyzTt`*xT#lzsWD+TJSyR#pkNmyf;hvzO2Z3 zF?YfCNwMzbXB^}=EIjXBChHK+q`SNCopDJ~48xW;Rt@VoqRM2=N=z?odRO<+|e26)aV&Z=d`>UomNS(t_zHH)k*4Zi-Vox2{o-r)s9bZni3>3#VOfnqHXP z5T|x>UE@5SFF`gy(Vz?77vD&|=ycR)1!`%`o4Sc0$+j!&>?~*f^#w(LK9sz*lb4oy zv5kF`d@J*w0O=~*6z%#C6}k4^Z+|Ujsk+O0Q$CEXf#b`+-ai-S@B7Wn@@vNDN7s&f z{{6_fSH9>+%@%vB1;kbawz7N?H3urt z>yvz;-7rn_c&Gw%ZL4(DGMVtBInMDMK&f?nk}tS(fF_nS^L#l7)OAsI^W?`2K#N}V zNxWbNn!DIKZUH}&ZgAhbf<`+Apq5?DtiKe%3Phm_f)?;IfD~9X+JVg6b(rN>Lt4%6 zi?{auuE?$DGmsDk=4QiM{+b8;j;pUQFJK?inVy7lhwt^lcqJ?A7WSLpYk);EgQu&X J%Q~loCIBCCf)M}! literal 0 HcmV?d00001 diff --git a/web/src/app/favicon.ico b/web/src/app/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..7b0b3feb84b14aae1275504e2e9d20031ffaf49b GIT binary patch literal 1362 zcmZQzU}Rus5D;Jh(h3Z}85kJMfLK8R!e7V8z+ec(1_ls*F%tvBeIV`(@N?(olHvj? z<@NM%2?EkU6BqQ~&sXKKBWe2JtT5CrAIk?^|+!ANGr#jiaoVuvb&Qy%E&|IaV~R`%UIZIMy`gz9oxj;h8x(eD~hPv{Y~DJd>m zSurDW>f~(pro_l)`wt&5s3^C{eV6#<{xjB=_CUsol`UFncFai!(o55qJP(~+e>!&N zgN5r^6{Le1j7%At7G8}0=Rb3Q-GwOkI-5Y24V*?6PfDaMcLy+S2s|75f zTa9JCk9W8HOOK>UPA1krCh{vES?}98gL=Ipfmjq?^gTjIvp} z`rCraRs$mdUu*%BGJ^p)w!)cyw&RE`CRIpmy^XTiE$R_spKulv*Vr+G@7N6>F(zSU3IkLbynJqj<^ngd)8~?=>U>goAeB8;I{UDqXoA_RYjZr8 zoj9=FapKav#0N*-s!f(X8P2ug3C}$i_3Yaf#~#cz-f^qydG02o69z9;_ssFVXWH7k zxk7rDOzHd1*r?{HMC$?Pi%(ZQ}s$s(UO0ZUV!u*SWvb{Gjh-SN8sM)aKXPx^BhN(*5 zgFe69mB6TV%|pa5e;3Y#~05!YxC)< z`$DFWu9b#o=i76LEeLw@JHWb$E1-6T>_OHQa@of(a0EzZAK%RI>%KFGs{ErpS4>`U z-z<##o_hEBYL?QMjpmnU)qCwZ)9bz0uivBY!jmO-nt`7d*X4$N-uWb7l&j^1W{vJN zXW@l!e*9(Gcb!+JMa^j@V|Au;^rLslyFg|;pSHsvxV({Z=)aB!g=3io&2PSH@`|r{<$P# rHusGA#M-W}JFk^9v)knb#|wMy6aQm=d&>rUma`KBBH0%nMNV=63ZOLG literal 0 HcmV?d00001 diff --git a/web/src/app/icon.svg b/web/src/app/icon.svg new file mode 100644 index 0000000..812c1ec --- /dev/null +++ b/web/src/app/icon.svg @@ -0,0 +1,5 @@ + + + + +