import type { Metadata, Viewport } from "next"; import { GeistSans } from "geist/font/sans"; import { GeistMono } from "geist/font/mono"; import { ThemeProvider } from "next-themes"; import { APP_URL } from "@/lib/env"; import { Toaster } from "@/components/ui/toast"; import { TooltipProvider } from "@/components/ui/tooltip"; import "./globals.css"; export const metadata: Metadata = { metadataBase: new URL(APP_URL), title: { default: "PolyLLM โ€” One interface. Every model.", template: "%s ยท PolyLLM" }, description: "PolyLLM is a universal control center for AI models. Bring your own API keys for OpenAI, Anthropic, Google Gemini, xAI, Mistral, DeepSeek, Kimi, OpenRouter and Cerebras, discover the latest models, configure them precisely and chat through one premium interface.", applicationName: "PolyLLM", keywords: ["LLM", "AI chat", "BYOK", "OpenAI", "Anthropic", "Gemini", "xAI", "Grok", "Claude", "GPT", "model comparison", "arena"], openGraph: { type: "website", siteName: "PolyLLM", title: "PolyLLM โ€” One interface. Every model.", description: "Bring your own keys. Compare models. Control every parameter. Track every token. Your models. Your keys. One workspace.", locale: "en_US", url: APP_URL, images: [{ url: "/og.png", width: 1200, height: 630, alt: "PolyLLM" }], }, twitter: { card: "summary_large_image", title: "PolyLLM โ€” One interface. Every model.", description: "Bring your own keys. Compare models. Control every parameter. Track every token.", images: ["/og.png"] }, authors: [{ name: "Simon-Pierre Boucher", url: "https://www.maclustr.io" }], creator: "Simon-Pierre Boucher", icons: { icon: [ { url: "/icon.svg", type: "image/svg+xml" }, { url: "/favicon-32.png", sizes: "32x32", type: "image/png" }, { url: "/favicon-16.png", sizes: "16x16", type: "image/png" }, ], shortcut: "/favicon.ico", apple: [{ url: "/apple-icon.png", sizes: "180x180" }], }, manifest: "/manifest.webmanifest", appleWebApp: { capable: true, title: "PolyLLM", statusBarStyle: "black-translucent" }, formatDetection: { telephone: false }, robots: { index: true, follow: true }, }; export const viewport: Viewport = { themeColor: [ { media: "(prefers-color-scheme: light)", color: "#f7f7f5" }, { media: "(prefers-color-scheme: dark)", color: "#0b0c10" }, ], width: "device-width", initialScale: 1, viewportFit: "cover", // Let the browser resize the layout viewport when the keyboard opens (Chrome/Android); iOS uses visualViewport. interactiveWidget: "resizes-content", }; export default function RootLayout({ children }: { children: React.ReactNode }) { return ( {children} ); }