Original release notes
:rocket: Release notes for 12.0
Notes on Updating
Before upgrading from an earlier version, a full backup of the data directory is strongly recommended, as this release includes database changes that prevent rolling back without a full restore.
Direct upgrades from 10.10.7 and 10.11.x to 12.0 are supported; intermediate upgrades are not required. Users running releases older than 10.10.7 are strongly encouraged to upgrade to 10.10.7 before migrating to 12.0.
Installed repository plugins (anything not built-in) should also be removed before migrating. Plugins will likely need time to adapt to the new database changes, so re-adding them afterward is the safest approach for testing.
Official plugins compatible with Jellyfin are available through the stable plugin repository. If you have changed to the unstable plugin repository please change it back.
- Go to Dashboard -> Plugins -> Manage Repositories
- Update the Plugin Repository URL to: https://repo.jellyfin.org/files/plugin/manifest.json
After migrating please perform the following steps.
- Perform a full library scan to restore alternative versions
If you run into issues, please prefix bug reports with "[12.0]".
Packaging
- Debian Bullseye and Ubuntu Focal packages are no longer built
Server
- Performance PR implications https://github.com/jellyfin/jellyfin/pull/16062
- We're running a full path-based check on all library items to clean up left overs. Depending on size this can take some time
- Alternative versions of media that were auto resolved (not manually merged) will be removed due to data type issues -> A full library scan will fix this again and is therefore REQUIRED AFTER UPGRADE
- First scan will take significantly longer than normal and some movies might appear as newly added due to type issues that got fixed on-scan
- Multiple versions for episodes
- Similarity & recommendation providers
- Search providers, letting plugins extend or replace how search results are produced
- SchedulesDirect and EPG refresh fixes
- Fixes to the parental rating system
- Proper data pruning on file replacement/deletion
- Support triple+ digit episode numbers
- Add library-specific BoxSet and Playlist filtering, allowing per-library collection and playlist views
CACHEDIR.tagsupportAccept-Languageheader support- Add VideoRotation profile condition for Android TVs that do not support rotation metadata
- Parse provider IDs from season and episode folder/file names
- Allow tmdb, tvdb, and imdb as aliases for the tmdbid, tvdbid, and imdbid provider IDs
- Add curly brace and parentheses support for parsing attribute values
- Add NameStartsWith and NameLessThan filters to Person search
- Add new filters for audio and subtitle languages
- Add OriginalLanguage as option to PreferredAudioLanguage
- Add a collection API for Included In feature
- Add support for VobSub subtitle streams
- Add Tmdb missing episode provider
Breaking and behavior changes
- Legacy route prefixes removed (
/emby/*and/mediabrowser/*). Old third-party clients that rely on them will stop working - Legacy authorization is now disabled by default, and a migration disables it on existing installs as well
- Removed obsolete API routes:
POST /Users/{userId}/EasyPassword(the EasyPassword feature is gone),GET /Items/{itemId}/CriticReviews,GET /Environment/NetworkShares,POST /System/MediaEncoder/Path,GET /LiveTv/Recordings/Groups/{groupId}, andGET /QuickConnect/Initiate - The global subtitle configuration has been removed, subtitle settings are configured per library
.oggis no longer treated as a video extension and is audio only,.aifcis now recognized as audio, and.aiffis no longer treated as an image- Symlinks are only resolved at playback time
- Sorting by name now uses
SortNameandCleanName, and the same cleaning logic is applied toForcedSortName. Library ordering may change compared to 10.11 - Image endpoints no longer upscale beyond the source resolution, so low resolution artwork renders at its real size instead of being enlarged
- Username capitalization can now be changed. Usernames are stored in a normalized column with a unique index, so installs with usernames that differ only by case need to be corrected before upgrading
Database and performance
- Playlists and collections are now properly relational, using a new
LinkedChildrentable instead of serialized child lists.OwnerIdandPrimaryVersionIdare real GUID foreign keys, andExtraIdshas been dropped - Many tuning migrations covering item counts, item names, type and clean name, latest items, image info, and primary version id
- Migration routines clean up existing data on first boot: duplicate music artists and people are merged, orphaned extras and external data are removed, incorrect owner relationships are repaired, and clean names, forced sort names, and series presentation keys are recomputed
- Heavy database tasks no longer run while a library scan is in progress
- Faster queries for Resume, Next Up, rewatching, Latest Items for music, playlists and collections, artist lookup, and item counts
- Item deletion is batched, which fixes "too many SQL variables" failures when deleting large numbers of items
jellyfin.dbcan now be stored at a custom path
Operations
- New
--modestartup flag withMediaServer,MigrateSystem, andSeedSystem, allowing migrations or database seeding to be run without starting the server. This is useful for containerized and orchestrated deployments and for controlled upgrades - The startup interface has been restyled and now shows version and activity information
- Disabled plugins are no longer re-enabled on restart
- Full system backups skip corrupt keyframe rows instead of failing
Media and subtitles
- Subtitle writing now goes through SubtitleEdit, which is what avoids the SSA to ASS conversion and loss of styles
- External subtitles can be embedded into MKV when transcoding
- The subtitle extraction timeout is now configurable
- Client-rendered graphical subtitles are allowed during remux
- Fixes for races in concurrent subtitle conversion, cache invalidation when a subtitle is replaced, and ffmpeg hangs during extraction
- New
HlsAudioSeekStrategyconfiguration option - Trickplay: existing files are discovered during a scan, duplicates from interlaced video are fixed, invalid PTS values from containers are normalized, and the cache is cleaned up after a failure
Live TV
- Live TV no longer returns unreachable "server-local" streaming URLs to clients
- XMLTV background images and episode thumbnails are now imported
- XMLTV guide imports skip programs whose data has not changed, using an ETag computed from the fields the server actually consumes, which makes repeat guide refreshes considerably cheaper. Other listings providers stay on the existing field-by-field update path
Metadata and providers
- ListenBrainz is now bundled with the server and provides similar artist data with a selectable similarity algorithm
- TVDB provider IDs are supported for movies
- AudioDb artist search
- ReplayGain album gain is parsed
- MusicBrainz lookups are more resilient
- WEB-DL release tags are recognized in file names
- Hyphenated numbers in episode titles are no longer parsed as multi-episode files
- 3D format detection works when the tag is the last token of the path
- Person metadata refreshes are queued instead of blocking the request
Transcoder
- New upstream version of FFmpeg 8.1
- Optimized CUDA transposing filter performance
- Optimized OCL scaling filter performance
- Optimized OCL tonemapping filter performance on Mali GPU
- Use EOTF from BT 2446 Method B for HLG tonemapping
- Fix potential A/V desync in HLS when transcoding video while remuxing audio
- Avoid SSA to ASS conversion and loss of styles
- Add spec-compliant dvh1 HLS variant for DoVi P5 for compatibility
Web
- The Modern layout is now the default, the previous layout is now called Legacy
- Updated Music Videos view
- Updated Mixed Media view
- Updated Collections & Playlists view
- Updated Books view
- Add still watching prompt
- Add delay setting for photo slideshow
- Add caching of queries to indexed db for the tanstack query client for improved loading performance
- Add watch feature to log viewer
- Add ``
,`and`.`` as controls to scrub frame-by-frame - Add filters for audio and subtitle languages (modern layout only)
- Add Collections and playlist tab to all libraries
- Add collections to item details page
- Replace libpgs with libbitsub and adds support for vobsub rendering
- Merge cards for crew with multiple roles
Layout and themes
- All themes now derive from a shared base theme built on CSS variables, including Dark, Light, WMC, Blue Radiance, Apple TV, and Purple Haze. Custom themes may need to be adjusted
- The library toolbar has been merged into the app bar, with a sticky library header and design polish throughout the library
- Custom links can be added to the Modern layout
- The screensaver time setting is now available in the Modern layout
Libraries and browsing
- Collections and folders tabs for book libraries, and a folder view in the Modern home videos layout
- Default tab options for Home Videos and Photos libraries
- Studio search, and an extended Studios tab
- Play All and Shuffle buttons on the series library. Both are disabled rather than hidden when no items are available
- Improved Upcoming view
- Sorting and filtering on the Activity page
- A Reset Filters button in the filter dropdown
- Folders can be marked as played
- TV show creators are shown on item details
- Similarity providers can be configured per library
- Pagination controls are hidden when paging is disabled
Playback
- The playback info overlay is more compact and shows more detail
- Chapter names are shown in the OSD slider bubble
- Bitrate detection now runs in web
- Dolby Vision in MKV on webOS 25 and newer
- AV1 fMP4 stream copy on TV clients
- Direct play of anamorphic video on Tizen, and loosened anamorphic restrictions for browser device profiles
- On iOS, background playback continues when the screen is turned off, and audio normalization is disabled to fix pitch and speed issues
- libbitsub updated to v1.11.0 with an HLS offset fix
- The screensaver is suppressed while viewing photos or reading
TV and remote
- Game controller navigation fixes, and the gamepad repeat rate is no longer tied to framerate
- Keyboard controls work on non-Latin keyboard layouts, with additional fixes for older browsers
- Rewind and FastForward play state commands are handled
- SyncPlay menu update, and the SyncPlay ping is now reported to the server
- Focused and checked checkbox styling in the TV layout
Under the hood
- WebSockets have been migrated to SDK subscriptions
- The React and TypeScript migration continues with the libraries, Live TV, and networking pages, and the dashboard user pages now use the TS SDK
- TanStack Query now backs user settings and home screen sections, and the query cache is cleared when the server restarts
Notable fixes
- Blurry card images on high DPI displays, and card image sizes are rounded up
- Duplicate
/socketconnections - Login loop, connecting to the wrong server when several are configured, and native shell server selection when signing out
- An invalid request for all items on page load
- The Live TV default landing tab
- Holding and dragging on media no longer activates multi-select
- A warning is shown before restoring a version, a warning is shown when starting a backup while a scan is running, and a library scan starts automatically when folders are added to a library
Security
Server:
- Path validation has been added to the legacy HLS segment endpoints and to the plugin image endpoint, so a requested file must resolve inside the transcode directory
- Path traversal hardening has been extended to the image and plugin endpoints and to username path handling, building on the fixes released in 10.11.x
- The startup wizard can no longer be re-run without authentication on a misconfigured server
- Unsafe plugin package names are rejected by the plugin installer
- Parental filtering is enforced on additional endpoints, playlist visibility has been corrected, non-admin access to additional parts has been fixed, and people are exempt from the allowed tags visibility check
Web:
- Cross-site scripting via person roles
- Auth parameters are encoded when creating API clients
- The login disclaimer only allows common link protocol schemes
Books
Books have often taken a backseat in favor of video playback in Jellyfin, but this should no longer be the case. We have started a concerted effort to improve book support across the API and our official clients. eBook and comic support is still maturing, but the ODPS plugin allows for direct access from a wide range of popular self-hosted programs. Correspondingly, contributions in any repository are extremely welcome from the wider community. That includes server improvements, documentation changes, and third-party clients for book playback. A combination of eBook, comic, and audiobook support is available on the following clients.
Official: Web, iOS, Android, Desktop, Roku, Kodi, JMP Community: JellyBook, Symfonium, Jellium, Plappa
One notable omission from the server is book series as unique entities, which didn't make the cut for this release. If you would like to bridge the gap until they are added, feel free to use the Folio plugin to display them as collections. It functions very similar to the TMDb Box Sets plugin but only applies to eBooks.
Another in-flight feature is audiobook chapters, which are only available from the API at present. Luckily, this means client support is now possible, so you should see them appear in your favorite audiobook client before our next server release.

