Jellyfin 12.0 Released: Major Database Changes, New Features, and Security Hardening

imagem 39

Jellyfin 12.0 is now available, bringing significant database restructuring, new media features, improved book support, and important security fixes. This is a major release that requires careful preparation before upgrading, as the database changes are irreversible without a full restore.

Upgrade Guidance

Before upgrading from an earlier version, a full backup of the data directory is strongly recommended. 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 should first upgrade to 10.10.7 before migrating to 12.0.

Installed repository plugins (anything not built-in) should be removed before migrating, as plugins will need time to adapt to the new database changes. Official plugins compatible with Jellyfin are available through the stable plugin repository; if you have changed to the unstable repository, please change it back to https://repo.jellyfin.org/files/plugin/manifest.json. After migrating, perform a full library scan to restore alternative versions. If you run into issues, prefix bug reports with “[12.0]”.

Packaging changes: Debian Bullseye and Ubuntu Focal packages are no longer built.

Server Highlights

The server introduces multiple versions for episodes, similarity and recommendation providers, and search providers that let plugins extend or replace how search results are produced. SchedulesDirect and EPG refresh fixes are included, along with fixes to the parental rating system and proper data pruning on file replacement or deletion. Support for triple+ digit episode numbers has been added, as well as library-specific BoxSet and Playlist filtering, CACHEDIR.tag support, Accept-Language header support, and a VideoRotation profile condition for Android TVs that do not support rotation metadata. Provider IDs are now parsed from season and episode folder/file names, and tmdb, tvdb, and imdb are accepted as aliases for the tmdbid, tvdbid, and imdbid provider IDs. Curly brace and parentheses support was added for parsing attribute values, along with new filters for audio and subtitle languages, NameStartsWith and NameLessThan filters for Person search, and OriginalLanguage as an option for PreferredAudioLanguage. A collection API for the Included In feature, VobSub subtitle stream support, and a Tmdb missing episode provider round out the changes.

Breaking and Behavior Changes

