link cards: each page gets its own OpenGraph card from templates
link cards: each page of the app gets its own OpenGraph card, phrased by branding templates. A stream page is "<display name> is live on <site>" over the stream's post text (the streamer's display name comes from their indexed profile record, the handle when there is none; it used to say "@handle's livestream on <site title>"); a video page is "<name>'s video on <site>" over the video's title; the front page (live tab), /video (on demand) and /live (go live) each carry their own title and description instead of the generic site card. Keys: cardSiteName ({site} in the templates, so a "W Social" site can say "on W"), cardLiveTitle, cardHomeTitle/Description (default: the site's own), cardVideosTitle/Description, cardVideoTitle, cardGoLiveTitle/Description; placeholders {site}, {name}, {handle}. The three card generators now share one branding fetch and one tag builder; a Link cards block in the branding admin edits the templates. Verified on a scratch node with the client's bundle plus the templates: all five pages read as specified Claude-Session: https://claude.ai/code/session_014aPQ5yqG9QFxKnbwQfCYKa (cherry picked from commit 6040e5ace78a50c6dcd4728b9ec2f0d8c026b820)