What I learned shipping a tiny FFmpeg desktop app

What I learned shipping a tiny FFmpeg desktop app

calendar_today agoschedule2 min read
— Originally published at dev.to

I kept hitting the same annoyance. Someone sends me a .mov, I need an .mp4, and every free option online wants me to upload the file to a server I do not trust. So I built mov2mp4, a small desktop app that converts locally and never touches the network.

The conversion itself is the easy part. FFmpeg already does it in one line:

ffmpeg -i input.mov -c:v libx264 -c:a aac output.mp4

Wrapping that in something a non-developer can actually use is where the real work lived.

Bundling FFmpeg so nobody has to install it

My first version just called ffmpeg from the system path. That works on my machine and almost nobody else's. Most people do not have FFmpeg installed, and I did not want the first step of my app to be "go install a command line tool."

So I bundled the FFmpeg binary inside the app and pointed the code at the bundled copy instead of the system one. The app got bigger, but the install went from three steps to zero. For a tool aimed at people who just want their file converted, that trade was worth it.

Batch and threading

Once one file worked, people wanted folders. Running conversions one at a time was slow, so I moved to a worker setup that processes several files at once and reports progress per file. The lesson I did not expect: I had to add a clean way to cancel a running job. If you kill the process mid write, you get a half-written .mp4 that looks real until someone tries to play it. Now a cancel deletes the partial output instead of leaving garbage behind.

The part nobody warns you about: unsigned apps

This one cost me the most time. My builds are not code signed yet, so:

  • On macOS, Gatekeeper blocks the app on first open and hides the real "Open" button behind Privacy and Security settings.
  • On Windows, SmartScreen throws up a blue "unknown publisher" screen.

Users read that as "this app is broken" or "this app is malware." Neither is true, but the operating system does not give me a friendly way to explain that. For now I wrote a short first launch note in the README and added a small helper so people can get past the warning once. Proper signing is on my list, but certificates cost money and I wanted the tool out the door.

What I would tell past me

The converter was a weekend. The packaging, the cancel logic, and the "why is my OS scaring my users" problem took far longer. If you are shipping a desktop tool built on an existing binary, budget your time for the wrapper, not the core.

Repo is here if you want to poke at it: https://github.com/MaybeSomeone-arc18/mov2mp4

Here's the website link if you want to use it:
mov2mp4.vercel.app

🔥 Join developers growing publicly
Share your knowledge, build in public, and grow your developer presence with a global community.

More Posts

I Wrote a Script to Fix Audible's Unreadable PDF Filenames

snapsynapseverified - Apr 20

The Sovereign Vault — A Comprehensive Guide to Protocol-Driven AI

Ken W. Algerverified - Jun 4

Dashboard Operasional Armada Rental Mobil dengan Python + FastAPI

Masbadar - Mar 12

How I Built a React Portfolio in 7 Days That Landed ₹1.2L in Freelance Work

Dharanidharan - Feb 9

I spent years trying to get AI agents to collaborate. Then Opus 4.6 and Codex 5.3 wrote the rules

snapsynapseverified - Apr 20
chevron_left
2Posts
1Comments
4Connections
Sanskar Kharya is a software engineer who builds AI-powered products and FastAPI backends — from an ... Show more

Related Jobs

View all jobs →

Commenters (This Week)

7 comments
2 comments
1 comment

Contribute meaningful comments to climb the leaderboard and earn badges!