Free · open source · runs on your machine
Paste a link. Get the file.
saveme is a video downloader built on yt-dlp. It opens in your browser, but the server is on your own computer — nothing is uploaded, no account is needed, and no one else sees what you download.
What it does
A front end for yt-dlp that behaves like an app
yt-dlp is the best downloader there is and it is a command line tool. saveme puts a page in front of it: paste, look at what is there, click. Everything the downloader is good at is still there underneath.
Many links at once
The URL box is a text area. Paste a block of links, one per line, and press Extract — each is fetched independently and gets its own card, so one dead link takes nothing else down with it. Three extract at a time; the rest queue.
Playlists and channels
A playlist or channel URL is listed entry by entry, so you can take one video or all of them. Up to 500 entries by default, and the limit is a setting.
Quality presets, or audio only
Best available, capped at 1080p, capped at 720p, or strip the audio out to MP3 or M4A. The caps are lenient on purpose — formats that do not report a height are kept rather than filtered away, which is what causes most spurious "requested format is not available" errors elsewhere.
Rename while it downloads
Type the name you want at any point. Mid-download it is remembered and applied when the file is finished; on a finished download the file moves straight away. The extension is kept either way.
Nothing phones home
No analytics, no crash reporting, no account, no update pings. The
server binds to 127.0.0.1 and the only traffic that leaves
your machine is yt-dlp fetching the media you asked for.
It closes like an app
The packaged build quits a few seconds after you close the tab — but never while a download is running; those finish first. No stray process to hunt down in Task Manager.
Install
Download and run — nothing to set up
The desktop builds are completely self-contained: Python, yt-dlp and a static ffmpeg/ffprobe pair are already inside. Unpack the archive, run the binary, and your browser opens on the app.
Every release also ships SHA256SUMS.txt — check your download
against it. Around 300 MB unpacked, most of that ffmpeg.
First run: getting past the security warning
These builds are not code-signed, because that requires paid certificates from Apple and Microsoft. Both systems will warn you once. Here is what you will see and why.
macOS
The app is ad-hoc signed, which is the minimum that runs at all on Apple Silicon. Combined with the quarantine flag macOS puts on any download, the dialog says "saveme is damaged and can't be opened". That is Gatekeeper's wording for unsigned — it is not a corrupt download. Clear the flag once:
xattr -dr com.apple.quarantine /path/to/saveme.app
Or open System Settings → Privacy & Security → Open Anyway. The first launch takes about ten seconds while Gatekeeper hashes the bundle; after that it is instant. saveme has no dock icon — its interface is the browser tab — so quit it from the tab, the Quit button, or Activity Monitor.
Windows
SmartScreen shows "Windows protected your PC" → More info → Run anyway. Defender occasionally quarantines unsigned PyInstaller executables as a heuristic false positive; add an exclusion rather than re-downloading.
Linux
tar -xzf saveme-<version>-linux-x64.tar.gz
./saveme-<version>-linux-x64/saveme/saveme
Opening a browser automatically needs xdg-utils; without it the
URL is printed for you to paste.
Or run it from source
Worth it if you want to upgrade yt-dlp yourself the moment a site changes. Needs Python 3.11+, uv, and ffmpeg on your PATH.
git clone https://github.com/hasithmeth/saveme.git
cd saveme
uv sync
uv run saveme
Then open http://127.0.0.1:8765. Flags you may want:
--port 9000, --download-dir ~/Videos,
--open.
Instructions
Using it
The basic loop
- Copy a link — a video, a playlist, or a channel.
- Paste it into the box and press Extract (Enter submits; Shift+Enter adds a line).
- Pick a preset on the card that appears, and click Download.
- Files land in
~/Downloads/savemeunless you change it in Settings.
Format presets
| Preset | What you get | Needs ffmpeg |
|---|---|---|
| Best | Highest video plus highest audio, merged | To merge — otherwise falls back to a pre-merged format |
| 1080p | Capped at 1080p, merged | Same |
| 720p | Capped at 720p, merged | Same |
| Audio (MP3) | Audio track extracted to MP3 | Yes |
| Audio (M4A) | Audio track extracted to M4A | Yes |
Without ffmpeg, video still downloads but quality is capped at whatever single pre-merged file the site offers — often 360p or 720p — and the audio presets are unavailable. The packaged builds bundle it, so this only applies when running from source. A banner at the top of the app tells you if it is missing.
Sites that need you signed in
Some sites will not serve anything to a client that is not logged in. Export your cookies with a browser extension that writes Netscape format, then point saveme at the file:
SAVEME_COOKIES_FILE=~/cookies.txt uv run saveme
For a packaged build, put that line in a .env file next to the
executable. SAVEME_COOKIES_FROM_BROWSER=firefox reads a browser
profile directly instead — though recent Chrome versions block this with
App-Bound Encryption, so a cookies file is the reliable route.
A cookies file is a login. Anyone holding it can act as you on that site. Keep it out of shared folders and out of version control, and delete it when you are done.
When extraction works but the download 403s
Some sites judge how your client speaks TLS rather than what headers it sends. The symptom is distinctive: the video details appear fine, then the download itself fails with 403. saveme impersonates a real browser by default to get around this. You can pin it:
SAVEME_IMPERSONATE=chrome:windows-10 # pin a client and OS
SAVEME_IMPERSONATE=off # turn it off
Settings worth knowing
| Variable | Default | What it does |
|---|---|---|
SAVEME_DOWNLOAD_DIR | ~/Downloads/saveme | Where files are saved. Also editable in the app. |
SAVEME_MAX_CONCURRENT_DOWNLOADS | 2 | How many download at once (1–8). |
SAVEME_PLAYLIST_ENTRY_LIMIT | 500 | Most entries listed from one playlist or channel. |
SAVEME_COOKIES_FILE | — | Netscape-format cookies for signed-in sites. |
SAVEME_PORT | 8765 | Port to listen on. |
SAVEME_EXIT_WHEN_IDLE | on when packaged | Quit after the last tab closes. |
The full list is in the
README.
Every setting is an environment variable, readable from a .env
file placed next to the executable.
Reaching it from your phone
saveme binds to loopback and checks the Host header against an
allowlist, so simply listening on another interface is not enough — that
check is what stops a hostile website from pointing DNS at your machine.
Opt in with the address you will actually type:
SAVEME_HOST=192.168.1.20 uv run saveme
This puts an unauthenticated file-writing service on your network. Anyone on that Wi-Fi can queue downloads onto your disk. Only do it on a network you control, and stop the server when you are finished.
Supported sites
If yt-dlp can reach it, saveme can save it
saveme adds no allowlist and no blocklist of its own. Site support is entirely yt-dlp's, which means it is enormous and it is maintained by people who fix extractors within days of a site changing.
The coverage spans mainstream video platforms and their playlists and channels, social networks, news sites and public broadcasters, music and podcast hosts, education and conference platforms, live streams and VOD archives, and adult tube sites. The authoritative list is yt-dlp's own supported-sites page — if a site is on it, pasting its URL into saveme works.
Adult and NSFW sites
Yes — this works, and it is worth being direct about it rather than coy. yt-dlp ships dedicated extractors for adult tube, clip and cam sites, and saveme hands every URL straight to it without inspecting, filtering or judging what you paste.
Three things matter more here than anywhere else, and saveme is built the right way for all three:
Nothing leaves your machine
Web-based "downloader" sites see every URL you paste, and many keep
logs, inject ads, or wrap the file in something you did not ask for.
saveme is a server on 127.0.0.1 with no analytics and no
account — the URL goes from your browser to your own process to the
site, and nowhere else.
Login-gated content needs cookies
Most adult sites gate at least some content behind an age confirmation
or an account. Export a cookies file from a signed-in browser session
and set SAVEME_COOKIES_FILE — see
Sites that need you signed in above. Treat that
file like a password.
403 on download usually means TLS fingerprinting
These sites fingerprint aggressively. Browser impersonation is on by
default and fixes most of it; if a specific site still refuses, pin a
target with SAVEME_IMPERSONATE=chrome:windows-10.
Adult content is 18+ (21+ in some places), and the rules are yours to follow. Download only what you are legally permitted to, respect each site's terms of service, do not circumvent paywalls or DRM, and never redistribute. saveme does not check any of this for you — it cannot, and it does not try.
A URL that used to work has stopped? That is almost
always an upstream extractor, not saveme. A packaged build pins the
yt-dlp it shipped with, so grab a newer release — one is built
automatically every month. From source,
uv lock --upgrade-package yt-dlp && uv sync fixes it
immediately. Extraction bugs belong on
yt-dlp's issue tracker,
not this one.
Troubleshooting
When something goes wrong
| What you see | What it means |
|---|---|
| Quality is capped at 720p or 360p | ffmpeg is missing, so nothing can be merged. The banner at the top of the app says so and gives you the install command. |
| "Requested format is not available" | The site does not offer your cap. Try the Best preset. |
| "Sign in to confirm you're not a bot" | The site wants a session. Supply a cookies file. |
| 403 on the download, though extraction worked | TLS fingerprinting. Pin SAVEME_IMPERSONATE. |
| "saveme is damaged and can't be opened" | macOS Gatekeeper on an unsigned app, not a bad download. Clear the quarantine flag. |
403 forbidden_host from your phone | The Host allowlist. Bind the LAN address you are typing. |
| Stuck at 100% | ffmpeg is merging or converting. The status line says which. |
| Job list is empty after a restart | Jobs live in memory only. The files on disk are untouched. |
.part files left behind | An interrupted download. Queue the same URL again and it resumes. |
Still stuck? Open an issue on GitHub — but if a particular site fails to extract, check yt-dlp's tracker first, because that is where the fix will come from.
Support the project
Found it useful? Leave a tip
saveme is free and open source, with no ads, no telemetry, no upsells and no paid tier — and it is going to stay that way. If it saved you some time, a coffee is the whole business model.
☕ ko-fi.com/hasithjEntirely optional. Everything works exactly the same either way. Starring the repo or telling someone about it helps just as much.
The fine print
saveme downloads nothing by itself
It is a convenience wrapper. Every part of the job that actually matters is done by other people's software: yt-dlp finds the media, picks the formats, and performs every network request and every byte of the download; ffmpeg merges streams and converts audio. What saveme adds is a local web page, a job queue, and some filename handling.
This project is not affiliated with, endorsed by, or supported by yt-dlp, the FFmpeg project, or any website you point it at. All trademarks belong to their owners. Which sites work and when an extractor breaks is decided upstream, not here.
You are responsible for what you download
saveme does not inspect, filter, judge or restrict the URLs you give it. It takes what you type and hands it to yt-dlp. Making sure you have the right to download a given file — and complying with the site's terms of service, copyright law, and any other law that applies where you are — is entirely your own responsibility. Downloading copyrighted material without permission may be illegal where you live. Do not use saveme to infringe copyright, breach a contract, or circumvent access controls.
No warranty, no liability
saveme is provided "as is", without warranty of any kind, as stated in the MIT licence. To the maximum extent permitted by law the authors are not liable for anything that follows from using it — lost or overwritten files, a filled disk, suspended accounts, or any legal consequence of what you chose to download. Using this software means you accept that risk yourself.