Back Original

Jellyfin 12.0

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

TL; DR

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.

  1. As always for major upgrades, ensure you STOP Jellyfin and take a FULL MANUAL BACKUP OF YOUR DATA AND CONFIG DIRECTORIES before upgrading!

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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.

  7. 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.

  8. 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.

  9. This release contains security fixes, so we recommend upgrading rather than staying on an older release once you are ready.

  10. 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!

Why 12.0?

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.

Tuning the new database

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.

What runs on first boot

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.

Multiple versions for episodes

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 and comics, properly this time

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.

Better recommendations, and a search that plugins can extend

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 Modern layout is now the default

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:

Photo of the updated Modern UI

Photo of the updated Modern UI - Movie Library

Changes you may notice after upgrading

A few things behave differently than they did on 10.11, beyond the legacy client removals covered above:

Security

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.

New Features & Enhancements

User Experience - Web Client

Administrator Experience - Web Client

Transcoding and Media Handling

Client Development Changes

The following changes apply to all client application developers. Please review thoroughly and update your applications as required.

HTTP API

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.

Plugins

Deprecation of internal TLS/SSL support

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!