Legacy route prefixes (/emby/* and /mediabrowser/*) have been removed, so 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. Several obsolete API routes were removed, including POST /Users/{userId}/EasyPassword, GET /Items/{itemId}/CriticReviews, GET /Environment/NetworkShares, POST /System/MediaEncoder/Path, GET /LiveTv/Recordings/Groups/{groupId}, and GET /QuickConnect/Initiate. The global subtitle configuration has been removed; subtitle settings are now configured per library. File extension handling changed: .ogg is audio only, .aifc is recognized as audio, and .aiff is no longer treated as an image. Symlinks are resolved only at playback time. Sorting by name now uses SortName and CleanName, and the same cleaning logic is applied to ForcedSortName, so library ordering may change compared to 10.11. Image endpoints no longer upscale beyond the source resolution, meaning low-resolution artwork renders at its real size. 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 LinkedChildren table instead of serialized child lists. OwnerId and PrimaryVersionId are real GUID foreign keys, and ExtraIds has been dropped. Many tuning migrations cover item counts, item names, type and clean name, latest items, image info, and primary version id. On first boot, migration routines clean up existing data: 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. Queries for Resume, Next Up, rewatching, Latest Items for music, playlists and collections, artist lookup, and item counts are all faster. Item deletion is batched, fixing “too many SQL variables” failures when deleting large numbers of items. jellyfin.db can now be stored at a custom path.

Operations

A new --mode startup flag supports MediaServer, MigrateSystem, and SeedSystem, allowing migrations or database seeding to be run without starting the server—useful for containerized and orchestrated deployments. The startup interface has been restyled and now shows version and activity information. Disabled plugins are no longer re-enabled on restart, and full system backups skip corrupt keyframe rows instead of failing.

Media and Subtitles

Subtitle writing now goes through SubtitleEdit, avoiding 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 address races in concurrent subtitle conversion, cache invalidation when a subtitle is replaced, and ffmpeg hangs during extraction. A new HlsAudioSeekStrategy configuration option is available. Trickplay improvements include discovering existing files during a scan, fixing duplicates from interlaced video, normalizing invalid PTS values, and cleaning the cache 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 consumes, making repeat refreshes considerably cheaper.

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 is available, ReplayGain album gain is parsed, and 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

The transcoder now uses FFmpeg 8.1. Optimizations include CUDA transposing filter performance, OCL scaling filter performance, and OCL tonemapping on Mali GPU. EOTF from BT 2446 Method B is used for HLG tonemapping. A potential A/V desync in HLS when transcoding video while remuxing audio has been fixed. SSA to ASS conversion loss is avoided, and a spec-compliant dvh1 HLS variant for DoVi P5 has been added.

Web Client

The Modern layout is now the default, with the previous layout renamed to Legacy. Updated views for Music Videos, Mixed Media, Collections & Playlists, and Books are included. A “still watching” prompt, delay setting for photo slideshow, query caching to indexed DB, watch feature in log viewer, and frame-by-frame scrubbing with , and . controls are new. Filters for audio and subtitle languages are available in the modern layout. Collections and playlists tabs have been added to all libraries, and collections appear on item details pages. libpgs has been replaced with libbitsub, adding vobsub rendering support. Crew cards with multiple roles are merged.

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 adjustments. The library toolbar has been merged into the app bar with a sticky library header. Custom links can be added to the Modern layout, and the screensaver time setting is now available there.

Libraries and Browsing

Collections and folders tabs for book libraries and a folder view in the Modern home videos layout are added. Default tab options for Home Videos and Photos libraries are available. Studio search, an extended Studios tab, Play All and Shuffle buttons on the series library, improved Upcoming view, sorting and filtering on the Activity page, a Reset Filters button, folders marked as played, TV show creators on item details, per-library similarity provider configuration, and hidden pagination when paging is disabled round out the browsing improvements.

Playback

The playback info overlay is more compact and shows more detail. Chapter names appear in the OSD slider bubble. Bitrate detection now runs in the web client. Dolby Vision in MKV works on webOS 25 and newer. AV1 fMP4 stream copy is supported on TV clients. Direct play of anamorphic video works on Tizen, and anamorphic restrictions are loosened 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 is 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 include repeat rate no longer tied to framerate. Keyboard controls work on non-Latin keyboard layouts. Rewind and FastForward play state commands are handled. SyncPlay menu is updated and its ping is reported to the server. Focused and checked checkbox styling is improved in the TV layout.

Under the Hood

WebSockets have been migrated to SDK subscriptions. The React and TypeScript migration continues with libraries, Live TV, networking, and dashboard user pages. TanStack Query now backs user settings and home screen sections, and the query cache is cleared when the server restarts.

Notable Fixes

Fixes include blurry card images on high DPI displays, duplicate /socket connections, login loops, connecting to the wrong server, an invalid request for all items on page load, the Live TV default landing tab, holding and dragging on media activating multi-select, warnings before restoring a version or starting a backup while a scan runs, and automatic library scan when folders are added.

Security

Server-side improvements: Path validation has been added to legacy HLS segment endpoints and the plugin image endpoint, ensuring requested files resolve inside the transcode directory. Path traversal hardening extended to image and plugin endpoints and username path handling. The startup wizard can no longer be re-run without authentication on a misconfigured server. Unsafe plugin package names are rejected. Parental filtering is enforced on additional endpoints, playlist visibility corrected, non-admin access fixed, and people are exempt from the allowed tags visibility check.

Web-side fixes: Cross-site scripting via person roles, auth parameters encoded when creating API clients, and the login disclaimer only allows common link protocol schemes.

Books

Books have received a concerted effort to improve support across the API and official clients. eBook and comic support is still maturing, but the ODPS plugin allows direct access from popular self-hosted programs. Supported clients include Web, iOS, Android, Desktop, Roku, Kodi, and JMP officially, with community clients JellyBook, Symfonium, Jellium, and Plappa. Book series as unique entities did not make this release; the Folio plugin can display them as collections. Audiobook chapters are available only from the API at present, enabling client support before the next server release. The Bookshelf plugin has been deprecated, with features merged into the server or extracted into ComicVine and GoogleBooks providers.

Server Changes for Books

Local book parsing is improved and available without plugins. Metadata is extracted from OPF and ComicInfo files or ComicBookInfo comments. External covers are supported for audiobook files, posters are generated for EPUBs and comic archives, name, index, year, and series are parsed from book filenames, volume and chapter are available in the API when present in comic filenames, page counts are extracted from comic archives and PDFs, and creator names from OPF data are normalized. A new OpenLibrary plugin provides metadata and images, and ISBN external IDs and links are supported. Chapters are extracted from audiobooks.

Web Changes for Books

The modern book library layout includes view types and paging. Books display author information and vice versa. The playback interface is redesigned and standardized across all book types. Progress indicator is enabled for supported eBooks. Sorting by index number, release date, etc., is available. Font size selection improved for EPUB files. Background audiobook playback works on iOS. Authors, collections, and folders tabs have been added to book libraries, and audiobooks appear under authors. Fullscreen behavior is unified, and PDFs support swipe navigation.

Developer Notes

The API no longer allows deprecated authorization mechanisms by default; clients and tooling must migrate. The policy for API changes will be documented in the coming months. Key behavior changes: GetItems is asynchronous and applies recursive when filters are requested, limited to requests that include includeItemTypes. ItemByName responses are restricted and people are deduplicated. Several endpoints are newly obsolete but still functional with replacements, and HLS controllers are hidden from the specification.

Platform: The server targets .NET 10; plugins must be retargeted and rebuilt. Swashbuckle is updated to v10, changing the generated OpenAPI document. jellyfin-web builds with Node 24 LTS and npm 11.

Plugin changes: ISearchEngine is replaced by ISearchManager, and SearchEngine by SearchManager with SqlSearchProvider. Several types and members were removed or changed, including NowPlayingQueueFullItems, DtoExtensions.AddClientFields, Jellyfin.Extensions.AlphanumericComparator, the ISubtitleWriter family, and SubtitleOptions. ServerConfiguration.EncoderPreset is no longer nullable. IAuthenticationProvider.HasPassword removed. IPasswordResetProvider.StartForgotPasswordProcess takes the entered username and a nullable user. IUserManager methods changed to accept user IDs instead of User objects, and GetFirstUser was added. Several IItemRepository members moved to new services, and other repository and directory service signatures changed.

New Plugin APIs

This release adds several extension points. Search providers let plugins participate in search itself via ISearchProvider, with internal and external variants. Similarity and recommendation providers can be selected per library. Comic metadata providers can supply comic metadata. Chapters can be saved for any item type. Password resets for unknown users are supported. Media segment providers get a cleanup callback. Schedules Direct service and tuner host deletion are exposed. Alternate versions and linked children are relational, with new ILibraryManager methods. Batch APIs for bulk work include IUserDataManager and ILibraryManager additions. Localization helpers are available. ICollectionManager and IPlaylistManager gained new capabilities. IHasEmbeddedImage is new but only for plugins compiled into the server.

The deprecation of built-in TLS certificate handling announced in 10.11.0 has been postponed to a future version.

Changelog Summary

This release includes over 460 changes. Key security fix: a potential FFmpeg argument injection via unescaped subtitle file path was addressed. Highlights include implementing multiple versions for episodes and disabling legacy authorization methods by default.

Leave a Comment

Your email address will not be published. Required fields are marked *