Files
oh-my-opencode/web/app/layout.tsx
T
YeonGyu-Kim 98242ba64f docs(i18n+web): align translated READMEs and landing copy with v4.1.1 hook count
Sweep the same '25+ hooks' / '50+ hooks' drift that lingered in the localized
READMEs and the marketing site after the user-facing docs refresh:

- README.ja.md / README.ko.md / README.zh-cn.md / README.ru.md:
  '25+ built-in hooks' to '54+ lifecycle hooks (61 with Team Mode)'.

- web/app/layout.tsx + web/app/_components/landing-page.tsx:
  SEO description, OG description, Twitter description, JSON-LD description,
  and HeroStats injected count: '50+ lifecycle hooks' to '54+ lifecycle hooks'.

Matches the canonical hook composition in src/plugin/hooks/ (24 Session +
16 ToolGuard + 5 Transform + 7 Continuation + 2 Skill = 54 base; +7 with
team_mode.enabled = 61 total).
2026-05-14 13:00:52 +09:00

114 lines
3.4 KiB
TypeScript

import type { Metadata } from "next"
import { GeistSans } from "geist/font/sans"
import { GeistMono } from "geist/font/mono"
import Script from "next/script"
import "./globals.css"
const primarySiteUrl = "https://ohmyopenagent.com"
export const metadata: Metadata = {
metadataBase: new URL(primarySiteUrl),
title: {
default: "Oh My OpenAgent — The Best Agent Harness",
template: "%s | Oh My OpenAgent",
},
description:
"Meet Sisyphus: The batteries-included agent that codes like you. Multi-model orchestration, Team Mode, background agents, 54+ lifecycle hooks.",
keywords: [
"opencode",
"oh-my-opencode",
"openagent",
"oh-my-openagent",
"ai agent",
"code agent",
"sisyphus",
"multi-model",
"team mode",
"agent orchestration",
"claude",
"gpt",
"gemini",
"coding assistant",
],
authors: [{ name: "Yeongyu Kim", url: "https://github.com/code-yeongyu" }],
creator: "Yeongyu Kim",
openGraph: {
type: "website",
locale: "en_US",
url: primarySiteUrl,
siteName: "Oh My OpenAgent",
title: "Oh My OpenAgent — The Best Agent Harness",
description:
"Meet Sisyphus: The batteries-included agent that codes like you. Multi-model orchestration, Team Mode, background agents, 54+ lifecycle hooks.",
images: [{ url: "/images/hero.webp", width: 1024, height: 683, alt: "Oh My OpenAgent" }],
},
twitter: {
card: "summary_large_image",
title: "Oh My OpenAgent — The Best Agent Harness",
description: "Meet Sisyphus: The batteries-included agent that codes like you.",
images: ["/images/hero.webp"],
},
robots: {
index: true,
follow: true,
googleBot: {
index: true,
follow: true,
},
},
}
const jsonLd = {
"@context": "https://schema.org",
"@type": "SoftwareApplication",
name: "Oh My OpenAgent",
applicationCategory: "DeveloperApplication",
operatingSystem: "macOS, Linux, Windows",
url: primarySiteUrl,
author: {
"@type": "Person",
name: "Yeongyu Kim",
url: "https://github.com/code-yeongyu",
},
description:
"The batteries-included agent harness for OpenCode. Multi-model orchestration, Team Mode, background agents, 54+ lifecycle hooks.",
offers: {
"@type": "Offer",
price: "0",
priceCurrency: "USD",
},
}
const gaMeasurementId = "G-S0QJFKT46Q"
const gaTrackedDomain = "ohmyopenagent.com"
export default function RootLayout({ children }: { children: React.ReactNode }) {
return (
<html
lang="en"
className={`dark ${GeistSans.variable} ${GeistMono.variable}`}
suppressHydrationWarning
>
<body className="flex min-h-screen flex-col bg-[#0a0a0a] text-[#ededed] antialiased">
<Script id="google-analytics-loader" strategy="lazyOnload">
{`if (typeof window !== 'undefined' && window.location.hostname === '${gaTrackedDomain}') {
var s = document.createElement('script');
s.async = true;
s.src = 'https://www.googletagmanager.com/gtag/js?id=${gaMeasurementId}';
document.head.appendChild(s);
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', '${gaMeasurementId}', { cookie_domain: '${gaTrackedDomain}' });
}`}
</Script>
<script
type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd) }}
/>
{children}
</body>
</html>
)
}