diff --git a/ADMIN-GUIDE.md b/ADMIN-GUIDE.md index 20e4b05..52fde15 100644 --- a/ADMIN-GUIDE.md +++ b/ADMIN-GUIDE.md @@ -3,6 +3,8 @@ The single page that tells you what to do and where to read more. Anything not on this page lives in `docs/` — links inline. +What's next on this deploy → [`ROADMAP.md`](ROADMAP.md). + --- ## Where things live diff --git a/ROADMAP.md b/ROADMAP.md new file mode 100644 index 0000000..c254dfa --- /dev/null +++ b/ROADMAP.md @@ -0,0 +1,104 @@ +# 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 |