Port 8096 — Jellyfin

Jellyfin is a completely free, open-source media server — a community-maintained fork of Emby. Port 8096 is its HTTP web interface; port 8920 is HTTPS. Unlike Plex, Jellyfin has no subscription tier — hardware transcoding, remote access, sync, and live TV are all available at no cost. The tradeoff is that you manage it yourself: no Plex relay servers, no cloud features, full self-hosting.

Jellyfin organizes your personal library of movies, TV shows, music, and photos, then streams them to any device via web browser, mobile apps, or smart TV apps. It runs on any hardware from a Raspberry Pi to a full server — though hardware transcoding is much faster on machines with an Intel Quick Sync, NVIDIA, or AMD GPU.

Jellyfin Web: localhost:8096

Install Jellyfin

# Docker (recommended for homelab)
docker run -d \
  --name jellyfin \
  -p 8096:8096 \
  -p 8920:8920 \
  -v /path/to/config:/config \
  -v /path/to/cache:/cache \
  -v /path/to/media:/media:ro \
  --restart unless-stopped \
  jellyfin/jellyfin

# Docker Compose version
services:
  jellyfin:
    image: jellyfin/jellyfin
    ports:
      - "8096:8096"
      - "8920:8920"
    volumes:
      - ./config:/config
      - ./cache:/cache
      - /mnt/media:/media:ro
    restart: unless-stopped

Replace /path/to/media with the actual path to your media files. The :ro (read-only) flag prevents Jellyfin from accidentally modifying your files.

First-Time Setup

  1. Open http://localhost:8096 — the setup wizard runs on first visit
  2. Choose your language and create an admin account
  3. Add media libraries: select the type (Movies, TV Shows, Music) and point to the relevant folder inside /media
  4. Jellyfin scans the library and fetches metadata (posters, descriptions, ratings) from The Movie Database (TMDB) and other sources
  5. After setup, the main dashboard shows your library organized by type

Hardware Transcoding

Software transcoding (CPU-only) is slow and power-hungry. Hardware transcoding uses your GPU's dedicated video encode/decode engine, enabling real-time transcoding of 4K content even on low-power hardware. To enable:

  • Admin → Playback → Transcoding
  • Select your hardware acceleration type: Intel Quick Sync, NVIDIA NVENC, AMD AMF, VA-API (Linux), VideoToolBox (Mac)
  • For Docker, pass the device through: --device /dev/dri:/dev/dri (Intel/AMD on Linux) or use NVIDIA runtime
# Docker with Intel Quick Sync GPU passthrough
docker run -d \
  --name jellyfin \
  --device /dev/dri:/dev/dri \
  -p 8096:8096 \
  -v ./config:/config \
  -v ./cache:/cache \
  -v /mnt/media:/media:ro \
  jellyfin/jellyfin

Remote Access

To access Jellyfin outside your home network:

  • Port forwarding: Forward port 8096 on your router to the server's local IP — simplest, but exposes Jellyfin directly to the internet
  • Reverse proxy with HTTPS: Run Nginx in front of Jellyfin with a Let's Encrypt cert — cleaner, more secure, gives you a domain name
  • VPN: Access your home network via WireGuard or Tailscale — most secure, no ports exposed

Jellyfin vs. Plex Comparison

FeatureJellyfinPlex
CostFree (everything)Free tier, Plex Pass $120/yr for full features
Hardware transcodingFreePlex Pass required
Remote access relayManual (port forward / VPN)Plex relay servers (cloud-managed)
Mobile appsFree (Jellyfin app)Free app, some features gated
Live TV / DVRFree (with tuner hardware)Plex Pass required
Setup complexityHigher — fully self-managedLower — Plex handles relay automatically

Troubleshooting

ProblemFix
Media not showing after adding libraryTrigger a manual scan: Dashboard → Libraries → Scan all libraries
Buffering / slow playback locallyEnable hardware transcoding — CPU-only transcoding is slow on 4K content
Remote access not workingCheck port forwarding on router, confirm Jellyfin is set to allow remote connections in Network settings
Can't reach from phone on LANUse the server's local IP: http://192.168.x.x:8096 — "localhost" only works on the same device
Port 8096 conflictChange in Jellyfin: Admin → Networking → HTTP Server Port