Files
buzz/previews/invite-video
klopez4212 773849665e Serve video and poster previews for invite links (#9306)
Invite links currently return HTML without preview metadata. Add
server-rendered `og:video` and `og:image` tags for `/invite/<code>`, and
bundle the approved MP4 and wordmark-only poster from #9282 into the
relay image. Media URLs use the request’s resolved community host, with
only TLS posture from `RELAY_URL`. Unknown hosts and lookup failures
receive no metadata; previews stay generic and never redeem invites.

Validation: production web build, workspace Clippy, 52 router tests
(including real HTTP and MP4 range requests), metadata tests, and
independent agent review pass. `just ci` stops at unrelated mobile
dependency/format checks. The full relay suite was attempted but stopped
during database-dependent tests without local infrastructure. Broad
local Rust/desktop hooks were stopped for disk pressure; desktop/mobile
hooks also lack dependencies and were skipped to publish this draft.
Full-stack and native Messages playback remain unverified. The new
preview regressions run in both CI test-runner paths.

Rollout: merge and deploy the resulting relay image with its web bundle,
verify the invite HTML and both public media URLs, then share a fresh
invite in Messages. Full-stack and human validation remain outstanding.

---------

Signed-off-by: kenny lopez <klopez4212@gmail.com>
Co-authored-by: Terp <5856f6900e8e0a4e0ea1f4f8d2ee33e4753d2119bc122f94ecafc660b46c0511@buzz.block.builderlab.xyz>
2026-11-09 23:12:34 +00:00
..

Invite preview media

A 16-second silent Buzz animation and wordmark-only PNG fallback, with a browser tool for reviewing motion and choosing poster frames. The animation uses the onboarding wordmark and fuzzy shader, pale-blue/lime bees, diagonal paired flights and a solo loop-de-loop.

Preview

From the repository root:

python3 -m http.server 4319 --bind 127.0.0.1 --directory previews/invite-video

Open http://127.0.0.1:4319. Scrub or choose a suggested frame, then select Use this frame. Poster choices persist only in that browser; Download poster PNG exports the choice. The committed poster is the approved wordmark-only frame at 0 seconds. The iMessage-style card is a composition simulation, not evidence of a native Messages unfurl.

Media

  • buzz-invite-loop.mp4: 960 × 540, 30 fps, H.264/yuv420p, fast-start, no audio.
  • buzz-invite-poster.png: 960 × 540, wordmark only.
  • buzz-wordmark.png and wordmark.frag: onboarding artwork and 400 ms grain/displacement shader, from the Buzz desktop onboarding implementation; bee silhouette matches the mobile welcome artwork.
  • Background: #D7D72E; bees: #D7E7F5 and #DBFA52.

Verify or regenerate

Activate the repository's Hermit environment first. Install Chrome, Python 3, and ffmpeg. Then:

cd previews/invite-video
npm ci
npm test
npm run render

Verification starts an isolated localhost server and checks poster selection, PNG export, persistence, loop continuity, mobile overflow and reduced-motion startup. Rendering also rebuilds both committed media files. Temporary captures stay in .output/. PREVIEW_BROWSER may select another installed Playwright Chromium channel.

Production invite previews

The production web build includes the approved MP4 and wordmark-only poster at /assets/invite-preview/buzz-invite-loop-v1.mp4 and /assets/invite-preview/buzz-invite-poster-v1.png. The relay adds Open Graph metadata to the initial HTML for /invite/<code> only. Previews are generic and do not validate or redeem the invite.

Deploy both the updated relay and its web bundle (the relay Docker image includes both). The media host comes from the request's resolved community, matching the invite link's host. RELAY_URL supplies only the wss/ws TLS posture, mapped to https/http. Unmapped hosts or lookup failures receive no preview metadata. Each community host must serve the web bundle without authentication. Use HTTPS in production.

After deployment, inspect an invite response with curl for og:video and og:image, then fetch both referenced URLs and check that they return MP4/PNG content rather than a login page. The video endpoint supports HTTP range requests. Share a fresh invite link in Messages to test actual playback; receiving apps decide whether to play video or use the poster, and may cache previews.

When replacing approved media, bump the versioned filenames in both web/vite.config.ts and crates/buzz-relay/src/invite_preview.rs to avoid stale cached media.

The receiving app chooses playback behavior. The 16-second duration is an animation choice, not an asserted platform limit.