
Convert video and audio right on your device with FFmpeg. No uploads, no servers.




- 25 output formats (14 audio, 11 video), with format-specific options
- Quick presets, trimming with waveform preview, batch queues
- Conversions keep running in the background
- Adaptive layouts for phones, tablets, foldables and large screens
- 12 languages
This is a Flutter rewrite of the original native Android app, Android-Media-Converter, built in 2018 with Khang Nguyen.
A Dart workspace monorepo:
apps/mcu: the appapps/mcu_configs: CLI that validates the FFmpeg configs and translationsmodules/converter: the converter feature (job maker, job manager, settings)packages/: shared packages, including the design system (sofluffy_ui, a git submodule), the platform layer (FFmpegKit, notifications, files), storage, ads and translations (l10n)
You need Flutter 3.47+ (Dart 3.13+). The project pins its Flutter version with
puro in .puro.json.
git clone --recurse-submodules <this repo>
cd converter
flutter pub get
cd apps/mcu
flutter runIf you cloned without --recurse-submodules, run
git submodule update --init first.
Everything builds out of the box. Without .assets/env.props:
- the app ID is
io.sofluffy.mcu - release builds are signed with the debug key
- ads use Google's sample ad units
To sign release builds or use real AdMob IDs, copy
.assets/env.props.example to .assets/env.props and fill it in. It's
gitignored.
./run_tests.sh # unit and widget tests across the workspace
./validate.sh # FFmpeg config schemas and translation parity
./test_ffmpeg.sh # runs the FFmpeg commands for realCode conventions are in CONVENTIONS.md, and FFmpeg config rules are in CONFIG_RULES.md.
GPL-3.0. The app bundles the GPL build of FFmpeg through FFmpegKit.