A collection of useful JavaScript scripts and CSS snippets to enhance your Jellyfin web client and improve your overall experience.
- These snippets are created by a new Jellyfin user (me). They prioritize compatibility over performance or efficiency.
- My JavaScript scripts are experimental and may rely on frequent
setIntervalchecks, which can affect performance depending on your setup. Use them at your own discretion. Optimizations are possible by replacing intervals with event-based listeners where applicable.
- Tested on Jellyfin Web Client v10.11.5. Compatibility with other versions is not guaranteed.
- CSS snippets can be added directly via
Dashboard > Brandingor through external plugins. - JavaScript scripts can be added using Jellyfin-JavaScript-Injector.
@import url("https://cdn.jsdelivr.net/gh/Zenrac/Zenrac-jellyfin-scripts@latest/css/remove-my-media.css");@import url("https://cdn.jsdelivr.net/gh/Zenrac/Zenrac-jellyfin-scripts@latest/css/remove-cast.css");@import url("https://cdn.jsdelivr.net/gh/Zenrac/Zenrac-jellyfin-scripts@latest/css/show-full-season-name.css");Replace hyperlinks in search's suggestions with cards.
You can configure:
itemsCount- number of items to display.horizontalScroll- enable horizontal scrolling instead of vertical wrap.
const s = document.createElement("script");
s.src = "https://cdn.jsdelivr.net/gh/Zenrac/Zenrac-jellyfin-scripts@latest/js/suggestions-card.js";
s.dataset.itemsCount = 20;
s.dataset.horizontalScroll = "false";
s.async = true;
document.head.appendChild(s);Allows clicking the header logo to return Home. Also modifies the 'Home' tab behavior to match the 'Home' in menu, fixing a issue with Media Bar Plugin.
const s = document.createElement("script");
s.src = "https://cdn.jsdelivr.net/gh/Zenrac/Zenrac-jellyfin-scripts@latest/js/clickable-header-logo.js";
s.async = true;
document.head.appendChild(s);Enhances the KefinTweaks plugin to also be able to remove items from Next Up (it currently only allows removing Watching items)
const s = document.createElement("script");
s.src = "https://cdn.jsdelivr.net/gh/Zenrac/Zenrac-jellyfin-scripts@latest/js/remove-nextup-item.js";
s.async = true;
document.head.appendChild(s);Enabling Settings > Display > Theme videos adds a button to open the video theme player in a modal.
const s = document.createElement("script");
s.src = "https://cdn.jsdelivr.net/gh/Zenrac/Zenrac-jellyfin-scripts@latest/js/open-player-video-theme.js";
s.async = true;
document.head.appendChild(s);Adds video themes in show details. Ordering for Openings/Endings is supported. Built-in player in a modal.
const s = document.createElement("script");
s.src = "https://cdn.jsdelivr.net/gh/Zenrac/Zenrac-jellyfin-scripts@latest/js/display-video-theme.js";
s.async = true;
document.head.appendChild(s);Adds "Hide Watched" and "Random Dice" buttons to specified sections (can be configured individually). Uses Jellyfin-Enhanced for random dice. This supports KefinTweaks plugin section IDs.
You can configure:
diceButtonSection- Comma-separated list of section identifiers or class names where the Random (dice) button should be added.hideButtonSection- Comma-separated list of section identifiers or class names where the Hide Watched button should be added.countSection- Comma-separated list of section identifiers or class names where the item count badge should be added (defaults toNextUp,ContinueWatchingNextUp,ContinueWatching,watchlist).
To explicitly disable one of these features, set it to an empty string ("").
const s = document.createElement("script");
s.src = "https://cdn.jsdelivr.net/gh/Zenrac/Zenrac-jellyfin-scripts@latest/js/home-section-button.js";
s.dataset.diceButtonSection = "LatestShows,RecentlyAddedShows,new-episodes,watchlist,NextUp,ContinueWatchingNextUp,ContinueWatching";
s.dataset.hideButtonSection = "LatestShows,RecentlyAddedShows,new-episodes";
s.dataset.countSection = "LatestShows,RecentlyAddedShows,new-episodes,watchlist,NextUp,ContinueWatchingNextUp,ContinueWatching";
s.async = true;
document.head.appendChild(s);Disable examples:
s.dataset.diceButtonSection = "";
s.dataset.hideButtonSection = "";
s.dataset.countSection = "";A small fix for Media Bar to remove buggy HTML tags from Shows descriptions.
const s = document.createElement("script");
s.src = "https://cdn.jsdelivr.net/gh/Zenrac/Zenrac-jellyfin-scripts@latest/js/media-bar-plot-fix.js";
s.async = true;
document.head.appendChild(s);Dark Reader is a very popular extension but it causes issues with Jellyfin. This script forces the extension to ignore your pages.
const s = document.createElement("script");
s.src = "https://cdn.jsdelivr.net/gh/Zenrac/Zenrac-jellyfin-scripts@latest/js/remove-dark-reader.js";
s.async = true;
document.head.appendChild(s);Plugin Pages does not work on android mobile app because of JQuery. This script loads JQuery then reloads Plugin Pages.
const s = document.createElement("script");
s.src = "https://cdn.jsdelivr.net/gh/Zenrac/Zenrac-jellyfin-scripts@latest/js/plugin-pages-android.js";
s.async = true;
document.head.appendChild(s);Makes Upcoming Shows/Upcoming Movies cards from Home Screen Sections clickable by linking them to the item details page.
Uses the Jellyfin-Enhanced ARR calendar endpoint to map titles to Jellyfin items.
const s = document.createElement("script");
s.src = "https://cdn.jsdelivr.net/gh/Zenrac/Zenrac-jellyfin-scripts@latest/js/clickable-upcomings.js";
s.async = true;
document.head.appendChild(s);Adds a visual badge for series with a new season to make them easier to spot in lists.
const s = document.createElement("script");
s.src = "https://cdn.jsdelivr.net/gh/Zenrac/Zenrac-jellyfin-scripts@latest/js/new-season-badge.js";
s.async = true;
document.head.appendChild(s);To get everything in one JS. Convenient but not customizable.
all.js loader version:
const s = document.createElement("script");
s.src = "https://cdn.jsdelivr.net/gh/Zenrac/Zenrac-jellyfin-scripts@latest/js/all.js";
s.async = true;
document.head.appendChild(s);combined.min.js single-file version:
const s = document.createElement("script");
s.src = "https://cdn.jsdelivr.net/gh/Zenrac/Zenrac-jellyfin-scripts@latest/combined.min.js";
s.async = true;
document.head.appendChild(s);- The banner image at the top was generated with AI.
- Some code was AI-assisted but manually improved, reviewed and tested before use.
- Contributions are welcome! You can suggest new JS or CSS snippets, improvements to existing ones, or fixes.
- Please make sure your code is compatible with Jellyfin Web Client v10.11.5 or clearly specify if it targets other versions.
- Respect existing code style and naming conventions to keep the repository consistent.
- For discussions, ideas, or questions, you can open an issue or join the Jellyfin Community Discord.
This project is licensed under the MIT License - see the LICENSE file for details.






