commit ce82f1b7fa07cc122fd29313d3f41b24b6d7dd90
parent 02545df562a0da24327e90ad33a6f26e7110055e
Author: I Mean I'm Just Saying <imeanimjustsaying@kiwifarms.st>
Date: Fri, 25 Sep 2026 21:27:08 -0400
homepage: the icons and favicon are rendered at build from the parent mark (brand S1)
The twin of the export routes, always ICON_PALETTES.archilyzer (bone on
slate). The committed public/icons/* and app/favicon.ico are gone; the layout
links ICON_METADATA, which adds icon-32.png. The OG image still names
/icons/icon-512.png.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Diffstat:
10 files changed, 40 insertions(+), 25 deletions(-)
diff --git a/homepage/app/favicon.ico b/homepage/app/favicon.ico
Binary files differ.
diff --git a/homepage/app/favicon.ico/route.ts b/homepage/app/favicon.ico/route.ts
@@ -0,0 +1,10 @@
+import { ICON_PALETTES } from "yt-dlp-transcript-common/lib/brand";
+import { iconResponse, renderFaviconIco } from "yt-dlp-transcript-common/lib/brandIcons";
+
+// /favicon.ico: the parent mark at 16/32/48 in one PNG-payload ICO. Static;
+// written to out/favicon.ico at build.
+export const dynamic = "force-static";
+
+export async function GET() {
+ return iconResponse(await renderFaviconIco(ICON_PALETTES.archilyzer), "image/x-icon");
+}
diff --git a/homepage/app/icons/[file]/route.ts b/homepage/app/icons/[file]/route.ts
@@ -0,0 +1,27 @@
+import { ICON_PALETTES } from "yt-dlp-transcript-common/lib/brand";
+import {
+ ICON_FILES,
+ iconResponse,
+ renderIconFile,
+} from "yt-dlp-transcript-common/lib/brandIcons";
+
+// /icons/<file>: the project site's icon set — the parent mark, achromatic
+// (bone on slate), rendered at build time from common/lib/brand.ts. The twin
+// of export/app/icons/[file]/route.ts; under `output: "export"` each listed
+// file lands at out/icons/<file>. The OG image names /icons/icon-512.png.
+export const dynamic = "force-static";
+export const dynamicParams = false;
+
+export function generateStaticParams() {
+ return ICON_FILES.map((f) => ({ file: f.file }));
+}
+
+export async function GET(
+ _req: Request,
+ { params }: { params: Promise<{ file: string }> },
+) {
+ const { file } = await params;
+ const out = await renderIconFile(file, ICON_PALETTES.archilyzer);
+ if (!out) return new Response("Not found", { status: 404 });
+ return iconResponse(out.body, out.contentType);
+}
diff --git a/homepage/app/layout.tsx b/homepage/app/layout.tsx
@@ -7,6 +7,7 @@ import {
PROJECT_TAGLINE,
PROJECT_URL,
} from "yt-dlp-transcript-common/lib/project";
+import { ICON_METADATA } from "yt-dlp-transcript-common/lib/brandIcons";
import Header from "./components/Header";
import Footer from "./components/Footer";
import "./globals.css";
@@ -31,14 +32,8 @@ export const metadata: Metadata = {
description:
"Archilyzer downloads a channel's back catalogue, transcribes it on your " +
"own machine, and builds a static, searchable site you host yourself.",
- icons: {
- icon: [
- { url: "/icons/icon.svg", type: "image/svg+xml" },
- { url: "/icons/icon-192.png", sizes: "192x192", type: "image/png" },
- { url: "/icons/icon-512.png", sizes: "512x512", type: "image/png" },
- ],
- apple: [{ url: "/icons/apple-touch-icon.png", sizes: "180x180" }],
- },
+ // Rendered at build by app/icons/[file]/route.ts — the parent mark.
+ icons: ICON_METADATA,
openGraph: {
type: "website",
siteName: PROJECT_NAME,
diff --git a/homepage/public/icons/apple-touch-icon.png b/homepage/public/icons/apple-touch-icon.png
Binary files differ.
diff --git a/homepage/public/icons/icon-192.png b/homepage/public/icons/icon-192.png
Binary files differ.
diff --git a/homepage/public/icons/icon-512.png b/homepage/public/icons/icon-512.png
Binary files differ.
diff --git a/homepage/public/icons/icon.svg b/homepage/public/icons/icon.svg
@@ -1,10 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="512" height="512" viewBox="0 0 512 512" role="img" aria-label="Archilyzer">
- <!-- The tool's mark, not an archive's. The export sites wear a brass diamond
- on warm black; this is a bone play head on graphite — the instrument that
- builds them, in the instrument family's palette (see tokens.css,
- [data-theme="archilyzer"]). The bar beneath is the transcript: the
- recording resolved into a line of text. -->
- <rect width="512" height="512" rx="96" fill="#151b20"/>
- <polygon points="188,132 372,236 188,340" fill="#e7edf1"/>
- <rect x="140" y="384" width="232" height="20" rx="4" fill="#8496a2"/>
-</svg>
diff --git a/homepage/public/icons/maskable-512.png b/homepage/public/icons/maskable-512.png
Binary files differ.
diff --git a/homepage/public/icons/maskable.svg b/homepage/public/icons/maskable.svg
@@ -1,7 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="512" height="512" viewBox="0 0 512 512" role="img" aria-label="Archilyzer">
- <!-- Maskable variant: same mark, pulled into the safe zone (the inner 80%
- circle) because a launcher may crop this to any shape. -->
- <rect width="512" height="512" fill="#151b20"/>
- <polygon points="206,164 350,246 206,328" fill="#e7edf1"/>
- <rect x="176" y="356" width="160" height="16" rx="4" fill="#8496a2"/>
-</svg>