Your 4K deserves more than 15 Mbps
uncompressed is a hardened arr stack with VPN namespace isolation, Tailscale-only ingress, and self-healing containers. A Docker Compose config you can actually trust.
Three commands. ~8 minutes.
Prereqs — Docker + Compose, a Tailscale account, ProtonVPN WireGuard keys, and a domain on Cloudflare DNS.
# download & run the wizard (no git required)
$curl -L https://github.com/Lackoftactics/uncompressed/archive/main.tar.gz | tar xz
$cd uncompressed-main && ./setup.sh
Request, fetch, serve — untouched.
Family member opens Seerr, taps a poster. Everything after is automatic and auditable.
Not a tutorial. A production config.
Five opinions baked in, so you don't spend a weekend chasing Reddit threads about WireGuard kill switches.
qBittorrent lives inside Gluetun's network namespace.
Not a firewall rule — a CLONE_NEWNET kernel boundary. If the tunnel drops, there is no network path. No egress, no DNS, no reconnect race condition.
Every container reports a heartbeat.
Endpoint-specific health checks (30–60s), ordered depends_on, autoheal restarts on red.
No ports open to the internet.
Traefik binds to the Tailscale IP only. HTTPS via Cloudflare DNS-01. Not on the mesh? No access, not even a login page.
- 0 ports open on 0.0.0.0
- traefik bound to 100.x.y.z
- ACME via DNS, never HTTP
Intel Quick Sync mapped through /dev/dri.
Direct-play on Apple TV, Infuse, Swiftfin. Transcode only when a phone falls off cellular.
Three isolated Docker networks. No service talks to something it shouldn't.
network_mode: "service:gluetun")vpnReal dashboards. Not dressed-up mocks.
What your library looks like once everything settles. Click through the apps below.

Jellyfin library — movies, collections, continue watching. All served at full Blu-ray quality.
10 containers. One .env file.
Configured across two Compose stacks (infra/ and arr/), sharing a single secrets file.
Jellyfin
Media server · hardware transcoding via QSV
Seerr
Request UI for movies & TV, per-user approval
Sonarr
TV show automation, season packs, upgrades
Radarr
Movie automation, quality profiles, renaming
Prowlarr
Indexer aggregation, one config, all apps
Bazarr
Subtitle management, multi-language, forced
qBittorrent
Torrent client, isolated inside VPN namespace
Gluetun
WireGuard tunnel via ProtonVPN, kill-switch
Traefik
Reverse proxy, automatic HTTPS via ACME
Autoheal
Container health monitor, auto-restart on red
Tailscale
Host-level, not a container — your only ingress
Cloudflare
DNS-01 ACME for cert renewal. Control plane only.
Cloudflare is control plane only.
Used as the ACME DNS-01 target for cert renewal. Never in the user-traffic path — Tailscale handles that end-to-end.

Runs on a used NUC.
Not compatible with Raspberry Pi or ARM. Hardware transcoding requires Intel Quick Sync (7th gen+).
| Component | Minimum | Recommended |
|---|---|---|
| CPU | x86_64 quad-core | Intel w/ Quick Sync (7th gen+) |
| RAM | 8 GB | 16 GB |
| Storage | SSD for configs + HDD for media | NVMe + large HDD array |
| OS | Any Linux with Docker | Unraid |
| Network | Home LAN + Tailscale node | + Gigabit uplink · IPv6 |
Stop watching a 15 Mbps imitation of your movie.
Clone the repo, run the wizard, come back in a weekend with a library you own.