mirror of
https://github.com/hanzo-apps/hanzo.ai.git
synced 2026-10-30 14:58:08 +00:00
hanzo.ai has published NOTHING for a day. Not a rollout problem: `deploy.yml` runs `pnpm gates` before it uploads, four gates were red, and the job died at that step on every commit. The gate did its job — the site is only as good as what it refuses to ship — but what it was refusing was worth fixing, not routing around. 111 published pages served the ROOT LAYOUT'S TITLE verbatim: one string, "Hanzo — the AI cloud for agents and apps", on /kms and /learn and every one of the 31 blockchain pages. Indistinguishable in a tab, in a bookmark and in a search result — a whole site indexed under one name. Each now carries its own title and description, and both are the page's OWN words: the <h1> is the title and the first real paragraph AFTER it is the lede, so a tab, a search result and the page itself say the same thing. Nothing was invented; a page that could not say what it is got reported, not written for. 104 of them are `'use client'`, which cannot export metadata, so the metadata sits in a co-located layout.tsx — the shape the gate's own failure message prescribes. Seven forwarding shells left the index. /defi, /fintech and /sentry (the Sentinel rename, a trademark matter) and /status are pages only because a static export has no `redirects()`; each renders one sentence and a link. They were offered to crawlers as results with nothing to read, and being published at 21 chars dragged the thin-page floor down onto the entire /docs/* shelf — one cause, two red gates, which is why both go green on one change. Six pairs of pages shared a title. Three were children inheriting a parent's (/contact/sales, /products/integrations, every /solutions/* leaf); two were blockchain pages whose <h1> is a copy-paste while their ledes describe different products (defi-stack, web3-cloud); one was two integrations pages covering one subject from opposite directions — worth merging, and until then at least distinguishable. The lede is whole sentences and never a cut word. The first pass ended one description "across all major ch", because it only guarded the word boundary above 160 chars and cut at 157. 50 gates green, from 46.
17 lines
653 B
TypeScript
17 lines
653 B
TypeScript
import type { Metadata } from 'next'
|
|
import { pageMeta } from '@/lib/page-meta'
|
|
|
|
// The page is 'use client', which cannot export metadata — so its title and
|
|
// description live here, beside it. Both are the page's OWN words: the title is
|
|
// its <h1> and the description its lede, so a tab, a search result and the page
|
|
// itself say the same thing.
|
|
export const metadata: Metadata = pageMeta({
|
|
title: 'Hanzo Console',
|
|
description: 'Track every LLM call across your stack. Monitor costs, latency, quality, and token usage.',
|
|
path: '/console',
|
|
})
|
|
|
|
export default function Layout({ children }: { children: React.ReactNode }) {
|
|
return children
|
|
}
|