# Roadmap — jellyfin-stack What's done, what's open, what's deferred. Update on every commit that lands or moves an item between buckets. Last revised: 2026-05-08 --- ## Done - [x] **Deploy**: Jellyfin 10.10.3 on nullstone, LAN-only at `tv.s8n.ru`, file-provider Traefik route, LE cert via Gandi DNS-01, Pi-hole local DNS pin, userns_mode=host - [x] **Theme**: ElegantFin v25.12.31 applied via `/System/Configuration/branding` - [x] **Cast & Crew + Guest Stars**: hidden globally via CustomCss (`#castCollapsible, #guestCastCollapsible`) - [x] **Library**: TV Shows → `/media/tv/Futurama (1999)/`, 72 eps + 9 featurettes, locked to TMDB 615 - [x] **Cleanup**: Polish set deleted, junk-stripped English set imported, source + staging deleted - [x] **Plugins**: OpenSubtitles v20 installed (v21+ needs JF 10.11 ABI) - [x] **Users**: `s8n` (admin), `guest` (non-admin, pw `123`) - [x] **Wrapper**: `bin/add-jellyfin-user.sh` for canonical user creation - [x] **Home layout**: My Media tile row dropped per user (resume / resumeaudio / nextup / latestmedia) - [x] **Docs**: 01–08 (artwork, metadata, subs, theming, file-structure, per-lib themes, cleanup, naming) + ADMIN-GUIDE.md --- ## Open — actionable now ### High value - [ ] **OpenSubtitles credentials** - Owner signs up at opensubtitles.**com** (NOT .org) - I POST creds to `/Plugins//Configuration` per [docs/03 § 3.4](docs/03-subtitles.md) - Test by triggering subtitle search on one Futurama episode - Free tier = 20 dl/day; full library will take ~3 days unless VIP - [ ] **GPU transcode (nvidia driver)** - GTX 1660 Ti present on nullstone, `nvidia-smi` fails — driver kernel module not loaded - SecureBoot enabled → DKMS module signing required - Steps in `README.md § Transcoding` and one earlier diagnosis turn - Blocks: anyone watching on a low-power client (phone, fire TV) currently CPU-transcodes - Estimated wall: 30 min + reboot (nullstone hosts traefik, forgejo, matrix — ~2 min downtime) - [ ] **Loading-splash rebrand** - Replace Jellyfin pre-bundle logo with `tv.s8n.ru` wordmark + 4-bar pulse spinner - Approach: bind-mount patched `/jellyfin/jellyfin-web/index.html` per the plan in this session's history - Doc to write: `docs/09-loading-splash.md` (pre-bundle vs CustomCss timing, regen-on-upgrade) ### Medium value - [ ] **Extract `bin/cleanup-import.sh` and `bin/normalize.py`** from docs 07 + 08 into runnable repo files (currently embedded in markdown only) - [ ] **Per-library themes (doc 06)** - Install `n00bcodr/Jellyfin-JavaScript-Injector` plugin - Ship 30-line shim that mirrors `topParentId` + `collectionType` from URL hash to body class - Add three scoped CSS blocks (`body.lib-movies` Netflix, `body.lib-anime` Crunchyroll, `body.lib-music` Spotify) - Source CSS hunt: 5 Netflix-flavoured bases listed in doc 06; Crunchyroll + Spotify must be hand-built (no existing theme) - Verdict per doc 06: "tinted, branded, recognisable" — NOT pixel-perfect - [ ] **Audit-vs-rules pass on current state** - `/home/user/media/tv/Futurama (1999)/` already conforms post-import - But: subtitle sidecars absent (waiting on OpenSubtitles creds) - Featurettes folder is lowercase ✓ - Year in parens ✓ - SXXEXX zero-padded ✓ - Episode title separator ` - ` ✓ ### Low value - [ ] **Library scaffolding**: empty `/media/{movies,anime,musicvideos}/` libraries exist; no content yet - [ ] **Backup strategy** for `/home/docker/jellyfin/config/` (DB + watched-state). Currently zero backups. Tie into existing nullstone backup chain. - [ ] **Forgejo Actions CI** for the repo (lint compose, validate `bin/*.sh` with shellcheck, render docs) --- ## Blocked / waiting on owner - OpenSubtitles creds → owner has not signed up yet - nvidia driver fix → owner needs to run sudo commands or approve disable-SecureBoot path - Decision on per-library themes (doc 06): green-light or skip --- ## Deferred - **Pixel-perfect Netflix/Crunchyroll/Spotify per-library**: would require 3 separate Jellyfin instances on subdomains. ~100× maintenance cost. Doc 06 § 5. Don't do. - **Custom Jellyfin Docker image**: `FROM jellyfin/jellyfin + COPY index.html`. Cleaner than bind-mount for splash + JS injector but extra build pipeline. Defer until ≥3 web-bundle overrides needed. - **Subdomain split for friend-only access**: friend already gets non-admin Jellyfin user via `bin/add-jellyfin-user.sh` with `EnabledFolders` ACL. Subdomain not necessary. - **Move to alternative web client (Jellyfin-Vue)**: replaces the whole UI, breaks ElegantFin + JS Injector. Owner explicitly wants Netflix-y, not vue-y. Don't do. - **Hardware change**: 4 TB HDD on nullstone idle. Wait until library exceeds 500 GB before activating second-path library mounts (doc 05 § Architecture C). --- ## Tracking When an item moves to **Done**, link the commit hash. When it stalls, note the blocker date. Don't let entries rot — review on the first of each month. | Item | Status | Last touch | Owner | |---|---|---|---| | OpenSubtitles creds | blocked-on-owner | 2026-05-07 | s8n | | nvidia driver | blocked-on-owner | 2026-05-07 | s8n | | Loading splash | open-actionable | 2026-05-08 | claude | | Extract bin/ scripts | open-actionable | 2026-05-08 | claude | | Per-library themes | open-actionable (decision pending) | 2026-05-08 | claude | | Library scaffolding | open-low-value | 2026-05-08 | s8n | | Backup strategy | open-low-value | not-started | claude | | Forgejo CI | open-low-value | not-started | claude |