Files
zeekay 70349b34c7 beta: a post about one topic, with that topic's page and card
The share card offers Hanzo, the products and the betas the member asked
for, the rest under More by group. A topic picks the posts Shuffle offers,
the link (/beta/for/<topic>, tagged utm_content) and the card it unfurls
to: that page carries the topic's title, line and card, a canonical naming
itself and the one noindex (lib/publish SHARES), and sends a person on to
/beta with the query kept, so ref and the campaign land as before.

lib/hanzo/topics is the list, its words the site's and BETAS's own.
generate-og draws a card per topic from it, palette-quantized with sharp:
49 cards, 2.9 MB. The cards gate reads every card's rendered words.

Claude-Session: https://claude.ai/code/session_017vrVus6PPBgP5YRzKV1iqW
2026-10-26 12:03:39 -07:00

35 lines
1.3 KiB
TypeScript

import type { Metadata } from 'next'
import { notFound } from 'next/navigation'
import { pageMeta } from '@/lib/page-meta'
import { TOPICS, page, topic as find } from '@/lib/hanzo/topics'
import { Forward } from './forward'
/**
* /beta/for/<topic> — the address a member's post links to (components/beta/share.tsx).
*
* Its head is what a share unfurls to: the topic's title and line, its own card
* (lib/constants/og.ts), and a canonical naming itself, which is where Facebook
* and LinkedIn read the image from. A person is sent on to /beta with the link's
* query intact, so `ref` and the campaign tags land exactly as a link to /beta
* does. Withheld from the index by lib/publish (SHARES), never disallowed: a
* social crawler obeys robots.txt.
*/
export const dynamicParams = false
export function generateStaticParams() {
return TOPICS.map((t) => ({ topic: t.id }))
}
export async function generateMetadata({ params }: { params: Promise<{ topic: string }> }): Promise<Metadata> {
const t = find((await params).topic)
if (!t) notFound()
return pageMeta({ title: t.title, description: t.line, path: page(t.id) })
}
export default async function Page({ params }: { params: Promise<{ topic: string }> }) {
const t = find((await params).topic)
if (!t) notFound()
return <Forward id={t.id} />
}