🎉 A big release, powered by @Jake
Most of this release comes from Jake, whose PRs closed 12 issues this cycle,
including a large share of the open feature requests.
Huge thanks, Jake!
✨ New Features
-
Native Poster Tags (Experimental): The most awaited feature!
-
Media Tags can now be drawn straight into poster images for clients that do not run the web UI. Huge thanks to @4eh5xitv6787h645ebv for building this! #894 #895 #590
- Tested on Streamyfin, Afinity and the official Jellyfin Android TV app
- Wholphin is not supported yet; it needs damontecres/Wholphin#2031 to land first
- Rendered in-process using each user's own tag settings and positions, respects Spoiler Guard, and is cached
- Off by default, enable it under Display > Media Tags
-
Age Rating Badges and Rating Tag Scope: A round of Media Tags additions and a tidier settings fieldset. Big thanks to @4eh5xitv6787h645ebv! #887 #433 #557 #561 #857
- Age rating badges
- Preferred audio language with partial-dub flags, and full-series language flags
- Six switches (Movies, Series, Seasons, Episodes, Continue Watching row, Next Up row) to control where rating tags render
-
Maintenance Mode Countdown, Reminders and Daily Window: Contributed by @4eh5xitv6787h645ebv, thank you! #880 #686 #688
- Manual maintenance can have a duration, with a live countdown banner (
{countdown}and{ends_at}tokens) - Affected users get a reminder when they start playback
- A daily scheduled maintenance window can open and close by itself
- Manual maintenance can have a duration, with a live countdown banner (
-
Spoiler Guard Auto-Enable on Library Add: Another great one from @4eh5xitv6787h645ebv, thanks! #877 #801
- New titles added to the library (scan, Seerr download, manual copy) are automatically added to Spoiler Guard for every user who can see that library
- All three auto-enable modes can now be scoped by content type (TV shows, Movies) and by library
-
Random Button: Playlist and Collection Scope: Thank you @4eh5xitv6787h645ebv for the idea made real! #876 #794
- Pick from the playlist or collection you are viewing
- Or pin a playlist or collection of your choice as the source everywhere else
- Falls back to the whole library when the source is empty
-
Seerr: Manual TVDB Match: Many thanks to @4eh5xitv6787h645ebv! #874 #653
- For series where TMDB has no TVDB id (common for anime and shorts), the season request modal now offers Sonarr lookup matches
- Or enter a TVDB id manually, instead of Seerr silently dropping the request
-
Seerr: Movies and Series on Studio and Network Pages: Credit goes to @4eh5xitv6787h645ebv, thank you! #881 #770
- Applies to the Recommendations tiles and the "More from" section
- Movies and series now show together with an All | Movies | Series toggle
-
Subtitle Text Effects: New Text Effect presets (Auto, None, Shadow, Outline, Outline + Shadow) with a matching admin default. Auto keeps the existing look. Shoutout to @4eh5xitv6787h645ebv! #882
-
Mirror Review Ratings to Jellyfin: Optionally mirror review star ratings to Jellyfin user ratings (cleared again when the stars are removed), plus an admin endpoint to list all reviews. Thank you @builtbyproxy, much appreciated! #841
⚙️ Improvements
-
Faster Startup: One bootstrap request replaces the serial chain of config requests, and the client scripts are now served as a single server-side bundle that is evaluated in the browser's idle time. Massive thanks to @4eh5xitv6787h645ebv for the perf work! #891
-
Faster Details Pages: Item size and watch progress are computed without walking every episode (a 432 episode series went from about 1.7 s to under 100 ms) and are fetched in one combined request. TMDB lookups now use HTTP/2, a global in-flight cap, bundled details calls and a persisted response cache that survives restarts.
-
Browser-Cached Tag Cache: The server tag cache is kept in IndexedDB and only changes are downloaded on later page loads, and the cache payload is about 22% smaller. Poster review ratings now come with the tag cache instead of a request per page, and tag layout work is batched for smoother scrolling.
-
Smoother UI: Scoped emoji font stack, shared observers and subset icon fonts remove long layout stalls (for example about 500 ms on the first open of the settings panel).
🐞 Bug Fixes
- Themes Losing Icons: JE's Material Symbols subsets now use private font names, so themes such as Jellyfish keep their full icon set instead of showing ligature names like "PLAY_CIRCLE". Fixed by @4eh5xitv6787h645ebv, thanks! #895
- Header Tray With Foreign Buttons: The header tray now gets its own container when another plugin's button sits before the user menu. #899 #867
- Native Tab and Custom Tabs Collisions: Native tab indexes no longer collide with Custom Tabs, and enabling both for the same page is now blocked.
- Custom Tabs Sync Alert: The "Custom Tabs sync issue" alert no longer appears on config saves when Custom Tabs is not installed. Thanks again @4eh5xitv6787h645ebv! #889 #888
- Plugin Defaults Casing: Resolved a casing mismatch when merging server plugin defaults into user settings. Appreciate the fix, @jjaroztegi! #884
📖 Documentation
- README Showcase: The README is now a full feature tour with new screenshots and recordings, and several outdated claims were corrected. The same screenshots were applied to the docs site. Cheers to @4eh5xitv6787h645ebv for the screenshots and recordings! #896
🌍 Translations
- Translations updated via Hosted Weblate, and the new strings were completed with AI assistance. #885 #890 #897
- Gracias and a big thank you to @Kisnov for the translations this cycle!
🛠️ Maintenance
- chore(ci)(deps): bump the github-actions group with 4 updates (#886)
P.S. Enjoying the plugin?
Fuel development (and my storage addiction) with a coffee!











