Jellyfin is the free, open-source, self-hosted media server. You point it at the movies, TV shows, music, books, and photos you already own, and it organizes them into a polished, Netflix-style library that you can stream to any device on your network — or, if you choose, over the internet. There is no subscription, no tracking, no premium tier, and no phoning home. Your media and your server belong entirely to you.
This guide walks you through installing Jellyfin, completing the first-time setup, organizing your media so Jellyfin recognizes it, and using every day-to-day feature: playback, user accounts, remote access, Live TV, plugins, and more. Architecture, deployment hardening, the full configuration reference, and the REST API live in the companion Admin Guide; this guide links there whenever a topic crosses into administration.
Note
This guide documents Jellyfin 12.0.0, built on .NET 10. Jellyfin runs on Linux, Windows, macOS, FreeBSD, Docker, and a range of NAS and single-board devices. The web interface looks and behaves identically across all of them.
1. Quick Start
If you just want to get a server running in five minutes, use Docker. This is the fastest path and the one the project itself ships templates for.
docker run -d \
--name jellyfin \
--user 1000:1000 \
--net=host \
--volume /path/to/config:/config \
--volume /path/to/cache:/cache \
--mount type=bind,source=/path/to/media,target=/media \
--restart=unless-stopped \
jellyfin/jellyfin:latest
Unable to find image 'jellyfin/jellyfin:latest' locally
latest: Pulling from jellyfin/jellyfin
...
Status: Downloaded newer image for jellyfin/jellyfin:latest
3f9c2b1e7a8d4c5f6e0a1b2c3d4e5f60718293a4b5c6d7e8f9a0b1c2d3e4f5a6b
Now open a browser to http://<server-ip>:8096 and follow the setup wizard
described in Section 4.
Tip
--net=hostlets Jellyfin auto-discover clients and respond to LAN broadcasts. If you cannot use host networking, map ports8096(HTTP) and, optionally,8920(HTTPS) and7359/udp(auto-discovery) explicitly. See Section 3.
The three volumes matter:
/config— your settings, database, metadata, and logs. Back this up./cache— transcodes, image cache, and other regenerable data./media— your actual movie/TV/music files, mounted read-only is fine.
Important
The
:latesttag tracks the newest stable release. For a server you depend on, pin a specific version tag and update it deliberately so you control when upgrades happen.
2. What Jellyfin Does
Jellyfin is a server plus a family of client apps. The server:
- Scans folders of media files you already have.
- Identifies each item and downloads matching metadata — posters, descriptions, cast, ratings, episode summaries — from internet providers.
- Presents everything through a web interface and a documented API.
- Transcodes media on the fly when a client cannot play the original format, so the same file streams to a 4K TV, a phone on cellular, and an old browser.
- Manages multiple user accounts, each with their own watch history, parental controls, and permissions.
The clients are the apps you watch with: the built-in web client (any browser), plus native apps for Android, Android TV, iOS, Roku, Fire TV, Kodi, and more, many of them community-built against the same API.
Your media files Jellyfin Server Clients
┌───────────────────┐ ┌────────────────────┐ ┌──────────────┐
│ /media/Movies │ │ Scan + identify │ │ Web browser │
│ /media/Shows │ ───────► │ Metadata + images │ ──────► │ Phone / TV │
│ /media/Music │ │ Stream / transcode│ │ Roku / Kodi │
└───────────────────┘ └────────────────────┘ └──────────────┘
Note
Jellyfin never modifies your media files during normal operation. It reads them, and it writes metadata sidecar files only if you explicitly enable that option per library (see Section 6).
3. Installation
Jellyfin distributes official builds for most platforms. Pick the tab matching your environment.
3.1 Choosing an installation method
| Method | Best for | Updates |
|---|---|---|
| Docker | Most users, NAS, homelab | Pull a new image tag |
Native Linux packages (.deb/.rpm) |
Dedicated Linux box | System package manager |
| Windows installer / tray app | Windows desktop or server | Re-run installer |
| macOS app | Mac mini media servers | Replace the app |
| Portable / binary archive | Custom or unsupported OS | Replace the binaries |
3.2 Install steps
Docker (compose)
Create a docker-compose.yml:
services:
jellyfin:
image: jellyfin/jellyfin:latest
container_name: jellyfin
user: 1000:1000
network_mode: host
volumes:
- /path/to/config:/config
- /path/to/cache:/cache
- /path/to/media:/media
restart: unless-stopped
Bring it up:
docker compose up -d
[+] Running 1/1
✔ Container jellyfin Started
Debian / Ubuntu
sudo apt update
sudo apt install jellyfin
Setting up jellyfin (12.0.0) ...
Created symlink /etc/systemd/system/multi-user.target.wants/jellyfin.service
The service starts automatically and is managed by systemd:
sudo systemctl status jellyfin
Windows
- Download the Windows installer for your architecture.
- Run it and choose whether to install Jellyfin as a background service or as a tray application.
- When installation finishes, your browser opens to the setup wizard at
http://localhost:8096.
Unraid
Add the community template repository under the Docker tab:
https://github.com/jellyfin/jellyfin/tree/master/deployment/unraid/docker-templates
Then click Add Container, select jellyfin, adjust the host paths for your config, cache, and media shares, and apply.
Portable binaries
Extract the archive and launch the server executable directly, supplying the data directory you want it to use:
./jellyfin --datadir /srv/jellyfin/data --ffmpeg /usr/bin/ffmpeg
Important
Jellyfin needs FFmpeg to transcode and to extract images, chapters, and subtitles. The Docker image and the native packages bundle a compatible
jellyfin-ffmpegbuild. If you run from portable binaries, install FFmpeg yourself and point to it with--ffmpeg(see Section 16).
3.3 Network ports
Jellyfin uses a small, fixed set of ports. The defaults come straight from the server's network configuration.
| Port | Protocol | Purpose | Default |
|---|---|---|---|
8096 |
TCP/HTTP | Web interface and API | Always on |
8920 |
TCP/HTTPS | Encrypted web interface and API | Only if HTTPS is enabled |
7359 |
UDP | Client auto-discovery on the LAN | On unless disabled |
1900 |
UDP | DLNA / SSDP discovery | Only if DLNA is in use |
Tip
You only need
8096open to use Jellyfin on your LAN. Open8920only if you set up HTTPS, and expose ports to the internet only after reading Section 8 and the Admin Guide's security chapter.
3.4 Verifying the server is up
Once started, confirm the server responds:
curl http://localhost:8096/System/Info/Public
{"LocalAddress":"http://192.168.1.50:8096","ServerName":"My Jellyfin",
"Version":"12.0.0","ProductName":"Jellyfin Server","Id":"a1b2c3...",
"StartupWizardCompleted":false}
StartupWizardCompleted is false until you finish the wizard in the next
section. This public endpoint requires no login and is what client apps use to
find and identify your server.
4. First-Time Setup Wizard
The very first time you open the web interface, Jellyfin runs a short setup
wizard. Behind the scenes each step calls a /Startup/... endpoint, and the
whole flow finishes by marking IsStartupWizardCompleted so the wizard never
runs again.
Work through the steps in order:
-
Preferred display language. Sets the UI culture (the server default is
en-US). You can change it later under Dashboard settings. -
Create your first user. This account is automatically an administrator — it gets the
IsAdministratorpermission and full access to the Dashboard. Choose a strong password; password-less accounts are allowed but strongly discouraged for an admin.Caution
The first user is your master account. If you forget its password, recovery requires server-side access (see Section 15, "I'm locked out"). Set a password you will not lose.
-
Set up your media libraries. You can add libraries now or skip and do it later. Each library needs a content type (Movies, Shows, Music, etc.) and one or more folders. See Section 6.
-
Preferred metadata language and country. Controls which language posters and descriptions are fetched in (defaults: language
en, countryUS). -
Configure remote access. Decide whether the server may be reached from outside your local network. This maps to the
EnableRemoteAccesssetting and can be changed anytime. Leave it off unless you have read Section 8. -
Finish. The wizard completes and you land on the home screen.
Note
While the server is still booting — before the wizard is even available — Jellyfin runs a tiny temporary "setup" web server on the same port that shows live startup progress and any startup errors. If you load the page during boot and see a "still starting up" screen that auto-refreshes, that is expected.
5. A Tour of the Interface
After setup you arrive at the Home screen. The main areas you will use:
- Home — "Continue Watching", "Next Up", and "Recently Added" rows, plus a row per library. This is your launchpad.
- Library views — click a library (e.g. Movies) to browse, sort, and filter its contents.
- Item pages — click any movie, show, album, or person to see details, play, manage, or edit.
- Search — the magnifier searches across all your libraries.
- User menu (top-right avatar) — switch settings, log out, and reach the Dashboard (admins only).
- Dashboard — the administration area: server settings, users, libraries, plugins, scheduled tasks, logs, and live sessions. Most of the Dashboard is covered in the Admin Guide.
5.1 Casting and "Play On"
When you have more than one Jellyfin client or a Chromecast-style cast
receiver available, an item's play menu lets you start playback on a different
device and control it remotely. Remote control of another session requires the
EnableRemoteControlOfOtherUsers (or shared-device-control) permission on your
account.
6. Adding and Organizing Libraries
A library is a content type plus the folders that hold that content. Jellyfin scans those folders, identifies each item, and fetches metadata. Getting your folder and file names right is the single most important thing you can do — Jellyfin's matching accuracy depends on it.
6.1 Creating a library
- Open Dashboard → Libraries (or use the wizard's library step).
- Click Add Media Library.
- Choose a Content type: Movies, Shows, Music, Music Videos, Photos, Books, Mixed Content, or others.
- Give it a display name and add one or more folders.
- Adjust the per-library options (metadata language, image fetchers, real-time monitoring, subtitle/trickplay extraction — see Section 6.5).
- Save. Jellyfin immediately scans the new library.
6.2 Movie naming
Put each movie in its own folder named Title (Year), with the video file named
the same way:
Movies/
├── The Matrix (1999)/
│ └── The Matrix (1999).mkv
├── Blade Runner (1982)/
│ ├── Blade Runner (1982).mkv
│ └── Blade Runner (1982)-trailer.mkv
└── Dune (2021)/
└── Dune (2021) [2160p].mkv
Tip
The
(Year)disambiguates remakes (e.g. Dune (1984) vs Dune (2021)). Anything in[square brackets]— resolution, codec, edition — is ignored for matching but can be parsed for technical display.
Multi-version and multi-part movies, extras (-trailer, -deleted,
-behindthescenes suffixes and extras/ subfolders), and alternate cuts are all
recognized by Jellyfin's naming engine.
6.3 TV show naming
Use a folder per series, a subfolder per season, and episode files tagged with
SxxEyy:
Shows/
└── The Expanse (2015)/
├── Season 01/
│ ├── The Expanse S01E01.mkv
│ └── The Expanse S01E02.mkv
└── Season 02/
└── The Expanse S02E01-E02.mkv
Note
Jellyfin understands many episode patterns:
S01E01,1x01, date-based episodes for daily shows, episode ranges likeS02E01-E02, and a "Specials" season (season 0). The display name for season 0 defaults to "Specials".
6.4 Music naming
Organize music by Artist/Album/Track:
Music/
└── Daft Punk/
└── Discovery (2001)/
├── 01 - One More Time.flac
└── 02 - Aerodynamic.flac
Embedded tags (artist, album, track number, cover art) are read directly from the files, so clean tags matter more than folder names for music.
6.5 Key per-library options
Each library has its own options. The ones you will touch most:
| Option | What it does | Default |
|---|---|---|
| Preferred metadata language | Language for fetched posters/descriptions | (server default) |
| Real-time monitoring | Auto-detect file changes without waiting for a scan | Off |
| Save artwork/metadata with media | Write .nfo/images next to files (portable) |
Off |
| Extract chapter images | Generate thumbnails at chapter marks | Off |
| Extract trickplay images | Generate scrubbing previews (see Section 11) | Off |
| Automatically merge series | Group split seasons across folders into one show | On |
| Allow embedded subtitles | Use subtitles muxed into the file (All / Text / Image / None) | Allow all |
| Automatically add to collection | Group franchise entries into a collection | Off |
Tip
Turn Real-time monitoring on for libraries you add to frequently so new files appear without waiting for the next scheduled scan. There is a built-in delay (about 60 seconds by default) before a detected change triggers a scan, which prevents half-copied files from being imported.
6.6 Scanning and refreshing
Jellyfin scans automatically: on a schedule, when real-time monitoring fires, and when you click Scan All Libraries or Refresh Metadata on a library or item. A scan does three things — finds new/changed/removed files, identifies them, and fetches missing metadata and images.
Warning
"Replace all metadata" on a refresh will overwrite any manual edits you made with freshly downloaded data. Use "Search for missing metadata" instead when you only want to fill gaps.
7. Playing Your Media
Click any item and press Play. From the item page you can:
- Choose a specific version, audio track, and subtitle track before or during playback.
- Resume from where you left off — Jellyfin records your position and marks items watched once you pass a threshold (about 90% of the runtime by default).
- Mark items played/unplayed or favorite manually.
7.1 Subtitles
Jellyfin uses subtitles from three sources, in this order of convenience:
- External sidecar files next to the media (e.g.
The Matrix (1999).en.srt). Language and "forced"/"default" flags are parsed from the filename. - Embedded subtitles muxed into the container.
- Downloaded subtitles from subtitle-provider plugins you enable per library.
Tip
Set an audio and subtitle language preference in your user settings and turn on "Remember subtitle selections" so Jellyfin auto-picks the right tracks every time instead of asking.
7.2 Why playback sometimes pauses to "transcode"
If your client can play a file's format directly, Jellyfin streams it untouched — Direct Play — using almost no server CPU. If the client cannot handle the container, codec, or bitrate, Jellyfin transcodes: it re-encodes the stream in real time into something the client supports. Transcoding is normal and powerful, but it uses real CPU/GPU. See Section 10 for how to make it fast.
8. Remote Access (Watching Away From Home)
By default Jellyfin is reachable only on your local network. To watch when you are away, you enable remote access — but do it carefully.
8.1 Turning remote access on
In Dashboard → Networking, the relevant settings include:
| Setting | Meaning |
|---|---|
| Allow remote connections | Master switch for access outside the LAN (EnableRemoteAccess) |
| LAN networks | Which subnets count as "local" |
| Known proxies | Trusted reverse proxies for forwarded-header handling |
| Remote IP filter | An allow-list or block-list of remote addresses |
| Secure connection (HTTPS) | Enable TLS plus certificate path/password |
| Base URL | Serve Jellyfin under a path prefix (e.g. /jellyfin) |
Caution
Exposing Jellyfin directly to the internet by forwarding port
8096sends your traffic unencrypted. The recommended approach is a reverse proxy (nginx, Traefik, Caddy) that terminates HTTPS in front of Jellyfin. Automatic UPnP port-mapping is no longer supported and has been removed. Full reverse-proxy guidance is in the Admin Guide.
8.2 Finding your server automatically
On the LAN, client apps discover your server by broadcasting on UDP port 7359
("who is JellyfinServer?"), and the server answers with its address, name, and
ID. This is why most apps "just find" your server without you typing an address —
as long as auto-discovery is enabled and the client is on the same network.
8.3 Quick Connect — log in without typing a password
Quick Connect lets you sign in on a TV or game console without entering your username and password on an awkward on-screen keyboard.
- On the new device, choose Quick Connect. It shows a 6-digit code.
- On a device where you are already logged in, open User menu → Quick Connect and enter that code.
- The new device is signed in as you.
Note
Quick Connect codes are six digits and expire after 10 minutes. The feature must be enabled on the server (
QuickConnectAvailable, on by default). Each code can only be authorized once.
9. Users, Profiles, and Parental Controls
Jellyfin supports many user accounts on one server, each with separate watch state, preferences, and a granular permission set. Manage them in Dashboard → Users.
9.1 What each user gets
- Their own Continue Watching, Next Up, favorites, and play history.
- Personal audio/subtitle language preferences and playback options like "auto-play next episode".
- An optional profile PIN (
EnableLocalPassword) for quick on-device switching.
9.2 Permissions you can grant or revoke
Administrators control exactly what each account may do. The full permission set:
| Permission | Grants the user… |
|---|---|
IsAdministrator |
Full Dashboard and server administration |
IsDisabled |
(When set) the account is blocked from logging in |
IsHidden |
Hide the account from login screens |
EnableMediaPlayback |
Play media at all |
EnableAudioPlaybackTranscoding |
Allow audio transcoding for this user |
EnableVideoPlaybackTranscoding |
Allow video transcoding for this user |
EnablePlaybackRemuxing |
Allow remuxing (repackaging without re-encoding) |
ForceRemoteSourceTranscoding |
Always transcode remote-source streams |
EnableContentDownloading |
Download items for offline playback |
EnableContentDeletion |
Delete media from libraries |
EnableMediaConversion |
Convert media to other formats |
EnableSyncTranscoding |
Transcode during sync/download |
EnableAllFolders / per-folder |
Access all libraries, or a chosen subset |
EnableAllChannels |
Access all channels |
EnableAllDevices / per-device |
Use any device, or only approved ones |
EnableRemoteAccess |
Connect from outside the LAN |
EnableLiveTvAccess |
Watch Live TV |
EnableLiveTvManagement |
Manage Live TV recordings and settings |
EnableCollectionManagement |
Create and edit collections |
EnableSubtitleManagement |
Download/manage subtitles |
EnableLyricManagement |
Manage lyrics |
EnableRemoteControlOfOtherUsers |
Control other users' sessions |
EnableSharedDeviceControl |
Control shared/cast devices |
EnablePublicSharing |
Share items publicly |
Tip
For a kids' account, leave
IsAdministratoroff, grant only the libraries you approve, and set a maximum parental rating so age-inappropriate items are hidden. You can also block specific tags.
9.3 Forgotten passwords
If a user forgets their password, an in-network password reset produces a short-lived PIN (valid 30 minutes) that, when redeemed, clears the password. This only works for requests originating inside your local network, by design.
10. Transcoding and Hardware Acceleration
Transcoding is what lets one file play on every device. By default it runs on the CPU, which works but is heavy for 4K or many simultaneous streams. Enabling hardware acceleration offloads the work to your GPU.
10.1 Enabling hardware acceleration
Go to Dashboard → Playback → Transcoding and pick a Hardware acceleration type that matches your hardware. Jellyfin supports, among others:
- Intel Quick Sync (QSV) and VA-API (Intel/AMD on Linux)
- NVIDIA NVENC/NVDEC
- AMD AMF
- Apple VideoToolbox
Note
On Linux with Intel/AMD, the VA-API render device defaults to
/dev/dri/renderD128. If you run in Docker you must pass that device into the container. Hardware-encoding details and per-vendor setup live in the Admin Guide.
10.2 Settings worth knowing
These options shape transcoding quality and resource use:
| Setting | Effect | Default |
|---|---|---|
| Enable hardware encoding | Use the GPU to encode, not just decode | On |
| Allow HEVC / AV1 encoding | Permit more efficient output codecs | Off |
| H.264 / H.265 quality (CRF) | Lower = better quality, bigger files (23 / 28) | 23 / 28 |
| Encoding thread count | CPU threads for software transcode (-1 = auto) |
Auto |
| Throttle transcodes | Pause encoding when the client buffer is full | Off |
| Delete old segments | Free disk by removing played HLS segments | Off |
| Tone mapping | Convert HDR to SDR for non-HDR screens | Off |
| Subtitle extraction | Pre-extract embedded subtitles for faster starts | On |
| Transcode path | Where temporary transcode files are written | <cache>/transcodes |
Tip
If playback stutters or your server pegs at 100% CPU, the cause is almost always video transcoding without hardware acceleration. Enable HW accel, or encourage Direct Play by storing widely compatible files (H.264 MP4/MKV with AAC audio).
Warning
The transcode path can fill a disk quickly during heavy use. Put it on a fast drive with room to spare, and consider enabling segment deletion. If the transcode directory is unwritable, the server refuses to start — this is an intentional safety check.
11. Trickplay (Scrubbing Previews)
Trickplay generates the little preview thumbnails you see when you scrub the seek bar. Enable trickplay image extraction per library; Jellyfin then produces tiled preview images in the background.
Defaults that affect generation: one image roughly every 10 seconds, 320px-wide previews, tiles arranged 10×10, JPEG quality 90, running at below-normal process priority so it does not starve playback. Generation is non-blocking by default — your library stays usable while previews build.
Tip
Trickplay is one of the nicest quality-of-life features. The trade-off is disk space and one-time CPU/GPU work per file, so enable it on your most-watched libraries first.
12. Collections and Playlists
Collections group related items — a film franchise, a director's works, a
themed set — into a single browsable entry. Create one from any item's menu
(Add to Collection), or let Jellyfin build franchise collections
automatically when a library option enables it. Managing collections requires the
EnableCollectionManagement permission.
Playlists are ordered lists you build yourself, most commonly for music but usable for video too. They can be private to you or shared with other users.
Important
A known issue (#17022) can expose playlists belonging to other users in some situations. If you store sensitive playlists, keep your server updated and review playlist sharing. See the Admin Guide's security notes.
13. Live TV and DVR
If you have a TV tuner (for example an HDHomeRun network tuner) and a program guide source (such as an XMLTV file or a guide-listing provider), Jellyfin becomes a DVR.
- Dashboard → Live TV → Add tuner, choose the tuner type, and enter its address.
- Add a guide data source (XMLTV file or listings provider) and map channels to guide entries.
- Browse the Guide, watch live channels, and schedule recordings — one-off or series.
Note
Watching Live TV requires the
EnableLiveTvAccesspermission; scheduling and managing recordings requiresEnableLiveTvManagement. Recordings land in a folder you configure and appear like any other library item.
14. Plugins
Plugins extend Jellyfin — extra metadata providers, subtitle sources, themes, and integrations. Install them from Dashboard → Plugins → Catalog.
- Open the Catalog, pick a plugin, and install it.
- Restart the server when prompted.
- Configure the plugin from its entry under My Plugins.
Bundled metadata/image providers you can enable per library include TheMovieDb (TMDb), The Open Movie Database (OMDb), MusicBrainz, TheAudioDb, ListenBrainz, Studio Images, and book providers like ComicVine, Google Books, and Open Library (ISBN).
Caution
Plugins run with full server access. Install only plugins you trust. You can add third-party plugin repositories, but treat unknown repositories with the same caution you would any software source.
15. Troubleshooting
Each entry gives the symptom, the likely cause, the fix, and how to avoid it.
Error: The server is expected to host the web client, but the provided content directory is either invalid or empty
- Cause: The web client files are missing from the expected web directory.
- Solution: Reinstall using a package or image that bundles the web client,
or pass the correct path with
--webdir. To run API-only with no web UI, start with--nowebclient. - Prevention: Use the official Docker image or native packages, which include the web client.
Error: Kestrel failed to start! This is most likely due to an invalid address or port bind
- Cause: The configured bind address or port is wrong or already in use.
- Solution: Free port
8096(or your configured port), or correct the bind interfaces in your network settings, then restart. - Prevention: Don't run two servers on the same port; check for an existing Jellyfin instance before starting a new one.
Symptom: New files don't show up
- Cause: No scan has run since you added them, or the path isn't in a library.
- Solution: Run Scan All Libraries, confirm the folder is included in a library, and check file/folder naming.
- Prevention: Enable Real-time monitoring on libraries you add to often.
Symptom: Playback buffers, stutters, or server CPU spikes to 100%
- Cause: The client can't Direct Play the file, so the server is software transcoding video.
- Solution: Enable hardware acceleration, lower the client's quality setting, or store more compatible files (H.264 + AAC).
- Prevention: Standardize on widely supported formats; set up HW transcoding.
Symptom: The transcode folder fills my disk
- Cause: Heavy transcoding writes large temporary segment files.
- Solution: Move the transcode path to a roomy/fast disk and enable segment deletion. Run the Clean Transcode Directory scheduled task.
- Prevention: Reduce transcoding by encouraging Direct Play.
- Reference: Community issues #16912 and #16590 discuss transcode-cache retention behavior.
Symptom: A movie or episode matched the wrong title
- Cause: Ambiguous naming.
- Solution: Rename to
Title (Year)/SxxEyy, then use Identify on the item to pick the correct match, and refresh. - Prevention: Follow the naming conventions in Section 6.
Symptom: Episodes land in an "Unknown" season or get duplicated
- Cause: Episode files lack a recognizable
SxxEyypattern, or NFO/metadata conflicts (see issues #16381, #16989). - Solution: Fix the episode filenames, remove conflicting NFO entries, and refresh metadata.
- Prevention: Keep one clean naming scheme across a series.
Symptom: The container starts very slowly
- Cause: Large libraries, slow storage, or first-run database setup (issue #13287).
- Solution: Use fast storage for
/config, let the first scan complete, and run the Optimize Database scheduled task periodically. - Prevention: Keep the config/database directory on an SSD.
Symptom: I'm locked out / forgot the admin password
- Cause: Lost admin credentials.
- Solution: Use the in-network password-reset PIN flow if available, or have a server administrator reset it server-side. (The mechanics are in the Admin Guide.)
- Prevention: Record the admin password somewhere safe; create a second admin account as a backup.
Tip
Your logs are the best diagnostic. Read them in Dashboard → Logs, or fetch them from the log directory. When asking for help, include the relevant log lines around the time of the problem.
16. Command-Line Reference
When you run the server binary directly (portable installs, custom services), the following options are available. They are parsed at startup.
| Option | Alias | Purpose |
|---|---|---|
--datadir |
-d |
Data folder (database, etc.) |
--configdir |
-c |
Configuration directory (settings, pictures) |
--cachedir |
-C |
Cache directory |
--webdir |
-w |
Web UI resources directory |
--logdir |
-l |
Log file directory |
--ffmpeg |
Path to an external FFmpeg executable | |
--nowebclient |
Run API-only; do not host the web client | |
--service |
Run as a headless service | |
--package-name |
Internal packaging identifier (e.g. synology) | |
--published-server-url |
URL to advertise via auto-discovery | |
--nonetchange |
Do not react to network status changes | |
--restore-archive |
Restore the server from a backup archive | |
--mode |
Action to perform on start (default: run as media server) |
Settings can also be supplied via environment variables prefixed with
JELLYFIN_ (for example JELLYFIN_DATA_DIR).
./jellyfin --datadir /srv/jf/data --cachedir /srv/jf/cache --ffmpeg /usr/bin/ffmpeg
[INF] Jellyfin version: 12.0.0
[INF] Startup complete 0:00:07
Note
Under Docker or the native packages you rarely need these flags — the container/service sets sensible paths for you. They matter most for portable and custom deployments.
17. Default Locations Cheat-Sheet
Jellyfin keeps several distinct directories. Exact paths vary by platform and by the flags above, but the roles are constant:
| Directory | Holds |
|---|---|
| Config | Your settings XML, the database, plugins, and plugin configs |
| Data | Program data and internal state |
| Cache | Image cache and other regenerable data |
| Transcodes | Temporary transcoding output (under cache by default) |
| Trickplay | Generated scrubbing preview images |
| Metadata | Downloaded posters, backdrops, and descriptions |
| Logs | Server log files |
| Backups | Backup archives created by the server |
Important
For backups, the config/data directory is what truly matters — it contains your database, users, and settings. Cache, transcodes, and trickplay can all be regenerated. The Admin Guide covers the built-in backup-and-restore feature.
18. Frequently Asked Questions
Q: Is Jellyfin really free? What's the catch? Yes. Jellyfin is free and open source with no paid tier, no account requirement, and no telemetry selling your data. The "catch" is that you host it yourself.
Q: Do I need an internet connection to use it? Only for downloading metadata and artwork, and for remote access. Local playback of your own files works fully offline.
Q: Can multiple people watch different things at once? Yes. The only limit is your server's ability to Direct Play or transcode the concurrent streams. Hardware acceleration dramatically raises that ceiling.
Q: What's the difference between Direct Play, Remux, and Transcode? Direct Play streams the file untouched (cheapest). Remux repackages the same audio/video into a different container without re-encoding (cheap). Transcode re-encodes the video and/or audio (expensive). Jellyfin picks the lightest option the client can handle.
Q: Why does my 4K movie transcode to a phone but Direct Play to my TV? Your TV supports the file's codec and your phone (or the network to it) does not, so Jellyfin transcodes only where necessary.
Q: How do I add a TV tuner / DVR? See Section 13. You need a supported tuner and a guide data source.
Q: Can I access my server from outside my house? Yes — enable remote access and, ideally, put a reverse proxy with HTTPS in front of it. See Section 8 and the Admin Guide. Do not blindly forward port 8096 to the internet.
Q: How do I log in on my TV without typing a password? Use Quick Connect (Section 8.3).
Q: Where are subtitles supposed to go?
External subtitle files go next to the media with a language code
(Movie (2020).en.srt). Embedded subtitles work automatically. You can also
enable subtitle-provider plugins to download them.
Q: My posters are wrong / in the wrong language. How do I fix it? Use Identify to re-match the item, set the library's preferred metadata language, and refresh. Avoid "Replace all metadata" if you have manual edits.
Q: Does Jellyfin change or delete my media files?
No, not during normal use. It only writes sidecar metadata/images if you enable
"save with media", and it only deletes files if a user with the
EnableContentDeletion permission explicitly does so.
Q: How do I keep my setup safe before exposing it online? Use strong admin passwords, give each person their own least-privilege account, keep the server updated, restrict CORS and remote IPs, and use HTTPS via a reverse proxy. The Admin Guide has a full hardening checklist.
Q: How many libraries/users can I have? There is no hard limit; practical limits are your storage and server CPU/RAM.
Q: Can I run Jellyfin behind a subpath like example.com/jellyfin?
Yes — set a Base URL in the network settings.
Q: How do I update Jellyfin?
Docker: pull a newer image tag and recreate the container. Native: update through
your package manager or re-run the installer. Always back up /config first.
Q: A feature I want isn't here — can I extend it? Often yes, via plugins (Section 14) or the documented REST API (see the Admin Guide). Jellyfin is a platform, not just an app.