mirror of
https://github.com/hanzo-apps/hanzo.ai.git
synced 2026-10-29 07:20:43 +00:00
Every import, the catalog pin and the docs name @hanzo/app and github.com/hanzoai/app. lib/rooms.ts is lib/app.ts and components/rooms.tsx is components/app.tsx.
67 lines
2.3 KiB
TypeScript
67 lines
2.3 KiB
TypeScript
import type { Metadata } from 'next'
|
|
import { BOOT } from '@hanzo/app/lib/session'
|
|
import DevLanding from '@/components/dev/DevLanding'
|
|
import { ProductJsonLd } from '@/components/product/ProductJsonLd'
|
|
import { ogImages, twitterImages } from '@/lib/constants/og'
|
|
import { at } from '@/lib/product'
|
|
import { Door } from './_door'
|
|
import { AWAY } from './_away'
|
|
|
|
// Hanzo Dev. At the app ROOT beside /gen, /kai and /enso, so only the root
|
|
// layout wraps it and the page ships the shared site chrome itself — which is
|
|
// what a stranger and a crawler read. A signed-in reader is drawn the builder
|
|
// at this address and every path under it (./_door).
|
|
|
|
const TITLE = 'Hanzo Dev — the coding agent'
|
|
const DESCRIPTION =
|
|
'Autonomous AI coding agent for your terminal, IDE, and cloud. Reads code, fixes bugs, runs tests, and creates PRs. Open source.'
|
|
|
|
export const metadata: Metadata = {
|
|
title: TITLE,
|
|
description: DESCRIPTION,
|
|
alternates: { canonical: 'https://hanzo.ai/dev' },
|
|
openGraph: {
|
|
title: TITLE,
|
|
description: DESCRIPTION,
|
|
url: 'https://hanzo.ai/dev',
|
|
siteName: 'Hanzo',
|
|
type: 'website',
|
|
images: ogImages(TITLE),
|
|
},
|
|
twitter: { card: 'summary_large_image', title: TITLE, description: DESCRIPTION, images: twitterImages },
|
|
}
|
|
|
|
/**
|
|
* Dev's page for a stranger, the builder for a member. `AWAY` and `BOOT` are the
|
|
* landing's first children and run before the rest of it is parsed, so the page
|
|
* never paints at a reader on their way into the builder: AWAY for an address
|
|
* that is a place in it (./_away), BOOT for a live session.
|
|
*/
|
|
export default function DevRoutePage() {
|
|
const product = at('/dev')
|
|
return (
|
|
<>
|
|
{/* Dev is outside the ProductLanding kit, so it declares itself here.
|
|
Each feature is a clause of the page's own sentence. */}
|
|
{product && (
|
|
<ProductJsonLd
|
|
product={product}
|
|
path="/dev"
|
|
description={DESCRIPTION}
|
|
features={[
|
|
'A coding agent in the terminal, on the web, in the cloud and in Slack',
|
|
'Enso by default, through api.hanzo.ai',
|
|
'Kai decides each step',
|
|
'Linux, macOS and Windows',
|
|
]}
|
|
/>
|
|
)}
|
|
<Door>
|
|
<script dangerouslySetInnerHTML={{ __html: AWAY }} />
|
|
<script dangerouslySetInnerHTML={{ __html: BOOT }} />
|
|
<DevLanding />
|
|
</Door>
|
|
</>
|
|
)
|
|
}
|