mirror of
https://github.com/juherr/kill-the-news.git
synced 2026-06-20 22:03:48 +00:00
feat(favicon): per-feed icon from the last sender's domain
Resolve each feed's most recent sender domain and serve its favicon at GET /favicon/:feedId, falling back to the project icon. Icons are fetched in the background on ingestion (direct /favicon.ico then a DuckDuckGo fallback), cached base64 in KV keyed by domain with a 1-week TTL so the fetch only fires when absent. Exposed via RSS <image> / Atom <icon>/<logo> and rendered in the admin feed list, plus a landing-page feature card. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
+5
-2
@@ -8,7 +8,7 @@ import { handle as handleEntry } from "./routes/entries";
|
||||
import { handle as handleFiles } from "./routes/files";
|
||||
import { handle as handleStats } from "./routes/stats";
|
||||
import { handle as handleHome } from "./routes/home";
|
||||
import { handle as handleFavicon } from "./routes/favicon";
|
||||
import { handle as handleFavicon, handleFeedFavicon } from "./routes/favicon";
|
||||
import { hubRouter } from "./routes/hub";
|
||||
import { handleCloudflareEmail } from "./lib/cloudflare-email";
|
||||
import { Env } from "./types";
|
||||
@@ -169,10 +169,13 @@ app.route("/files", files);
|
||||
app.route("/admin", admin);
|
||||
app.route("/hub", hubRouter);
|
||||
|
||||
// Project favicon (also the fallback for the future per-feed favicon)
|
||||
// Project favicon (also the fallback for the per-feed favicon)
|
||||
app.get("/favicon.svg", handleFavicon);
|
||||
app.get("/favicon.ico", handleFavicon); // readers/browsers that hardcode .ico
|
||||
|
||||
// Per-feed favicon derived from the last sender's domain
|
||||
app.get("/favicon/:feedId", handleFeedFavicon);
|
||||
|
||||
// Health check endpoint for monitoring
|
||||
app.get("/health", (c) => c.json({ status: "ok", timestamp: Date.now() }));
|
||||
|
||||
|
||||
Reference in New Issue
Block a user