Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

11 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Monke Convert

Monke Convert

Let Monke handle the FFmpeg

A one-stop DaVinci Resolve workflow manager for Linux. Drop a video, and Monke figures out the rest: the codec, the flags, the frame-rate fix. Then it converts your finished edit back to an upload-ready MP4 and cleans up after itself.

CI License: MIT Python 3.10+ Platform: Linux

The Monke Convert window

Why this exists

Editing in DaVinci Resolve on Linux means running the same tedious loop by hand every time:

remember the ffmpeg command  ->  transcode to an edit codec  ->  edit  ->
render  ->  transcode back to MP4  ->  hunt down the multi-GB leftovers  ->  delete

Resolve on Linux won't import H.264/AAC MP4 at all, so every clip has to be transcoded to an edit codec first. And Android screen recordings are variable-frame-rate, which Resolve silently conforms to a fixed timeline, so the audio drifts out of sync minutes into the edit, long after you'd notice why.

Monke Convert puts the whole loop in one window, and the frame-rate fix happens automatically, so you never find out it was needed.

Select video  ->  Convert  ->  Open in Resolve  ->  Render  ->  Convert back  ->  Clean up

Smart Convert

The one button that makes this feel like a tool rather than a graphical wrapper. It inspects the file and picks the right command, and it tells you why, instead of asking you to trust it:

Monke sees... because... Monke does...
πŸ“Ό Already Resolve-ready codec is ProRes / DNxHR / MJPEG skips conversion, so import it directly
πŸ“± Android screen recording MediaMuxer tags, no rotation, variable frame rate Everyday + automatic CFR fix
πŸ“± Android camera MediaMuxer tags, rotation matrix, GPS Everyday (Maximum if 10-bit)
🍏 iPhone / iPad Apple Core Media tags Everyday (Maximum if 10-bit HDR)
πŸ–₯️ Desktop capture (OBS, Kazam) ffmpeg muxer + monitor resolution Everyday
🎬 Cinema / 4K / HDR 3840 wide or more, 10-bit, or Rec.2020 High quality / Maximum
πŸŽ₯ Anything else no distinguishing metadata Everyday, a safe default

From your side, every video is just Browse, then Convert.

Quality, in plain English

You should not need to know what "DNxHR SQ" means to convert a video. Every option leads with a name you can act on, prints the technical name quietly beside it, and shows both the file size and how long it will take before you commit:

Technical name Speed Good for
Draft DNxHR LB ⚑ Fast rough cuts, long screen recordings
Everyday DNxHR SQ ⚑ Fast almost everything, and the default
High quality DNxHR HQ ⚑ Fast colour grading
Maximum (10-bit) DNxHR HQX ⚑ Fast HDR and 10-bit cameras
ProRes Draft to High ProRes Proxy to HQ 🐒 Slow handing footage to a Mac or Final Cut

Is DNxHR really native to Resolve?

Yes, and that is the point. DaVinci Resolve on Linux ships Avid's own libDNxSDK.so and offers DNxHR LB, SQ, HQ, HQX and 444 as render presets. It will decode ProRes, but it does not write it on Linux. DNxHR is the codec Resolve is happiest with here.

It is also much faster. Measured on a 12-thread Ryzen 5 3600 encoding 1080p30, ffmpeg's prores_ks runs at 0.26 to 0.33x realtime, while dnxhd runs at 1.3 to 1.9x for the same file size and comparable SSIM. That is five to seven times faster: a 28-minute lecture drops from roughly 85 minutes to about 15. ProRes is still one click away, and honestly labelled Slow.

Features

  • A preview, not a filename. The video you dropped, with its resolution, length and codec as chips you can read at a glance.
  • Real progress, not a spinner. A true percentage and ETA, parsed from ffmpeg's machine-readable output stream.
  • Automatic VFR fix. Variable-frame-rate sources are conformed to a constant rate so the audio never drifts. This is the bug the whole app exists to prevent.
  • Honest size and time estimates, before you commit an hour and 40 GB. DNxHR is computed exactly (its frames are 4096-byte aligned); ProRes is quoted as a range.
  • Disk guard. Refuses to start an encode that won't fit, and aborts if the disk fills mid-transcode. The indicator turns amber under 20 GB and red under 10 GB.
  • Pause, resume, and safe cancel. Cancelling deletes the half-written file; it never leaves a truncated MOV that looks complete.
  • Overnight queue. Line up a term's worth of lectures and let them run.
  • Back to MP4. Convert the finished Resolve render to H.264/AAC (CRF 18, +faststart), with all metadata stripped so your GPS location doesn't get uploaded.
  • YouTube Shorts. Reframe to 1080x1920 by centre-crop or blurred background.
  • Thumbnail grabber. Pick from nine frames sampled across the clip.
  • One-click Resolve. Launch DaVinci Resolve straight from the app.
  • Safe cleanup. Delete intermediates or the whole project, to the trash by default, with hard guardrails against deleting anything outside the project.

