Share cards per piece
A piece with no image of its own still unfurls as the site wordmark.
/opengraph-image generates the Orbitron card for the whole site. A piece
with an image in its frontmatter already overrides it.
The gap is pieces without one: a [slug]/opengraph-image.tsx could render
the title onto the card so a shared link shows what it actually is.
Built
Every page renders its own card: a small blue wordmark as a kicker, the page's
title taking the space, scofti.com in the corner. Title type steps down as the
title gets longer, because satori neither reflows nor truncates — a title that
does not fit simply runs off the edge, where nobody looking at this site would
ever see it.
One generator in src/lib/share-card.tsx, used by all six routes, so the cards
cannot drift into six different designs. Entries, Model Behavior articles and
tickets take their title from the file; the three index pages pass their own.
A piece with a lead image still wins with that image.
The part that nearly shipped broken: every page already set
images: ["/opengraph-image"] in its metadata, and an explicit value beats
Next's colocated opengraph-image.tsx. The cards would have been generated on
every route and used by none of them, while every link went on unfurling as the
bare wordmark. Nothing would have failed — the build passes either way, and
check:meta reads og:url and og:title, not og:image. It was only caught
by reading the rendered og:image out of the built HTML.
So the fallback is gone and the field is now left unset on purpose, with a note
in entry-meta.ts saying why, because naming it there looks like the careful
thing to do and is the one thing that breaks this.