Jellyfin 12.0: Upgrade Checklist for Home Media Servers
Jellyfin 12.0 rewrites its database, drops the old Emby API paths and breaks every plugin. Here is what a Sri Lankan self-hoster should check before pressing upgrade.
Jellyfin 12.0 is the biggest upgrade the free, open-source media server has shipped in years, and it is also the first one I would not apply on a Friday night without a backup. The project's own release post is long, so I read it with one question in mind: what actually changes for someone running a small server at home or in a two-person office in Sri Lanka?
Short answer: the database is rewritten on first boot, plugins all break, and a few old integrations stop working. The payoff is a server that finally handles big libraries without falling over.
๐ Why the version number jumped from 10.11 to 12.0
The headline oddity is the number. Jellyfin has spent its whole life on 10.x releases, a leftover from the Emby fork. This release drops the leading "10.", so what would have been 10.12.0 ships as 12.0, and the server reports itself as 12.0.0.
That is cosmetic, but it signals something real. The team is treating this as a break with the past, and the changelog backs it up:
| Change | Before 12.0 | In 12.0 |
|---|---|---|
| Version string | 10.11.x | 12.0.0 |
Legacy /emby/ and /mediabrowser/ API paths |
Supported | Removed |
| Deprecated sign-in methods | Enabled | Disabled |
| Username matching | Case-sensitive | Case-insensitive |
| Default web layout | "Legacy" | "Modern" |
| Plugin runtime | Previous .NET | .NET 10 |
Key takeaway: Treat 12.0 as a major-version migration, not a routine update. Every item in that table can break something you rely on.
๐ The database rewrite is the real story
The change that matters for reliability is under the hood. Playlists used to be stored as one monolithic blob per list. In 12.0 each playlist item becomes its own database row, and collections and boxsets get the same treatment.
The practical effect the release notes claim:
- Large playlist operations no longer fail partway through. If you have ever built a 500-track playlist and watched it silently lose entries, this is the fix.
- Resume data follows the exact version you watched. Alternate versions, previously a movies-only feature, now work for episodes too.
- The database file location is configurable. You can move it off a slow SD card or USB stick to faster storage, which is a common pain on Raspberry Pi and old-laptop setups.
The cost is the migration itself:
- You must be on 10.10.7 or any 10.11.x release first. Older servers cannot jump straight to 12.0.
- The schema changes are applied on first boot, with the server actively rewriting data. Do not interrupt it.
- A full library scan is mandatory afterwards, and the notes warn it will take significantly longer than usual.
- If two accounts differ only by capitalisation, the migration fails. Rename one before you start.
Warning: The release post is explicit that you need a full manual backup before upgrading. On a home server that means copying the config and data directories while the service is stopped, not relying on a backup plugin that may itself stop working in 12.0.
๐ ๏ธ Every plugin breaks, and some APIs are gone
The server now targets .NET 10, so every plugin must be retargeted and rebuilt by its author. The recommendation is to remove third-party plugins before upgrading and reinstall updated builds afterwards. Disabled plugins also now stay disabled across restarts.
Removed API routes worth knowing if you script against your server:
| Removed route | Replacement |
|---|---|
POST /Users/{userId}/EasyPassword |
None |
GET /Items/{itemId}/CriticReviews |
None |
GET /Environment/NetworkShares |
None |
POST /System/MediaEncoder/Path |
None |
GET /LiveTv/Recordings/Groups/{groupId} |
None |
GET /QuickConnect/Initiate |
POST /QuickConnect/Initiate |
Two more behaviour changes that catch scripts and dashboards:
GetItemsis now asynchronous and appliesrecursivewhenever filters are requested..oggfiles are treated as audio, not video. Any library that lumped them into a "Videos" folder will re-sort.
If you wrote a small Node or Python script to sync watch state, run it against a test server first. Very old third-party clients may also stop connecting because the deprecated authorization paths are off by default.
โก Transcoding and books: the quieter wins
Two feature areas stand out for the kind of hardware people run here.
Transcoding moves to FFmpeg 8.1, with optimisations for CUDA transposing, OpenCL scaling and OpenCL tonemapping, and HLG tonemapping now uses the EOTF from BT.2446 Method B. VobSub subtitles are supported, and subtitle settings are now per library instead of server-wide, so a Sinhala-subtitled film library and an English series library can have different defaults.
Books and comics get first-class treatment:
- Metadata read directly from OPF, ComicInfo and ComicBookInfo files.
- Poster generation for EPUBs and comic archives.
- Page counts extracted from PDFs and comic archives.
- Chapter extraction from audiobooks.
- A new Modern book layout with Authors, Collections and Folders tabs.
The old Bookshelf plugin is deprecated because its features moved into the server. For students who keep a folder of textbooks and lecture PDFs, this turns Jellyfin into a passable e-book shelf without a separate Calibre-Web instance.
The web client also gains frame-by-frame scrubbing with the , and . keys, chapter names in the seek bar, and a live log viewer for admins.
Key takeaway: Per-library subtitle settings and native book support are the two features most likely to change how a mixed-use home library is organised. Plan the library split before the mandatory rescan, not after.
๐ Security fixes make delaying the upgrade a real cost
Staying on 10.11 to avoid the churn is tempting. The security section argues against it. The post lists multiple crafted-request vulnerabilities patched, cross-site scripting fixes, rejection of plugin packages with unsafe names, a block on re-running the setup wizard on misconfigured servers, and wider parental control enforcement.
Any Jellyfin instance exposed to the internet, which for many Sri Lankan users means a port-forward on a Dialog or SLT router, should not sit on a version with known request-handling bugs. The one deprecation that got postponed is internal TLS support. The advice stays the same: put a reverse proxy in front and let it terminate HTTPS.
๐ก What this means for you
If you run Jellyfin at home or for a small team, here is the order I would do things in:
- Check your version. Anything below 10.10.7 needs an intermediate upgrade first.
- Fix duplicate usernames that differ only by case.
- Stop the server and copy the whole data directory to another disk. This is your only rollback.
- Remove third-party plugins and note which ones you will need updated builds for.
- Upgrade, then leave it alone while the database rewrite and full scan run. On a Raspberry Pi or a single-core VPS, expect this to take a while.
- Hard refresh the browser (Ctrl+Shift+R) before assuming the web UI is broken.
- Re-test any scripts or dashboards that talk to the API, especially anything using QuickConnect or the removed routes.
One more thing worth doing while the server is offline: work out what it costs to run. A 24/7 mini-PC or old laptop draws a small but constant load, and with current CEB tariffs that adds up. Our appliance electricity cost calculator will give you the monthly figure from the device's wattage, which is useful if you are deciding between an always-on box and a NAS that sleeps.
Jellyfin remains fully free, with no account requirement and no premium tier. Version 12.0 asks for one careful evening of maintenance in exchange for a server that scales past a few thousand items without breaking.
Original source
Jellyfin 12.0AI-assisted draft, reviewed and approved by Induwara Ashinsana before publishing. Sources are linked inline; if something here is wrong, tell me and it gets corrected.