How it works
What is this?
Jellycanvas is a theme designer for Jellyfin 12, delivered as a server plugin. A theme is one JSON file with the designer's settings. This site is where people share those files - with a live preview, so you can see a theme on a real Jellyfin 12 before you touch your own server.
Using a theme
- Install the plugin: Dashboard → Plugins → Repositories → add
https://raw.githubusercontent.com/SpeeDFireCZE/jellycanvas/main/manifest.json, then install Jellycanvas from the catalog and restart. - Open Dashboard → My Plugins → Jellycanvas and scroll to Share / import.
- On a theme's page here, copy the import link and paste it into the import box (or download the .json and open it there). The plugin fetches the file and loads it into the designer.
- Look at the preview, change what you like, then Apply. Nothing on your server changes before that.
Themes marked needs File Transformation use the plugin's client script (home slideshow, card badges, the info bar). That part needs the File Transformation plugin on your server; the CSS part works without it.
Sharing a theme
Sign in - with GitHub, or with an account made here (a name and a password, no e-mail) - click Share a theme and paste the JSON from the designer's Copy theme JSON. The preview shows it as others will see it. You can edit or delete your themes any time from My themes.
What the checks do
Every upload is validated against the plugin's own settings model before it is stored, rendered or served:
- Only real settings. Keys the plugin does not have are dropped. A value of the wrong type, a color that is not a color, a choice the plugin does not offer - the file is refused with the exact path that is wrong. The designer never writes such a file, so it is not a theme.
- Nothing private. Custom toolbar buttons (they point at your services), the Seerr address and API key, the info bar text, the login title, your uploaded logo and image links that are not public https addresses are removed - the same things the designer's own export strips.
- Custom CSS on a leash. The free-form CSS block may not
@importanything, useurl()on anything but https, or use the old code-running tricks (expression(),behavior, escapes that spell them out). It is limited in size. - Rendered by the plugin, not by us. The CSS you see in the preview - and the CSS your server will generate - comes from the same plugin code, running on this site's demo Jellyfin. The file the site serves is the cleaned copy; the raw upload is never kept.
- Limits. Files up to 256 KB, a handful of uploads per hour per account.
A theme is still CSS: it can hide, move or restyle anything in the web client. Look at the preview and the JSON before you apply one - it is your server.
The preview
The preview is a real Jellyfin 12 with the plugin installed and a small demo library, signed in as a user who can only look. It is reachable only through this site and only for reading; whatever you click in it stays in the demo.
Five of the pages cannot be visited that way - the player's prompts only exist while a video plays, and the admin pages belong to an administrator. Those are drawn from the same markup the client builds, with the theme applied to it, the way the plugin's own designer shows them: a picture of the page, with nothing behind it to change or save.