Repository navigation
Releases: jampez77/ScreenHarbour
Release list
ScreenHarbour 0.2.55
ScreenHarbour 0.2.55 — prerelease
Returning from a movie restores the selected Home item to the position it occupied on screen when opened. Saving only the scrolling containers’ offsets was not enough when Jellyfin changed the layout or replaced a scrolling container while the item’s details were open.
Home now also remembers the item’s viewport position. Restoration finds its current scrolling containers and corrects movement caused by delayed native scrolling or layout updates. This follows the actual changes instead of relying on one correction after a fixed delay, which could occur too early on a slower TV.
The originating row and tab, selected item, shuffle order and loaded artwork are retained. Left/Right navigation can immediately select another item without having its horizontal position pulled back; leaving the row, pointer input and manual scrolling remain responsive. Fresh Home visits still reshuffle enabled rows.
All saved rows, settings, seasonal effects and manual ordering are preserved. No reconfiguration or settings migration is required.
Update
Update ScreenHarbour, restart Jellyfin, then fully reload browsers or close and reopen web-based TV clients. Keep File Transformation enabled.
| Jellyfin server | Plugin version |
|---|---|
| 10.10.7 | 0.2.55.1 |
| 10.11.x | 0.2.55.2 |
| 12.x | 0.2.55.3 |
The existing catalogue remains:
https://raw.githubusercontent.com/jampez77/ScreenHarbour/main/manifest.json
Plugin identity, assembly name, existing API routes, storage keys and settings remain unchanged.
Validation
- TypeScript validation and all 254 unit tests passed.
- The full browser suite passed 694 tests; 74 optional upstream integrations were skipped because their external fixtures were unavailable.
- Regression checks reproduce delayed native animation frames, replacement scrolling containers, late row-height changes without browser scroll anchoring, and exact seasonal viewport restoration. They also cover immediate navigation, repeated Back, unchanged shuffle order and account isolation.
- All 801 Jellyfin 12 server verification checks passed.
- All three server packages built without warnings. DLL versions, embedded client bundles, archive checksums and preservation of all 165 previous catalogue entries were verified.
Physical LG webOS behavior has not been tested by this release work.
ScreenHarbour 0.2.54 — Home return position and stronger parallax
ScreenHarbour 0.2.54 — prerelease
Back to Home now makes one final position correction after Jellyfin’s delayed native focus scrolling finishes. That queued animation could otherwise move the page after ScreenHarbour had restored the selected card. The correction preserves the originating row and tab, current shuffle and loaded artwork. It does not refocus another card, and new navigation, pointer input or wheel scrolling takes priority.
Seasonal parallax now has three times the movement range: 13.5% of the row width from one end to the other, previously 4.5%. It uses the same existing background image and 115%-wide scenery surface, with safe overlap at both ends. No additional images or graphics layers are added. Updates remain limited to one transform per animation frame, and reduced-motion preferences keep the background still.
Fresh Home visits still reshuffle enabled rows. All saved rows, settings, seasonal effects and manual ordering are preserved. No reconfiguration or settings migration is required.
Update
Update ScreenHarbour, restart Jellyfin, then fully reload browsers or close and reopen web-based TV clients. Keep File Transformation enabled.
| Jellyfin server | Plugin version |
|---|---|
| 10.10.7 | 0.2.54.1 |
| 10.11.x | 0.2.54.2 |
| 12.x | 0.2.54.3 |
The existing catalogue remains:
https://raw.githubusercontent.com/jampez77/ScreenHarbour/main/manifest.json
Plugin identity, assembly name, existing API routes, storage keys and settings remain unchanged.
Validation
- TypeScript check, 254 unit tests and 801 server checks passed.
- 303 browser checks passed; 14 optional Featured/ElegantFin integration checks were skipped because their external fixtures are unavailable.
- The return regression reproduces the previous failure with Jellyfin’s actual queued scrollManager. Checks cover exact row/tab identity, viewport and full-screen alignment, document and nested scrolling, older focus behavior, repeated Back, delayed native reveal, immediate remote input and wheel-scroll priority.
- Parallax checks verify three times the travel, covered image edges at multiple screen sizes, reduced-motion behavior and one transform update per burst of scroll events. Existing seasonal navigation and retained-artwork checks also pass.
- All three target packages passed assembly identity/version, embedded client/artwork and checksum checks. All 162 historical catalogue entries remain unchanged, with the correct new version selected for each server target.
- Physical LG webOS behavior has not been tested by this release work.
ScreenHarbour 0.2.53 — preserve shuffled rows on Back
ScreenHarbour 0.2.53 — prerelease
Opening a film from a shuffled Home row and returning with Back now keeps the current item order. The selected card returns to the same place in the originating row, including when that film appears in several Home rows.
A fresh Home visit still reshuffles rows with Shuffle on load enabled. Background refreshes keep the current visit’s order stable. Saved manual ordering, collection membership, seasonal settings and the shuffle preference itself are unchanged. No reconfiguration or settings migration is required.
Update
Update ScreenHarbour, restart Jellyfin, then fully reload browsers or close and reopen web-based TV clients. Keep File Transformation enabled.
| Jellyfin server | Plugin version |
|---|---|
| 10.10.7 | 0.2.53.1 |
| 10.11.x | 0.2.53.2 |
| 12.x | 0.2.53.3 |
The existing catalogue remains:
https://raw.githubusercontent.com/jampez77/ScreenHarbour/main/manifest.json
Plugin identity, assembly name, existing API routes, storage keys and settings remain unchanged.
Validation
- TypeScript check, 254 unit tests and 801 server checks passed.
- 285 browser checks passed; 14 optional Featured/ElegantFin integration checks were skipped because their external fixtures are unavailable. Coverage includes exact row/tab restoration for duplicate films, unfocused desktop activation, nested details navigation, fresh-visit shuffling, metadata and resume updates, account isolation, and seasonal TV navigation.
- The 240-card animated Home fixture retains the same rows, cards and loaded artwork on Back with shuffle enabled, remains interactive while background requests wait, and shows no initial loading screen.
- All three target packages passed assembly identity/version, embedded client/artwork and checksum checks. All 159 historical catalogue entries remain unchanged, with the correct new version selected for each server target.
- Physical LG webOS behavior has not been tested by this release work.
ScreenHarbour 0.2.52 — collection rows in Settings
ScreenHarbour 0.2.52 — prerelease
Open Settings → ScreenHarbour → Collection rows in desktop display mode to configure your Home rows. The editor now sits alongside Streaming services and Loading screen, and the Collections page keeps its browsing controls. If you have renamed the interface, your configured title replaces ScreenHarbour in the Settings section heading.
The same editor still provides collection choices, tabs, manual item order, ranking, Home position, Watchlist rows, seasonal groups, themed appearance and live previews. Editing remains desktop-only; TV continues to display the saved account rows without an editing control.
All existing rows and settings remain unchanged. No reconfiguration or settings migration is required.
Update
Update ScreenHarbour, restart Jellyfin, then fully reload browsers or close and reopen web-based TV clients. Keep File Transformation enabled.
| Jellyfin server | Plugin version |
|---|---|
| 10.10.7 | 0.2.52.1 |
| 10.11.x | 0.2.52.2 |
| 12.x | 0.2.52.3 |
The existing catalogue remains:
https://raw.githubusercontent.com/jampez77/ScreenHarbour/main/manifest.json
Plugin identity, assembly name, existing API routes, storage keys and settings remain unchanged.
Validation
- TypeScript check, 254 unit tests and 801 server checks passed.
- 194 browser checks passed; 2 optional ElegantFin checks were skipped because their external CSS fixture is unavailable. Coverage includes Settings navigation, server context, Save/Cancel/Back focus, account isolation, existing seasonal settings, previews and the other Settings editors.
- All three target packages passed assembly identity/version, embedded client/artwork and checksum checks. All 156 historical catalogue entries remain unchanged, with the correct new version selected for each server target.
- Physical LG webOS behavior has not been tested by this release work.
ScreenHarbour 0.2.51 — faster return to Home
ScreenHarbour 0.2.51 — prerelease
Returning from movie details now reuses Home’s existing cards, seasonal scenery and channel artwork instead of rebuilding them. The selected item and scroll position are restored to the retained page.
Native rows that already contain items can refresh in the background without blanking Home. Custom collection and streaming-service rows are rebuilt only when their content or configuration changes. Initial loading still waits for the first row batch.
Seasonal timers, animation frames, lazy-background observers and resize work pause while Home is inactive. Returning resumes them around the restored selection, retaining loaded artwork and the row’s expanded state. Channel-logo lookup and image completion also wait to update the page until Home resumes.
Retained Home belongs to the same account and server; profile changes and sign-out do not reuse another user’s page. Saved settings, seasonal dates, row positions, shuffle behavior, expansion, themed headings, frames, doors, parallax and lazy-loaded TV images are preserved. No configuration changes are needed.
Update
Update ScreenHarbour, restart Jellyfin, then fully reload browsers or close and reopen web-based TV clients. Keep File Transformation enabled.
| Jellyfin server | Plugin version |
|---|---|
| 10.10.7 | 0.2.51.1 |
| 10.11.x | 0.2.51.2 |
| 12.x | 0.2.51.3 |
The existing catalogue remains:
https://raw.githubusercontent.com/jampez77/ScreenHarbour/main/manifest.json
Plugin identity, assembly name, existing API routes, storage keys and settings remain unchanged.
Validation
- TypeScript check, 254 unit tests and 801 server checks passed.
- 275 browser checks passed; 14 optional Featured/ElegantFin fixture checks were skipped because their external fixtures are unavailable. New regressions cover retained artwork, remote input during background reads, successive metadata refreshes, account cleanup and deferred collection-tab completion.
- All three target packages passed embedded client/artwork, assembly identity/version and checksum verification. The catalogue retains all 153 historical entries unchanged and selects the correct new build for each server version.
- A Chromium benchmark at 6× CPU slowdown, with 240 collection cards and two fullscreen Nightmare scenes, measured about 45% less main-thread work on warm return and no repeated seasonal-artwork requests. This is a browser measurement, not an LG timing guarantee.
- Physical LG webOS responsiveness still needs confirmation after installation.
ScreenHarbour 0.2.50 — stop seasonal TV navigation bouncing
ScreenHarbour 0.2.50 — prerelease
Fixes seasonal rows bouncing up and down when moving Left/Right on TV. Jellyfin’s native scroll manager schedules its own focus-centering animation after a card receives focus. That movement competed with ScreenHarbour’s seasonal-row alignment, even when CSS smooth scrolling was temporarily disabled.
Seasonal card scrollers now use Jellyfin’s existing custom-scroll contract on both axes. ScreenHarbour keeps the selected item visible and positions the row without the delayed native animation pulling it away again. Other Jellyfin scrollers keep their existing behavior.
Left/Right movement adjusts only the horizontal position. Entering or leaving a seasonal row gets one bounded final visibility check after any earlier native animation finishes. It does not restart on each horizontal keypress, follow an abandoned selection or survive leaving the page.
The previous release’s checks covered CSS smooth scrolling but missed Jellyfin’s JavaScript scroll animation. This release adds regressions using the Jellyfin 12 scroll manager to exercise that interaction.
All saved settings, row positions, seasonal dates, expansion choices, themed headings, frames, doors, ranks, shuffle choices, local fonts and smaller lazy-loaded TV images are preserved. No configuration changes are needed.
Update
Update ScreenHarbour, restart Jellyfin, then fully reload browsers or close and reopen web-based TV clients. Keep File Transformation enabled.
| Jellyfin server | Plugin version |
|---|---|
| 10.10.7 | 0.2.50.1 |
| 10.11.x | 0.2.50.2 |
| 12.x | 0.2.50.3 |
The existing catalogue remains:
https://raw.githubusercontent.com/jampez77/ScreenHarbour/main/manifest.json
Plugin identity, assembly name, existing API routes, storage keys and settings remain unchanged.
Validation
- Typecheck, 254 unit tests and 801 server checks passed.
- All 263 selected Home, seasonal and provider browser checks passed. Fourteen checks needing optional external Featured/ElegantFin fixtures were skipped.
- Eighteen regressions run Jellyfin 12’s actual, pinned scroll manager. The old build reproduced 54–84px vertical jumps; the corrected build remains stable during horizontal navigation. Coverage includes static/parallax scenes, expansion sizes, document/nested scrolling, missing
preventScrollsupport, rapid entry/exit, subsequent seasonal rows, route cleanup and zero vertical page/ancestor writes on horizontal keys. - The native source is verified by SHA-256 and fetched from its pinned upstream commit when a local audited copy is absent. That download path was also checked.
- All three packages are verified for assembly identity/version, embedded client/assets/fonts, licences and checksums. The catalogue preserves all 150 previous entries unchanged.
- Physical LG webOS behavior still needs confirmation after installation.
ScreenHarbour 0.2.49 — smoother seasonal rows
ScreenHarbour 0.2.49 — prerelease
Full-screen seasonal rows now finish positioning on initial focus, without needing another Left/Right press. Native CSS smooth scrolling could compete with expansion and leave the scene short of its final position. Seasonal focus now temporarily suppresses that scrolling, restores the original declaration and settles below the header. Late font or header changes also receive a final alignment.
Expansion commits the final layout once and animates the visible layers with compositor transforms. This avoids continuously changing row padding and repainting the large background throughout the animation. Parallax, animated doors, themed headings and reduced-motion support remain available.
Remote navigation measures adjacent candidates instead of all 60 posters on every horizontal move. Vertical movement checks only the controls needed to preserve the selected column and uses final row positions while expansion is still moving. Arrow, focus and scroll events share saved-position work; activation and Back still save immediately. Temporary smooth-scroll overrides no longer cause Home to rediscover and reattach its rows.
In a Chromium comparison with 6× CPU throttling, a 60-poster Nightmare scene with parallax, frames, doors and full-screen expansion used approximately 60% less main-thread work and 79% less paint work over three expansion/collapse cycles. Twelve horizontal moves used about 7% less main-thread work. These are two-run browser averages against 0.2.48, not a measured frame-rate improvement on the physical LG television.
All saved settings, row positions, seasonal dates, frames, doors, ranks, shuffle choices, local fonts and smaller lazy-loaded TV images are preserved. No configuration changes are needed.
Update
Update ScreenHarbour, restart Jellyfin, then fully reload browsers or close and reopen web-based TV clients. Keep File Transformation enabled.
| Jellyfin server | Plugin version |
|---|---|
| 10.10.7 | 0.2.49.1 |
| 10.11.x | 0.2.49.2 |
| 12.x | 0.2.49.3 |
The existing catalogue remains:
https://raw.githubusercontent.com/jampez77/ScreenHarbour/main/manifest.json
Plugin identity, assembly name, existing API routes, storage keys and settings remain unchanged.
Validation
- Typecheck, 254 unit tests and 801 server checks passed; artwork/font version checks were rerun after the version update.
- All 245 selected Home, seasonal and provider browser checks passed. Fourteen checks requiring optional external Featured/ElegantFin fixtures were skipped.
- Fifteen settlement regressions cover initial focus, document/nested smooth scrolling, shrinking headers, interrupted animations, immediate horizontal reveal, delayed fonts, resize, route cleanup, missing animation APIs and Back followed by Down during expansion.
- Packages for all three server targets are checked for assembly identity/version, embedded client/artwork/fonts, licences and checksums. The catalogue retains all 147 previous entries unchanged.
- Physical LG webOS responsiveness still needs confirmation after installation.
ScreenHarbour 0.2.48 — Smoother seasonal rows and full-screen scenes
ScreenHarbour 0.2.48 — prerelease
Seasonal rows have an optional Full screen setting under Appearance → Height when focused. Focusing an item expands the row into the space beneath Jellyfin’s header and transforms its heading into larger themed lettering. Each of the seven Halloween/Christmas scenery styles has its own locally bundled font, including horror lettering for Nightmare. Posters keep their normal size; leaving the row restores its ordinary height and title. Up/Down continues through Home normally. The editor shows a scaled preview, and reduced-motion preferences remain respected.
TV navigation avoids repeated Home discovery and placement work when focus moves between seasonal cards. Saved scroll positions reuse existing row references until Home changes. Horizontal navigation inspects the current row, and door reveals update only the previously and newly selected cards. Parallax moves one clipped scenery layer instead of repainting the background position on every scroll frame; the additional graphics layers are released when the row loses focus.
A 60-card browser fixture previously performed 55 native-row discoveries, 24 Home reattachments and 12 complete navigation-row scans during twelve horizontal moves. The updated code performs none of those repeated scans. These are controlled browser measurements, not a measured frame-rate improvement on an LG television.
Existing settings, seasonal dates, row positions, doors, frames, ranking, shuffle and the smaller lazy-loaded TV images are preserved. Full-screen expansion is opt-in. Clients predating this feature can read the rows but cannot silently erase a saved full-screen appearance. Font files are served locally and cached; only the selected style downloads. Their SIL Open Font License notices and provenance are included in each package.
Update
Update ScreenHarbour, restart Jellyfin, then fully reload browsers or close and reopen web-based TV clients. Keep File Transformation enabled.
| Jellyfin server | Plugin version |
|---|---|
| 10.10.7 | 0.2.48.1 |
| 10.11.x | 0.2.48.2 |
| 12.x | 0.2.48.3 |
The existing catalogue remains:
https://raw.githubusercontent.com/jampez77/ScreenHarbour/main/manifest.json
Plugin identity, assembly name, existing API routes, storage keys and settings remain unchanged.
Validation
- Typecheck and all 254 unit tests passed.
- 224 browser checks passed, including 15 using the actual pinned Jellyfin 12 items-container source. Fourteen optional external Featured/CSS-fixture checks remain skipped. Validation covers Home navigation and return positions, full-screen expansion/collapse, long titles, all seven local fonts, reduced motion, editor persistence, lazy loading, abandoned-row cleanup, advent dates, compositor layer limits and legacy webOS CSSOM behaviour.
- All 801 server checks passed, including settings round trips, old-client safeguards, and exact font bytes, licences, caching and conditional requests.
- Packages are built for all three supported Jellyfin targets and checked against the client bundle, embedded artwork/fonts, assembly identity/version, checksums and catalogue. All 144 historical entries are preserved unchanged.
- Physical LG webOS smoothness and the new full-screen mode still need confirmation after installation. Version 0.2.47 was confirmed to load on the user’s TV with parallax and animated doors.
ScreenHarbour 0.2.47 — lighter TV artwork and lazy backgrounds
ScreenHarbour 0.2.47 — prerelease
TV mode now uses smaller, more compressed photographic seasonal artwork. Backgrounds are 1280 × 480 at WebP quality 60, instead of 2048 × 768 at quality 90. Photographic doors and frames are 600 pixels high at quality 70, with frame transparency preserved. Desktop keeps the original artwork.
The Halloween Nightmare background drops from 186,758 bytes to 20,074 bytes (about 182 KiB to 20 KiB, an 89% reduction). Its decoded RGBA pixel data falls from roughly 6 MiB to 2.34 MiB. Across all seven photographic assets, individual download reductions range from 84% to 94%. These figures describe artwork costs, not total application memory or a measured improvement on the physical TV.
Seasonal backgrounds now load when their rows come within 300 pixels of the viewport. Direct focus or mouse hover loads immediately; editor previews stay eager. Missing or unavailable IntersectionObserver support falls back to immediate loading. Row geometry, titles and items remain present while background artwork waits, and loaded backgrounds remain available during navigation. No fixed delay is added.
Existing settings, collection positions, seasonal dates, doors, frames, parallax and expansion choices are preserved. The Chromium 79 sizing-loop fix from 0.2.46 remains included. No extra transparency or opacity change is used to disguise the artwork; CSS opacity would not reduce downloaded bytes or decoded dimensions.
Update
Update ScreenHarbour, restart Jellyfin, then fully reload browsers or close and reopen web-based TV clients. Keep File Transformation enabled.
| Jellyfin server | Plugin version |
|---|---|
| 10.10.7 | 0.2.47.1 |
| 10.11.x | 0.2.47.2 |
| 12.x | 0.2.47.3 |
The existing catalogue remains:
https://raw.githubusercontent.com/jampez77/ScreenHarbour/main/manifest.json
Plugin identity, assembly, API routes and storage keys are unchanged. TV image variants use separate URLs so previously cached desktop images remain valid. Artwork can be regenerated with bash scripts/optimize-seasonal-art.sh using cwebp.
Validation
- Typecheck and all 248 unit tests passed.
- 68 browser checks passed: nine new tests for lazy requests, direct focus, unsupported observers, mounted/staged cleanup, previews and TV/desktop asset selection, plus 59 existing seasonal, frame-fit, navigation, editor, graphics-layer and Chromium 79 rounding-regression checks. One optional external native-CSS fixture was skipped.
- All 735 server checks passed against Jellyfin 10.11.0, including HTTP bytes, caching and conditional requests for all 14 embedded seasonal images.
- All seven smaller assets were visually inspected. Frame alpha remains present; the seven desktop images are unchanged. The reproducible encoder script passes shell syntax validation.
- Packages are built for all three supported Jellyfin targets and verified against their client bundle, embedded artwork, assembly identity/version, MD5/SHA-256 and catalogue entries. All 141 historical catalogue entries are retained unchanged.
- Physical LG webOS responsiveness needs confirmation after installation. This release isolates the requested artwork reduction and loading changes; it does not disable or shorten expansion animations.
ScreenHarbour 0.2.46 — seasonal layout loop fix
ScreenHarbour 0.2.46 — prerelease
Fixes a continuous seasonal-row layout update in older Chromium browsers. With row expansion enabled, the calculated padding could contain a long decimal such as 38.30000000000001px. Chromium 79 stores that as 38.3px. Comparing the two as text caused ScreenHarbour to write the padding again, trigger its Home observer, and repeat before the browser could paint. This can happen with a static background, without doors or parallax.
Seasonal measurements now use stable pixel values and compare their numeric sizes. Repeated attachment can settle, while resizing and focus expansion still update the row. The background images and all seasonal options remain available. The original image is unchanged: the Halloween Nightmare background is 2048 × 768 pixels and about 182 KiB on disk.
Existing settings, collections, seasonal dates, artwork choices and advent unlock rules are preserved. The graphics-layer reduction from 0.2.45 remains included. That earlier change did not resolve the reported physical TV problem by itself.
Update
Update ScreenHarbour, restart Jellyfin, then fully reload browsers or close and reopen web-based TV clients. Keep File Transformation enabled.
| Jellyfin server | Plugin version |
|---|---|
| 10.10.7 | 0.2.46.1 |
| 10.11.x | 0.2.46.2 |
| 12.x | 0.2.46.3 |
The existing catalogue remains:
https://raw.githubusercontent.com/jampez77/ScreenHarbour/main/manifest.json
Plugin identity, assembly, API routes and storage keys are unchanged. No reconfiguration is needed.
Validation
- Reproduced the pre-fix loop in actual Chromium 79.0.3945.0 with a 485-pixel row: medium expansion at 720px and large expansion at 720px/960px reached a protective 100-mutation cutoff before the next timer could run. After the fix, all nine combinations of no/medium/large expansion and 720px/960px/1080px viewport heights made exactly two initial style writes and allowed the timer to run.
- A new browser regression models that older engine's numeric CSS serialization on a 60-item static-background row. It checks that Home becomes visible, layout writes settle, normal timers run, focus expansion and collapse work, resizing from 720px to 960px updates spacing, and all items remain available.
- Typecheck, client build and all 246 unit tests passed. 59 browser checks passed, including the new regression and existing seasonal, advent, frame-fit, editor, rank, graphics-layer and Home focus checks. One optional native-CSS fixture check was skipped because its external fixture was not configured.
- All 700 server checks passed against Jellyfin 10.11.0. All three supported target packages build and pass embedded-client/artwork, assembly version, MD5/SHA-256 and catalogue checks. All 138 historical catalogue entries are preserved.
- Physical LG webOS confirmation remains pending. The unsuccessful temporary fade-mask CSS test was removed from the live server, preserving its original branding CSS and account settings.