Self-Host Jellyfin: Plex Alternative Media Server 2026
TL;DR
Jellyfin is a completely free, open source media server — GPL 2.0, ~35K GitHub stars, no subscription, no server-side account required. It streams movies, TV shows, music, live TV (with a TV tuner), and photos to all your devices. Plex charges $5–8/month for Plex Pass features (hardware transcoding, offline sync, live TV). Jellyfin gives you everything for free. The tradeoff: Plex has more polished apps and better third-party device support.
Key Takeaways
- Jellyfin: GPL 2.0, ~35K stars — 100% free, no subscription ever
- vs Plex: Same core features; Plex has slicker apps, Jellyfin has no paywalled features
- vs Emby: Jellyfin is a fork of Emby after it went closed-source
- Hardware transcoding: Free (Plex requires Plex Pass for this)
- Requirements: 1–2GB RAM + storage for your media library
- Clients: Web, iOS, Android, Apple TV, Roku, Fire TV, Android TV, Smart TVs
Jellyfin vs Plex vs Emby
| Feature | Jellyfin | Plex | Emby |
|---|---|---|---|
| License | GPL 2.0 | Proprietary | Proprietary |
| Cost | Free | Free + $120/yr Plex Pass | Free + $54/yr Emby Premiere |
| Hardware transcoding | ✅ Free | Plex Pass required | Emby Premiere required |
| Live TV / DVR | ✅ Free | Plex Pass required | Emby Premiere required |
| Offline sync | ✅ Free | Plex Pass required | Emby Premiere required |
| Mobile apps | ✅ Free | Free (with limitations) | Emby Premiere or pay |
| Client count | Good | Excellent | Good |
| Third-party plugins | ✅ | Limited | ✅ |
| Account required | ❌ (fully local) | ✅ Plex account | ✅ Emby account |
| GitHub Stars | ~35K | — | — |
Server Requirements
- CPU: 2+ cores (transcoding is CPU/GPU intensive)
- RAM: 1–2GB (4GB if running alongside other services)
- Storage: Depends on library. 1080p files: 4–15GB each. 4K: 30–80GB each.
- Network: Gigabit LAN for local 4K, 10–25 Mbps for remote 1080p streams
Part 1: Docker Compose Setup
# docker-compose.yml
version: '3.8'
services:
jellyfin:
image: jellyfin/jellyfin:latest
container_name: jellyfin
restart: unless-stopped
network_mode: host # Enables network discovery (device auto-detection)
environment:
JELLYFIN_PublishedServerUrl: "https://media.yourdomain.com"
volumes:
- ./config:/config # Jellyfin config files
- ./cache:/cache # Metadata cache
- /mnt/media/movies:/media/movies:ro # Your movie library (read-only)
- /mnt/media/tv:/media/tv:ro # TV shows
- /mnt/media/music:/media/music:ro # Music
# Hardware transcoding (choose one based on GPU):
# devices:
# - /dev/dri/renderD128:/dev/dri/renderD128 # Intel/AMD GPU
# environment:
# JELLYFIN_DATA_DIR: /data
Or without host networking (ports mode):
services:
jellyfin:
image: jellyfin/jellyfin:latest
ports:
- "8096:8096" # HTTP
- "8920:8920" # HTTPS
- "7359:7359/udp" # Local discovery
- "1900:1900/udp" # DLNA
volumes:
- ./config:/config
- ./cache:/cache
- /mnt/media:/media:ro
docker compose up -d
Visit http://your-server:8096 → setup wizard → add your media libraries.
Part 2: HTTPS with Caddy
media.yourdomain.com {
reverse_proxy localhost:8096
}
For remote access, set in Jellyfin → Dashboard → Networking:
- Public HTTPS port: 443
- Custom SSL certificate path (or let Caddy handle TLS)
Part 3: Initial Setup Wizard
- Select language → Next
- Create admin user → username + password
- Add media libraries:
- Click
+→ Select type:Movies - Add folder:
/media/movies - Language: English
- Scan automatically: Yes
- Click
- Repeat for TV, Music
- Let the initial metadata scan complete (10–30 minutes depending on library size)
Part 4: Hardware Transcoding
Hardware transcoding drastically reduces CPU load for streaming:
Intel Quick Sync (Intel GPU)
services:
jellyfin:
devices:
- /dev/dri:/dev/dri
environment:
- JELLYFIN_PublishedServerUrl=https://media.yourdomain.com
group_add:
- "109" # video group (check with: stat -c "%g" /dev/dri/renderD128)
In Jellyfin Dashboard → Playback → Transcoding:
- Hardware acceleration:
Intel Quick Sync Video - Enable: H.264, HEVC, VP8, VP9, AV1
NVIDIA GPU
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities: [gpu, video]
In Dashboard → Transcoding: NVIDIA NVENC
No GPU (CPU Transcoding)
CPU transcoding works but uses significant CPU. On a 4-core server, expect 1–2 simultaneous 1080p streams before maxing out.
Part 5: Media Organization
Jellyfin follows Emby/Plex naming conventions:
movies/
The Matrix (1999)/
The Matrix (1999).mkv
The Matrix (1999).nfo # Optional: custom metadata
tv/
Breaking Bad/
Season 01/
Breaking Bad S01E01.mkv
Breaking Bad S01E02.mkv
Season 02/
Breaking Bad S02E01.mkv
music/
Artist Name/
Album Name (Year)/
01 - Track Name.flac
02 - Track Name.flac
Jellyfin auto-downloads metadata (posters, descriptions, ratings) from:
- TheMovieDB (movies/TV)
- MusicBrainz (music)
- TheTVDB (TV)
Part 6: Client Apps
Web Browser
Visit https://media.yourdomain.com — full web client.
iOS / Android
Official Jellyfin app:
- iOS: Jellyfin (free)
- Android: Jellyfin (free)
Third-party clients with better UI:
- Infuse 7 (iOS, best iOS media player)
- Swiftfin (official Swift rewrite for iOS)
- Findroid (Android, Material You UI)
Smart TVs and Streaming Devices
| Device | Client | Notes |
|---|---|---|
| Apple TV | Infuse 7 or Swiftfin | Infuse has best performance |
| Roku | Jellyfin Roku | Official channel |
| Fire TV | Jellyfin for Fire TV | In Amazon App Store |
| Android TV | Jellyfin for Android TV | Official |
| Samsung/LG TV | Web browser | Smart TV web app |
| Xbox/PlayStation | Web browser | Browser-based |
Part 7: Live TV and DVR
Requires a TV tuner connected to your server:
- HDHomeRun (network TV tuner, recommended)
- Hauppauge WinTV (USB tuner)
devices:
- /dev/dvb:/dev/dvb # USB DVB tuner
In Jellyfin Dashboard → Live TV:
- Add tuner device (HDHomeRun auto-discovered on network)
- Add TV guide: Schedules Direct ($25/year) or XMLTV
- Configure DVR storage location
- Start watching live TV and recording shows
Part 8: Plugins and Extensions
Jellyfin has a plugin catalog:
Dashboard → Plugins → Catalog:
- Playback Reporting: Track what you've watched
- Trakt.tv: Sync watch history to Trakt
- Fanart.tv: Better artwork from Fanart.tv
- Open Subtitles: Auto-download subtitles
- Bookshelf: Add books to your library
- Kodi Sync Queue: Sync watched status with Kodi
Remote Access and Security
Secure Remote Access
Never expose Jellyfin directly on port 80/443 without a reverse proxy. With Caddy:
media.yourdomain.com {
reverse_proxy localhost:8096
# Rate limit to prevent brute force:
rate_limit {
zone dynamic {
key {remote_host}
events 10
window 1m
}
}
}
Enable HTTPS Only
In Jellyfin → Dashboard → Networking:
- Require HTTPS: On
- Allow remote connections: On
- Remote IP whitelist: Leave blank (all IPs), or restrict to trusted IPs
Maintenance
# Update Jellyfin:
docker compose pull
docker compose up -d
# Backup:
tar -czf jellyfin-config-$(date +%Y%m%d).tar.gz ./config
# Rebuild metadata (if images are missing):
# Dashboard → Libraries → Scan all libraries
# Check logs:
docker compose logs -f jellyfin
See all open source media server tools at OSSAlt.com/alternatives/plex.