We are pleased to bring you Jellyfin 12.0, our new stable release. This release continues in the same direction as 10.11: finishing what the database conversion started, turning that new foundation into real performance work, and finally giving books and comics the support they have deserved for years.
If you just want a quick summary of what you need to know to get your system upgraded and running, please read on to the "TL; DR" section just below, or keep reading for a full explanation of all the major features and improvements in Jellyfin 12.0! You can also view full changelogs on the server and web GitHub releases.
- Cody
info
IT IS VERY IMPORTANT THAT YOU READ THIS SECTION BEFORE UPGRADING TO JELLYFIN 12.0! Failure to do so may cause issues! Always feel free to ask for help in our chat if you are unclear or run into trouble.
This release changes the database schema and actively rewrites data on first boot, so a backup is the only way back to your previous version.
As always for major upgrades, ensure you STOP Jellyfin and take a FULL MANUAL BACKUP OF YOUR DATA AND CONFIG DIRECTORIES before upgrading!
You must be running Jellyfin 10.10.7 or any 10.11.x release before upgrading to 12.0. Upgrading directly from 10.11.x is fully supported and no intermediate step is needed. If you are on anything older than 10.10.7, upgrade to 10.10.7 first, then upgrade to 12.0.
Check your usernames before upgrading. Usernames are now case insensitive, so two accounts can't have names that only differ by capitalization. If you have users that match this pattern the database migration will fail.
A full library scan is REQUIRED after upgrading. As part of fixing how alternate versions are stored, versions that Jellyfin grouped automatically, not ones you merged yourself, are cleared during the upgrade. Until you run the scan those versions will look like they are missing.
The first scan after upgrading will take significantly longer than normal, and some movies may appear as newly added. This is expected. Jellyfin now checks every item in your library against the files on disk to clear out leftovers from previous versions, and anything that was previously filed incorrectly gets corrected as it goes. Do not stop the server while migrations are running.
Once installed, please ensure you hard refresh (e.g. Ctrl+Shift+R or similar) and/or clear your web cache for your Jellyfin instance if you notice any UX anomalies. Bad cached assets are the #1 cause of such issues.
Remove any third-party plugins before upgrading. Plugins built for 10.11 will not load on 12.0 and need updated builds from their authors, so give them time to catch up before adding them back. Official plugins have been updated for 12.0 support.
Very old third-party clients will stop working. Support for the legacy /emby/ and /mediabrowser/ addresses has been removed, and the deprecated way of signing in is now disabled, including on existing servers. Clients that have not seen an update in years are the ones at risk here.
This release contains security fixes, so we recommend upgrading rather than staying on an older release once you are ready.
As always with major Jellyfin releases, bugs will exist. Please prefix bug reports with "[12.0]" so we can triage them quickly, and see point 1 one more time: take a backup.
And now on to the cool new features!
The most visible change in this release is the one in its name: we are dropping the major version "10" from our naming scheme. What would have been 10.12.0 is simply 12.0, and the server reports its version as 12.0.0. 10.11.x was the last release branch to use the old scheme.
The reason is the feedback we got after 10.11.0, which we first raised in January and confirmed in May. A release like 10.11.0 was, by any reasonable measure, a major release - it rewrote the library database - but the version number presented it as a minor update, and people upgraded with expectations to match. The leading 10. never changed and never told anyone anything, so all it did was push the number that actually mattered into the middle position and make "major" releases look minor. Dropping it means the first number moves when the release is big.
If you maintain anything that parses Jellyfin version strings - a client, a monitoring check, a deployment script, a container tag pin - this is the item to look at before upgrading.
Jellyfin 10.11.0 finished rebuilding how the library database works, which opened the door for the performance work in this release. We aren't finished, but you should notice a big difference when browsing.
One of the largest changes is how playlists and collections are stored. Before, everything in a playlist was kept as one big list inside the playlist itself, and the database couldn't look into that list. Anything we needed to know meant loading the whole playlist and unpacking it first. Getting the item count, working out how much you've watched, or showing a single page all cost the same as loading the entire thing. Editing was the same story, because adding or removing one item meant writing the whole list back out.
Every item in a playlist is now its own row. The database can count rows, return one page, and add or remove a single item without touching the rest, so this should be a big improvement on large playlists. Collections and boxsets were stored the same way and get the same fix.
Alongside that:
Most of this shows up as pages that used to freeze no longer freezing.
One thing to note is that this work went into how Jellyfin reads your library, not into the library scanner. You may find the scanner is a little quicker as a side effect, but speeding it up was not a goal this time around.
As usual, a new release of Jellyfin comes with multiple database migrations. These migrations will take a while to complete depending on the size of your library and how much bad data has been accumulated.
If you would rather run that step deliberately than have it happen on first start the server now accepts --mode MigrateSystem, which performs the upgrade and exits without starting the rest of Jellyfin.
Alternate versions have been a movies-only feature since they were introduced. In 12.0 they work for episodes as well, so a series with a broadcast cut and an extended cut, or a 1080p and a 4K copy of the same episode, can be grouped the way movies always could. This includes resume data that follows the version you were actually watching.
This is also the feature behind the required post-upgrade scan: making versions work correctly for episodes meant fixing how version links are stored, and automatically resolved versions have to be rebuilt from the files on disk.
Books have often taken a backseat in favor of video playback in Jellyfin, and this release is the start of an effort to change that. Most of what the Bookshelf plugin used to do now has been moved to the server itself.
On the server:
In the web client:
note
The Bookshelf plugin has been deprecated. Its features have been merged into the server or extracted into the ComicVine and GoogleBooks providers.
Where "more like this" and the suggestion rows get their ideas from is no longer fixed. You now choose the source per library in the same place you already pick metadata providers, so you can use one source for movies and a different one for music.
ListenBrainz ships with the server as one of those sources. Point your music library at it and similar-artist suggestions come from real listening data rather than from tags alone.
Search works the same way now: a plugin can add its own results alongside Jellyfin's own. If you have ever wanted Jellyfin to search somewhere else at the same time, that is a plugin now rather than a fork. Both systems are written up for plugin authors in the release notes.
The layout that shipped as "experimental" is now simply the Modern layout, and on desktop and mobile it is the default for anyone who has not explicitly chosen otherwise. The previous layout is still available and is now called Legacy. Televisions are unchanged: TV devices continue to use the TV layout, which still runs on the legacy app.
Alongside making it the default, the layout got the polish that implies:


