Skip to main content

How to Self-Host Jellyfin: Media Server Alternative to Plex 2026

·OSSAlt Team
jellyfinplexmedia-serverself-hostingdockertranscoding2026

TL;DR

Jellyfin (GPL 2.0, ~33K GitHub stars, C#) is the free, fully open source media server — no subscription, no Plex Pass required, no data sent to any company's servers. It streams your movie, TV show, music, and photo library to every device: web browser, iOS, Android, Roku, Fire TV, Apple TV, Android TV, and Samsung/LG smart TVs. Plex charges $4.99/month (or $119.99 lifetime) for Plex Pass to unlock hardware transcoding and offline sync. In Jellyfin, all features are free.

Key Takeaways

  • Jellyfin: GPL 2.0, ~33K stars, C# — fully free Plex alternative, no subscription
  • Hardware transcoding: Intel QSV, AMD AMF, Nvidia NVENC — all free (Plex charges for this)
  • Smart TV apps: Roku, Fire TV, Apple TV, Android TV, Samsung Tizen, LG WebOS
  • Offline sync: Download for offline on iOS/Android — free (Plex charges Plex Pass)
  • No account required: Runs fully self-contained with zero external services
  • Metadata: TMDB, TheTVDB, MusicBrainz — automatic metadata and cover art

Part 1: Docker Setup

# docker-compose.yml
services:
  jellyfin:
    image: jellyfin/jellyfin:latest
    container_name: jellyfin
    restart: unless-stopped
    network_mode: host   # Enables DLNA/auto-discovery
    volumes:
      - jellyfin_config:/config
      - jellyfin_cache:/cache
      - /path/to/movies:/media/movies:ro
      - /path/to/tvshows:/media/tv:ro
      - /path/to/music:/media/music:ro
    environment:
      TZ: America/Los_Angeles
      JELLYFIN_PublishedServerUrl: "https://media.yourdomain.com"
    # For hardware transcoding (Intel):
    devices:
      - /dev/dri/renderD128:/dev/dri/renderD128

volumes:
  jellyfin_config:
  jellyfin_cache:
docker compose up -d

Visit http://your-server:8096 → setup wizard.


Part 2: HTTPS with Caddy

media.yourdomain.com {
    reverse_proxy localhost:8096
}

Part 3: Media Library Structure

Jellyfin follows the standard Kodi/Plex naming convention:

Movies

/movies/
├── The Godfather (1972)/
│   └── The Godfather (1972).mkv
├── Inception (2010)/
│   ├── Inception (2010).mkv
│   └── Inception (2010) - Featurettes/
│       └── Making of Inception.mkv
└── Dune Part Two (2024)/
    └── Dune Part Two (2024).mkv

TV Shows

/tvshows/
├── Breaking Bad (2008)/
│   ├── Season 01/
│   │   ├── Breaking Bad S01E01 - Pilot.mkv
│   │   └── Breaking Bad S01E02 - Cat's in the Bag.mkv
│   └── Season 02/
│       └── Breaking Bad S02E01 - Seven Thirty-Seven.mkv
└── The Wire (2002)/
    └── Season 01/
        └── The Wire S01E01 - The Target.mkv

Part 4: Hardware Transcoding

Hardware transcoding lets Jellyfin transcode H.264/H.265 video in real-time without maxing out the CPU:

Intel Quick Sync (QSV)

# docker-compose.yml
services:
  jellyfin:
    devices:
      - /dev/dri:/dev/dri
    group_add:
      - "109"  # render group (check: getent group render | cut -d: -f3)

In Jellyfin → Admin → Playback → Transcoding:

  • Hardware acceleration: Intel QuickSync (QSV)
  • Enable H.264, H.265 hardware encoding: Yes

Nvidia GPU

services:
  jellyfin:
    runtime: nvidia
    environment:
      NVIDIA_VISIBLE_DEVICES: all
      NVIDIA_DRIVER_CAPABILITIES: all

In Jellyfin → Admin → Playback:

  • Hardware acceleration: NVIDIA NVENC

Verify transcoding

Stream a 4K file to a device that can't handle 4K → Jellyfin should transcode to 1080p. Check Admin → Dashboard → Playback Sessions to see if "Transcode" or "Direct Play" is shown.


Part 5: Client Apps

Web browser

https://media.yourdomain.com — full web player with:

  • Custom subtitles (SRT, PGS, ASS)
  • Audio track selection
  • Chapter navigation
  • Playback speed

Mobile

AppPlatformNotes
Jellyfin (official)iOS/AndroidFull-featured, offline downloads
SwiftfiniOSNative Swift UI — better iOS experience
FindroidAndroidMaterial You design

Smart TV / Streaming

PlatformApp
RokuJellyfin for Roku (official)
Fire TVJellyfin for Amazon Fire TV
Apple TVJellyfin Media Player (tvOS)
Android TV / Google TVOfficial Jellyfin app
KodiJellyfin for Kodi add-on
Samsung TizenJellyfin web app
LG WebOSJellyfin web app

Part 6: Metadata and Artwork

Jellyfin fetches metadata automatically from:

  • TMDB (The Movie Database) — movies and TV
  • TheTVDB — TV shows
  • MusicBrainz — music
  • AniDB — anime

Custom artwork

Right-click item → Edit → Images:

  • Upload custom poster, backdrop, logo, banner
  • Or select from multiple auto-fetched options

NFO files (manual metadata)

Create movie-name.nfo alongside your video file:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<movie>
  <title>The Godfather</title>
  <originaltitle>The Godfather</originaltitle>
  <year>1972</year>
  <plot>The aging patriarch of an organized crime dynasty...</plot>
  <tagline>An offer you can't refuse.</tagline>
  <genre>Drama</genre>
  <genre>Crime</genre>
</movie>

Part 7: Users and Parental Controls

# Create users in Admin → Users:
# - Admin: full access
# - Standard user: limited access
# - Parent-restricted: parental controls

# Per-user settings:
# - Max video stream quality (bandwidth limiting)
# - Parental rating filter (PG-13, R, etc.)
# - Allow media downloads: Yes/No
# - Access specific libraries only

Parental controls

  1. Admin → Users → [user] → Parental Control
  2. Maximum allowed content rating: PG
  3. Block items with no content rating: Yes
  4. Blocked tags: "adult", etc.

Part 8: DLNA and Live TV

DLNA (local network streaming)

network_mode: host   # Required for DLNA auto-discovery

Jellyfin exposes DLNA — Samsung/LG/Sony smart TVs discover it automatically on the local network.

Live TV and DVR (with a tuner)

Connect a network tuner (HDHomeRun) or USB TV tuner:

  1. Admin → Live TV → + Add tuner
  2. Type: HDHomeRun, M3U Playlist, or XMLTV
  3. Guide data: Schedules Direct ($25/year)

Maintenance

# Update:
docker compose pull
docker compose up -d

# Backup (config only — your media stays on filesystem):
tar -czf jellyfin-config-$(date +%Y%m%d).tar.gz \
  $(docker volume inspect jellyfin_jellyfin_config --format '{{.Mountpoint}}')

# Clear transcoding cache:
docker exec jellyfin rm -rf /cache/transcodes/*

# Rebuild metadata for a library:
# Admin → Libraries → [library] → Scan library files

# Logs:
docker compose logs -f jellyfin

See our comparison: Jellyfin vs Plex vs Emby

See all open source media tools at OSSAlt.com/categories/media.

Comments