2026

Media Converter

A browser-based audio and video converter that processes files locally using WebAssembly.

Media Converter

Media Converter

A browser-based audio and video converter. Files are processed locally by an ffmpeg build compiled to WebAssembly, so nothing is ever uploaded to a server.

Why

Most online converters ask you to upload your files to someone else’s machine. This one doesn’t. There is no backend, no account, and no request leaves the page once the app has loaded. After the first visit it works offline.

Features

  • Convert between MP3, M4A, WAV, FLAC, OGG, Opus and MP4
  • Queue up to 8 files and convert them in one pass
  • Drag and drop, or browse
  • Per-file progress and per-file error reporting
  • Runs entirely in a Web Worker, so the UI stays responsive during long conversions

Supported outputs

TargetCodecSettings
MP3libmp3lame192 kbps
M4Aaac192 kbps
WAVpcm_s16leuncompressed
FLACflaclossless
OGGlibvorbisquality 5
Opuslibopus128 kbps
MP4libx264 + aacCRF 26, ultrafast preset

Input is anything the bundled ffmpeg build can decode, which covers most common audio and video containers.

How it works

  1. scripts/copy-ffmpeg.mjs copies the ESM build of @ffmpeg/core from node_modules into public/ffmpeg, then checks the file actually carries its default export. A wrong build fails the script rather than reaching the browser.
  2. src/ffmpeg-worker.js runs as a module worker. On the first conversion it imports the core, hands it an explicit locateFile so the wasm path is never guessed, and wires up the log and progress callbacks.
  3. src/App.jsx talks to the worker over a small id-based request and response protocol. Each file is written to the in-memory filesystem, converted, read back, and handed to the page as an object URL.

Files are converted one at a time on purpose. The single-threaded core has one wasm heap, so running two conversions concurrently against the same instance corrupts its state.

Back to personal projects