diff --git a/router_dyndns/assets/apple-touch-icon.png b/router_dyndns/assets/apple-touch-icon.png new file mode 100644 index 0000000..27b1102 Binary files /dev/null and b/router_dyndns/assets/apple-touch-icon.png differ diff --git a/router_dyndns/assets/favicon-16x16.png b/router_dyndns/assets/favicon-16x16.png new file mode 100644 index 0000000..3763ea5 Binary files /dev/null and b/router_dyndns/assets/favicon-16x16.png differ diff --git a/router_dyndns/assets/favicon-32x32.png b/router_dyndns/assets/favicon-32x32.png new file mode 100644 index 0000000..4c49062 Binary files /dev/null and b/router_dyndns/assets/favicon-32x32.png differ 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:
+