Files
zeekay 1b6bcb6a5c The sitemap offers the career role pages, and not the mail bodies or /bot/details, which is /bot
Every public page shipped is offered, and every page offered is linked:
- The nine /careers/<slug> pages (04845090) came from a dynamic segment the
  sitemap's list of generated pages never named. They are offered now from
  the one list of slugs their route builds from, each with its own
  canonical, where the /careers layout's had named /careers.
- public/email/pool-party-launch.html shipped as a page. The bodies of the
  emails the site sends are MAIL in lib/publish: fetched, never indexed.
- /bot/details draws what /bot draws since e229ebc4, which also dropped the
  one link to it. hanzo.bot is rooted at it, so it stays, as an ALTERNATE
  whose canonical is /bot.
2026-10-15 07:41:51 -07:00

42 lines
1.1 KiB
TypeScript

import { notFound } from 'next/navigation'
import type { Metadata } from 'next'
import { careerSlugs, getJobOpening } from '@/lib/careers'
import { JobView } from './JobView'
export function generateStaticParams() {
return careerSlugs.map((slug) => ({ slug }))
}
export async function generateMetadata({
params,
}: {
params: Promise<{ slug: string }>
}): Promise<Metadata> {
const { slug } = await params
const job = getJobOpening(slug)
if (!job) return { title: 'Position Not Found — Hanzo Careers' }
const title = `${job.title} (${job.department}) — Hanzo Careers`
return {
title,
description: `${job.description} Join the Hanzo team building the open AI cloud.`,
// Its own address: the /careers layout's canonical would otherwise name /careers.
alternates: { canonical: `/careers/${job.id}` },
openGraph: {
title,
description: job.description,
type: 'article',
},
}
}
export default async function Page({
params,
}: {
params: Promise<{ slug: string }>
}) {
const { slug } = await params
const job = getJobOpening(slug)
if (!job) notFound()
return <JobView job={job} />
}