Files
zeekay 6c65e3e941 @hanzo/app 0.2.0: the app SDK, renamed from @hanzo/rooms
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.
2026-10-22 19:07:20 -07:00

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>
</>
)
}