Captions UX Overhaul & Playback Stability
Captions editor redesign with inspector controls, multi-select editing, phrase seeking, and more reliable MOV playback and export.
Captions Editor, Reimagined Around an Inspector Pattern
The captions editor has been rebuilt around a focused inspector pattern: selecting an overlay opens a dedicated properties panel on the right instead of cramming controls into a fixed sidebar. The interaction model is now predictable everywhere — single click selects, double click edits — with auto-scroll to the active phrase, inline transcription progress, and per-overlay accordions that collapse inactive items so you only see what you’re working on.
Selecting multiple overlays of the same type now routes to a shared multi-edit panel, while mixed-type selections show a clean summary view. Shift+click extends selection from the last-clicked anchor, matching the multi-select conventions you already use everywhere else. For transcribed overlays, a new multi-overlay transcription panel lets you run batch operations across an entire selection in a single accordion view.
Phrase-Level Seeking and Inline Word Editing
Clicking a phrase in the left sidebar now seeks the player directly to that phrase, and word-level editing has moved into the right panel where it belongs — driven by phrase selection, editable inline, with no need to leave the transcript view. A new timestamp guard validates segment boundaries before write, so out-of-order edits can no longer corrupt the transcript.
Video overlays also regain a proper Properties tab alongside Transcription and Crop, restoring access to border radius, transform, and animation controls that were temporarily inaccessible while the right panel was being reworked.
Export Pipeline Hardening
Exports are more resilient and more honest about failure. We’ve added an h264_compat software encoding fallback, output resolution capping, and FFmpeg error surfacing that tells you exactly which stage failed instead of swallowing it under a generic message. When something does go wrong, you now know whether it was probe, encode, mux, or finalize.
Bug Fixes
- First-clip freeze on iPhone
.movimports — proxy generation now regenerates PTS (+genpts +igndts), forces CFR at 30 fps (-fps_mode cfr -r 30), and drops negative timestamps (-avoid_negative_ts make_zero). iPhone footage with non-zero start PTS or encoder delay no longer parks the<video>element on the first frame while audio plays normally. - Silence remover “Keep” button on cut clips —
toggleSilencenow walks clips using collapsed (display) durations and converts the local range from display time to source time before storing the keep segment, mirroring the cut-region logic. Projects with any exclusion zone previously wrote the segment at the wrong source-time offset and the silence overlay never lifted. - Restart button left the player playing — the timeline-store
restart()action only reset store state; the Remotion<Player>’s internal frame counter kept advancing. Captions and silence playback controls now alsopause()andseekTo(0)on the player ref, matching the natural end-of-playback path. - Properties tab not switching for video overlays — the right-panel
Tabsvaluewas derived solely fromcropOverlayId, leaving non-crop tab clicks with nowhere to write. Local state for the active non-crop tab now makes Properties and Transcription selections actually take effect. - End-of-playback auto-restart — guarded against stale play commands on ended media; the player now forces an immediate seek to zero so the next play() lands at frame 0 rather than re-triggering the previous loop.
activeOverlayIddesync inTranscriptionPanel— segments store now stays in sync with the active overlay so the correct transcript is always shown.- Word selection lifecycle — replaced the global Escape handler with focus-based clearing and prioritised event propagation so word selection clears reliably without swallowing unrelated keyboard events.
Performance
TranscriptionPanelre-renders — the panel reads segment data via store snapshots instead of reactive subscriptions, eliminating re-renders on every playhead tick.- Tighter video drift tolerances in silence remover — playback restart logic standardised to reduce decoder lag after silence jumps.
Refactoring
TimelineTimeTransformContext— display-time mapping decoupled from the timeline store; clip boundaries now sync with collapsed durations and the playhead scroll target factors indisplayTimeTransform.removeGaps— the gap threshold has been removed so all gaps between segments close, simplifying the contract.- Removed segment-resizing and permanent-exclude UI from the silence remover timeline in favour of the cut/keep model.
