Video Poster Frames
Date: 2026-03-25 PR: #171 Issue: Closes #55
What changed
Videos now display a poster frame (thumbnail preview) instead of a blank rectangle on mobile. Upload-time and existing content are both covered.
New upload behavior
When uploading a video in the editor, a poster frame is automatically extracted at the 1-second mark using a hidden <video> + <canvas> element. The poster JPEG is uploaded alongside the video and set as the poster attribute. Real video dimensions (videoWidth/videoHeight) replace the hardcoded 1280x720 placeholder.
Poster extraction runs in parallel with the video upload — no added latency. If extraction fails (unsupported codec, etc.), the video uploads without a poster.
Backfill migration
Migration 0013_backfill_video_posters processes all existing content:
- Scans
stories,projects,pagesfor<video>tags withoutposter - Uses existing thumbnails from
video_processing_jobswhen available - Falls back to FFmpeg extraction for videos without processing jobs
- Updates
srcto processed H.264 MP4 (720p) for non-MP4 originals that won’t play on mobile Safari - Backfills real dimensions from processing job metadata
- Works with both local storage and GCS
Infrastructure
FFmpeg added to the backend Dockerfile for migration support.