All apps · 0 apps
fetchly
Docker app from GillBates' Repository
Overview
Readme
View on GitHub
Self-hosted media downloader for YouTube, TikTok, Instagram & Facebook.
Paste a link, preview it, pick a format — with a live job dashboard, waveform audio trimming, and Lalal.ai stem separation.

Dashboard — paste a link, preview the media, pick a format, and track every job live.

Authenticated login with invisible, server-verified anti-bot protection.
Why fetchly
- A web UI, not the CLI — no
yt-dlpflags to remember; format and quality are picked from menus. - It stays running — a persistent dashboard for queued, active, done, and failed jobs, not a one-shot command.
- More than downloading — trim audio on a waveform and split vocals from instrumentals without leaving the app.
- Self-hosted — a single container, SQLite on a mounted volume, authenticated access, and a hardened default setup.
Features
| Feature | What you get |
|---|---|
| Download everywhere | Save video or audio from YouTube, TikTok, Instagram, and Facebook in one place. |
| Stay in control | Follow every queued, active, completed, or failed job from a live dashboard. |
| Choose your quality | Pick the format and quality you want, then let fetchly handle the conversion. |
| Trim with precision | Cut audio visually with an interactive waveform before you download or process it further. |
| Create clean stems | Connect Lalal.ai to separate vocals and instrumentals when you need production-ready tracks. |
| Keep it private | Run everything yourself with persistent storage, authentication, CSRF protection, anti-bot checks, and login rate limiting. |
| Ready to run | Get the complete application and its required dependencies in one Docker image. |
Supported platforms
Video and audio downloads from YouTube, TikTok, Instagram, and Facebook.
Note: Only publicly accessible URLs work — private videos will not download.
Quickstart
Docker is the recommended way to run fetchly. The image (Docker Hub) bundles ffmpeg, yt-dlp, yt-dlp-ejs, and deno — nothing else to install.
Docker Compose
# compose.yaml
services:
fetchly:
image: giiibates/fetchly:latest
container_name: fetchly
restart: unless-stopped
ports:
- "8000:8000"
environment:
FETCHLY_SECRET_KEY: ${FETCHLY_SECRET_KEY:?generate with: openssl rand -base64 32}
FETCHLY_ADMIN_PASSWORD: ${FETCHLY_ADMIN_PASSWORD:?the admin login password}
volumes:
- ./data:/app/data
export FETCHLY_SECRET_KEY="$(openssl rand -base64 32)"
export FETCHLY_ADMIN_PASSWORD="change-me"
docker compose up -d
A fuller compose file with logging, timezone, and reverse-proxy notes lives in docker/docker-compose.yml.
docker run
docker run --rm \
-p 8000:8000 \
-e FETCHLY_SECRET_KEY="$(openssl rand -base64 32)" \
-e FETCHLY_ADMIN_PASSWORD="change-me" \
-v "$PWD/data:/app/data" \
giiibates/fetchly:latest
Then open http://127.0.0.1:8000 and sign in as admin.
To build the image yourself: docker build -f docker/Dockerfile -t fetchly .
Standalone
Requires Linux, Python 3.13, and ffmpeg, yt-dlp, deno on PATH.
pip install -r requirements.txt && pip install yt-dlp yt-dlp-ejs
export FETCHLY_SECRET_KEY="$(openssl rand -base64 32)"
export FETCHLY_ADMIN_PASSWORD="change-me"
python run.py
Configuration
Everything is set through environment variables (with Compose, put them in an .env file next to the compose file).
| Variable | Default | Description |
|---|---|---|
FETCHLY_SECRET_KEY |
— | Required. Signs session cookies. Generate with openssl rand -base64 32; the app refuses to start without it. |
FETCHLY_ADMIN_PASSWORD |
— | Required. Password for the admin login. |
FETCHLY_ADMIN_USER |
admin |
Admin login username. |
FETCHLY_BEHIND_HTTPS |
0 |
Set to 1 when serving over HTTPS (e.g. behind a reverse proxy) so session cookies are marked Secure. |
FETCHLY_COOKIES_DIR |
data/ |
Directory scanned for a cookies.txt that yt-dlp uses for age- or login-gated content. |
TZ |
Europe/Berlin |
Container timezone, used for timestamps in the UI and logs. |
LOG_LEVEL |
info |
One of debug, info, warning, error. |
PORT / HOST |
8000 / 0.0.0.0 |
Bind address for the standalone server (python run.py). |
Lalal.ai stem separation is enabled by entering an API key under Settings in the app — no environment variable required.
Reverse proxy
fetchly speaks plain HTTP inside the container. Terminate TLS at a proxy (Caddy, nginx, Traefik), forward to port 8000, and set FETCHLY_BEHIND_HTTPS=1. An example Caddyfile is included.
Built with
- yt-dlp + yt-dlp-ejs and deno — media extraction and YouTube JS-challenge solving
- ffmpeg — transcoding, audio trimming, and waveform generation
- wavesurfer.js — browser-based waveform display and trim UI
- Gunicorn + Uvicorn — ASGI server used in Docker
- Lalal.ai — optional vocals/instrumental stem separation
The image ships upstream static ffmpeg/ffprobe builds and stable yt-dlp PyPI releases; Debian's media packages are pinned out so they cannot shadow them.
Install Fetchly on Unraid in a few clicks.
Find Fetchly in Community Apps on your Unraid server, review the template, and click Install. Unraid handles the Docker app or plugin setup from the published template.
Categories
Download Statistics
Related apps
Explore more like this
Explore allDetails
giiibates/fetchly:latestRuntime arguments
- Web UI
http://[IP]:[PORT:8000]- Network
bridge- Shell
bash- Privileged
- false
- Extra Params
--restart unless-stopped
Template configuration
REQUIRED: Signs session cookies. Generate with: openssl rand -base64 32. The app refuses to start without this.
- Target
- FETCHLY_SECRET_KEY
REQUIRED: Password for the admin login.
- Target
- FETCHLY_ADMIN_PASSWORD
Admin login username
- Target
- FETCHLY_ADMIN_USER
- Default
- admin
Set to '1' when serving over HTTPS (e.g. behind a reverse proxy) so session cookies are marked Secure
- Target
- FETCHLY_BEHIND_HTTPS
- Default
- 0
Verbosity of the container logs. Default: INFO. Use DEBUG only for troubleshooting - it is noisy.
- Target
- LOG_LEVEL
- Default
- INFO|DEBUG|WARNING|ERROR|CRITICAL
- Value
- INFO
Container timezone (IANA name, e.g. Etc/UTC or Europe/Berlin), used for timestamps in the UI and logs
- Target
- TZ
- Default
- Etc/UTC
fetchly Web UI/API port
- Target
- 8000
- Default
- 8000
Jobs, SQLite database, and downloads
- Target
- /app/data
- Default
- /mnt/user/appdata/fetchly/data