Tree / Self Hosting / Movies & TV Shows / Jellyfin / Library View
Essentials
Eight Jellyfin Web scripts in one plugin, each with its own switch and settings in the dashboard, and the six header buttons in the order you choose.
- Status
- Green · Released
- Type
- plugin
- Hours
- about 3.5
- Tokens
- about 1.6 M
Released on GitHub for Jellyfin 10.10.7 and 12.0+, and running on my own server.
In this article
Eight scripts, one home
Over time I had built or extended eight scripts for Jellyfin Web: three header buttons, two extra rows for the details block, ratings, hover previews and keyboard navigation. All of them ran through the JavaScript Injector plugin. That worked, but setting them up did not feel like Jellyfin. You changed values at the top of the code, copied library IDs by hand and pasted the keys for the rating services into the source. I wanted to leave the Injector behind completely.
Essentials is the answer: one plugin that loads the eight scripts and gives each of them its settings from a normal plugin page in the dashboard. No code to edit, no IDs to copy, and every addition has its own switch.
What changes for the person who installs it
The settings page has a General tab and one tab per script. Together they hold every value that used to sit at the top of the code, with short one-line descriptions. Libraries are picked from a list instead of pasting IDs. The fine details, like the look and motion of Hover Previews for each kind of card, stay folded away until you need them, and fields that depend on a switch turn grey while it is off. A backup code saves the whole configuration, and the service keys are not part of it.
The scripts themselves did not move. Each one still lives in its own repository, and Essentials loads the current version from GitHub through jsDelivr. An improvement to a script reaches every server without a new plugin release, at the latest within about an hour. For testing there is a build switch that serves the scripts straight from the local repositories instead.
Without Essentials the scripts keep working as before with the Injector. Each copy runs only once per page, so two copies never fight, and the General tab names any old Injector entries that are still running one of the eight.
One order for six buttons
Six buttons from four projects sit in Jellyfin's header: Random, Autoscroll and Fullscreen from the scripts, plus Globe, Cinema Project and Destroy, which are plugins of their own. On the General tab you sort them with arrows.
To make that possible, all six got the same small contract. Each button reads the order from Essentials, and if Essentials is not there, it falls back to its fixed list. A button whose plugin is missing, or whose addition is switched off, simply takes no place. The buttons do not need to know about each other, only about the order.
Where Jellyfin held on
The most stubborn problem was the start page. Jellyfin serves its index.html with a fixed ETag. A changed button order was written into the page, but the browser asked whether anything had changed, got "not modified" and kept the old one. The fix was to move everything that can change into a small file of its own that is never cached, and to make sure it still runs before all other scripts.
Two other problems turned out not to be in the code at all. Jellyfin's tray app refused to start the server several times. My guess was that a running test instance was in the way, and it was: the tray treats every jellyfin.exe as its own server. And a details row that did not appear in a test was not a bug in the script, but a hidden browser window with a width of zero pixels.
Built and checked by a Claude Code session
Essentials was built by the Claude Code session that coordinates my Jellyfin projects, not by one of the project sessions. I set the goal, chose the logo from several rounds of drafts and gave each go-ahead.
The checks were the larger part of the work. An own audit was followed by an independent counter-audit, which found no serious faults and a handful of medium ones, and which compared all 251 settings paths with the scripts: every one of them matched. A polishing pass made the texts read as written by hand, a convention check compared the admin page with my other plugins, and every description was cut to one sentence on one line.
The test matrix covered both Jellyfin lines and every interface: 10.10.7 classic, 12.1 modern and classic, phone and TV. The settings of every script take effect, switched-off additions do not load, users without admin rights see the right things, and signing in from the login page, a cold start, running without File Transformation and uninstalling without leftovers all work. Along the way the audit found a fault in one of the scripts: MediaInfo Ratings asked MDBList on every details page even when no key was set. That is fixed.
Limits
- Jellyfin Web only. Apps that do not load the server's web page do not show the additions.
- Autoscroll, Fullscreen, MediaInfo Ratings and Hover Previews run only in browsers on Windows, as their scripts always did.
- A changed script takes up to an hour to arrive, because of the jsDelivr cache.
- The order covers these six buttons. Buttons from other plugins stand to their right.
Released
Essentials is public on GitHub under MIT, in two builds from one source: 1.x for Jellyfin 10.10.7 and 2.x for 12.0+. Jellyfin's plugin catalog offers the one that matches the server, and it needs the File Transformation plugin by IAmParadox27. Credit for two of the scripts goes to Druidblack, whose jellyfin_ratings MediaInfo Ratings is based on, and to malte9799, whose Collection Preview the Hover Previews extend. The ratings come from MDBList, and country, awards and box office from OMDb.
Connected
Next: Ratings Enhanced