- New scripts/source-fetch.mjs: fetch tweet/thread via fxtwitter API +
Jina fallback; news via r.jina.ai (title/author/excerpt/paragraphs)
- New src/remotion/cards.tsx: TweetCard, ThreadCard, NewsCard — mono,
flat, white cards w/ avatar initial, handle, text, stats (views/likes/
replies/retweets) or headline+excerpt; ThreadCard stacks tweets
- ShortsVideo: new scene types tweet/thread/news; source card scene
REPLACES the story segment's visual (duration kept identical so the
audio/video mux stays in sync) — the voiceover keeps playing while the
actual tweet/news is shown on screen
- Worker: fetch sourceUrl when present → sourceToCard() → inject card
- Schema: YoutubeScript.sourceUrl + sourceData (Json)
- UI: approved scripts get a '🔗 Tweet/News URL' input; Render Shorts
saves sourceUrl then queues the render
- Verified: card scene renders (bright%≈20.8 vs caption 3.9 in pixel
histogram); TSC clean; frame extraction OK
- Fix critical bug: scenes were stacked without <Sequence> — every segment
rendered simultaneously, last scene covering the whole video (root cause
of 'too simple/ugly' visual)
- Scene variety: kinetic word-by-word title (hook), karaoke caption card,
big-number stat scene (auto-detected: $12B, 65%, 3.2M), CTA center
- Karaoke captions synced to TTS: edge-tts SentenceBoundary timing via new
scripts/tts-words.py (mp3 + sentences.json per segment); active sentence
bright, others dimmed
- Rich background per scene: 4 color palettes (indigo/pink, cyan/teal,
purple/pink, orange/red), drifting orbs, dot grid, ken-burns motion
- Real fonts: @fontsource Inter 700 + Montserrat 800 (display/captions)
- Glass card captions, progress bar per-scene, safe zone 900x1400
- Word-boundary truncation for stat labels (no mid-word cuts)
- Perf kept: no blur/SVG-noise (software renderer); ~2 min per 32s short