From 49c7243fd7da000a503820f6d7ee15f146080ba3 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Thu, 1 Jan 2026 19:04:10 +0000
Subject: [PATCH 1/7] Initial plan
From 702fa6022f4bd8ee17cbacb3280b68eba9034890 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Thu, 1 Jan 2026 19:12:33 +0000
Subject: [PATCH 2/7] Add comprehensive SEO optimization with metadata,
structured data, and files
Co-authored-by: DevSecNinja <14926452+DevSecNinja@users.noreply.github.com>
---
frontend/app/layout.tsx | 77 ++++++++++++++++++++++++++++--
frontend/app/page.tsx | 80 ++++++++++++++++++++++++++++----
frontend/public/robots.txt | 6 +++
frontend/public/site.webmanifest | 29 ++++++++++++
frontend/public/sitemap.xml | 12 +++++
5 files changed, 193 insertions(+), 11 deletions(-)
create mode 100644 frontend/public/robots.txt
create mode 100644 frontend/public/site.webmanifest
create mode 100644 frontend/public/sitemap.xml
diff --git a/frontend/app/layout.tsx b/frontend/app/layout.tsx
index 08f7a0b..fefe302 100644
--- a/frontend/app/layout.tsx
+++ b/frontend/app/layout.tsx
@@ -1,10 +1,75 @@
-import type { Metadata } from "next";
+import type { Metadata, Viewport } from "next";
import "./globals.css";
export const metadata: Metadata = {
- title: "hadiscover - Discover Home Assistant Automations",
+ title: "hadiscover - Discover Home Assistant Automations from the Community",
description:
- "Search and explore powerful Home Assistant automations from the community. Find triggers, actions, and blueprints shared on GitHub.",
+ "Search and explore powerful Home Assistant automations from the community. Find triggers, actions, and blueprints shared on GitHub. Discover real-world automation examples to enhance your smart home.",
+ keywords: [
+ "Home Assistant",
+ "automations",
+ "smart home",
+ "YAML",
+ "GitHub",
+ "home automation",
+ "triggers",
+ "blueprints",
+ "IoT",
+ "search engine",
+ ],
+ authors: [{ name: "DevSecNinja" }],
+ creator: "DevSecNinja",
+ publisher: "hadiscover",
+ metadataBase: new URL("https://hadiscover.com"),
+ alternates: {
+ canonical: "https://hadiscover.com",
+ },
+ openGraph: {
+ type: "website",
+ locale: "en_US",
+ url: "https://hadiscover.com",
+ title: "hadiscover - Discover Home Assistant Automations",
+ description:
+ "Search and explore powerful Home Assistant automations from the community. Find triggers, actions, and blueprints shared on GitHub.",
+ siteName: "hadiscover",
+ images: [
+ {
+ url: "/og-image.png",
+ width: 1200,
+ height: 630,
+ alt: "hadiscover - Home Assistant Automation Discovery",
+ },
+ ],
+ },
+ twitter: {
+ card: "summary_large_image",
+ title: "hadiscover - Discover Home Assistant Automations",
+ description:
+ "Search and explore powerful Home Assistant automations from the community. Find triggers, actions, and blueprints shared on GitHub.",
+ images: ["/og-image.png"],
+ creator: "@DevSecNinja",
+ },
+ robots: {
+ index: true,
+ follow: true,
+ googleBot: {
+ index: true,
+ follow: true,
+ "max-video-preview": -1,
+ "max-image-preview": "large",
+ "max-snippet": -1,
+ },
+ },
+};
+
+export const viewport: Viewport = {
+ width: "device-width",
+ initialScale: 1,
+ maximumScale: 5,
+ themeColor: [
+ { media: "(prefers-color-scheme: light)", color: "#ffffff" },
+ { media: "(prefers-color-scheme: dark)", color: "#0a0a0f" },
+ ],
};
export default function RootLayout({
@@ -14,6 +79,12 @@ export default function RootLayout({
}>) {
return (
+
+
+
+
+
+
{children}
);
diff --git a/frontend/app/page.tsx b/frontend/app/page.tsx
index 0b2a913..1facc60 100644
--- a/frontend/app/page.tsx
+++ b/frontend/app/page.tsx
@@ -259,14 +259,77 @@ export default function Home() {
}
};
+ // JSON-LD structured data for SEO
+ const jsonLd = {
+ "@context": "https://schema.org",
+ "@type": "WebSite",
+ name: "hadiscover",
+ description:
+ "Search engine for discovering Home Assistant automations from the community",
+ url: "https://hadiscover.com",
+ potentialAction: {
+ "@type": "SearchAction",
+ target: {
+ "@type": "EntryPoint",
+ urlTemplate: "https://hadiscover.com/?q={search_term_string}",
+ },
+ "query-input": "required name=search_term_string",
+ },
+ provider: {
+ "@type": "Organization",
+ name: "DevSecNinja",
+ url: "https://github.com/DevSecNinja",
+ },
+ };
+
+ const organizationJsonLd = {
+ "@context": "https://schema.org",
+ "@type": "SoftwareApplication",
+ name: "hadiscover",
+ applicationCategory: "SearchApplication",
+ operatingSystem: "Web",
+ offers: {
+ "@type": "Offer",
+ price: "0",
+ priceCurrency: "USD",
+ },
+ description:
+ "Search and explore powerful Home Assistant automations from the community. Find triggers, actions, and blueprints shared on GitHub.",
+ url: "https://hadiscover.com",
+ author: {
+ "@type": "Person",
+ name: "DevSecNinja",
+ url: "https://github.com/DevSecNinja",
+ },
+ aggregateRating: statistics
+ ? {
+ "@type": "AggregateRating",
+ ratingValue: "5",
+ ratingCount: statistics.repo_star_count.toString(),
+ bestRating: "5",
+ worstRating: "1",
+ }
+ : undefined,
+ };
+
return (
-
- {/* Theme Toggle Button */}
+ <>
+ {/* JSON-LD Structured Data */}
+
+
+
+ {/* Theme Toggle Button */}
-
+
+ >
);
}
diff --git a/frontend/public/robots.txt b/frontend/public/robots.txt
new file mode 100644
index 0000000..e98b7b5
--- /dev/null
+++ b/frontend/public/robots.txt
@@ -0,0 +1,6 @@
+# https://www.robotstxt.org/robotstxt.html
+User-agent: *
+Allow: /
+
+# Sitemap
+Sitemap: https://hadiscover.com/sitemap.xml
diff --git a/frontend/public/site.webmanifest b/frontend/public/site.webmanifest
new file mode 100644
index 0000000..c0c5e00
--- /dev/null
+++ b/frontend/public/site.webmanifest
@@ -0,0 +1,29 @@
+{
+ "name": "hadiscover - Home Assistant Automation Discovery",
+ "short_name": "hadiscover",
+ "description": "Search and discover Home Assistant automations from the community",
+ "start_url": "/",
+ "display": "standalone",
+ "background_color": "#0a0a0f",
+ "theme_color": "#0a0a0f",
+ "orientation": "portrait-primary",
+ "icons": [
+ {
+ "src": "/favicon.ico",
+ "sizes": "any",
+ "type": "image/x-icon"
+ },
+ {
+ "src": "/icon-192.png",
+ "sizes": "192x192",
+ "type": "image/png",
+ "purpose": "any maskable"
+ },
+ {
+ "src": "/icon-512.png",
+ "sizes": "512x512",
+ "type": "image/png",
+ "purpose": "any maskable"
+ }
+ ]
+}
diff --git a/frontend/public/sitemap.xml b/frontend/public/sitemap.xml
new file mode 100644
index 0000000..ad9c183
--- /dev/null
+++ b/frontend/public/sitemap.xml
@@ -0,0 +1,12 @@
+
+
+
+ https://hadiscover.com/
+ 2026-01-01
+ daily
+ 1.0
+
+
From b376390c9c182f96d78fd95d8b2cc58e2aa1fc69 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Thu, 1 Jan 2026 19:17:50 +0000
Subject: [PATCH 3/7] Fix code review issues: Remove references to non-existent
image files
Co-authored-by: DevSecNinja <14926452+DevSecNinja@users.noreply.github.com>
---
frontend/app/layout.tsx | 26 ++++++++++++++------------
frontend/public/site.webmanifest | 12 ------------
frontend/public/sitemap.xml | 2 +-
3 files changed, 15 insertions(+), 25 deletions(-)
diff --git a/frontend/app/layout.tsx b/frontend/app/layout.tsx
index fefe302..63d1ec0 100644
--- a/frontend/app/layout.tsx
+++ b/frontend/app/layout.tsx
@@ -32,21 +32,23 @@ export const metadata: Metadata = {
description:
"Search and explore powerful Home Assistant automations from the community. Find triggers, actions, and blueprints shared on GitHub.",
siteName: "hadiscover",
- images: [
- {
- url: "/og-image.png",
- width: 1200,
- height: 630,
- alt: "hadiscover - Home Assistant Automation Discovery",
- },
- ],
+ // Note: Add og-image.png to public directory for social media previews
+ // images: [
+ // {
+ // url: "/og-image.png",
+ // width: 1200,
+ // height: 630,
+ // alt: "hadiscover - Home Assistant Automation Discovery",
+ // },
+ // ],
},
twitter: {
card: "summary_large_image",
title: "hadiscover - Discover Home Assistant Automations",
description:
"Search and explore powerful Home Assistant automations from the community. Find triggers, actions, and blueprints shared on GitHub.",
- images: ["/og-image.png"],
+ // Note: Add og-image.png to public directory for Twitter card images
+ // images: ["/og-image.png"],
creator: "@DevSecNinja",
},
robots: {
@@ -80,10 +82,10 @@ export default function RootLayout({
return (
-
-
+ {/* Next.js automatically handles favicon.ico from app directory */}
+ {/* Note: Add apple-touch-icon.png to public directory for iOS devices */}
+ {/* */}
-
{children}
diff --git a/frontend/public/site.webmanifest b/frontend/public/site.webmanifest
index c0c5e00..1392a3a 100644
--- a/frontend/public/site.webmanifest
+++ b/frontend/public/site.webmanifest
@@ -12,18 +12,6 @@
"src": "/favicon.ico",
"sizes": "any",
"type": "image/x-icon"
- },
- {
- "src": "/icon-192.png",
- "sizes": "192x192",
- "type": "image/png",
- "purpose": "any maskable"
- },
- {
- "src": "/icon-512.png",
- "sizes": "512x512",
- "type": "image/png",
- "purpose": "any maskable"
}
]
}
diff --git a/frontend/public/sitemap.xml b/frontend/public/sitemap.xml
index ad9c183..f63bc5e 100644
--- a/frontend/public/sitemap.xml
+++ b/frontend/public/sitemap.xml
@@ -5,7 +5,7 @@
http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">
https://hadiscover.com/
- 2026-01-01
+ 2024-12-01
daily
1.0
From be52a4d63f4cf9e32e257f6f2c87886eb468948f Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Thu, 1 Jan 2026 19:19:39 +0000
Subject: [PATCH 4/7] Remove misleading aggregateRating and add sitemap update
note
Co-authored-by: DevSecNinja <14926452+DevSecNinja@users.noreply.github.com>
---
frontend/app/page.tsx | 9 ---------
frontend/public/sitemap.xml | 1 +
2 files changed, 1 insertion(+), 9 deletions(-)
diff --git a/frontend/app/page.tsx b/frontend/app/page.tsx
index 1facc60..0be29a4 100644
--- a/frontend/app/page.tsx
+++ b/frontend/app/page.tsx
@@ -301,15 +301,6 @@ export default function Home() {
name: "DevSecNinja",
url: "https://github.com/DevSecNinja",
},
- aggregateRating: statistics
- ? {
- "@type": "AggregateRating",
- ratingValue: "5",
- ratingCount: statistics.repo_star_count.toString(),
- bestRating: "5",
- worstRating: "1",
- }
- : undefined,
};
return (
diff --git a/frontend/public/sitemap.xml b/frontend/public/sitemap.xml
index f63bc5e..e6320e5 100644
--- a/frontend/public/sitemap.xml
+++ b/frontend/public/sitemap.xml
@@ -1,4 +1,5 @@
+
Date: Thu, 1 Jan 2026 21:03:26 +0100
Subject: [PATCH 6/7] Update frontend/app/page.tsx
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
---
frontend/app/page.tsx | 11 ++---------
1 file changed, 2 insertions(+), 9 deletions(-)
diff --git a/frontend/app/page.tsx b/frontend/app/page.tsx
index 27d51bf..5fb308f 100644
--- a/frontend/app/page.tsx
+++ b/frontend/app/page.tsx
@@ -305,15 +305,8 @@ export default function Home() {
return (
<>
- {/* JSON-LD Structured Data */}
-
-
+ {/* JSON-LD structured data is now intended to be rendered from a server component
+ (e.g., layout.tsx) to ensure it is included in the initial HTML response. */}
Date: Thu, 1 Jan 2026 20:07:08 +0000
Subject: [PATCH 7/7] Move manifest link to metadata object and remove manual
head element
Co-authored-by: DevSecNinja <14926452+DevSecNinja@users.noreply.github.com>
---
frontend/app/layout.tsx | 7 +------
1 file changed, 1 insertion(+), 6 deletions(-)
diff --git a/frontend/app/layout.tsx b/frontend/app/layout.tsx
index 63d1ec0..d9ef4cc 100644
--- a/frontend/app/layout.tsx
+++ b/frontend/app/layout.tsx
@@ -62,6 +62,7 @@ export const metadata: Metadata = {
"max-snippet": -1,
},
},
+ manifest: "/site.webmanifest",
};
export const viewport: Viewport = {
@@ -81,12 +82,6 @@ export default function RootLayout({
}>) {
return (
-
- {/* Next.js automatically handles favicon.ico from app directory */}
- {/* Note: Add apple-touch-icon.png to public directory for iOS devices */}
- {/* */}
-
-
{children}
);