A desktop media downloader that ships as a real installer.
Download
Version 1.1.0 — 24 Aug 2026Source and release notes on GitHub.
Download from the web
Runs in your browserWaiting for a link
In the app
Copy your link, then open Media Downloader and paste it. The app does the fetching on your machine, at your connection speed, with no queue and no size limit.
Detecting your system…
Also available: macOS (Apple Silicon), Windows
In the terminal
The exact command for the options above. Needs yt-dlp and ffmpeg installed — the app bundles both so you do not have to.
yt-dlp -f "bv*+ba/b" --merge-output-format mp4 -o "%(title)s [%(id)s].%(ext)s" "<paste your link>"Nothing you paste here leaves your browser. This page prepares the download; your machine performs it. Fetching media on the server would mean running a public download service from this domain — and the platforms block datacenter addresses anyway, so it would stop working within days.
First launch
Both builds are unsigned, so each system warns you once. This is not the app misbehaving — it is the cost of not paying for a certificate, and it happens exactly once per machine.
macOS
- 01Open the .dmg and drag the app to Applications
- 02Right-click the app and choose Open
- 03Click Open again in the dialog
Windows
- 01Run the installer
- 02On the SmartScreen warning, click More info
- 03Click Run anyway
What it is
Most tools in this category are a Python script and a README that assumes you already have a working toolchain. The interesting engineering problem is not the downloading — yt-dlp solves that — it is turning a Python GUI into something a non-technical person can install on two operating systems without touching a terminal.
That means bundling ffmpeg into the app so high-resolution downloads work out of the box, because anything above 360p arrives as separate video and audio streams that have to be merged. It means a PyInstaller spec per platform, an Inno Setup installer for Windows, a .dmg for macOS, and a GitHub Actions matrix that builds all of it from a version tag. It means a first-run experience that explains the unsigned-binary warning instead of letting the user conclude the app is broken.
The app itself is tkinter: quality presets, MP3 export, subtitle selection including Sinhala and Tamil, playlist handling, live progress with speed and ETA, and a cancel that stops cleanly mid-download. It also updates its own yt-dlp from inside the UI, because extractors break when platforms change their players and the fix is almost always just a newer yt-dlp.
What it does
- Quality presets from best down to 360p, plus smallest-file mode
- MP3 export at 192 kbps
- Subtitles in English, Sinhala and Tamil, including auto-generated
- Live progress with speed, ETA and file size, and a clean cancel
- ffmpeg bundled — no separate install for high-resolution merging
- Self-updating yt-dlp from inside the app
- Version
- 1.1.0
- Built with
- Python, tkinter, yt-dlp, ffmpeg
- Packaging
- PyInstaller, Inno Setup, GitHub Actions
- macOS
- Apple Silicon (arm64)
- Windows
- 64-bit installer
- Price
- Free, open source
Build notes
- 01
Bundling ffmpeg was the difference between working and not
Without ffmpeg on the PATH, every download silently caps at 360p — the only resolution served as a single combined stream. Users read that as a broken app, not a missing dependency. Shipping the binary inside the bundle and checking for it before falling back to PATH removed the single largest source of confusion.
- 02
The release is triggered by a tag, not a push
Pushing to main does nothing. Pushing a v-prefixed tag starts the build matrix, which produces both installers and attaches them to a GitHub release. The version string lives in three files and all three have to agree, which is exactly the kind of thing that should be checked by CI rather than remembered.
- 03
Code signing is where hobby projects hit a wall
Windows certificates run a few hundred dollars a year; Apple's programme is 99 and notarization is mandatory on modern macOS or the app simply refuses to open. Shipping unsigned and documenting the first-launch workaround is the honest trade for a free tool — but it is a real cost paid by every user, and worth naming rather than hiding.
Built by Sasindu Bandara, Software Engineer at Innovative-e, Inc. in Colombo, Sri Lanka.