Security

You're feeding this app video files, and video demuxers are a large, memory-unsafe parsing surface. Monke Convert treats every input as hostile:

  • ffmpeg runs inside a bubblewrap sandbox. No network, no capabilities, an empty environment, the input mounted read-only and only the output directory writable. A malicious file that exploits a demuxer bug lands in an empty jail. (Auto-disables with a warning if bubblewrap isn't installed.)
  • No shell, ever. ffmpeg is invoked with an argument list, never a command string, so there is nothing for a crafted filename to inject into.
  • Protocol confinement. Every path is passed as a file: URL with -protocol_whitelist file, so a file named concat:... or http://... is read as a file, not as an ffmpeg protocol.
  • Deletion is contained and reversible. Targets must resolve inside the project; symlinks are removed as links, never followed out. Everything goes to the trash by default, and deleting a whole project makes you type its name.
  • Never clobbers. Encodes go to a temporary file and are atomically renamed on success, so a crash or cancel can't corrupt an existing render.
  • No pickle, no yaml.load, no network. Settings are validated JSON; history is parameterised SQLite; nothing phones home.

More detail in SECURITY.md.

Installation

Linux Mint / Ubuntu / Debian. ffmpeg is required; bubblewrap is recommended for the sandbox. There is no system PyQt6 package on these distributions, so the installer builds a private virtual environment. Nothing is forced into your system Python.

From source (recommended today)

git clone https://github.com/harshavardhanmdev/Monke-Convert.git
cd Monke-Convert
./install.sh

install.sh does three things: it offers to apt install ffmpeg bubblewrap, it builds the virtual environment, and it adds Monke Convert to your application menu. It installs:

What Where
Launcher script ~/.local/bin/monke-convert
Menu entry ~/.local/share/applications/monke-convert.desktop
Icons (7 sizes) ~/.local/share/icons/hicolor/*/apps/monke-convert.png

Then press your Super key and type Monke, or run monke-convert in a terminal.

Prebuilt binary

Each release ships a single-file executable and a .deb:

# single binary
chmod +x monke-convert && ./monke-convert

# or the Debian package
sudo apt install ./monke-convert_*.deb

Updating

git pull

That's it for the code: install.sh installs the package in editable mode, so a pull takes effect the next time you launch.

If the icon or menu entry looks out of date, the desktop files need refreshing too. Re-run the installer, which is safe to run repeatedly:

./install.sh

Your desktop caches icons, so if the old one lingers, log out and back in.

Development

The codebase has a hard rule that makes it a pleasure to test: monke_convert/core/ never imports Qt. All the decision-making (codec choice, command construction, VFR detection, size estimation, path safety) is pure Python, exercised headlessly.

python -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"

pytest            # runs real ffmpeg encodes; the sandbox tests need bubblewrap
ruff check .

The suite includes end-to-end tests that transcode synthesized clips and assert the things that matter: that a VFR source comes out with audio and video the same length, that DNxHR sizes are predicted to the byte, and that a concat:-named file is read as a file.

monke_convert/
  core/        pure logic, zero Qt (safety, sandbox, probe, classify, commands, estimate)
  workers/     QProcess encode runner, QThread prober, job queue
  ui/          PyQt6 window, widgets and dialogs

Roadmap

Ideas tagged good first issue are a great place to start contributing:

  • Subtitle generation (Whisper)
  • Silence removal
  • Auto intro / outro
  • Batch Smart Convert for a whole folder
  • Windows and macOS builds

Contributing

Pull requests are welcome. See CONTRIBUTING.md. The short version: keep core/ free of Qt, add a test, and run ruff before you push.

License

MIT Β© Harsha Vardhan M

πŸ’ Let Monke handle the FFmpeg.
Powered by Nexorium Systems Private Limited

About

FFmpeg made easier

Topics

Resources

Contributing

Security policy

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages