Skip to main content

Self-Host Jellyfin: Plex Alternative Media Server 2026

·OSSAlt Team
jellyfinplexmedia-serverself-hostingdockerstreaming2026

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

FeatureJellyfinPlexEmby
LicenseGPL 2.0ProprietaryProprietary
CostFreeFree + $120/yr Plex PassFree + $54/yr Emby Premiere
Hardware transcoding✅ FreePlex Pass requiredEmby Premiere required
Live TV / DVR✅ FreePlex Pass requiredEmby Premiere required
Offline sync✅ FreePlex Pass requiredEmby Premiere required
Mobile apps✅ FreeFree (with limitations)Emby Premiere or pay
Client countGoodExcellentGood
Third-party pluginsLimited
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

  1. Select language → Next
  2. Create admin user → username + password
  3. Add media libraries:
    • Click + → Select type: Movies
    • Add folder: /media/movies
    • Language: English
    • Scan automatically: Yes
  4. Repeat for TV, Music
  5. 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:

Third-party clients with better UI:

Smart TVs and Streaming Devices

DeviceClientNotes
Apple TVInfuse 7 or SwiftfinInfuse has best performance
RokuJellyfin RokuOfficial channel
Fire TVJellyfin for Fire TVIn Amazon App Store
Android TVJellyfin for Android TVOfficial
Samsung/LG TVWeb browserSmart TV web app
Xbox/PlayStationWeb browserBrowser-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:

  1. Add tuner device (HDHomeRun auto-discovered on network)
  2. Add TV guide: Schedules Direct ($25/year) or XMLTV
  3. Configure DVR storage location
  4. 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.

Comments