Inspiration

Creators make the same content four times — re-cutting, re-captioning, checking safe zones for every platform. One video shouldn't mean four editing sessions. Edit-Once exists to kill that grind: edit once, ship everywhere.

What it does

Upload one video (captions optional — if you don't have an SRT, Whisper transcribes it for you) and Edit-Once renders four platform-ready vertical versions simultaneously: TikTok, Instagram Reels, YouTube Shorts, and X.

Each version gets:

  • Platform-correct safe margins (every platform has different rules — I apply them per version, not one-size-fits-all)
  • Styled captions — Default, Karaoke (word-by-word highlight), Pop Red, and Bold Outline
  • Fit modes — Crop with a smart face-anchored focus point you can drag or nudge with arrow keys, or Blur Pad for a cinematic blurred backdrop
  • Stills previews, a modal video player, and per-version downloads
  • AI-generated SEO packs — title, hashtags, and caption tuned for each platform And every render is automatically verified — resolution, aspect ratio, safe margins, audio, and duration are checked against the platform spec before you ever see a "Ready" badge.

How I built it

Stack: FastAPI (Python) + React 18/Vite + ffmpeg with libass — plus Whisper for transcription and Groq for SEO generation. The pipeline: upload → optional Whisper transcription → media analysis (probe + face detection to find the smart crop anchor) → per-platform render configs → ffmpeg filter graphs with ASS-subtitle styling → automatic pixel/probe verification → still extraction. A single-worker queue with atomic disk persistence keeps every job crash-safe, and platform failures stay local — one broken platform never fails the whole job. The frontend is a full product, not a demo: live progress polling, a focus-trapped modal player, drag-to-position anchor markers, keyboard accessibility (arrows nudge the crop anchor 5%), and a deliberately designed dark-glass UI.

Challenges I ran into

  • Making libass actually style captions — ASS color formats, karaoke \k timing tags, outline/border styles; every template is a real render, not a color swap
  • Per-platform safe-zone rules that genuinely differ (TikTok's bottom margin is not Reels' is not Shorts')
  • The stale-cache trap — re-renders updated the files on disk, but browsers kept showing the old preview because the URLs never changed. Took real browser instrumentation to catch, fixed with cache-busted URLs
  • Face-anchored cropping that still lets the user override — the default anchor comes from analysis, the user's drag always wins
  • Keeping the pipeline atomic — a render must never publish half-verified output

Accomplishments that I'm proud of

  • One upload → four verified, platform-tuned videos — the core promise, fully working
  • Caption styles that are provably different — I verified with pixel-level analysis that karaoke renders yellow, pop renders red, bold renders green
  • Per-platform re-render: change the fit or style of one platform without invalidating the other three you already approved
  • A UI that doesn't feel like a hackathon — accessibility, motion design, and a coherent design system

What I learned

  • ffmpeg is a full production pipeline if you treat it right — filters, libass, and probes can do 90% of the work
  • The hard part of "just captions" is legibility and per-platform constraints, not the text
  • Automated verification beats trusting your renderer — I caught real defects with probe-based checks I'd have shipped otherwise
  • Cache headers will silently undo your best work in the browser

What's next for Edit-Once

  • More platforms — Pinterest, Snapchat, and landscape variants
  • Dynamic captions (word-by-word TikTok style) and auto-font fitting
  • Brand kits — upload fonts, colors, and logo so every render is on-brand
  • Batch upload — one campaign, ten videos, zero re-edits
  • Direct posting — publish to each platform from Edit-Once via their APIs
  • A/B thumbnails — generate and pick the best still per platform before you ship

Built With

Share this project:

Updates

Submission history