Self-Hosted Media Server 2026: Jellyfin vs Plex vs Emby — The Complete Homelab Guide
Reading time: ~16 minutes Audience: Homelab owners building their first media server stack
Introduction: Why Self-Host Your Media in 2026?
Streaming subscriptions have become cable TV in disguise. Between Netflix ($17.99), Disney+ ($15.99), Max ($16.99), Hulu ($18.99), and a half-dozen others, the monthly bill easily crosses $100 — and you still do not own anything. Shows vanish overnight when licensing deals expire. Regional restrictions block content you paid for. And every platform now injects ads into their “ad-free” tiers.
Building a self-hosted media server solves all three problems: you own your media, you control access, and you pay once for hardware that lasts years. A full media server setup — a refurbished mini PC, a couple of 8 TB hard drives, and free open-source software — pays for itself in under 12 months compared to streaming subscriptions. After that, it is pure savings.
In 2026, the self-hosted media server landscape has three clear contenders: Jellyfin (fully open-source and free), Plex (commercial, polished, widely supported), and Emby (the middle ground with an open core and optional premium). This guide compares all three — something no other article does — with real Docker Compose files you can copy and paste, hardware transcoding requirements for 4K streaming, and a decision tree that tells you which to pick in under a minute.
The Three Contenders at a Glance
| Feature | Jellyfin | Plex | Emby |
|---|---|---|---|
| License | GPL (fully open-source) | Proprietary (freemium) | Proprietary (open-core) |
| Cost | Completely free | Free base; Plex Pass $6.99/mo | Free base; Emby Premiere $4.99/mo |
| Cloud dependency | None — fully local | Required for authentication | Optional (local auth available) |
| Hardware transcoding | Free (VAAPI, QSV, NVENC) | Requires Plex Pass | Requires Emby Premiere |
| Client apps | Good (Android, iOS, web, Roku, Apple TV) | Excellent (every platform) | Very good (most platforms) |
| Plugin ecosystem | Growing community plugins | Official channels + agents | Plugin catalog |
| Live TV / DVR | Free (HDHomeRun, m3u) | Plex Pass required | Emby Premiere required |
| User management | Built-in, no limits | Built-in, managed users free | Built-in |
| Mobile sync/download | Not native (3rd-party) | Plex Pass required | Emby Premiere required |
The short version: pick Jellyfin if you want everything free and do not mind occasional rough edges. Pick Plex if you want Netflix-like polish and are willing to pay for premium features. Pick Emby if you want more customization than Plex but better app support than Jellyfin.
Deep Dive: How Each Platform Works
Jellyfin — The Open-Source Purist
Jellyfin is a fork of Emby 3.5.2, created in December 2018 when Emby closed its source code. Since then, the Jellyfin community has built a fully open-source media server under the GPL license. There is no premium tier, no paywall, and no cloud authentication server phoning home. Everything runs locally on your hardware.
Jellyfin’s plugin ecosystem is community-driven and covers metadata fetching (TheMovieDB, TheTVDB, OpenSubtitles), client-side features (Kodi Sync, Intro Skipper), and advanced tools (Bookshelf for ebooks, Tautulli-style analytics). Hardware transcoding works out of the box with Intel Quick Sync (QSV), AMD VAAPI, and NVIDIA NVENC — no license key required.
The trade-off: Jellyfin’s client apps, while solid, are not as polished as Plex. The Apple TV app is community-maintained (Swiftfin). The Roku app occasionally lags behind the web client in features. For power users comfortable with a bit of rough-around-the-edges software, Jellyfin is the obvious choice. It is the only option that respects your privacy unconditionally.
Plex — The Polished Commercial Option
Plex is the most mature media server platform, with over 15 years of development. It offers a freemium model: the core server and playback are free, but premium features — hardware transcoding, Live TV/DVR, mobile sync, skip intro, and Plexamp — require a Plex Pass subscription ($6.99/month, $39.99/year, or $149.99 lifetime).
Plex’s biggest strength is its client app ecosystem. There is a native app for every device imaginable: every smart TV platform, every streaming stick, every game console, and every mobile OS. The Plexamp music player is genuinely excellent. Plex’s metadata matching is best-in-class, and the discovery features (AI-powered recommendations, “Plex Discover” universal watchlist, cross-service search) feel like a commercial streaming service.
The trade-off: Plex requires cloud authentication for user sign-in. When Plex’s auth servers go down — and they do, a few times a year — you cannot sign into your own server. The mobile apps require a one-time $5.99 activation fee (or Plex Pass) for full playback. And Plex has been gradually layering in their own ad-supported content, which purists find distasteful on a self-hosted server.
Emby — The Middle Ground
Emby occupies the space between Jellyfin’s open-source purity and Plex’s commercial polish. Its core server is proprietary but exposes enough configuration for power users. Emby Premiere ($4.99/month, $54/year, or $149 lifetime) unlocks hardware transcoding, Live TV/DVR, mobile sync, cover art customization, and Cinema Intros — roughly equivalent to Plex Pass at a slightly lower subscription price.
Emby’s unique strengths: local authentication is a first-class feature (unlike Plex), the metadata manager is more flexible than Plex’s, and the plugin architecture supports deeper customization. Emby also has better parental controls than Jellyfin and a more configurable home screen layout. Client support covers all major platforms, though the app ecosystem is smaller than Plex.
The trade-off: Emby’s community is the smallest of the three. Fewer plugins, fewer third-party tools, and fewer community-written guides exist compared to Jellyfin or Plex. Documentation quality varies. And like Jellyfin, the premium features are behind a paywall — though unlike Plex, Emby does not require cloud authentication.
Hardware Transcoding: What Your Homelab Needs
Hardware transcoding converts video from one format to another in real time using a GPU or integrated graphics. Without it, the CPU must handle transcoding in software, which is slow and power-hungry. For a single 1080p stream, any modern CPU handles software transcoding fine. For 4K HDR with tone mapping, hardware transcoding is mandatory.
CPU Requirements Per Stream
| Stream Type | Software (CPU only) | Hardware (GPU/iGPU) |
|---|---|---|
| 1080p → 1080p | ~2,000 PassMark per stream | Minimal GPU usage |
| 1080p → 720p | ~1,500 PassMark per stream | Minimal GPU usage |
| 4K → 1080p (SDR) | ~12,000 PassMark per stream | Intel QSV or NVIDIA NVENC |
| 4K HDR → 1080p SDR (tone mapping) | ~17,000 PassMark per stream | Intel QSV (7th-gen+) or NVIDIA 1050+ |
A practical example: an Intel Core i3-12100 (PassMark ~13,400) can handle roughly one 4K software transcode or 6+ 1080p software transcodes. Add Intel Quick Sync, and that same i3-12100 handles 4-5 simultaneous 4K HDR-to-1080p SDR transcodes with tone mapping — a 5x improvement.
GPU/iGPU Recommendations for Hardware Transcoding
| Hardware | Transcode Engine | 4K Performance | Best For |
|---|---|---|---|
| Intel Quick Sync (7th-gen+) | QSV | 4-8 simultaneous 4K transcodes | Most homelab builds; free with Intel CPU |
| Intel Arc A310/A380 | QSV (discrete) | 8+ simultaneous 4K transcodes | Dedicated transcoding box; AV1 encode |
| NVIDIA GTX 1050 Ti+ | NVENC | 3-5 simultaneous 4K transcodes | Existing gaming GPU reuse |
| NVIDIA Quadro P400 | NVENC | 2-3 simultaneous 4K transcodes | Low-power, no external power needed |
| AMD Ryzen APU (Vega) | VCN | 1-2 simultaneous 4K transcodes | Budget builds; Linux VAAPI support improving |
The homelab sweet spot: An Intel N100 mini PC (~$150) with Quick Sync handles 2-3 simultaneous 4K transcodes while drawing 6W idle. Pair it with a NAS for storage, and you have a media server that rivals a $2,000 prebuilt NAS in transcoding capability.
Docker Compose Setup: Get Running in 10 Minutes
All three media servers run beautifully in Docker. The key is passing through the hardware transcoding device (/dev/dri) and mapping your media directories correctly.
Jellyfin Docker Compose
version: '3.8'
services:
jellyfin:
image: jellyfin/jellyfin:latest
container_name: jellyfin
restart: unless-stopped
network_mode: host # Simplifies DLNA and discovery
environment:
- PUID=1000
- PGID=1000
- TZ=Asia/Jakarta
volumes:
- ./config:/config
- ./cache:/cache
- /mnt/media/tv:/data/tvshows
- /mnt/media/movies:/data/movies
- /mnt/media/music:/data/music
devices:
- /dev/dri:/dev/dri # Intel Quick Sync hardware transcoding
# For NVIDIA GPUs, add:
# deploy:
# resources:
# reservations:
# devices:
# - driver: nvidia
# count: 1
# capabilities: [gpu]
After docker compose up -d, Jellyfin is available at http://your-server-ip:8096. Complete the setup wizard, add your media libraries, and enable hardware transcoding under Dashboard → Playback → Hardware Acceleration → Intel Quick Sync (QSV).
Plex Docker Compose
version: '3.8'
services:
plex:
image: lscr.io/linuxserver/plex:latest
container_name: plex
restart: unless-stopped
network_mode: host
environment:
- PUID=1000
- PGID=1000
- TZ=Asia/Jakarta
- VERSION=docker
- PLEX_CLAIM=claim-xxxxxxxxxxxxx # Get from https://plex.tv/claim
volumes:
- ./config:/config
- /mnt/media/tv:/tv
- /mnt/media/movies:/movies
- /mnt/media/music:/music
devices:
- /dev/dri:/dev/dri
Important: PLEX_CLAIM is a one-time token that links your server to your Plex account. It expires in 4 minutes — generate it at plex.tv/claim right before running docker compose up -d. The claim token is only needed for first-run; remove it after setup.
Plex is available at http://your-server-ip:32400/web. Hardware transcoding is enabled under Settings → Transcoder → Use hardware acceleration when available — but remember, this requires Plex Pass.
Emby Docker Compose
version: '3.8'
services:
emby:
image: emby/embyserver:latest
container_name: emby
restart: unless-stopped
network_mode: host
environment:
- UID=1000
- GID=1000
- GIDLIST=1000,44,109 # 44=video, 109=render for hardware transcoding
- TZ=Asia/Jakarta
volumes:
- ./config:/config
- /mnt/media/tv:/mnt/share1
- /mnt/media/movies:/mnt/share2
- /mnt/media/music:/mnt/share3
devices:
- /dev/dri:/dev/dri
Emby is available at http://your-server-ip:8096. The GIDLIST environment variable includes group IDs for video (44) and render (109), which are required for hardware transcoding access on Linux. Enable hardware transcoding in Settings → Transcoding → Enable hardware acceleration. Requires Emby Premiere.
Reverse Proxy Integration
Once your media server is running, you probably want to access it with a proper domain. Here is an example Nginx Proxy Manager (NPM) config:
- Domain:
jellyfin.yourdomain.com - Scheme:
http - Forward IP:
192.168.1.50 - Forward Port:
8096 - SSL: Request Let’s Encrypt certificate
- WebSocket Support: Enable (required for playback progress reporting)
If you are using Cloudflare Tunnel instead of port forwarding, add a public hostname pointing to http://localhost:8096 inside the cloudflared configuration. See our Cloudflare Tunnel guide for the full walkthrough. For detailed NPM configuration, refer to our Nginx Proxy Manager tutorial.
4K Streaming & Real-World Performance
4K is where media servers earn their keep. Direct Play — streaming without any transcoding — is the ideal path: the client device decodes the original file, and the server does almost no work. A Raspberry Pi 4 can Direct Play 4K to a modern smart TV all day.
The challenge is transcoding: when the client cannot play the original format (wrong codec, insufficient bandwidth, burned subtitles), the server must convert the stream in real time.
Bandwidth Requirements
| Quality | Direct Play (per stream) | Transcode Target |
|---|---|---|
| 4K Blu-ray remux | 60-100 Mbps | — |
| 4K streaming (web-dl) | 25-40 Mbps | — |
| 4K → 1080p (10 Mbps) | — | ~10 Mbps |
| 1080p Blu-ray remux | 25-35 Mbps | — |
| 1080p streaming | 8-15 Mbps | — |
Network recommendation: Gigabit Ethernet (1 Gbps) for your media server and any wired clients. A single 4K remux (~80 Mbps average, bursting higher) will saturate a 100 Mbps link. For Wi-Fi clients, ensure a strong 5 GHz signal and expect occasional buffering on high-bitrate 4K files. If you are setting up your homelab network, invest in a managed switch with at least Gigabit ports on every link.
Jellyfin-Specific: Tone Mapping
Jellyfin’s 4K HDR-to-SDR tone mapping is entirely free and works with Intel Quick Sync on 7th-gen CPUs and newer, plus NVIDIA GPUs. This is a massive advantage over Plex and Emby, both of which gate hardware tone mapping behind their premium tiers.
Remote Access: How to Stream from Anywhere
Once your media server is running locally, the next question is how to access it outside your home.
| Method | Security | Complexity | Best For |
|---|---|---|---|
| WireGuard / Tailscale VPN | Excellent | Low | You + a few trusted users; no public exposure |
| Cloudflare Tunnel | Very good | Low | Public access without opening ports; HTTPS included |
| Reverse proxy + Let’s Encrypt | Good | Medium | Full public access with domain + SSL |
| Port forwarding | Poor | Low | Last resort; exposes your home IP |
For the privacy-focused approach, install Tailscale on your media server and every client device. You get encrypted WireGuard tunnels, a private IP range (100.x.x.x), and zero ports exposed to the internet. Tailscale’s free plan supports up to 100 devices.
For sharing with family members who are not technical, use Cloudflare Tunnel. It creates an outbound-only connection from your homelab to Cloudflare’s edge — no open ports, no DDNS, and free SSL. Combine it with Cloudflare Access policies to require a one-time email code or Google login before anyone reaches your server. Our Cloudflare Tunnel guide covers the full setup.
Decision Tree: Which Media Server Is Right for You?
Answer these questions to find your match in under a minute:
-
Do you want everything completely free and are willing to accept slightly less polished client apps? → Jellyfin. Free hardware transcoding, free Live TV/DVR, no cloud dependency, no accounts to create. The open-source purist’s choice.
-
Do you want the closest thing to a self-hosted Netflix with the best apps on every device, and are you okay paying for premium features? → Plex. Pay for Plex Pass ($149 lifetime is the best value), and you get a polished experience that your family will actually use without complaining.
-
Do you want more customization than Plex, better app support than Jellyfin, and the option to keep authentication fully local? → Emby. Emby Premiere ($149 lifetime) unlocks hardware transcoding. The middle ground that many homelabbers overlook — but should not.
Still undecided? You do not have to choose just one. Many homelabbers run Jellyfin as their primary server and keep Plex installed for the rare family member who insists on the Plex app. Both can point at the same media directories. Try Jellyfin first — it is free and takes 10 minutes with the Docker Compose file above. If you hit a wall with client support, try Plex or Emby alongside it.
FAQ
Can I migrate from Plex to Jellyfin? Yes — and it is surprisingly easy. Both servers read the same media files. Your watch history is the main thing that does not transfer. Use the community tool Jellyfin-Plex-Trakt-Sync to sync watch status via Trakt.tv as a bridge. For metadata, Jellyfin rescans your libraries and fetches cover art, descriptions, and cast information from the same sources Plex uses (TheMovieDB, TheTVDB).
Does Jellyfin work on Apple TV? Yes, via the Swiftfin app (community-maintained, free, App Store). It handles Direct Play beautifully and supports 4K HDR. Transcoding-heavy use cases may encounter occasional issues. An official Jellyfin Apple TV app is in development but not yet released.
Is hardware transcoding really free on Jellyfin? Yes. Completely. Jellyfin includes VAAPI, Intel Quick Sync, NVIDIA NVENC, and AMD VCN hardware acceleration with no license, no subscription, and no activation required. This alone saves you $149 (Plex Pass lifetime) or $149 (Emby Premiere lifetime). Jellyfin’s HDR-to-SDR tone mapping is also free — a feature both competitors paywall.
Can I run multiple media servers on the same hardware? Absolutely. Point Jellyfin, Plex, and Emby at the same media directories. As long as each runs on a different port (8096, 32400, 8096 respectively — note Jellyfin and Emby default to the same port, so change one), they coexist without conflict. This is common in the homelab community: run Jellyfin as the daily driver, keep Plex installed for testing or for a family member who insists on the Plex app.
Conclusion
Jellyfin, Plex, and Emby each serve a distinct audience within the homelab community. Jellyfin delivers a fully open-source, zero-cost media server that respects your privacy absolutely — at the cost of slightly rougher client apps. Plex offers a polished, Netflix-like experience across every device imaginable, backed by 15 years of development — but locks its best features behind a paywall and requires cloud authentication. Emby strikes a middle ground with local auth, flexible customization, and solid app support — but has the smallest community.
No matter which you choose, Docker Compose makes setup trivially easy. Copy the docker-compose.yml above, set your media paths, run docker compose up -d, and you have a media server in under 10 minutes. Pair it with a low-power mini PC for always-on operation, store your media on a proper NAS OS, and secure remote access with Cloudflare Tunnel or Tailscale.
The $100/month streaming bill ends today. Your self-hosted media server starts now.
Want more homelab guides? Check out our Proxmox beginner guide for running your media server in a VM or LXC, our Docker Compose for beginners tutorial, and our guide to the best self-hosted apps of 2026.