A practical settings reference for Jellyfin — not a tour of every option, just the ones worth changing from default and why.
Most Jellyfin installs run on default settings that were chosen as safe fallbacks, not as a finished configuration — wrong metadata provider order, real-time monitoring left on over a network share, hardware acceleration checked for codecs the GPU doesn't actually support.
This page walks through the settings actually worth changing, grouped the same way as the admin dashboard: Libraries, Users, Networking, Transcoding, Trickplay, and Clients. Every setting below has a specific reason attached to it.
Admin → Libraries → Add Library → Content Type
Pick Movies or Shows specifically. Never Mixed — it disables a chunk of automatic metadata matching because Jellyfin doesn't know what kind of content it's looking at. Always be explicit.
None of the automatic matching works without correct naming — the folder needs the movie name and year, and filenames need season/episode numbers, following the same convention the *arr stack uses:
Movies: Movie Name (2019)/Movie Name (2019).mkv
Shows: Show Name/Season 01/Show Name - S01E01 - Episode Title.mkv
Get this wrong and no setting downstream fixes it.
Admin → Libraries → [library] → ⋮ → Manage Library → Metadata → Metadata fetchers
Drag TMDB to the top for movies and shows. Add TVDB above it only if anime is part of the library — its episode ordering tends to be more accurate there.
Jellyfin goes top to bottom and stops at the first match — the order is the actual setting, not just which providers are enabled.
Admin → Libraries → [library] → ⋮ → Manage Library → Metadata → "Save artwork into media folders"
Turn this on. It writes posters, backdrops, and NFO files next to your media instead of locking everything inside Jellyfin's internal database — point a different server (Plex, Kodi, anything) at the same folder later and it inherits the metadata instead of starting from zero.
Admin → Libraries → [library] → ⋮ → Manage Library → "Real time monitoring"
| Media location | Setting |
|---|---|
| Same filesystem as Jellyfin | On |
| Network storage (NFS/SMB) | Off |
Over a network mount it's unreliable and just floods the logs for nothing.
Admin → Libraries → [library] → ⋮ → Manage Library → "Automatically merge versions"
Turn on only if you keep multiple versions of the same movie (e.g. 1080p and 4K) — it collapses duplicates into one library entry with a quality picker at playback. Leave off if you don't have duplicates.
Admin → Scheduled Tasks → "Scan All Libraries" → Triggers
Drop this to once a day. If the collection barely changes, set it to manual and trigger scans yourself after adding content — no reason to scan a static library on a tight loop.
Admin → Libraries → [library] → ⋮ → Manage Library → Subtitles
Set the preferred language here, not just in the Open Subtitles plugin. Subtitle mode:
Set this per library.
Admin → Users → [username] → Library Access
Scope access per user instead of giving everyone visibility into everything — a kid's profile doesn't need access to the whole collection. Takes ten seconds, removes a whole category of problem.
Admin → Users → [username] → Parental Controls
Parental controls run off content ratings pulled from the metadata provider, not a per-title flag — which is exactly why correct naming and metadata matching from the Libraries section matters here too. Pair a rating limit with an access schedule to restrict when an account can stream, not just what it can see.
Admin → Users → [username] → Password → "Enable easy pin code"
Good for kids' profiles or TV-primary accounts — a quick 4-digit PIN entered on a remote, keeping the account separate without anyone needing the real password.
Admin → Advanced → Quick Connect → "Enable Quick Connect"
Replaces typing a password on a TV remote with approving a six-digit code from a phone. Worth enabling for any account that lives primarily on a TV — which, on a media server, is most of them.
Admin → Users → [username] → Profile → "Max simultaneous streams"
Default is unlimited. On a homelab running a single node, one user hammering three simultaneous transcodes can kill everyone else's playback. Set a reasonable cap — 2 or 3 is usually enough for a non-admin user.
Admin → Advanced → Networking → "Base URL"
Set this if Jellyfin runs behind a reverse proxy at a subpath. Leave blank if Jellyfin sits at the root of its domain.
⚠ A wrong value here breaks all API calls — clients can't communicate with the server.
Admin → Advanced → Networking → "Known proxies"
Add the reverse proxy's LAN IP (e.g. 192.168.1.x). Without this, Jellyfin sees every request as coming from the proxy's IP rather than the actual client — breaking IP-based session logging and rate limiting.
Admin → Advanced → Networking → "Allow remote connections"
Only turn this on if Jellyfin is meant to be reachable outside the LAN, via VPN or reverse proxy. Leave it off for LAN-only use — don't enable it and forget about it.
Admin → Advanced → Networking → HTTPS section
Don't configure TLS certificates inside Jellyfin. Let the reverse proxy (Nginx Proxy Manager, Caddy, etc.) handle TLS termination — Jellyfin talks plain HTTP internally to the proxy, and the proxy handles HTTPS externally. One place to manage and renew certificates, not two.
Jellyfin does one of three things with every stream: direct-plays the file as-is, remuxes it into a different container without re-encoding, or fully transcodes it in real time. The first two are essentially free. Full transcoding is the expensive one — everything below is about avoiding it where it isn't actually needed.
Admin → Playback → Transcoding → "Hardware acceleration"
| GPU vendor | Option |
|---|---|
| Intel | Quick Sync |
| Nvidia | NVENC |
| AMD | VAAPI |
If the hardware doesn't show up as an option, that's a passthrough problem at the container level (/dev/dri for Intel/AMD, the Nvidia runtime libraries for Nvidia) — not a Jellyfin settings problem. This is the most common dead end people hit here.
Admin → Playback → Transcoding → codec checkboxes
Only enable codecs the hardware can actually decode/encode. Checking a box for HEVC or AV1 the GPU doesn't support does nothing — Jellyfin silently falls back to software transcoding anyway. Check the hardware's codec support table before ticking anything.
Admin → Playback → Transcoding → "Burn in subtitles"
Subtitles are their own transcode trigger, separate from video and audio. Sidecar formats like SRT that the client supports natively pass through for free. Anything that has to be burned into the picture forces a full video transcode just to render text — if a server only struggles on subtitled content specifically, this is why.
Admin → Playback → Transcoding → "Throttle transcoding when playing back"
Leave this on. It pauses transcoding the instant a client pauses playback, stopping Jellyfin from burning CPU rendering frames nobody's watching.
Admin → Playback → Transcoding → "Transcoding temporary path"
Default is inside Jellyfin's data directory. On an LXC with a limited root disk this fills up fast during heavy transcoding — point it to a volume with headroom, ideally the same fast storage as the media rather than the container's root filesystem.
Admin → Dashboard (home) → active sessions → hover the Transcode badge
Before touching any setting, check this screen. Every active session shows whether it's direct-playing or transcoding, and hovering the badge gives the actual reason — unsupported codec, bitrate cap, subtitle burn-in. Check this first every time, before guessing at config changes.
Jellyfin client app → Settings → Quality/Playback → Maximum bitrate
A transcode can be the client's decision, not the server's. A mobile data cap or a manually capped quality setting in the client forces a transcode even on hardware that could have handled direct play fine. Check client settings before blaming the server.
Admin → Playback → Trickplay → "Enable Trickplay"
Generates the scrub-bar thumbnail previews seen on every major streaming service. Built into core Jellyfin now (not a separate plugin) and off by default on some setups. Runs as a background task — no ongoing cost during playback.
Admin → Scheduled Tasks → "Generate Trickplay images" → Run
Trigger this manually once to process the existing library. New content is handled automatically after that.
Skip the official phone apps in favor of these three:
| Platform | Client | Why |
|---|---|---|
| Android | Findroid (F-Droid / Play Store) | Native Kotlin, no Google dependency — matters on GrapheneOS or de-Googled Android |
| Apple / tvOS | Swiftfin (App Store) | Native Swift, genuinely good on Apple TV specifically, where the official app has historically lagged |
| Desktop (Linux/Windows/macOS) | Jellyfin Media Player (jellyfin.org/downloads) | Built on MPV, so it inherits MPV's codec support instead of the browser's video element — fixes transcodes that shouldn't be happening |
| Android TV / Fire TV | Jellyfin for Android TV (Play Store / Fire TV store) | Actively maintained and works well, unlike the phone app — avoid the web browser on a TV stick, it will transcode content that should direct-play |
Logging in: all four clients log in the same way — Add Server → enter the Jellyfin URL → Quick Connect. No typing passwords on a remote.
https://www.youtube.com/watch?v=TUAYzposF6Q&feature=youtu.be