import type { Metadata, Viewport } from "next"; import { Inter, JetBrains_Mono } from "next/font/google"; import type { ReactNode } from "react"; import { CommandPalette } from "@/components/command-palette"; import { EventDrawerProvider } from "@/components/event-drawer"; import { Footer } from "@/components/footer"; import { MobileNav, TopNav } from "@/components/nav"; import { PrefsProvider } from "@/components/prefs"; import { Providers } from "@/components/theme"; import { SITE_URL } from "@/lib/api"; import "./globals.css"; const inter = Inter({ subsets: ["latin"], variable: "--font-inter", display: "swap" }); const mono = JetBrains_Mono({ subsets: ["latin"], variable: "--font-jetbrains", display: "swap" }); export const metadata: Metadata = { metadataBase: new URL(SITE_URL), title: { default: "WebSensor — The Web is changing. We are watching.", template: "%s · WebSensor" }, description: "WebSensor continuously watches the public web for meaningful changes, preserving evidence and connecting signals into real-world events.", applicationName: "WebSensor", authors: [{ name: "Simon-Pierre Boucher", url: "https://www.maclustr.io" }], creator: "Simon-Pierre Boucher", openGraph: { type: "website", siteName: "WebSensor", url: SITE_URL, title: "WebSensor — The Web is changing. We are watching.", description: "Real-time Internet change intelligence: what changed, where, when, whether it was silent, how important it is — with immutable evidence." }, twitter: { card: "summary_large_image", title: "WebSensor — The Web is changing. We are watching.", description: "Detect what changed. Know why it matters." }, alternates: { canonical: "/", types: { "application/rss+xml": `${SITE_URL}/api/v1/feed.rss` } }, robots: { index: true, follow: true }, }; export const viewport: Viewport = { themeColor: [{ media: "(prefers-color-scheme: dark)", color: "#0a0e15" }, { media: "(prefers-color-scheme: light)", color: "#f6f7fa" }], width: "device-width", initialScale: 1, viewportFit: "cover" }; export default function RootLayout({ children }: { children: ReactNode }) { return ( Skip to content
{children}