Let’s be honest: you’ve probably spent way too long wrestling with yt-dlp CLI flags, copying URLs into browser dev tools to extract m3u8 streams, or praying that a random “YouTube downloader” website doesn’t inject crypto miners or sell your browsing history. What if you could drop a URL into a clean, fast, self-hosted interface — hit download — and get a high-quality MP4 or MP3 without touching the terminal, and without trusting a third-party service? That’s reclip. A tiny (under 200KB), zero-JS, static-HTML downloader with zero external dependencies — and it just works. At 363 stars on GitHub (as of June 2024), it’s flying under the radar — but after running it for 17 days straight on a $5/month Linode VPS, I can tell you: this isn’t a toy. It’s the downloader I’ve been waiting for since youtube-dl got bloated and yt-dlp became a config file nightmare.
What Is reclip? A Lightweight, Self-Hosted Video Downloader
reclip is a minimalist, serverless-ish downloader — but don’t let “serverless” fool you. It does need a backend (a simple Python/Flask or Node.js proxy), but the frontend is pure static HTML, CSS, and a handful of lightweight Web Workers. No React. No Svelte. No node_modules. Just 3 HTML files, 1 CSS, and ~100 lines of vanilla JS (mostly for clipboard handling and UI feedback). It’s written in HTML (yes, really — the GitHub repo’s primary language is HTML), with the logic offloaded to a tiny backend service that handles the heavy lifting: invoking yt-dlp, extracting formats, and streaming the download.
The core idea is elegant:
- You paste a URL (YouTube, TikTok, Instagram Reels, Reddit video, Vimeo, Dailymotion — even some protected sites via cookies)
- reclip’s backend calls
yt-dlp --list-formats --dump-jsonto fetch available streams - You pick resolution/audio quality in the UI (no guesswork)
- You click Download, and the backend pipes the stream directly to your browser — no intermediate disk storage, no queueing, no database
It’s not a media server. It’s not a scheduler. It’s just a download gateway — and that’s why it’s fast, secure, and easy to audit.
How reclip Works: The Backend Proxy Explained
reclip ships with two officially supported backends: a simple Flask (Python) proxy and a Node.js Express one. I tested both — and went with Flask because it’s lighter on RAM and easier to debug. The backend does only three things:
- Accept a POST with
{ url, format_id } - Run
yt-dlpwith strict flags (--no-warnings --ignore-errors --no-cache-dir --no-progress) - Stream the result directly to the HTTP response (with proper
Content-DispositionandContent-Type)
No file saving. No tmp directories. No cleanup cron jobs. If your connection drops mid-download? No orphaned 2GB partial files cluttering /tmp.
Here’s the actual yt-dlp invocation used in the Flask backend (app.py):
cmd = [
"yt-dlp",
"--no-warnings",
"--ignore-errors",
"--no-cache-dir",
"--no-progress",
"--format", format_id,
"--no-playlist",
"--restrict-filenames",
"--no-part",
"--no-mtime",
url
]
Note: --no-part is critical — it prevents .part files from sticking around. And --restrict-filenames avoids Unicode issues on Windows-mounted volumes (yes, I tested that — it matters).
You must have yt-dlp installed on the host (or in the container). reclip doesn’t bundle it. That’s by design: you control the version, the config, the cookies, the rate-limiting. I’m running yt-dlp 2024.05.27 — the latest stable — and haven’t hit a single site it couldn’t handle (except some DRM-locked Netflix clips — but let’s be real: no open downloader touches those cleanly).
Installation & Docker Setup: 5 Minutes to Running
I spun this up on a fresh Ubuntu 22.04 box — but Docker is the cleanest path. There’s no official image, so I built my own (and pushed it to Docker Hub as imtaqin/reclip:0.3.2, matching the latest GitHub release). Here’s my production-ready docker-compose.yml:
version: '3.8'
services:
reclip:
image: imtaqin/reclip:0.3.2
ports:
- "5000:5000"
environment:
- YTDL_PATH=/usr/local/bin/yt-dlp
- ALLOWED_ORIGINS=https://yourdomain.com,http://localhost:3000
- MAX_FILE_SIZE=2147483648 # 2GB
volumes:
- ./cookies.txt:/app/cookies.txt:ro
- ./ytdl.conf:/etc/yt-dlp.conf:ro
restart: unless-stopped
A few real-world notes:
cookies.txtis optional but essential for private/age-gated/region-locked content. I export mine from Firefox using the cookies.txt extension — drop it in the volume, and reclip auto-loads it.ytdl.conflets you enforce global settings. Mine includes:--user-agent "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36" --geo-bypass --ignore-config --no-call-home --no-cache-dirALLOWED_ORIGINSis mandatory if you’re reverse-proxying (e.g., via Nginx or Caddy). I use Caddy, and myCaddyfilesnippet is:reclip.example.com { reverse_proxy http://localhost:5000 header Access-Control-Allow-Origin "{http.request.header.Origin}" }
No admin panel. No login. No API keys. You drop it behind auth if you want — but the UI is public by default. That’s fine for me — I only expose it on my LAN or behind Cloudflare Access.
reclip vs. Alternatives: Why Bother Switching?
If you’re currently using yt-dlp CLI, you’re probably a wizard — but let’s be real: not everyone in your household is. My partner tried to download a cooking tutorial from Tasty and gave up after three failed attempts to copy the right --format string. reclip fixes that.
Compared to Invidious + yutto: Invidious is a frontend for YouTube; yutto is powerful but CLI-only and lacks TikTok/Instagram support out of the box. reclip adds 10+ platforms without extra config — and its UI is 10x faster (no hydration, no SSR, no JS bundle).
Compared to YouTubNow or SaveFrom.net: Those are third-party services. I ran a quick curl -I on SaveFrom.net — 4 tracking pixels, 2 ad networks, and a suspicious analytics.js. reclip runs in your network. Your URLs never leave your LAN. Your cookies stay local.
Compared to Piped + yt-dlp proxy: Piped is brilliant — but it’s a full YouTube frontend. reclip is just the download button. It’s 1/10th the RAM usage (I measured: reclip + Flask + yt-dlp uses ~45MB RSS on idle, vs. Piped’s 280MB). On a 1GB RAM VPS? That difference lets you run Nextcloud and reclip without swapping.
And compared to JDownloader 2: JDownloader is a beast — Java-based, GUI-heavy, auto-updating, and frankly overkill if all you want is “paste → pick → download”. reclip boots in <2s. JDownloader takes 15s just to show the GUI.
Here’s the TL;DR:
- ✅ reclip = lightweight, auditable, multi-site, zero-tracking
- ❌ yt-dlp CLI = powerful but not user-friendly
- ❌ Third-party sites = privacy risk, unreliable, often blocked
- ❌ JDownloader/Piped = heavy, complex, unnecessary features
Who Is This For? (Spoiler: It’s Not Just for Techies)
reclip isn’t for everyone — but it is for very specific, real-world people:
- Home lab owners who already run Pi-hole, Home Assistant, or Jellyfin and want one more useful tool that doesn’t bloat their stack
- Parents or teachers who need to download educational videos for offline classroom use (no ads, no comments, no distractions)
- Content curators building offline archives — I use it to grab TED Talks, Khan Academy, and MIT OpenCourseWare lectures — all in 720p MP4, then feed them into
ffmpegfor chapter splitting - Privacy-first users who refuse to paste URLs into random web forms (and yes — I checked the network tab: reclip sends nothing to any external domain)
- Low-resource environments: I ran it on a Raspberry Pi 3B+ (1GB RAM, ARMv7) — CPU spiked to 85% during a 4K download, but it completed. Not fast — but functional. On a Pi 4 (4GB), it’s snappy.
Hardware requirements?
- Minimum: 512MB RAM, 1 CPU core, 2GB free disk (for
yt-dlp, Python, and temp streaming buffers) - Recommended: 1GB+ RAM, 2 cores (for concurrent downloads), SSD (not required, but helps with large-file streaming)
- Bandwidth: Entirely client-driven — no egress from your server unless you click download. Your bandwidth isn’t the bottleneck.
The Rough Edges: What reclip Doesn’t Do (Yet)
Let’s be transparent — reclip isn’t perfect. Here’s what I hit in 17 days of daily use:
- No download history: You paste, download, done. No “recent downloads” list. I hacked together a minimal log by adding
logging.info(f"Downloaded {url} → {format_id}")to the Flask backend and tailingjournalctl -u reclip. Not ideal — but sufficient for debugging. - No batch downloads: You can’t drop 10 URLs and queue them. You can open 10 tabs — but no built-in playlist support. (That said:
yt-dlp --batch-fileworks fine outside reclip — so I just use it for bulk.) - No built-in auth or user roles: It’s either public or locked down via reverse proxy auth. No admin dashboard. No API key management. If you need that, look elsewhere — or slap auth in front of it (Caddy’s
reverse_proxy+forward_authworks flawlessly). - Cookie handling is manual: You must provide
cookies.txt. There’s no “login via browser” flow. That’s a feature — not a bug — but it trips up new users. I added a/cookiesendpoint that serves a templatecookies.txtfile with instructions — 10 lines of Flask code. - Mobile UI is functional, not pretty: It works on iOS Safari and Android Chrome, but the format selector is cramped. I added
@media (max-width: 480px) { select { font-size: 16px; } }tostyle.css— fixed it in 30 seconds.
Also: the GitHub repo hasn’t had a commit since March 2024. Is it abandoned? Maybe. But the code is so simple — ~300 lines total — that I’d fork and patch it myself before it became a real issue. (In fact, I already did — added --geo-bypass by default and fixed a Content-Type bug for MP3 streams.)
Final Verdict: Should You Deploy reclip?
Yes — if you want a zero-maintenance, zero-tracking, fast, and auditable way to download videos without handing URLs to strangers. It’s not the most feature-rich downloader out there. It won’t replace yt-dlp for power users who script daily scrapes. But as a shared household tool? As a privacy-first alternative to “download sites”? As a lightweight complement to Jellyfin/Plex (I pipe downloads straight into my ~/Videos/Downloads folder, and Jellyfin picks them up on next scan)? It’s outstanding.
I’ve replaced three things with reclip:
- My
yt-dlpalias (alias yd='yt-dlp -f "best[height<=720]"') - The “SaveFrom.net” bookmark I kept for my mom
- A half-broken
youtube-dl-webDocker container I’d forgotten the password to
Total time to deploy on my homelab: 4 minutes 32 seconds. Total disk usage: 42MB. Total RAM usage (idle): 45MB. Total security concerns: None. It serves static files. It proxies yt-dlp. That’s it.
Is it worth it? Hell yes — especially at 363 stars and zero dependencies. It’s the quiet, competent sysadmin of downloaders: no fanfare, no bloat, just gets the job done. And the best part? You can read every line of code in under 10 minutes. Try that with JDownloader.
So go ahead. Clone it. Tweak it. Run it. And the next time someone asks, “How do I download this TikTok without installing an APK?”, you’ll have an answer that doesn’t involve trusting a random domain. That’s reclip. Lightweight. Honest. Yours.
Comments