From 1759415f78e2b0cdf29dfaad5710f6e37be485c6 Mon Sep 17 00:00:00 2001 From: StasonJatham Date: Wed, 20 May 2026 20:20:09 +0200 Subject: [PATCH] Add complete web icon set --- router_dyndns/assets/apple-touch-icon.png | Bin 0 -> 26181 bytes router_dyndns/assets/favicon-16x16.png | Bin 0 -> 1141 bytes router_dyndns/assets/favicon-32x32.png | Bin 0 -> 2284 bytes router_dyndns/ddns.py | 48 +++++++++++++++++++++- tests/test_ddns.py | 31 ++++++++++++++ 5 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 router_dyndns/assets/apple-touch-icon.png create mode 100644 router_dyndns/assets/favicon-16x16.png create mode 100644 router_dyndns/assets/favicon-32x32.png diff --git a/router_dyndns/assets/apple-touch-icon.png b/router_dyndns/assets/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..27b1102ffd6ecd6c545246e08cb7de2b827937ba GIT binary patch literal 26181 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 A#sB~S literal 0 HcmV?d00001 diff --git a/router_dyndns/assets/favicon-16x16.png b/router_dyndns/assets/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..3763ea5b60b423c9260379aec1521a4599f95e2a GIT binary patch literal 1141 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!Lb6AYF9SoB8UsT^3j@P1pisjL z28L1t28LG&3=CE?7#PG0=IjczVPIf<8Q>G*3RJ+z%*epa^8f#Tekp!NW+o{~Nik7T zK|ujwAt6pqPIeA<9v&VpE-nT}21XV}A5U)^D{Dp;CL3#OLjwZ_CI$v3Mn)!}93uw@ z2NOFR6EhPtI~&kgLnA{cCnq;IHzOk>AQuSa<>fls+gn>(Wn^T4Tuv@7YisL?6DRcb z_F7q4ad2|*@bdWi`g(hNb8~Y86*xOPJ2=>bbTTlQnVT7#7>kRGi;9W>wM$A#+S}XP z*Z}OJr2!d0*^3u1z5;=l7cX4+{p%Mni2nco_v_cs`}gi0J#ysw_3KBD z9KLhs&Xp@y7R;Z2Ky=^y%x@ub)1BeDnJCmoJ|W9yqXn-#(!G&!0PY`t<32d-onXc<|l3cgvS8>+kP> z^X3gOFjuZz@%HW8>({T{xPJZh>sOyYeFFOB;qJMNpnxa|@&hFl+`zc=#_3i=mZ%5! z!kHCUzI(e|-u(R=V~)-1*;rRB$^mS!_#VR5s#60PIcQ;T-wZt`|BqgyV z)hf9t6-Y4{85o)A8kp)D8H5;GSQ!{v8JTJu7+4t?tlk>9rcIq39uSh0mXMg5 zkdTlZ9v0Z^@8J^^eEq=#7OsNKtW5RgOO`EL^76&2LT1*AFT9tGje>)WHgDqXt!QMb zIi_a0v+^fvWvlD5v>FG-y5jCflP+!g)OE?rJJoGMLqlk2sc&v>TR@7xFnuF6dscMRtl3d-WgXrL6qjUWzxVKb`Q}wwnIJot$BtcJzl42LeYWlE z?rM()7Ms0lK66Yez205Pyl1y4L3iKf^fPnpvcJvQS(l)@hUedBg>6q*44QdTpYZa$ znzvs;u{g1yL*+zb(4~cm4+SR%UNqcT_{fNdq3e)KY16w&JAk3U;OXk;vd$@?2>^DB BwSE8q literal 0 HcmV?d00001 diff --git a/router_dyndns/assets/favicon-32x32.png b/router_dyndns/assets/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..4c490622df67c6851888ac227cb577656a37f25c GIT binary patch literal 2284 zcmZ{m2T;>n7RLX85ac0Mmm*4$-V!>5P=wH1qzKXsB_Ps^5=vs8E>(J!4q^fb5}LF? z#6?65pdw9@C-H%x5(Gi==)5>PvopIhduQ(X=AJXZ`OclWbLM6s9Iejqi1PpdaK^?O z?#xoDUz?kY6=M?Yi13jo}L0KhjS06-rAfJjtj{}mXk zz~yge1!pO1?U|GAumlum<6r^$#(7pqh@;@m{rjwxT%3hRT%cbZ3K|fDVhNxL(bQFg z=%{HzTs8Ee5DloNjtT?{6dF*Ezw_JFB#$xzMC|2lD}6Dl%Z`WlrIO_E~Y` zf;<6VZhpt2T4Qav65Q;QH2jryah`SgKjgHZm}Naymddw2clsut@K`_zVXGwT;HsS0 zZsX5jEZ~;fUat9UB$|A$GG>4zL&Gfl`=NhT8gADZoRn#eBDt=Vu;t*cN&#qG5E8Vh zLT@mI_9U}gH`6@B#nLamU#q!&wV6>E4JiM&8Z@c^co?{?6Kk9_kT4eH2I?P4O!eRbRXKWOb0Nl)HO$Ovd>5 zXliIkCqzrEb}NA2-EhSoOd4t?F&VyeKLBr9A&&Yc7Dlo)Rp|;TT4pliTZQIM`uqF0 zf<~elAvLhxMaG9qgb?iM0S;JjiN~xfFzyACVb7uKGxwQHCP(O8tJ+TDU>L2p-BgT| z+eO$;$qgO3Fi_^9+AUk14mOBcwr(LE__L2JW>%8zAf6&%U+?{+SKKUcWa$TeUiUdN z@5c>o&=TL0qD($_9a3O4y0Nj5KBnUobCmd?yPFxdVqYUrYe(5i_~9WXAc}2!>Zb0~ zFDoM>LLz-m5y8r{E~B&%KN>AtIA-ncUJ5&4bWX+oc$l8<-5YheyrM!5;ihxyFz|6D z$%x&vzT*^32L?O5eKe4u>d^+^Hoqv29%Hj2$$MM^LK&xwjEsIVnGgem(?coSs|J{T z?SOo4z`-GVdUh5%yomWLlpc#3A7TrZDRD6J0t#%E$cKOaW=o5>`MCMRV3M9m;;x?r z)o*pODtY%)nj-T3%EZ9lN=4X*j+ApM?tcN5YZzki?B)1o(_rq+|iDR^1Q!Hv0? z@_GuTFBGpilIAQ3Dxws-1=>}OE`@lLllQ6w1fyec5#j>|WF-~%mfEhaxco;|3#1Da z3!uw6Z>I&{O$cH>BoHc>%A2fhkjbed`F$rKNms!}#xy+S~Jkq0kt(>-5AEjtBLs>oH+T zLBKV3Xas(y#rD}VI-a^th#lpdD&qz5WAn7sIR!R07M((_i4g~x;;jV*cgdAG2QO~h z#?Z>8*{}JN?1xo%(6And;?mO2aH?*Oq@ktaS!IFknCp@!#+dSOA~}<~KAFUhn_IIu zzmRQzh1r*6Qj1WebnNc05fhfO^+d-7oALORmjwCa?Y-5Mk>JVdPtVgX`eVN@Gd4C> zcjm4KBar~5gEeUbzj2{6I{{o*fMF9{<}wCjWPF{os;bJnf11)4yV^TVrJ%JvcTq4+ zM<*wKk;$3{5~<>XA++h|L77%C-w(9J=xt|3P1=1$mwR=uaV|a^gYJsY518wPGtH8v z-QBtgHz&kd0}@J~WQ1<`0^F^*W;w9Hss!9nS67Fqt|%{`KRL!4A276FzF;S!mpk2b@v||G zQjq`1Pi%fX&Z_rx4CS#~b0ADeux}}E%<}VW#O`Dt1FbDlg10M$4*iz$Wm2|(x+;=V zjyXqu+hCRZ(I0Y$zip$*=w!Lj>CwQz0RIhB6m{ZE$6H4`YXM*5#1UDkR(rckxuRlX(q;DkRNe0I zLVJ0!i{zJ9k{4tOLaklKWaozGhKH_qmd-Re4L9AtryIrK#o2|TFv+_RotYW$?;F93 zRvFyw98bw-2=^&v2mgxAlJyq=Y%Cn%t!Bu(e*<5LG4KEY literal 0 HcmV?d00001 diff --git a/router_dyndns/ddns.py b/router_dyndns/ddns.py index 42af83d..23340af 100644 --- a/router_dyndns/ddns.py +++ b/router_dyndns/ddns.py @@ -519,10 +519,52 @@ def make_app(settings: DdnsSettings | None = None) -> FastAPI: def favicon() -> FileResponse: return FileResponse(ASSET_DIR / "favicon.ico", media_type="image/x-icon") + @app.get("/favicon-16x16.png", include_in_schema=False) + def favicon_16_png() -> FileResponse: + return FileResponse(ASSET_DIR / "favicon-16x16.png", media_type="image/png") + + @app.get("/favicon-32x32.png", include_in_schema=False) + def favicon_32_png() -> FileResponse: + return FileResponse(ASSET_DIR / "favicon-32x32.png", media_type="image/png") + + @app.get("/apple-touch-icon.png", include_in_schema=False) + def apple_touch_icon_png() -> FileResponse: + return FileResponse(ASSET_DIR / "apple-touch-icon.png", media_type="image/png") + @app.get("/logo.png", include_in_schema=False) def logo_png() -> FileResponse: return FileResponse(ASSET_DIR / "logo.png", media_type="image/png") + @app.get("/logo-192.png", include_in_schema=False) + def logo_192_png() -> FileResponse: + return FileResponse(ASSET_DIR / "logo-192.png", media_type="image/png") + + @app.get("/logo-512.png", include_in_schema=False) + def logo_512_png() -> FileResponse: + return FileResponse(ASSET_DIR / "logo-512.png", media_type="image/png") + + @app.get("/site.webmanifest", include_in_schema=False) + def site_webmanifest() -> Response: + return Response( + """ +{ + "name": "KarlDNS", + "short_name": "KarlDNS", + "description": "Accountless Dynamic DNS for routers and home labs.", + "start_url": "/", + "scope": "/", + "display": "standalone", + "background_color": "#ffffff", + "theme_color": "#ffffff", + "icons": [ + {"src": "/logo-192.png", "sizes": "192x192", "type": "image/png"}, + {"src": "/logo-512.png", "sizes": "512x512", "type": "image/png"} + ] +} +""".strip(), + media_type="application/manifest+json", + ) + @app.get("/app.js", include_in_schema=False) def app_js() -> Response: return Response(APP_JS, media_type="application/javascript") @@ -1318,9 +1360,13 @@ def _page(title: str, body: str) -> str: + {html.escape(title)} - + + + +