Moonfin v2.1.0 Release Notes 
Important
With this release in order to connect to Seerr/Jellyseerr you will need to use the new Moonfin server plugin
Highlights
- Unified mono-repo — Tizen and webOS now share a single codebase with shared UI components, services, and views. Platform-specific code lives in dedicated packages. (Maintaining two codebases with 95% of the same code was annoying)
- Tizen 2.4 support — Full compatibility with Samsung TVs running Tizen 2.4 (WebKit r152340), including AVPlay native player integration and legacy browser polyfills.
- Overhauled video playback — Three-tier playback fallback chain, corrected DirectPlay profiles from LG's AV format docs, native HLS, and Dolby Vision detection.
- Redesigned UI — New Details page, Library views, Login screen, Browse featured bar, and Account modal across both platforms.
- Music support — Full music library with album art, track lists, audio playlist navigation, and artist/album/song search.
Tizen
New Features
- AVPlay native player — Refactored the Player to use Samsung's AVPlay API instead of the HTML5 video element. The Player container background is transparent to allow the AVPlay platform video layer to show through.
- Tizen 2.4 / legacy TV support — Added
--legacybuild flag, polyfills (globalThis,NodeList.forEach,whatwg-fetch), URL parsing utility for browsers without theURLconstructor, Enact compatibility patches (CSS custom-properties, Button border-radius, ProgressBar inline styles, Slider knob, Scrollbar DOM fallback), and XHR mocking for ilib locale loading onfile://protocol. - Smart Hub Preview — Wired up the background service for Smart Hub Preview on Tizen 4+; automatically skipped on legacy targets. NOT available on Tizen 2.4 and 3
- Music library — Album art, track lists, audio playback with dedicated controls, playlist navigation (next/previous track), artist/album/song search results.
- Details page redesign — Complete overhaul of the Details page with the new Moonfin UI, updated back button management.
- Account modal — Moved Account out of Settings into a new modal accessible from the user's avatar.
- Chapter extraction — Added chapter data retrieval and display, fixed audio/subtitle track selection from the Details screen.
- Exit dialog — Application exit confirmation dialog.
- Playlist management — Item selection, reordering, and playback from playlists in the Details view.
- Folder view — Breadcrumb navigation in Libraries.
- Auto-login — Automatic login with last server tracking.
Bug Fixes
- Fixed subtitle fallback to extracted subtitles when native embedded subtitle detection found none.
- Fixed next episode trigger logic and updated button labels.
- Fixed back key handling to exit app from home screen.
- Fixed enact page styles to use fixed positioning and full viewport coverage.
- Added seekStep setting to default settings.
- Fixed Media Segments API integration.
- Fixed
globalThispolyfill — Tizen 2.4 black screen on boot caused by@enact/core/platformreferencingglobalThiswithout a typeof guard. Three-layer fix:polyfills.js, HTML<script>injection, andnode_modulespatch. - Samsung certificate and profile verification added to the build script before packaging .wgt.
Build & Tooling
- Tizen build pipeline adapted for mono-repo:
enact packruns frompackages/app/withBROWSERSLIST_CONFIGtargetingchrome >= 38, safari >= 9. patch-enact-legacy.jspost-install script patches@enact/coreand related modules for legacy compatibility..browserslistrcfor Tizen targets Chromium 38 (Tizen 2.4) and Safari 9.- Build scripts output to repository root.
- GitHub Actions workflow for lint.
webOS
New Features
- Dolby Vision detection and native HLS playback — Runtime Dolby Vision detection with native HLS via Starfish. HLS transcoding for webOS 5+ uses fMP4 segments to preserve DV metadata. DV codec hints added to
<source type="...">to activate the Starfish DV decoder for direct play. - Overhauled video playback pipeline — Replaced per-mount video elements with a single shared instance (prevents webOS 4 from exhausting hardware decoders). Three-tier fallback: DirectPlay → native HEVC via Starfish → hls.js with H.264+AAC via MSE.
- Corrected DirectPlay profiles from LG docs — Fixed 7 profiles: VC-1 removed from TS, MP2 audio added to MKV/TS/AVI, VOB profile created, MPG/MPEG profile filled, AV1 level made resolution-responsive, HEVC added to M2TS, ASF/WMV codecs filled.
- Music library — Album art, track lists, audio playback with dedicated controls, playlist navigation (next/previous track), artist/album/song search results.
- Details page redesign — Complete overhaul with new Moonfin layout.
- Account modal — Moved Account to a new modal from the user's avatar.
- Subtitle customization — Size, position, and offset settings with a live subtitle settings overlay.
- Screensaver — Inactivity-based screensaver with configurable settings.
- Photo and comic viewer — Dedicated viewer components integrated with the Library.
- Moonfin plugin integration — Moonfin plugin support in Jellyseerr with updated Seerr auth flow and v2 envelope with v1 fallback.
- MDBList ratings — Ratings display using the Moonfin server plugin, updated icons.
- Sidebar — New navigation sidebar.
- Playlists library — Dedicated playlist library view.
- Auto-login — Automatic login with last server tracking.
- Playlist management — Item selection, reordering, and playback from playlists.
- Folder view — Breadcrumb navigation in Libraries.
- Exit dialog — Application exit confirmation dialog.
- Force Direct Play setting — Bypass transcoding decision logic.
- Hide libraries setting — Hide specific libraries from the home screen.
Bug Fixes
- Fixed audio stream switching by preserving playback position and adding native audio track support.
- Fixed playback with resume support, next episode auto-play, and improved seeking.
- Fixed DirectStream handling to ensure both audio and video are natively supported, preserving HDR during audio transcoding.
- Fixed resolution detection logic in
getResolutionName. - Fixed max bitrate handling — derived from device capabilities instead of hardcoded.
- Fixed platform back navigation at root level so the app closes and reopens correctly.
- Fixed audio stream switching to maintain transcoding state and reset fallback flag.
- Refined DTS support checks and audio stream handling.
- Fixed playback progress reporting with event tracking and state management.
- Fixed video element loading issues with proper cleanup and source reloading.
- Increased decoder release time from 2000ms to 3000ms for better resource management.
- HDR10+ detection aligned with HDR10 capabilities (webOS does not support HDR10+).
- E-AC3 support enabled for all webOS versions (DD+ compatibility on webOS 4+).
- HDR handling updated with Dolby Vision fallbacks.
- HLS transcoding profiles prioritize HEVC for HDR content with H.264 fallback.
- Video element cleanup resets HDR display mode by loading a minimal SDR video.
- webOS version detection converts internal versions to marketing names.
- DTS support detection uses correct device config to derive edidType for model-specific capabilities.
- Added timeout for non-HLS streams with fallback to transcoding.
- Play/pause button click fixed in webOS Player (the
ifblock was never reached). - Correct app reopen handling.
- Player navigation buttons now reset the 5-second auto-hide timer.
- Audio playback key handling for webOS remote.
Build & Tooling
- Build script optimized — removed unused locales and font weights, reducing file size from 9.3 MB to 6 MB uncompressed.
- Build script adapted for mono-repo:
enact packfrompackages/app/, copies dist locally before platform-specific post-processing. - GitHub Actions workflow for build and lint.
@enact/cliand@webosose/ares-cliadded as devDependencies.build.jsscript created to replace shell-based build.- webOS manifest auto-update on build.
Shared (Both Platforms)
New Features
- Genres and Library UI overhaul — Refactored Genres, Favorites, and Library views with new layouts and styling.
- Login UI redesign — Updated to match other Moonfin clients.
- Featured media bar — Updated layout for the overview box and logo.
- Jellyseerr transport unification — Rewrote Jellyseerr context and API service for shared use.
- Seerr integration normalization — Normalized media item handling and updated image URLs.
- Version checker — Fetches platform-specific releases.
- Dynamic version display — Settings shows app version and platform info.
- Spotlight navigation — Refactored focus handling in NavBar, Sidebar, and ExitDialog.
- Consistent 24/12-hour format — Player and Details page respect the setting; optional clock in navbar.
- Chapter API —
fetchItemChaptersfunction for retrieving chapter data. - Settings reorganization — Cleaner grouping and layout.
- Watched and favorite badges — Visual badges on media items indicating watched status and favorites.
- Multiple video version selector — Details page shows a version picker when media has multiple versions (e.g., 4K, 1080p, singalong), with resolution labels and automatic audio/subtitle defaults per version.
- Audio and subtitle pre-selection — Audio and subtitle tracks can be selected from the Details page before starting playback; defaults are initialized from server preferences.
Bug Fixes
- Fixed passwordless auto-login for users without passwords.
- Fixed subtitle style defaults and rendering across both platform players.
- Fixed screensaver activating during video playback by implementing keepScreenOn on both platforms.
- Fixed Browse backdrop handling.
- Fixed formatting for end time display in 12-hour and 24-hour formats.
- Fixed play/pause key handling across both platform players.
- Refactored video element cleanup and trailer handling.
- Spotlight focus for play-pause button on Player control navigation.
Community Contributions
@nullbyze
- webOS build script — Created
build.jsto replace the shell-based build process, contributed multiple iterations of the build script and package.json updates. - Browse view fixes — Multiple updates to Browse.js.
- Player fix — Fixed play/pause not working on button click in WebOSPlayer (the
ifblock condition was inverted and never reached). - App reopen fix — Fixed correct reopen handling in App.js.
- 24/12-hour format — Consistent time format across Player and Details page, with optional top-right clock display.
- README update — Updated README.
@999romain
- Settings border fix — Removed left and right black border in Settings.
- Card scroll fix — Prevented cards from being cut off with
startscroll behavior. - Details scroll-to-top — Implemented scroll-to-top on button row focus in the Details component.
- UI enhancements — Style adjustments and new overrides for MediaCard, MediaRow, Browse, Details, and Settings. Created the RatingsRow component and MDBList API service.
@MoazSalem
- Subtitle fallback — Added fallback to extracted subtitles when native embedded subtitle detection found none.
@morpheus133
- Smart Hub Preview — Wired up the background service for Smart Hub Preview on Tizen 4+; automatically skipped on legacy targets. NOT available on Tizen 2.4 and 3