ffmpeg webCLI
A browser-based video editor powered by ffmpeg.wasm. No uploads, no servers -- all processing happens locally in your browser using WebAssembly.
▶ Live app: https://tejaswigowda.com/ffmpeg-webCLI/
Paper
This tool is a reference implementation of the Web-CLI architecture, described in:
The Web-CLI: Verifiable Privacy for Tools, Models, and Inference Engines in the Browser Tejaswi Gowda, Arizona State University. arXiv: https://arxiv.org/abs/2608.28950
The paper defines the four properties (fidelity, progressive disclosure, offline-first, zero egress), presents four reference implementations, and argues that for sensitive data, client-side should be the default architecture - because it makes privacy a verifiable technical property rather than a policy promise.
Key Features

✓ No Server Uploads : All video processing happens entirely on your device
✓ 30+ Video Operations : GIF creation, format conversion, compression, trimming, effects, filters, auto-captioning, and more
✓ Batch Processing : Process multiple videos at once with the same operation - or an entire operation chain - applied to every file; real-time progress, per-file preview, individual downloads, ZIP-all, and graceful fallback
✓ Offline-First PWA : Works completely offline after first use; install as a native app
✓ Screen Wake Lock : Screen stays active during video processing on any device
✓ Live Previews : See output size estimates and live settings adjustments
✓ Multi-Format Support : MP4, WebM, MKV, MOV, AVI, GIF, MP3, AAC, WAV, OGG, FLAC, JPG, PNG
✓ Advanced Features : Raw ffmpeg command access, subtitle embedding, concatenation, picture-in-picture, audio mixing
✓ Fast & Responsive : Uses Web Workers for background processing
✓ Privacy First : Zero data collection; works with your files locally
When to use this instead of cloud tools
Cloud tools like CloudConvert, Kapwing, Ezgif, and Otter handle these same tasks. Every one of them uploads your file to a server. Some are free with ads, some charge, but all of them see your file, and all are subject to data breaches, subpoenas, and shifting privacy policies.
ffmpeg-webCLI does format conversion, trimming, compression, GIF creation, audio extraction, captioning, and more all in your browser, for free. Reach for it when your files are private, when you can't install software, or when you'd simply rather not upload. Your video never leaves your device.
Use Cases
▶ GIF Maker
Convert any video clip into an animated GIF. Set the frame rate and output width; height scales automatically to preserve the aspect ratio. Uses a two-pass palette generation for the best possible color quality.

↻ Video Format Converter
Re-encode a video to a different container and codec:
- MP4 : H.264 + AAC, widest compatibility
- WebM : VP9 + Opus, open format optimised for the web (~45% smaller than MP4 at similar quality)
- MKV / MOV : H.264 + AAC in alternative containers
- AVI : legacy compatibility
⊟ Video Compression
Reduce file size without changing the resolution. Dial in the quality with a CRF slider (18 = near-lossless → 51 = maximum compression) and pick an encoding preset (ultrafast → veryslow) to trade encoding speed for compression efficiency. A live size estimate updates as you adjust the settings.
▤ Video Trimming
Set a start and end point with the timeline sliders before running any operation. Trimming is applied on top of every other operation, so you can, for example, extract a short clip, compress it, and convert it to GIF all at once.
⊞ Resize & Compress
Change the output dimensions and compress in one pass. Width and height are auto-filled from the source video; edit either value or leave it blank to let ffmpeg maintain the aspect ratio. Combines a scale filter with CRF-based H.264 encoding.
♪ Audio Extraction
Pull the audio track out of any video into a standalone audio file:
- MP3 : universal playback
- AAC : efficient lossy, great for mobile
- WAV : uncompressed PCM
- OGG Vorbis : open lossy format
- FLAC : lossless compression
⊘ Mute Video
Strip the audio stream entirely. Output is the original video with no audio track -- useful for silent loops, social media clips, or before replacing the audio elsewhere.
▶ Speed Change
Speed up or slow down playback (0.25× – 4×). Both the video PTS and the atempo audio filter chain are adjusted so audio pitch and sync are preserved. Chains multiple atempo stages automatically when the multiplier is outside the 0.5–2.0 range that a single filter accepts.
↻ Rotate / Flip
Correct orientation or create mirror effects without re-uploading. Options: 90° clockwise, 90° counter-clockwise, 180°, flip horizontal, flip vertical, or flip both axes.

▤ Crop
Trim the frame to a specific region. X/Y offset and width/height are auto-filled from the source video dimensions so you can immediately drag values down rather than starting from scratch.
▭ Thumbnail Extractor
Pull a single frame from any point in the video and save it as a JPEG or PNG image. The timestamp field is pre-filled to the midpoint of the loaded clip.
The frame is always extracted as a PNG (ffmpeg's -frames:v 1); JPEG output is then produced in-browser via a canvas. This works around a crash (memory access out of bounds) in the WebAssembly core's MJPEG encoder, so JPEG thumbnails stay reliable across all clips, including high-frame-rate and variable-frame-rate sources.
⟲ Reverse
Play the video (and audio) backwards using ffmpeg's reverse + areverse filters. The reverse filter buffers the entire video into memory for processing, which combined with re-encoding makes it memory-intensive. Works in single mode; not supported in batch mode to prevent memory exhaustion when processing multiple large files (risk of hitting the 2GB WebAssembly heap limit).
▨ Fade In / Out
Add a smooth fade-in, fade-out, or both. Set the duration in seconds for each direction independently; the filter is applied after any trim.
◉ Adjust (Brightness / Contrast / Saturation)
Fine-tune the look of a clip with the eq filter. Three sliders control brightness (−1 → 1), contrast (0 → 2), and saturation (0 → 3). A Grayscale checkbox pins saturation to zero for instant black-and-white output.
✕ Strip Metadata
Remove all embedded metadata -- GPS coordinates, camera make/model, creation timestamps, and any other tags -- before sharing a file. Uses -map_metadata -1 during re-encoding.
▢ Embed Subtitles
Mux an .srt, .vtt, or .ass subtitle file into the video. Two methods:
- Stream embed (soft subtitles) -- toggleable on/off in any media player (VLC, browser, etc.) without re-encoding the picture. Video and audio are stream-copied (zero quality loss, near-instant). Output format choices:
- MP4 : subtitle stream encoded as
mov_text - MKV : subtitle stream copied natively (preserves ASS/SSA styling)
- MP4 : subtitle stream encoded as
- Hard-burn -- captions are baked directly into the video frames, so they're always visible (ideal for social media). The standard WebAssembly core ships no fonts for libass, so cues are rendered with the browser canvas (white outlined text in a fitted, rounded box, centered along the bottom with automatic word-wrap) and overlaid onto the video, which is then re-encoded. Supports
.srt,.vtt, and.ass/.ssa.
Caption font size (hard-burn only): choose Small, Medium (default), or Large. The size scales with the video resolution so captions stay proportional on any clip.
◉ Auto-Caption (Whisper)
Generate automatic captions from speech using OpenAI's Whisper model via Transformers.js. Transcription runs entirely in your browser. Your audio never leaves your device. Model weights are cached locally in IndexedDB after the first download, and the library is cached by the service worker for offline use. Edit the transcript before embedding it as a soft subtitle track or burning it into the frames.
Workflow:
- Extract : Audio is extracted from the video at 16 kHz mono
- Transcribe : Whisper processes the audio in 30-second chunks with 5-second overlap for context; the overlapping seconds are de-duplicated so captions don't repeat and stay in sync with the audio
- Review & Edit : Transcript appears in a textarea as SRT format - edit any caption before embedding
- Embed : Click Confirm & Embed to add the captions to the o