A few things behave differently than they did on 10.11, beyond the legacy client removals covered above:
.ogg files are treated as audio, not video. If you had .ogg video files, they will be re-sorted on the next scan.This release includes a number of security fixes on both the server and the web client. Several of them close off ways a crafted request could reach files outside the directories Jellyfin is supposed to serve. Others prevent the setup wizard being re-run on a misconfigured server without signing in, reject plugin packages with unsafe names, apply parental controls in more places, and fix cross-site scripting issues in the web client.
, and . scrub frame-by-frame during playback.CACHEDIR.tag, so backup tools know to skip them instead of backing up these files.dvh1 HLS variant for Dolby Vision Profile 5 for better device compatibility.The following changes apply to all client application developers. Please review thoroughly and update your applications as required.
GetItems is now asynchronous and applies recursive when filters are requested, limited to requests that include includeItemTypes. The same query can return a different result set than it did on 10.11.ItemByName responses are restricted and people are deduplicated.GetTrailers (use GetItems with includeItemTypes=Trailer), GetArtists and GetAlbumArtists (use GetPersons), GetArtistByName (use GetPerson), GetMusicGenre (use GetGenre), the music genre instant mix endpoints (use GetInstantMixFromItem), GetRecordingsSeries, and the startup routes (use the configuration endpoints). UserDto.HasPassword is also obsolete and no longer provides useful information. The HLS controllers are hidden from the specification.POST /Users/\{userId\}/EasyPassword, GET /Items/\{itemId\}/CriticReviews, GET /Environment/NetworkShares, POST /System/MediaEncoder/Path, and GET /LiveTv/Recordings/Groups/\{groupId\} were all obsolete no-ops returning 403, 404, or an empty result. GET /QuickConnect/Initiate did work and was an alias for the POST route, so clients using the GET form need to switch to POST.As a general reminder of our API support policy: if an endpoint is not listed in the OpenAPI specification it should not be used, and if an endpoint or parameter is marked obsolete it should not be used. Deprecations will normally be marked for an entire major release cycle before removal.
ISearchEngine, IAuthenticationProvider.HasPassword, parts of IItemRepository, and a few IUserManager members are the notable breaks.In the 10.11.0 release notes we announced that internal TLS/SSL support would be removed in this release. That removal has been postponed to a future version. The reasoning has not changed - we continue to recommend running Jellyfin behind a reverse proxy - so if you are running an Internet-facing instance using Jellyfin's built-in TLS, this is extra time to migrate, not a reprieve.
Happy Watching!