Files
greywall-landing-page/app/layout.tsx
2026-03-19 17:10:44 -04:00

123 lines
3.9 KiB
TypeScript

import type { Metadata } from 'next'
import { Inter, Source_Serif_4 } from 'next/font/google'
import './globals.css'
const inter = Inter({
subsets: ['latin'],
display: 'swap',
variable: '--font-inter',
})
const sourceSerif = Source_Serif_4({
subsets: ['latin'],
display: 'swap',
variable: '--font-source-serif',
style: ['normal', 'italic'],
axes: ['opsz'],
})
export const metadata: Metadata = {
metadataBase: new URL('https://greywall.io'),
title: 'Greywall: Sandbox for AI Agents',
description:
'Container-free, default-deny sandboxing with real-time observability for AI agents on Linux and macOS. Five kernel-enforced security layers in one command. Open source.',
icons: {
icon: [
{ url: '/icon.svg', type: 'image/svg+xml' },
{ url: '/icon-dark-32x32.png', sizes: '32x32', type: 'image/png', media: '(prefers-color-scheme: dark)' },
{ url: '/icon-light-32x32.png', sizes: '32x32', type: 'image/png', media: '(prefers-color-scheme: light)' },
],
apple: '/apple-icon.png',
},
openGraph: {
title: 'Greywall: Sandbox for AI Agents',
description: 'Container-free, default-deny sandboxing with real-time observability for AI agents. Five kernel-enforced security layers in one command.',
url: 'https://greywall.io',
siteName: 'Greywall',
type: 'website',
images: [{ url: '/og-image.png', width: 1200, height: 630 }],
},
twitter: {
card: 'summary_large_image',
title: 'Greywall: Sandbox for AI Agents',
description: 'Container-free, default-deny sandboxing with real-time observability for AI agents. Five kernel-enforced security layers in one command.',
images: ['/og-image.png'],
},
alternates: {
canonical: 'https://greywall.io',
},
}
const jsonLd = {
'@context': 'https://schema.org',
'@graph': [
{
'@type': 'Organization',
'@id': 'https://greyhaven.co/#organization',
name: 'Greyhaven',
url: 'https://greyhaven.co',
logo: { '@type': 'ImageObject', url: 'https://greywall.io/icon.svg' },
sameAs: ['https://github.com/GreyhavenHQ'],
},
{
'@type': 'WebSite',
'@id': 'https://greywall.io/#website',
name: 'Greywall',
url: 'https://greywall.io',
publisher: { '@id': 'https://greyhaven.co/#organization' },
},
{
'@type': 'SoftwareApplication',
'@id': 'https://greywall.io/#software',
name: 'Greywall',
description:
'Container-free, default-deny sandboxing with real-time observability and dynamic controls for AI agents on Linux and macOS.',
applicationCategory: 'SecurityApplication',
operatingSystem: 'Linux, macOS',
url: 'https://greywall.io',
downloadUrl: 'https://github.com/GreyhavenHQ/greywall',
license: 'https://opensource.org/licenses/Apache-2.0',
offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' },
author: { '@id': 'https://greyhaven.co/#organization' },
featureList: [
'Filesystem isolation',
'Network isolation',
'Command blocking',
'Real-time violation monitoring',
'Learning mode',
'Syscall filtering',
'Dynamic allow/deny controls',
],
isAccessibleForFree: true,
},
{
'@type': 'SoftwareSourceCode',
name: 'Greywall',
codeRepository: 'https://github.com/GreyhavenHQ/greywall',
programmingLanguage: 'Go',
license: 'https://opensource.org/licenses/Apache-2.0',
targetProduct: { '@id': 'https://greywall.io/#software' },
},
],
}
export default function RootLayout({
children,
}: Readonly<{
children: React.ReactNode
}>) {
return (
<html lang="en" className={`dark ${inter.variable} ${sourceSerif.variable}`}>
<head>
<script
type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd) }}
/>
</head>
<body className="font-sans antialiased bg-background text-foreground">
{children}
</body>
</html>
)
}