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
- Go to Dashboard → Playback → Transcoding.
- Select your Hardware Acceleration method.
- Enable supported codecs.
| Method | GPU | Docker Flag | Performance |
|---|---|---|---|
| NVIDIA NVENC | GeForce/Quadro | --gpus all | Excellent (10+ streams) |
| Intel QSV | Intel 6th gen+ CPU | --device /dev/dri | Very good (6-8 streams) |
| VAAPI | Intel/AMD GPU | --device /dev/dri | Good (4-6 streams) |
| AMD AMF | AMD GPU | --device /dev/dri | Good (4-6 streams) |
| Software | CPU only | None | Poor (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
Option 1: Reverse Proxy (Recommended)
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:
- Verify file naming matches the format above.
- Check DNS resolution from the container:
docker exec jellyfin ping api.themoviedb.org. - Manually identify mismatched items in Dashboard → Libraries → Scan.
Transcoding Fails with “Playback Error”
Cause: GPU device not passed to Docker, or driver mismatch.
Fix:
- NVIDIA: Verify
nvidia-smiworks on host, ensurenvidia-container-toolkitis installed. - Intel: Verify
/dev/dricontainsrenderD128. - 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:
- Lower the remote streaming quality in client settings (e.g., 4 Mbps instead of Original).
- Enable hardware transcoding to speed up real-time conversion.
- Use Jellyfin’s Download feature to sync media for offline viewing.
Jellyfin vs. Plex vs. Emby
| Feature | Jellyfin | Plex | Emby |
|---|---|---|---|
| Cost | 100% free | Free + $5/mo or $120 lifetime | Free + $5/mo or $119 lifetime |
| Open Source | ✅ | ❌ | Partial |
| 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 Apps | Good | Excellent | Good |
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.