Some checks failed
CI / Frontend Lint & Type Check (push) Has been cancelled
CI / Frontend Build (push) Has been cancelled
CI / Backend Lint (push) Has been cancelled
CI / Backend Tests (push) Has been cancelled
CI / Docker Build (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
Deploy / Build & Push Images (push) Has been cancelled
Deploy / Deploy to Server (push) Has been cancelled
Deploy / Notify (push) Has been cancelled
Fix brandables API NameError, switch Trend Surfer to a working Google Trends RSS endpoint, and harden the HUNT UI against failed requests. Also add sharp for Next.js standalone image optimization and remove PostHog script crossOrigin to reduce CORS breakage.
192 lines
7.3 KiB
TypeScript
192 lines
7.3 KiB
TypeScript
import './globals.css'
|
|
import { Inter } from 'next/font/google'
|
|
import type { Metadata, Viewport } from 'next'
|
|
import Script from 'next/script'
|
|
|
|
const inter = Inter({ subsets: ['latin'] })
|
|
|
|
const siteUrl = process.env.NEXT_PUBLIC_SITE_URL || 'https://pounce.ch'
|
|
const googleSiteVerification = process.env.NEXT_PUBLIC_GOOGLE_SITE_VERIFICATION
|
|
|
|
export const viewport: Viewport = {
|
|
width: 'device-width',
|
|
initialScale: 1,
|
|
themeColor: '#10b981',
|
|
}
|
|
|
|
export const metadata: Metadata = {
|
|
metadataBase: new URL(siteUrl),
|
|
title: {
|
|
default: 'Pounce - Domain Intelligence Platform | Find, Track & Trade Domains',
|
|
template: '%s | Pounce',
|
|
},
|
|
description: 'Domain intelligence for serious investors. Scan live auctions, track drops, compare TLD pricing, and manage portfolios with a clean market feed and verified listings.',
|
|
keywords: [
|
|
'domain intelligence',
|
|
'domain auctions',
|
|
'expired domains',
|
|
'domain investing',
|
|
'TLD pricing',
|
|
'domain drops',
|
|
'domain marketplace',
|
|
'domain monitoring',
|
|
'domain portfolio',
|
|
'domain valuation',
|
|
'premium domains',
|
|
'domain flipping',
|
|
'godaddy auctions',
|
|
'sedo marketplace',
|
|
'dropcatch',
|
|
'namejet',
|
|
'domain trading',
|
|
'buy domains',
|
|
'sell domains',
|
|
'domain price trends',
|
|
'.com domains',
|
|
'.io domains',
|
|
'.ai domains',
|
|
],
|
|
authors: [{ name: 'Pounce' }],
|
|
creator: 'Pounce',
|
|
publisher: 'Pounce',
|
|
formatDetection: {
|
|
email: false,
|
|
address: false,
|
|
telephone: false,
|
|
},
|
|
alternates: {
|
|
canonical: siteUrl,
|
|
languages: {
|
|
'en': siteUrl,
|
|
},
|
|
},
|
|
openGraph: {
|
|
type: 'website',
|
|
locale: 'en_US',
|
|
url: siteUrl,
|
|
siteName: 'Pounce',
|
|
title: 'Pounce - Domain Intelligence Platform | Find, Track & Trade Domains',
|
|
description: 'Domain intelligence for serious investors. Live auctions, TLD pricing intel, a clean market feed, and verified listings.',
|
|
images: [
|
|
{
|
|
url: `${siteUrl}/og-image.png`,
|
|
width: 1200,
|
|
height: 630,
|
|
alt: 'Pounce - Domain Intelligence Platform',
|
|
},
|
|
],
|
|
},
|
|
twitter: {
|
|
card: 'summary_large_image',
|
|
title: 'Pounce - Domain Intelligence Platform',
|
|
description: 'Domain intelligence for serious investors. Live auctions, TLD pricing intel, a clean market feed, and verified listings.',
|
|
creator: '@pouncedomains',
|
|
site: '@pouncedomains',
|
|
images: [`${siteUrl}/og-image.png`],
|
|
},
|
|
verification: googleSiteVerification ? { google: googleSiteVerification } : undefined,
|
|
robots: {
|
|
index: true,
|
|
follow: true,
|
|
googleBot: {
|
|
index: true,
|
|
follow: true,
|
|
'max-video-preview': -1,
|
|
'max-image-preview': 'large',
|
|
'max-snippet': -1,
|
|
},
|
|
},
|
|
icons: {
|
|
icon: [
|
|
{ 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' },
|
|
],
|
|
},
|
|
manifest: '/site.webmanifest',
|
|
}
|
|
|
|
export default function RootLayout({
|
|
children,
|
|
}: {
|
|
children: React.ReactNode
|
|
}) {
|
|
return (
|
|
<html lang="en" className="dark">
|
|
<head>
|
|
{/* Preconnect to external domains for performance */}
|
|
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossOrigin="anonymous" />
|
|
|
|
{/* Organization Schema */}
|
|
<Script
|
|
id="organization-schema"
|
|
type="application/ld+json"
|
|
dangerouslySetInnerHTML={{
|
|
__html: JSON.stringify({
|
|
'@context': 'https://schema.org',
|
|
'@type': 'Organization',
|
|
name: 'Pounce',
|
|
url: siteUrl,
|
|
logo: `${siteUrl}/pounce-logo.png`,
|
|
description: 'Domain intelligence platform for investors and traders',
|
|
sameAs: [
|
|
'https://twitter.com/pouncedomains',
|
|
'https://github.com/pounce',
|
|
],
|
|
contactPoint: {
|
|
'@type': 'ContactPoint',
|
|
email: 'hello@pounce.ch',
|
|
contactType: 'Customer Service',
|
|
},
|
|
}),
|
|
}}
|
|
/>
|
|
|
|
{/* WebSite Schema for Search Box */}
|
|
<Script
|
|
id="website-schema"
|
|
type="application/ld+json"
|
|
dangerouslySetInnerHTML={{
|
|
__html: JSON.stringify({
|
|
'@context': 'https://schema.org',
|
|
'@type': 'WebSite',
|
|
name: 'Pounce',
|
|
url: siteUrl,
|
|
potentialAction: {
|
|
'@type': 'SearchAction',
|
|
target: {
|
|
'@type': 'EntryPoint',
|
|
urlTemplate: `${siteUrl}/search?q={search_term_string}`,
|
|
},
|
|
'query-input': 'required name=search_term_string',
|
|
},
|
|
}),
|
|
}}
|
|
/>
|
|
|
|
{/* PostHog Analytics */}
|
|
<Script
|
|
id="posthog-init"
|
|
strategy="afterInteractive"
|
|
dangerouslySetInnerHTML={{
|
|
__html: `
|
|
!function(t,e){var o,n,p,r;e.__SV||(window.posthog && window.posthog.__loaded)||(window.posthog=e,e._i=[],e.init=function(i,s,a){function g(t,e){var o=e.split(".");2==o.length&&(t=t[o[0]],e=o[1]),t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}}(p=t.createElement("script")).type="text/javascript",p.async=!0,p.src=s.api_host.replace(".i.posthog.com","-assets.i.posthog.com")+"/static/array.js",(r=t.getElementsByTagName("script")[0]).parentNode.insertBefore(p,r);var u=e;for(void 0!==a?u=e[a]=[]:a="posthog",u.people=u.people||[],u.toString=function(t){var e="posthog";return"posthog"!==a&&(e+="."+a),t||(e+=" (stub)"),e},u.people.toString=function(){return u.toString(1)+".people (stub)"},o="init zr Wr fi Br Gr ci Nr Hr capture Ui calculateEventProperties Kr register register_once register_for_session unregister unregister_for_session Zr getFeatureFlag getFeatureFlagPayload isFeatureEnabled reloadFeatureFlags updateEarlyAccessFeatureEnrollment getEarlyAccessFeatures on onFeatureFlags onSurveysLoaded onSessionId getSurveys getActiveMatchingSurveys renderSurvey displaySurvey cancelPendingSurvey canRenderSurvey canRenderSurveyAsync identify setPersonProperties group resetGroups setPersonPropertiesForFlags resetPersonPropertiesForFlags setGroupPropertiesForFlags resetGroupPropertiesForFlags reset get_distinct_id getGroups get_session_id get_session_replay_url alias set_config startSessionRecording stopSessionRecording sessionRecordingStarted captureException loadToolbar get_property getSessionProperty Xr Jr createPersonProfile Qr jr ts opt_in_capturing opt_out_capturing has_opted_in_capturing has_opted_out_capturing get_explicit_consent_status is_capturing clear_opt_in_out_capturing Vr debug O Yr getPageViewId captureTraceFeedback captureTraceMetric Or".split(" "),n=0;n<o.length;n++)g(u,o[n]);e._i.push([i,s,a])},e.__SV=1)}(document,window.posthog||[]);
|
|
posthog.init('phc_J0Ac94FAcsmbFj0CWOAqo9tGGSE4i9F4LXXfnN796gN', {
|
|
api_host: 'https://eu.i.posthog.com',
|
|
defaults: '2025-11-30',
|
|
person_profiles: 'identified_only',
|
|
})
|
|
`,
|
|
}}
|
|
/>
|
|
</head>
|
|
<body className={inter.className} suppressHydrationWarning>
|
|
{children}
|
|
</body>
|
|
</html>
|
|
)
|
|
}
|