selfhost.directory

The index of self-hostable projects — ranked, categorized and served with live updates.
Own your data and stop giving it to big tech.

uncompressed logo

Self-host uncompressed

v1.0.0

Hardened Docker Compose media stack with VPN isolation

ReleaseOpen SourceMIT
Updated5 months ago
LanguageShell
Setup difficultyAdvanced
Stars
213
CPU
x86_64 quad-core (Intel 7th gen+ with Quick Sync recommended)
RAM
8 GB (16 GB recommended)
Storage
SSD for configs + HDD for media (NVMe + large HDD array recommended)
Ports
8096 (Jellyfin direct access for LAN clients (Infuse, Apple TV)), 80 (Traefik HTTP (redirects to HTTPS) on Tailscale IP), 443 (Traefik HTTPS on Tailscale IP)
Requires
Cloudflare DNS, Docker, ProtonVPN, Tailscale
Install with Docker Compose
Jellyfin library view showing movies, collections, and continue watchingJellyfin media libraryRadarr movie managementSonarr TV show management

What is uncompressed?

uncompressed delivers a production-grade Docker Compose stack for a personal media server. It assembles a full *arr pipeline — media server, TV and movie automation, indexer aggregation, request UI, subtitle management, and torrent client — behind a Traefik reverse proxy that provisions HTTPS certificates through Cloudflare DNS. The defining characteristic is kernel-level VPN isolation: the torrent client and indexer run inside the VPN container's network namespace, so a tunnel failure leaves zero network paths for data to escape. External access is limited to a Tailscale mesh; the proxy binds solely to the Tailscale address, keeping all ports off the public internet. Every service runs health checks with an auto-healing watchdog. Intel Quick Sync transcoding is available on supported hardware. A single environment file drives the entire deployment, guided by an interactive setup script. The stack requires x86_64 Linux with a 7th-generation or newer Intel CPU; ARM platforms will not work.

Should you self-host uncompressed?

uncompressed scores 47/100 on selfhost.directory (how scoring works) and ranks #71 of 118 in Media Server. It has 213 GitHub stars.

It shipped 1 stable release in the past year. The latest, v1.0.0, came out on 4 April 2026.

Setup is advanced: plan for several services and some ongoing maintenance. It is MIT-licensed and written mostly in Shell.

Its closest alternative on selfhost.directory is Jellyfin (88/100, 58 733 stars). It scores higher overall, so compare the two before you pick. See uncompressed vs Jellyfin side by side.

Features

  • Guided setup wizard
  • Hardware Transcoding (Intel Quick Sync)Requires Intel 7th gen+ CPU with Quick Sync
  • Network segmentation
  • Self-healing containers
  • Single .env configuration
  • VPN namespace isolation

uncompressed README

How to install uncompressed

Install uncompressed with Docker Compose

curl -L https://github.com/Lackoftactics/uncompressed/archive/main.tar.gz | tar xz
cd uncompressed-main && ./setup.sh

Or with git:

git clone https://github.com/Lackoftactics/uncompressed.git
cd uncompressed && ./setup.sh

Manual setup:

cp .env.example .env              # fill in secrets, domain, Tailscale IP, WG keys, CF token
ln -s ../.env arr/.env            # each compose stack reads its own .env
ln -s ../.env infra/.env
docker network create traefik_proxy

Then start the stack:

docker compose -f infra/docker-compose.yml up -d  # traefik first
docker compose -f arr/docker-compose.yml up -d     # media pipeline (9 containers)

Guided setup.sh wizard available. Requires Docker + Compose, Tailscale account, ProtonVPN WireGuard keys, Cloudflare DNS domain.

How to configure uncompressed

  • ACME_EMAILyour@email.comEmail for Let's Encrypt ACME registration

    Email for Let's Encrypt ACME registration

  • BT_PORT51413Torrenting port

    Torrenting port

  • CF_API_EMAILyour@email.comCloudflare account email

    Cloudflare account email

  • CF_DNS_API_TOKENyour_cloudflare_dns_api_tokenCloudflare DNS API token for ACME DNS-01 challenge

    Cloudflare DNS API token for ACME DNS-01 challenge

  • DATA_DIR/mnt/user/appdataConfig/appdata base directory

    Config/appdata base directory

  • DOMAIN_NAMEexample.comDomain for Traefik routing (e.g. media.example.com)

    Domain for Traefik routing (e.g. media.example.com)

  • DOWNLOADS_DIR/mnt/user/media/downloads/qbittorrentDownloads directory for qBittorrent

    Downloads directory for qBittorrent

  • MEDIA_MOVIES_DIR/mnt/user/media/moviesMovies media directory

    Movies media directory

  • MEDIA_TV_DIR/mnt/user/media/tvTV shows media directory

    TV shows media directory

  • PGID1000Container group ID

    Container group ID

  • PROTONVPN_PASSWORDyour_protonvpn_passwordProtonVPN password (OpenVPN fallback)

    ProtonVPN password (OpenVPN fallback)

  • PROTONVPN_USERNAMEyour_protonvpn_usernameProtonVPN username (OpenVPN fallback)

    ProtonVPN username (OpenVPN fallback)

  • PUID1000Container user ID

    Container user ID

  • QB_PASSWORDchange_meqBittorrent WebUI password

    qBittorrent WebUI password

  • QB_USERNAMEadminqBittorrent WebUI username

    qBittorrent WebUI username

  • TAILSCALE_IP100.x.x.xTailscale IP to bind Traefik to (not 0.0.0.0)

    Tailscale IP to bind Traefik to (not 0.0.0.0)

  • TZEurope/WarsawTimezone

    Timezone

  • WG_PRIVATE_KEYyour_wireguard_private_keyWireGuard private key from ProtonVPN

    WireGuard private key from ProtonVPN

  • WG_PUBLIC_KEYyour_wireguard_public_keyWireGuard public key from ProtonVPN

    WireGuard public key from ProtonVPN

  • WIREGUARD_ADDRESSES10.2.0.2/32WireGuard address

    WireGuard address

uncompressed releases & version history

More in Self-hosting

Rate this project

Click to rate — no account needed.

0 comments

Posting as guest
Loading comments…