VIDSHIFT / LOCAL VIDEO EXPERIMENT

Let the camera move.

A full-window canvas above. Your editable motion timeline below. Back to preview ↑

Higher values prefer “nothing” when motion barely improves the pixel match; 0 removes this extra preference. Applies to the next analysis. Choose decoding/analysis threads beside Open video above.

On-device analysis. Original video and audio. Nothing uploaded.

Nothing · 2D movement · centered zoom · scene cuts

How this works

Each selected worker decodes and analyzes queued 6-second slices of your local file. Frame overlap keeps boundaries intact; raw motion is joined before the parallel second pass checks neighbors across slices. Slice boundaries are not scene cuts. The browser then plays your original video; only its position and scale change. Short clips may contain fewer slices than threads, and codec/hardware limits still affect speed.

Movement is a two-dimensional X/Y vector, not separate horizontal/vertical actions. Tiny improvements need not count as motion. Positive X/Y describe image movement right/down; the video rectangle moves inversely. Moving subjects, parallax, blur and lighting changes can still confuse the estimate.

Per-frame motion is coalesced into steady movements: each row is one operation at one constant rate. Expand a row to change its type or rate. Edits update playback without reanalysis. Export/import JSON contains only operations and identifying metadata, never the video. Import after analyzing the matching local video; Reset restores the original analysis.

Use MP4/MOV or WebM with one video track and a codec supported by your browser's WebCodecs implementation. Audio stays with native playback. HTTPS or localhost is required; no special isolation headers, WASM, bundler or video encoding is used.

Embedding: import web/video-shift.js and put <video-shift threads="4"></video-shift> inside a parent with a defined width and height. The operations editor is an optional, separate component.