PTENES
Tool · personal use

Paste the link. The your VPS download.

A video and audio downloader that runs on your own machine, protected by a password, with files automatically deleted after 6 hours.

inemadlp — personal downloader on a VPS
What it is

yt-dlp with an interface, accessible from your phone

You open a page on your VPS, paste the URL, choose video or audio, and get the file. Under the hood, it’s the same old yt-dlp — the difference is that you don’t need a terminal, and the download comes from a trusted residential IP instead of your phone.

📱 Works on your phone

The interface is a PWA: install it on your home screen, sign in once with the password, and it never asks you to log in again. No app, no app store.

🧹 Keeps your disk from filling up

Every downloaded file is deleted 6 hours later, and a cleanup scan also removes leftovers from failed downloads. The VPS doesn’t become a storage bin.

🍪 Gets past the block

You upload your signed-in browser’s cookies through the interface. That’s what prevents the “Sign in to confirm you're not a bot” message that blocks data center IPs.

How it works

From URL to file, without you having to keep an eye on it

A single process: FastAPI serves the interface and API, and a worker processes the queue one job at a time — deliberately, to avoid rate limits from the source. Caddy handles HTTPS.

Paste the link→ Added to the queue→ yt-dlp downloads→ ffmpeg combines→ "Download" button→ Deletes after 6h

One job at a time

The queue is serial. Two simultaneous downloads would only increase the chance of getting blocked by the source.

No automatic retries

It failed, so you queue it again. Retrying automatically against a source that blocked you just burns through the IP faster.

Download resumption

Delivery supports Range, so if your phone loses signal, the download picks up where it left off — that's why there's a TTL instead of deleting the file after the first download.

Prerequisites

What needs to be ready

A Linux VPS with Docker and a subdomain pointed to it. Nothing else — ffmpeg and yt-dlp are included in the image.

Docker + Compose

It's the only software requirement on the VPS.

# Ubuntu
curl -fsSL https://get.docker.com | sh

A subdomain

Point an A record to the VPS IP before before starting: Caddy issues the certificate on the first visit.

# example
dlp.seudominio  A  203.0.113.10

One signed-in browser

On your PC or phone, signed in to the sources you download from. That’s where the cookies come from.

# extension (Edge/Chrome)
Get cookies.txt LOCALLY
User guide · step by step

From zero to your first download

There are five steps. Starting with the third, you’re already using it on your phone.

1

Clone and run the installer

It generates the three secrets, writes the .env with the right permission, it starts the containers and prints your password at the end.

git clone https://github.com/inematds/inemadlp.git && cd inemadlp
./instalar.sh dlp.seudominio  # warns if DNS still doesn't point here
2

Wait for the certificate

Caddy requests the certificate on the first visit — 10 to 60 seconds. Prefer doing it manually instead of using the installer? The README has the manual method.

docker compose logs -f caddy   # wait for "certificate obtained"
curl -I https://dlp.seudominio  # HTTP/2 200 = online
3

Install on your phone

Open the domain, enter the password, and use "Add to Home Screen." The session doesn't expire — you log in once, and that's it.

# on your phone's browser
https://dlp.seudominio
4

Upload the cookies

Without this, YouTube refuses: the VPS IP is from a data center. On your PC, with Edge or Chrome signed in to YouTube:

  1. install the extension Get cookies.txt LOCALLY (just once);
  2. open YouTube and confirm your profile picture appears;
  3. click the extension icon → Export — downloads one cookies.txt;
  4. in inemadlp, open the dashboard Cookies and send this file;
  5. delete the cookies.txt from the Downloads folder — it gives access to your account.

Redo this only when a download fails: the interface will let you know "expired cookies".

# shortcut, only on the Linux machine with Firefox logged in
DLP_URL=https://dlp.seudominio DLP_UPLOAD_TOKEN=... ./sync-cookies.sh
# -> {"cookies": 81}
5

Download

Paste the URL, choose Video (MP4 up to 1080p) or Audio (M4A) and wait. Progress appears in the list, and the "Download" button shows up when it's done.

# the file is available for 6 hours, then it disappears
# want more time? DLP_TTL_HOURS in .env
Cookies

Why this exists and when to renew

YouTube and other sources challenge data center IPs. Cookies from a signed-in browser solve this — and they’re the project’s only recurring maintenance task.

When a download fails

The interface itself says "expired cookies" when it recognizes the reason. Then you export again and resend it — no need to guess. In practice, YouTube cookies last for weeks.

Why this can’t be automated on Windows

Edge and Chrome have encrypted cookies with App-Bound Encryption since version 127: only the browser itself can get the key. That's why the main method is uploading them, not using a script.

Weekly cron job (optional)

On the Linux machine with Firefox signed in, you may never see the error.

# every Monday, 9 a.m.
0 9 * * 1 DLP_URL=https://dlp.seudominio DLP_UPLOAD_TOKEN=... /caminho/sync-cookies.sh

Day-to-day operations

Practically none.

docker compose logs -f app     # see what happened
docker compose restart app     # updates yt-dlp on boot
Roadmap

Where it is and what’s out of scope

v1 is complete and verified end to end. Anything not included here was cut on purpose — this is a personal tool, not a product.

v1 ✓
CompleteQueue, video and audio downloads, password-protected PWA, cookie upload, automatic expiration, deployment with Docker and Caddy. 77 tests, plus one that downloads a real video, plus browser UI verification.
Outside
Cut due to YAGNIResolution selection, playlists, subtitles, clip trimming, multiple users, and automatic retries. Each of these would be for an audience this project doesn't have.
Maybe
If it becomes painful enoughA one-click requeue button (right now you have to paste the URL again) and a more complete PWA installer on Android.