diff --git a/web/Dockerfile b/web/Dockerfile
index 2fc3b063b..3b9002d24 100644
--- a/web/Dockerfile
+++ b/web/Dockerfile
@@ -49,8 +49,7 @@ ENV NEXT_TELEMETRY_DISABLED=1
RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 nextjs
-# TEMP: bypass build error due to empty public directory
-# COPY --from=builder /app/public ./public
+COPY --from=builder /app/public ./public
# Automatically leverage output traces to reduce image size
# https://nextjs.org/docs/advanced-features/output-file-tracing
diff --git a/web/public/logo-filterlists.png b/web/public/logo-filterlists.png
new file mode 100644
index 000000000..9df6e74d8
Binary files /dev/null and b/web/public/logo-filterlists.png differ
diff --git a/web/src/app/layout.tsx b/web/src/app/layout.tsx
index c880c2c2c..b0eb9be14 100644
--- a/web/src/app/layout.tsx
+++ b/web/src/app/layout.tsx
@@ -1,9 +1,9 @@
-import type { Metadata } from "next";
import { Geist, Geist_Mono } from "next/font/google";
import "./globals.css";
import { ThemeProvider } from "@/components/theme-provider";
import { Header } from "@/components/header";
import { Footer } from "@/components/footer";
+export { metadata } from "./metadata";
const geistSans = Geist({
variable: "--font-geist-sans",
@@ -15,12 +15,6 @@ const geistMono = Geist_Mono({
subsets: ["latin"],
});
-export const metadata: Metadata = {
- title: "FilterLists",
- description:
- "FilterLists is the independent, comprehensive directory of filter and host lists for advertisements, trackers, malware, and annoyances. By Collin M. Barrett.",
-};
-
export default function RootLayout({
children,
}: Readonly<{
diff --git a/web/src/app/metadata.ts b/web/src/app/metadata.ts
new file mode 100644
index 000000000..53af0fae5
--- /dev/null
+++ b/web/src/app/metadata.ts
@@ -0,0 +1,75 @@
+import type { Metadata } from "next";
+
+export const metadata: Metadata = {
+ title: "FilterLists",
+ description:
+ "FilterLists is the independent, comprehensive directory of filter and host lists for advertisements, trackers, malware, and annoyances. By Collin M. Barrett.",
+ keywords: [
+ "adblock",
+ "filter lists",
+ "blocklists",
+ "host lists",
+ "privacy",
+ "malware",
+ "tracker",
+ "adblock plus",
+ "ublock origin",
+ "adguard",
+ "internet explorer tpl",
+ "dns",
+ "content blocking",
+ "open source",
+ "collin barrett",
+ ],
+ authors: [{ name: "Collin M. Barrett", url: "https://collinmbarrett.com" }],
+ creator: "Collin M. Barrett",
+ publisher: "Collin M. Barrett",
+ metadataBase: new URL("https://filterlists.com"),
+ alternates: {
+ canonical: "https://filterlists.com/",
+ },
+ openGraph: {
+ title: "FilterLists",
+ description:
+ "The independent, comprehensive directory of filter and host lists for advertisements, trackers, malware, and annoyances.",
+ url: "https://filterlists.com/",
+ siteName: "FilterLists",
+ images: [
+ {
+ url: "/logo-filterlists.png",
+ width: 1200,
+ height: 280,
+ alt: "FilterLists logo",
+ },
+ ],
+ locale: "en_US",
+ type: "website",
+ },
+ twitter: {
+ card: "summary_large_image",
+ title: "FilterLists",
+ description:
+ "The independent, comprehensive directory of filter and host lists for advertisements, trackers, malware, and annoyances.",
+ images: [
+ {
+ url: "/logo-filterlists.png",
+ alt: "FilterLists logo",
+ },
+ ],
+ },
+ icons: {
+ icon: "/icon.svg",
+ },
+ applicationName: "FilterLists",
+ generator: "Next.js",
+ referrer: "no-referrer",
+ appleWebApp: {
+ capable: true,
+ title: "FilterLists",
+ statusBarStyle: "default",
+ },
+ abstract:
+ "FilterLists is a directory of filter and host lists for adblockers and privacy tools.",
+ category: "Internet",
+ classification: "Web Directory",
+};
diff --git a/web/src/components/header.tsx b/web/src/components/header.tsx
deleted file mode 100644
index f3ba092f4..000000000
--- a/web/src/components/header.tsx
+++ /dev/null
@@ -1,15 +0,0 @@
-import { ThemeToggle } from "./theme-toggle";
-
-export function Header() {
- return (
-
- );
-}
diff --git a/web/src/components/header/index.tsx b/web/src/components/header/index.tsx
new file mode 100644
index 000000000..9086cac56
--- /dev/null
+++ b/web/src/components/header/index.tsx
@@ -0,0 +1,32 @@
+import { ImageThemed } from "@/components/image-themed";
+import { ThemeToggle } from "../theme-toggle";
+import LogoLight from "./logo-filterlists-light.png";
+import logoDark from "./logo-filterlists-dark.png";
+import styles from "./logoHeader.module.css";
+
+export function Header() {
+ return (
+
+ );
+}
diff --git a/web/src/components/header/logo-filterlists-dark.png b/web/src/components/header/logo-filterlists-dark.png
new file mode 100644
index 000000000..599307dfd
Binary files /dev/null and b/web/src/components/header/logo-filterlists-dark.png differ
diff --git a/web/src/components/header/logo-filterlists-light.png b/web/src/components/header/logo-filterlists-light.png
new file mode 100644
index 000000000..9df6e74d8
Binary files /dev/null and b/web/src/components/header/logo-filterlists-light.png differ
diff --git a/web/src/components/header/logoHeader.module.css b/web/src/components/header/logoHeader.module.css
new file mode 100644
index 000000000..dc98a0ddd
--- /dev/null
+++ b/web/src/components/header/logoHeader.module.css
@@ -0,0 +1,6 @@
+@media (max-width: 640px) {
+ .logoHeader {
+ max-width: 222px;
+ max-height: 52px;
+ }
+}