Owner accepted Sassy the Sasquatch S01 v3.5 YouTube-auto-CC subs as '85 % acceptable, fine, not great' but flagged them for v4 WhisperX rebuild. Adds a single worklist file (STOPGAP-SUBS.md) so every show that ships via the v3.5 path gets logged for the eventual v4 sweep instead of being silently forgotten. Sassy run log gets a STOP-GAP banner at the top pointing to the new worklist. README.md gets a stop-gap-exception note alongside the STYLE.md hard-prereq paragraph. ROADMAP H5 now points at the worklist file as the canonical source of which shows v4 needs to regenerate.
143 lines
8.1 KiB
Markdown
143 lines
8.1 KiB
Markdown
# Roadmap — ARRFLIX
|
||
|
||
Last revised: **2026-05-08**
|
||
|
||
---
|
||
|
||
## Snapshot
|
||
|
||
| Metric | Value |
|
||
|---|---|
|
||
| Prod URL | https://arrflix.s8n.ru → 302 ✓ |
|
||
| Dev URL | https://dev.arrflix.s8n.ru → 302 ✓ |
|
||
| Theme | **Cineplex v1.0.6** (rolled back from NeutralFin) |
|
||
| Repo | `git.s8n.ru/s8n/ARRFLIX` |
|
||
| Library | 6 series + 2 movies, 175 eps + 9 featurettes |
|
||
| Disk | nullstone /home — 156G free (60% used) |
|
||
| Users | 9 (1 admin + 8 non-admin) |
|
||
| Snapshot tag | `snapshot-2026-05-08-pre-elegantfin` (rollback) |
|
||
| Docs | 17 in `docs/` + ADMIN-GUIDE + ROADMAP |
|
||
|
||
---
|
||
|
||
## 🟥 Open — High value (do first)
|
||
|
||
| # | Item | Effort | Blocker |
|
||
|---|---|---|---|
|
||
| H1 | ~~OpenSubtitles credentials~~ — done 2026-05-09; `Caveman5` saved + free API key at `~/.config/arrflix-opensubtitles-api.txt` | — | done |
|
||
| H2 | GPU transcode (nvidia driver kernel module + container toolkit + SecureBoot signing) | L | **owner sudo + reboot** |
|
||
| H3 | Apply `bin/force-english-all-users.sh` (German Play button breaks UX for non-English browsers) | S | none — owner runs |
|
||
| H4 | Backup `/home/docker/jellyfin/config/` off-host (no automated backup yet) | M | strategy decision |
|
||
| H5 | **v4 subtitle path: WhisperX large-v3 on friend RTX 4080 node**. Worklist = `processes/subtitles/STOPGAP-SUBS.md` (currently Sassy 5/5, will grow as more Big Lez universe shows ship via v3.5). Replaces v3.5 YT auto-CC stop-gap with proper-noun-prompted transcription. New helper at `processes/subtitles/lib/sub-whisperx-fetch.py`. WhisperX install on `100.64.0.3` (per memory `project_friend_gpu.md`, currently offline 2d); per-show prompt yaml at `processes/subtitles/prompts/<show>.yaml`. Expected 4–6 % WER vs ~12 % for YT auto-CC; restores STYLE.md "best quality" bar. | M | friend node back online + WhisperX setup |
|
||
|
||
## 🟨 Open — Medium value
|
||
|
||
| # | Item | Effort | Notes |
|
||
|---|---|---|---|
|
||
| M1 | Tune detail-page backdrop gradient stops if text contrast off | S | doc 14 §7 |
|
||
| M2 | EnableThrottling + EnableSegmentDeletion (kills wasted ffmpeg-after-disconnect) | S | doc 13 win 1 |
|
||
| M3 | KnownProxies + LocalNetworkSubnets in network.xml (fixes session origin on WAN endpoint) | S | doc 13 win 3 |
|
||
| M4 | PWA manifest bind-mount — kills "Jellyfin" name on Android/iOS install | M | doc 16 phase 1 |
|
||
| M5 | Logo-screensaver disable + i18n DOM-rewrite shim | M | doc 16 phases 2+3 |
|
||
| M6 | Extract `bin/cleanup-import.sh` + `normalize.py` from doc bodies into runnable files | S | docs 07/08 |
|
||
| M7 | Per-library themes (JS injector plugin + body class shim) | M | doc 06 — "tinted, not pixel-perfect" |
|
||
|
||
## 🟩 Open — Low value (nice-to-have)
|
||
|
||
| # | Item | Effort | Notes |
|
||
|---|---|---|---|
|
||
| L1 | Forgejo Actions CI (lint compose, shellcheck bin/, render docs) | M | not started |
|
||
| L2 | High-res ARRFLIX wordmark for desktop splash variant (currently 235×85, looks soft on 1080p+) | S | doc 14 finding |
|
||
| L3 | Hide lone "User" h3 header above Sign Out (cosmetic) | S | open Q from settings-fix agent |
|
||
| L4 | Rotate dev admin password (currently same as prod for parity) | S | open Q from settings-fix agent |
|
||
|
||
---
|
||
|
||
## 🚫 Blocked / waiting
|
||
|
||
| Item | Blocker | Action owner |
|
||
|---|---|---|
|
||
| OpenSubtitles auth | account signup at .com | **s8n** |
|
||
| Nvidia GPU | sudo + reboot decision | **s8n** |
|
||
| WAN public access | home router port-forward 80/443 → 192.168.0.100 | **s8n** |
|
||
|
||
---
|
||
|
||
## 🔒 Deferred (with reason)
|
||
|
||
| Item | Reason |
|
||
|---|---|
|
||
| Pixel-perfect Netflix/Crunchyroll/Spotify per-lib themes | requires 3 separate Jellyfin instances on subdomains; ~100× maintenance cost. Doc 06 |
|
||
| Custom Jellyfin Docker image (FROM jellyfin + COPY index.html) | bind-mount works; defer until ≥3 web-bundle overrides needed |
|
||
| Subdomain split for friend-only access | non-admin user policies + EnabledFolders ACL already do this on a single instance |
|
||
| Move to Jellyfin-Vue alt web client | replaces UI, breaks current branding stack |
|
||
| 4 TB HDD activation | wait until library exceeds 500 GB; currently 50G |
|
||
|
||
---
|
||
|
||
## ✅ Done
|
||
|
||
### Branding + theme
|
||
- ✅ Theme: ElegantFin → Cineplex → ElegantFin → NeutralFin → **Cineplex v1.0.6 (final)**, snapshot tag for rollback
|
||
- ✅ ARRFLIX logo data-URL injected — overrides Cineplex's logo on `.adminDrawerLogo img` + `.pageTitleWithLogo` (split-rule per element type, no overlap)
|
||
- ✅ Browser tab title `ARRFLIX` + favicon = ARRFLIX wordmark (via index.html bind-mount)
|
||
- ✅ Pre-bundle splash → ARRFLIX wordmark (no more Jellyfin logo on first paint)
|
||
- ✅ LoginDisclaimer "Welcome to ARRFLIX - Private invite only service"
|
||
- ✅ Critical-path inline `<style>` in index.html eliminates pre-bundle theme flash
|
||
- ✅ JS shim in index.html: title-lock + favicon-lock + nukeSettings + SW unregister
|
||
- ✅ Detail-page backdrop full-bleed gradient fix (was 17vw black band; now Netflix-style)
|
||
|
||
### UI hides + tweaks (CSS in CustomCss)
|
||
- ✅ Cast & Crew + USER-F Stars sections (`#castCollapsible, #USER-FCastCollapsible`)
|
||
- ✅ Quick Connect button + server-side disable (`.btnQuick`, `QuickConnectAvailable=false`)
|
||
- ✅ Settings drawer link v2 (`a.btnSettings, [data-itemid="settings"]` — verified on dev with headless A/B before swap)
|
||
- ✅ Header icons: SyncPlay group, Cast, User menu (`.headerSyncButton`, `.headerCastButton`, `.headerUserButton`)
|
||
- ✅ Unwatched-count badges (`.countIndicator`)
|
||
- ✅ Settings menu page access (`EnableUserPreferenceAccess=false` per non-admin)
|
||
- ✅ Slider thumbs blue → white (scrubber + volume on player OSD)
|
||
- ✅ Pure-black background
|
||
|
||
### Library
|
||
- ✅ Cleanup playbook: 17-doc set including pre-import strip rules + filename normalization
|
||
- ✅ Imports applied via cleanup → normalize pipeline:
|
||
- Futurama (1999) S01–S04, 72 eps + 9 featurettes (TMDB 615)
|
||
- American Dad! (2005) S01–S04, 58 eps (TMDB 1433)
|
||
- Rick and Morty (2013) S01, 11 eps (TMDB 60625)
|
||
- Star Wars: Maul – Shadow Lord (2026) S01, 10 eps (TMDB 289219)
|
||
- Obi-Wan Kenobi (2022) S01, 6 eps + 4 featurettes (TMDB 92830)
|
||
- The Incredible Hulk (2008) (TMDB 1724)
|
||
- Idiocracy (2006) (TMDB 7512)
|
||
- ⏳ The Mandalorian (2019) S01–S03 — 18/24 mkv on disk, scrape in flight
|
||
- ✅ Futurama season posters re-locked to highest-res TMDB (was low-res)
|
||
- ✅ Polish set replaced with English; libraries flipped `pl/PL` → `en/US`
|
||
|
||
### Users + access
|
||
- ✅ 9 users (`s8n` admin, `5`, `USER-D`, `USER-B`, `USER-F`, `USER-G`, `USER-A`, `USER-E`, `USER-C`)
|
||
- ✅ All non-admin policies: `IsAdministrator=false`, `EnableContentDeletion=false`, `EnableUserPreferenceAccess=false`, `LoginAttemptsBeforeLockout=5`
|
||
- ✅ Wrapper `bin/add-jellyfin-user.sh` — single-call canonical user creation (4-step pipeline: create + home layout + lang prefs + restricted policy)
|
||
- ✅ Home layout per-user: resume → resumeaudio → nextup → latestmedia (My Media tile row dropped)
|
||
|
||
### Infra
|
||
- ✅ Domain rename: `tv.s8n.ru` → `nasflix.s8n.ru` → **`arrflix.s8n.ru`**
|
||
- ✅ Repo rename: `jellyfin-stack` → `NASFLIX` → **`ARRFLIX`** at `git.s8n.ru/s8n/ARRFLIX`
|
||
- ✅ Pi-hole local DNS for `arrflix.s8n.ru` + `dev.arrflix.s8n.ru`
|
||
- ✅ LE certs via Gandi DNS-01 for both prod + dev
|
||
- ✅ WAN window: Gandi public A record `arrflix.s8n.ru → 82.31.156.86`, no-USER-F middleware dropped, lockout=5 baked in (router port-forward pending)
|
||
- ✅ Dev instance: `dev.arrflix.s8n.ru`, isolated config, shared `/home/user/media:/media:ro` mount with prod (read-only), 7 mirror users + s8n-dev admin
|
||
- ✅ Snapshot tag `snapshot-2026-05-08-pre-elegantfin` for one-command rollback
|
||
|
||
### Docs (17 + 2 indexes + bin/)
|
||
- ✅ `ADMIN-GUIDE.md` (entry point)
|
||
- ✅ `ROADMAP.md` (this file)
|
||
- ✅ `docs/01..16` covering: artwork, metadata, subtitles, theming-and-users, file-structure, per-library-themes, cleanup, normalization, WAN exposure, SPA shim, NeutralFin audit, dev instance, optimization audit, theme audit, force English, Jellyfin-branding leaks, dev mirror + settings fix
|
||
- ✅ `bin/add-jellyfin-user.sh`, `bin/inject-shim.py`, `bin/force-english-all-users.sh`
|
||
|
||
---
|
||
|
||
## Conventions
|
||
|
||
When marking an item:
|
||
- Move **Open** → **Done** when shipped + verified
|
||
- Move to **Blocked** when waiting on owner / external
|
||
- Move to **Deferred** with one-line reason
|
||
- Update **Snapshot** stats on every revision
|