← back to Dear Bubbe Nextjs
app/layout.tsx
254 lines
import type { Metadata, Viewport } from "next";
import { Geist, Geist_Mono } from "next/font/google";
import "./globals.css";
import { Providers } from "./providers";
const geistSans = Geist({
variable: "--font-geist-sans",
subsets: ["latin"],
});
const geistMono = Geist_Mono({
variable: "--font-geist-mono",
subsets: ["latin"],
});
export const viewport: Viewport = {
width: 'device-width',
initialScale: 1,
maximumScale: 1,
userScalable: false,
themeColor: '#667eea',
viewportFit: 'cover'
}
export const metadata: Metadata = {
title: "Dear Bubbe - Your Brutally Honest AI Jewish Grandma | Get Real Advice",
description: "Get brutally honest, no-filter advice from Dear Bubbe, your AI Jewish grandmother. Ask about relationships, career, life choices - get the truth with a side of guilt trips and Yiddish wisdom.",
keywords: [
"AI Jewish grandmother",
"brutally honest advice",
"Dear Bubbe",
"Yiddish wisdom",
"relationship advice",
"life coach",
"Jewish humor",
"AI chat",
"grandma advice",
"authentic advice",
"no filter advice",
"tough love",
"Jewish culture",
"bubbe chat"
],
authors: [{ name: "Dear Bubbe Team" }],
creator: "Dear Bubbe",
publisher: "Dear Bubbe",
robots: {
index: true,
follow: true,
googleBot: {
index: true,
follow: true,
'max-video-preview': -1,
'max-image-preview': 'large',
'max-snippet': -1,
},
},
openGraph: {
type: 'website',
locale: 'en_US',
url: 'https://bubbe.ai',
title: "Dear Bubbe - Your AI Jewish Grandma",
description: "Get brutally honest advice from your AI Jewish grandmother. No sugarcoating, just truth with Yiddish wisdom and guilt trips.",
siteName: "Dear Bubbe",
images: [
{
url: '/bubbe.png',
width: 1200,
height: 630,
alt: 'Dear Bubbe - AI Jewish Grandma',
type: 'image/png',
},
],
},
twitter: {
card: 'summary_large_image',
site: '@DearBubbe',
creator: '@DearBubbe',
title: "Dear Bubbe - Your Brutally Honest AI Jewish Grandma",
description: "Get real advice with no filter from your AI Jewish grandmother. Tough love, Yiddish wisdom, and guilt trips included.",
images: ['/bubbe.png'],
},
alternates: {
canonical: 'https://bubbe.ai',
},
category: 'Technology',
classification: 'AI Chat Application',
appleWebApp: {
capable: true,
statusBarStyle: 'default',
title: 'Dear Bubbe',
startupImage: [
{
url: '/apple-touch-icon.png',
media: '(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2)',
},
],
},
applicationName: "Dear Bubbe",
referrer: 'origin-when-cross-origin',
icons: {
icon: [
{ url: '/favicon.ico', sizes: 'any' },
{ url: '/favicon-16x16.png', sizes: '16x16', type: 'image/png' },
{ url: '/favicon-32x32.png', sizes: '32x32', type: 'image/png' }
],
apple: [
{ url: '/apple-touch-icon.png', sizes: '180x180', type: 'image/png' }
],
other: [
{ rel: 'android-chrome', url: '/android-chrome-192x192.png', sizes: '192x192' },
{ rel: 'android-chrome', url: '/android-chrome-512x512.png', sizes: '512x512' }
]
},
manifest: '/manifest.json',
};
// Structured Data JSON-LD
const structuredData = {
"@context": "https://schema.org",
"@graph": [
{
"@type": "WebApplication",
"@id": "https://bubbe.ai/#webapp",
"name": "Dear Bubbe",
"description": "AI Jewish Grandmother providing brutally honest life advice",
"url": "https://bubbe.ai",
"applicationCategory": "LifestyleApplication",
"operatingSystem": "Web Browser",
"offers": {
"@type": "Offer",
"price": "0",
"priceCurrency": "USD"
},
"creator": {
"@type": "Organization",
"name": "Dear Bubbe Team"
},
"sameAs": ["https://twitter.com/DearBubbe"]
},
{
"@type": "Organization",
"@id": "https://bubbe.ai/#organization",
"name": "Dear Bubbe",
"url": "https://bubbe.ai",
"logo": {
"@type": "ImageObject",
"url": "https://bubbe.ai/bubbe.png",
"width": 512,
"height": 512
},
"sameAs": ["https://twitter.com/DearBubbe"],
"contactPoint": {
"@type": "ContactPoint",
"contactType": "customer service",
"email": "support@bubbe.ai"
}
},
{
"@type": "WebSite",
"@id": "https://bubbe.ai/#website",
"url": "https://bubbe.ai",
"name": "Dear Bubbe",
"description": "Get brutally honest advice from your AI Jewish grandmother",
"inLanguage": "en-US",
"publisher": {
"@id": "https://bubbe.ai/#organization"
},
"potentialAction": {
"@type": "SearchAction",
"target": "https://bubbe.ai/?q={search_term_string}",
"query-input": "required name=search_term_string"
}
},
{
"@type": "Person",
"@id": "https://bubbe.ai/#bubbe",
"name": "Dear Bubbe",
"description": "AI Jewish Grandmother character providing life advice",
"knowsAbout": [
"Jewish Culture",
"Life Advice",
"Relationships",
"Family",
"Career Guidance",
"Yiddish Language",
"Traditional Values"
],
"memberOf": {
"@id": "https://bubbe.ai/#organization"
}
}
]
};
export default function RootLayout({
children,
}: Readonly<{
children: React.ReactNode;
}>) {
return (
<html lang="en" suppressHydrationWarning>
<head>
{/* Google Analytics */}
<script async src="https://www.googletagmanager.com/gtag/js?id=G-C754K84WQP"></script>
<script
dangerouslySetInnerHTML={{
__html: `
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-C754K84WQP', {
page_title: 'Dear Bubbe - AI Jewish Grandma',
send_page_view: true,
anonymize_ip: true
});
`,
}}
/>
{/* Structured Data */}
<script
type="application/ld+json"
dangerouslySetInnerHTML={{
__html: JSON.stringify(structuredData),
}}
/>
{/* Additional SEO Meta Tags */}
<meta name="language" content="English" />
<meta name="revisit-after" content="7 days" />
<meta name="distribution" content="global" />
<meta name="rating" content="general" />
<meta name="mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="default" />
{/* Preconnect for Performance */}
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossOrigin="anonymous" />
<link rel="preconnect" href="https://www.googletagmanager.com" />
{/* DNS Prefetch */}
<link rel="dns-prefetch" href="https://www.google-analytics.com" />
</head>
<body
className={`${geistSans.variable} ${geistMono.variable} antialiased`}
suppressHydrationWarning
>
<Providers>{children}</Providers>
</body>
</html>
);
}