hacker news alerts in slack (incessant pings if you make front page)

chore: fix og image

dunkirk.sh 3de6f325 26cdbaec

verified
+24 -6
-1
public/favicon.svg
··· 1 - <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="270" height="270" version="1.1" viewBox="0 0 270 270"><image width="270" height="270" xlink:href="data:image/png;base64,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"/><style>@media (prefers-color-scheme:light){:root{filter:none}}@media (prefers-color-scheme:dark){:root{filter:none}}</style></svg>
-1
public/index.html
··· 9 9 href="/public/favicon-96x96.png" 10 10 sizes="96x96" 11 11 /> 12 - <link rel="icon" type="image/svg+xml" href="/public/favicon.svg" /> 13 12 <link rel="shortcut icon" href="/public/favicon.ico" /> 14 13 <link 15 14 rel="apple-touch-icon"
-1
public/item.html
··· 9 9 href="/public/favicon-96x96.png" 10 10 sizes="96x96" 11 11 /> 12 - <link rel="icon" type="image/svg+xml" href="/public/favicon.svg" /> 13 12 <link rel="shortcut icon" href="/public/favicon.ico" /> 14 13 <link 15 14 rel="apple-touch-icon"
public/og.jpg

This is a binary file and will not be displayed.

public/og.png

This is a binary file and will not be displayed.

+3 -3
public/site.webmanifest
··· 15 15 "purpose": "maskable" 16 16 } 17 17 ], 18 - "theme_color": "#ffffff", 19 - "background_color": "#ffffff", 18 + "theme_color": "#EF6100", 19 + "background_color": "#1A1A1A", 20 20 "display": "standalone" 21 - } 21 + }
+21
src/index.ts
··· 90 90 Sentry.captureException(err); 91 91 }); 92 92 93 + async function serveFile(filePath: string): Promise<Response> { 94 + const file = Bun.file(filePath); 95 + return new Response(await file.bytes(), { 96 + headers: { "Content-Type": file.type }, 97 + }); 98 + } 99 + 93 100 const server = Bun.serve({ 94 101 port: process.env.PORT || 3000, 95 102 reusePort: true, ··· 97 104 routes: { 98 105 "/": root, 99 106 "/item": item, 107 + // Static files 108 + "/public/favicon.ico": await serveFile("./public/favicon.ico"), 109 + "/public/favicon-96x96.png": await serveFile("./public/favicon-96x96.png"), 110 + "/public/apple-touch-icon.png": await serveFile( 111 + "./public/apple-touch-icon.png", 112 + ), 113 + "/public/site.webmanifest": await serveFile("./public/site.webmanifest"), 114 + "/public/web-app-manifest-192x192.png": await serveFile( 115 + "./public/web-app-manifest-192x192.png", 116 + ), 117 + "/public/web-app-manifest-512x512.png": await serveFile( 118 + "./public/web-app-manifest-512x512.png", 119 + ), 120 + "/public/og.png": await serveFile("./public/og.png"), 100 121 // Apply CORS to all API routes 101 122 "/api/story/:id": handleCORS(async (req) => { 102 123 try {