TL;DR — Quick Summary

Set up Jellyfin, the free open-source media server, with Docker. Enable hardware transcoding (NVIDIA/Intel QSV/VAAPI), organize libraries, and stream movies, TV, and music anywhere.

What Is Jellyfin?

Jellyfin is a free, open-source media server that lets you organize, manage, and stream your personal media collection — movies, TV shows, music, photos, and live TV — to any device, anywhere. It is the fully free alternative to Plex and Emby, with no paid tiers, no account requirements, and no usage tracking.

Key features:

  • Completely free — no premium plans, all features included
  • No account required — no cloud sign-in, everything stays local
  • Hardware transcoding — NVIDIA NVENC, Intel QSV, AMD AMF, VAAPI
  • Rich metadata — automatic scraping from TMDB, TVDB, MusicBrainz
  • Multi-user — separate profiles with parental controls
  • Live TV & DVR — with a TV tuner and guide data (EPG)
  • Plugins — subtitles (OpenSubtitles), fan art, audiobooks, and more
  • Cross-platform clients — Android, iOS, Web, Smart TV, Fire TV, Roku

Prerequisites

  • Docker installed on your server.
  • Media files organized in directories (movies, TV shows, music).
  • 4 GB RAM minimum (8 GB recommended with transcoding).
  • Optional: NVIDIA GPU or Intel CPU with Quick Sync for hardware transcoding.

Installation with Docker

CPU Only (No Transcoding)

docker run -d \
  --name jellyfin \
  -p 8096:8096 \
  -v jellyfin-config:/config \
  -v jellyfin-cache:/cache \
  -v /media/movies:/media/movies \
  -v /media/tv:/media/tv \
  -v /media/music:/media/music \
  --restart always \
  jellyfin/jellyfin:latest

With NVIDIA GPU Transcoding

docker run -d \
  --name jellyfin \
  --gpus all \
  -p 8096:8096 \
  -v jellyfin-config:/config \
  -v jellyfin-cache:/cache \
  -v /media:/media \
  --restart always \
  jellyfin/jellyfin:latest

With Intel QSV / VAAPI Transcoding

docker run -d \
  --name jellyfin \
  --device /dev/dri:/dev/dri \
  -p 8096:8096 \
  -v jellyfin-config:/config \
  -v jellyfin-cache:/cache \
  -v /media:/media \
  --restart always \
  jellyfin/jellyfin:latest

Docker Compose

services:
  jellyfin:
    image: jellyfin/jellyfin:latest
    container_name: jellyfin
    restart: always
    ports:
      - "8096:8096"
    volumes:
      - jellyfin-config:/config
      - jellyfin-cache:/cache
      - /media/movies:/media/movies
      - /media/tv:/media/tv
      - /media/music:/media/music
    # Uncomment for GPU transcoding:
    # deploy:
    #   resources:
    #     reservations:
    #       devices:
    #         - capabilities: [gpu]
    # OR for Intel QSV:
    # devices:
    #   - /dev/dri:/dev/dri

volumes:
  jellyfin-config:
  jellyfin-cache:

Media Organization

Jellyfin works best with properly named files:

Movies

/media/movies/
  The Matrix (1999)/
    The Matrix (1999).mkv
  Inception (2010)/
    Inception (2010).mkv
    Inception (2010).srt       # subtitle

TV Shows

/media/tv/
  Breaking Bad/
    Season 01/
      Breaking Bad S01E01.mkv
      Breaking Bad S01E02.mkv
    Season 02/
      Breaking Bad S02E01.mkv

Music

/media/music/
  Artist Name/
    Album Name (Year)/
      01 - Track Name.flac
      02 - Track Name.flac

Tip: Jellyfin uses TMDB, TVDB, and MusicBrainz for metadata. Correct naming ensures automatic poster, backdrop, and cast information retrieval.


Hardware Transcoding

Transcoding converts media formats on-the-fly for devices that cannot play the original format. Hardware acceleration offloads this to the GPU, dramatically reducing CPU usage.

Configuration

  1. Go to Dashboard → Playback → Transcoding.
  2. Select your Hardware Acceleration method.
  3. Enable supported codecs.
MethodGPUDocker FlagPerformance
NVIDIA NVENCGeForce/Quadro--gpus allExcellent (10+ streams)
Intel QSVIntel 6th gen+ CPU--device /dev/driVery good (6-8 streams)
VAAPIIntel/AMD GPU--device /dev/driGood (4-6 streams)
AMD AMFAMD GPU--device /dev/driGood (4-6 streams)
SoftwareCPU onlyNonePoor (1-2 streams)

Verify GPU Transcoding Is Working

# NVIDIA: Check GPU utilization during playback
nvidia-smi

# Intel: Check VAAPI/QSV usage
intel_gpu_top

Remote Access

Use Traefik, Nginx, or Caddy to expose Jellyfin with HTTPS on a subdomain:

# Nginx example
server {
    listen 443 ssl;
    server_name media.yourdomain.com;

    ssl_certificate /etc/letsencrypt/live/media.yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/media.yourdomain.com/privkey.pem;

    location / {
        proxy_pass http://localhost:8096;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_buffering off;
    }
}

Option 2: Tailscale / WireGuard

Access Jellyfin via a VPN without exposing any ports to the internet. See Tailscale Mesh VPN or WireGuard VPN.


Troubleshooting

Metadata Not Downloading

Cause: Jellyfin cannot reach TMDB/TVDB APIs, or files are not named correctly.

Fix:

  1. Verify file naming matches the format above.
  2. Check DNS resolution from the container: docker exec jellyfin ping api.themoviedb.org.
  3. Manually identify mismatched items in Dashboard → Libraries → Scan.

Transcoding Fails with “Playback Error”

Cause: GPU device not passed to Docker, or driver mismatch.

Fix:

  1. NVIDIA: Verify nvidia-smi works on host, ensure nvidia-container-toolkit is installed.
  2. Intel: Verify /dev/dri contains renderD128.
  3. Check Jellyfin logs: Dashboard → Logs → ffmpeg.

Buffering on Remote Playback

Cause: Upload bandwidth too low for the stream bitrate, or transcoding is too slow.

Fix:

  1. Lower the remote streaming quality in client settings (e.g., 4 Mbps instead of Original).
  2. Enable hardware transcoding to speed up real-time conversion.
  3. Use Jellyfin’s Download feature to sync media for offline viewing.

Jellyfin vs. Plex vs. Emby

FeatureJellyfinPlexEmby
Cost100% freeFree + $5/mo or $120 lifetimeFree + $5/mo or $119 lifetime
Open SourcePartial
Account Required✅ (cloud)
HW Transcoding✅ Free✅ Plex Pass only✅ Premiere only
Live TV & DVR✅ Free✅ Plex Pass only✅ Premiere only
Mobile Sync✅ Free✅ Plex Pass only✅ Premiere only
Tracking/Analytics❌ None✅ Sends telemetry✅ Sends telemetry
Plugins✅ Community❌ Limited✅ Community
Client AppsGoodExcellentGood

Summary

Jellyfin gives you a private, free, ad-free media streaming experience that rivals Plex — without the subscriptions, cloud accounts, or telemetry. Deploy it with Docker in 5 minutes, enable GPU transcoding, and stream to any device from anywhere.