diff --git a/frontend/app/layout.tsx b/frontend/app/layout.tsx
index fe24ccbf..c18cfc24 100644
--- a/frontend/app/layout.tsx
+++ b/frontend/app/layout.tsx
@@ -18,10 +18,47 @@ const jetbrainsMono = JetBrains_Mono({
});
export const metadata: Metadata = {
- title: "PolyWeather | Weather Intelligence",
+ title: {
+ default: "PolyWeather | Institutional Weather Signal Intelligence",
+ template: "%s | PolyWeather",
+ },
description:
- "PolyWeather paid professional terminal for weather-signal intelligence, city decision cards, and subscription-only analytics.",
+ "PolyWeather is a paid professional weather-signal intelligence terminal with METAR evidence, DEB forecast blending, and AI decision cards. Real-time observations for 51 global cities.",
manifest: "/site.webmanifest",
+ metadataBase: new URL("https://polyweather.top"),
+ alternates: {
+ canonical: "/",
+ },
+ openGraph: {
+ type: "website",
+ siteName: "PolyWeather",
+ title: "PolyWeather | Institutional Weather Signal Intelligence",
+ description:
+ "Paid professional weather-signal intelligence terminal. METAR evidence, DEB forecast blending, AI decision cards. 51 cities, real-time.",
+ url: "https://polyweather.top",
+ images: [
+ {
+ url: "/apple-touch-icon.png",
+ width: 180,
+ height: 180,
+ alt: "PolyWeather",
+ },
+ ],
+ },
+ twitter: {
+ card: "summary",
+ title: "PolyWeather | Weather Signal Intelligence",
+ description:
+ "Paid professional weather-signal intelligence terminal. 51 cities, real-time observations.",
+ images: ["/apple-touch-icon.png"],
+ },
+ robots: {
+ index: true,
+ follow: true,
+ "max-video-preview": -1,
+ "max-image-preview": "large",
+ "max-snippet": -1,
+ },
icons: {
icon: [
{ url: "/favicon.ico", type: "image/x-icon" },
diff --git a/frontend/app/page.tsx b/frontend/app/page.tsx
index f890c2bf..3ea56d6a 100644
--- a/frontend/app/page.tsx
+++ b/frontend/app/page.tsx
@@ -33,8 +33,29 @@ export default async function HomePage({
const qs = usp.toString();
redirect(`/auth/callback${qs ? `?${qs}` : ""}`);
}
+ const jsonLd = {
+ "@context": "https://schema.org",
+ "@type": "WebApplication",
+ name: "PolyWeather",
+ description:
+ "Paid professional weather-signal intelligence terminal with METAR evidence, DEB forecast blending, and AI decision cards.",
+ url: "https://polyweather.top",
+ applicationCategory: "BusinessApplication",
+ operatingSystem: "Web",
+ offers: {
+ "@type": "Offer",
+ price: "10.00",
+ priceCurrency: "USD",
+ description: "Monthly subscription",
+ },
+ };
+
return (
<>
+
>
diff --git a/frontend/app/robots.ts b/frontend/app/robots.ts
new file mode 100644
index 00000000..2e82707f
--- /dev/null
+++ b/frontend/app/robots.ts
@@ -0,0 +1,14 @@
+import type { MetadataRoute } from "next";
+
+export default function robots(): MetadataRoute.Robots {
+ return {
+ rules: [
+ {
+ userAgent: "*",
+ allow: "/",
+ disallow: ["/terminal/", "/account/", "/ops/", "/api/"],
+ },
+ ],
+ sitemap: "https://polyweather.top/sitemap.xml",
+ };
+}
diff --git a/frontend/app/sitemap.ts b/frontend/app/sitemap.ts
new file mode 100644
index 00000000..4fef5c14
--- /dev/null
+++ b/frontend/app/sitemap.ts
@@ -0,0 +1,20 @@
+import type { MetadataRoute } from "next";
+
+export default function sitemap(): MetadataRoute.Sitemap {
+ const baseUrl = "https://polyweather.top";
+
+ return [
+ {
+ url: baseUrl,
+ lastModified: new Date(),
+ changeFrequency: "weekly",
+ priority: 1.0,
+ },
+ {
+ url: `${baseUrl}/auth/login`,
+ lastModified: new Date(),
+ changeFrequency: "monthly",
+ priority: 0.6,
+ },
+ ];
+}