Repository navigation
v0.10.0 — automatic intro skipping, yellow subtitles, Next and Previous episodes, Play Version, a player HUD you can replace, and ASS we can
LatestThis release lets you choose, install and replace the player's on-screen controls, adds Play Version, playback speed and automatic intro skipping, redesigns Home so what you were watching is one press away, and plays far more audio formats by decoding them in the app. It also adds Russian, Polish, Dutch and Catalan, draws Arabic and Hebrew, and fixes a long list of seeks and resumes that hung. It is the first release since 0.9.0, which was cut on 2026-10-23.
What's new
- A player HUD you can choose and replace. Settings → Video & playback → Player HUD lists the built-in HUD and any installed HUD packages, per profile. Browse HUDs opens a gallery of published HUDs with a preview and separate Install and Use buttons; a package can also be installed from the HUD folder on the television or from an address. The built-in HUD is now itself a package drawn by the same renderer, so Chapters and Info are sections of it, a More fold holds the rest, and menus open next to the control that opened them. How packages work, and what a package may not do, is in HUD plugins. HUDs for the gallery are made and submitted in a separate repository, plxnative-huds, not in this one; its authoring guide is the place to start.
- Play Version. A movie or episode with two or more versions on the server gets a Play Version row in its menu and a disc after Play on its page; a row plays that version. Thanks to aulonm.
- Playback speed. The player's
…menu has a Playback speed row with 0.5×, 0.75×, 1.25×, 1.5×, 1.75× and 2× beside Normal. The speed is applied in the app, not by the television, and a speed the set cannot play is not offered. Thanks to dimitrije83. - Skip intros and credits automatically. For a viewer with Plex Pass, Settings → Video & playback has per-profile Skip intros and Skip credits choices of Manual, Disabled or Automatic. Automatic skipping waits five seconds of actual playback. On the timed prompt the filled button is the action the countdown performs (Skip Intro, or Next Episode after credits), pressing it does that now, and a separate Watch Intro or Watch Credits button beside it cancels the countdown; focus starts on the filled one. The choice is hidden when your plex.tv account does not offer the markers, and a Plex Pass held by the viewer now counts (danzig666). A managed Home profile, which has no Plex Pass of its own, takes its Home administrator's. The two Settings rows and an automatic offer no longer blink away for a moment every few minutes.
- Next and Previous, and tap seeking. An episode with an episode before or after it gets Previous and Next buttons in the control row. A tap on fast-forward or rewind jumps one Skip interval with the controls left hidden, quick taps add up, and a hold still scrubs. A per-profile Instant D-pad seeking option lets Left and Right jump without showing the controls first. Thanks to stefan-ovezea.
- When it will finish. The player's HUD shows the local time the film or episode ends at; the Estimated end time switch on the Player HUD settings page is offered only while the HUD in use has room for it (a HUD package declares that in format 1.1). Thanks to seergi893.
- More audio plays directly. FLAC, ALAC and integer PCM are decoded in the app and sent to the television as PCM; stereo files above 48 kHz are resampled by the app instead of being re-encoded lossily by the server. Opus direct-plays on sets that can take it. A DTS core is decoded to stereo where the set has no DTS decoder, but only under Force Direct Play for one- and two-channel tracks, and as the last step in Auto after the server has refused to convert a refused file; a surround DTS file is otherwise still converted by the server. Audio the app decodes is delayed to line up with the picture; that was timed on the development set, with speakers and with Bluetooth, and the other LG audio stacks use values read from firmware that nobody has timed. Surround is not mixed down to stereo by default. Thanks to paulorichards and Dr-Amp.
- A redesigned Home: pick up where you left off at a glance. Continue Watching sits right under the hero, one press away instead of a scroll down. On Home and on Recommended, each tile is a wide 16:9 picture with cover art, a one-line footer with an episode label and time left, and a play glyph on focus. The Home hero shows playback progress in its Resume pill and, for every movie, show and episode, a line with the type, year, length, genres and age rating, whether or not you have started it. Its page dots sit inside the page and slide with it, the Play pill's tint follows the page that is arriving instead of popping, the background wash stays steady through a quick run of page flips, and a title drawn in type rather than as a logo now keeps the same gap above that line. A fullscreen autoplay trailer on a Detail page shows its clock and can be sought.
- Library, reorganised around the sort. The Library header's sort control carries the current sort, the poster captions can show the sort's value, and the A-Z rail on the right now follows the other sorts too: rating, duration, unplayed, plays, date added, date viewed, last episode added and release year. A TV library's Seasons and Episodes views get the rail as well. The library list and Favorite libraries live in the Library options menu, and Sort & Filter holds only sorting and filtering. A Library remembers whether you left it on Recommended or Collections, per profile. Thanks to MozgOFF and isaymon.
- Settings, redesigned. The root is four groups (Libraries, Playback, System, Support) with a sentence about the focused row, and Diagnostics is one row that opens its own page. Under posters now lets you tick up to four details per kind (movies: year, length, genre, video quality, age rating, score; shows: year, seasons, genre, age rating, score) with a two-poster preview. Favorite libraries shows its preview as soon as you open it, and the Player HUD page previews the HUD you have focused.
- Dolby Vision Auto or Off, per profile. Settings → Video & playback has a Dolby Vision setting for sets whose firmware misreports it and for viewers who prefer HDR10. With Off, a Profile 8.1 file plays its HDR10 base. Thanks to MozgOFF.
- A Playback engine setting. Settings → Video & playback → Playback engine has Standard (the default, exactly as before) and Experimental, which lets the television stream a file itself while the app's controls stay. If it fails the video restarts in Standard, and videos with subtitles, videos the server converts and videos the set cannot play as they are always use Standard. On webOS 5 and newer the list of sets it may drive ships empty in this release, so Experimental does not yet change how a video plays there.
- Go to Show. An episode's page has a Go to Show disc that opens the show's season list. Thanks to LovelessCodes.
- A Yellow subtitle color. Settings → Audio & subtitles → Look has a Subtitle color row beside Size and Position, and the same choice is under Color in the player's Subtitles menu: White (as before), Yellow, or one of five grays that only dim. Yellow colors text subtitles (SubRip, WebVTT and the other text formats) and the white text of styled ASS and SSA subtitles, including a SubRip file the server converts to ASS; a cue's own other colors are kept. Picture subtitles (PGS, VobSub) never take it, and where the subtitle on screen cannot take a color the Yellow choice is dimmed with the reason instead of looking selected. The cost: signs and other on-screen text a styled subtitle draws in white also turn yellow. The panel and HDR look of the yellow has not been checked on a television.
- Four new interface languages, and Arabic and Hebrew drawn properly. Russian (isaymon), Polish (rawinek), Dutch (BamischijfNL) and Catalan (seergi893), alongside the eight from 0.9.0. Titles, summaries, cast names and menus in Arabic and Hebrew were boxes; they are now shaped and in reading order (Goo6i).
- Plex's own stops are honoured. When a server stops your playback, for example from the Plex dashboard, the player shows the server's reason and Back leaves. Thanks to PilaScat.
- A version the television can decode plays by default. When Plex lists a 4K copy first that the set cannot decode, Play and Resume now pick the best version the set can decode instead of having the server convert the 4K copy. Thanks to PilaScat.
- Magic Remote. Pointing at the edges of the screen scrolls, rows glide sideways, and a hover never moves the page. Thanks to danzig666.
Fixed
- A Dolby Vision film that hung on Buffering after a resume or seek now plays the HDR10 base layer when the resume point lands on a CRA picture. That picture was not measured on a set running platform release 5.5, and the reporter has not retested (issue #1166).
- Seeking in some Blu-ray remuxes never finished. Their later seek points are ordinary I-frames, which the player now accepts. Thanks to danzig666.
- An MPEG-TS stream with a
.mp4name hung on Loading. It now direct-plays, which has not been confirmed on a television or on the reporter's file (issue #1084). - Pause then Play late in an automatic-quality stream could never resume, and (issue #1216), and an automatic upgrade that lost its lease could end the stream that was already playing (issue #954).
- A seek that reloads, or that never reached the video, left the picture on the old position. Seeks on a transcode, a retranscode and an HTTP/2 stream are recovered, and Back saves the position you asked for. Thanks to Psychotonikum, fraygox and tiper.
- Up Next showed another server's episode details over the right video when two servers used the same item number (issue #1280).
- A retired streaming session stayed in the Plex dashboard as an extra playback (issue #1236). How often a stream switches sessions is not changed.
- Leaving an episode for the next one from its credits left it unwatched. It is now marked watched (tiper).
- A new play could freeze the interface forever when LG's Unload on the previous one never returned; it now fails with a message after 10 seconds. A crash on exit from the TLS library's cleanup, seen in opt-in crash reports, is fixed.
- Magic Remote Back and pointer recovery after the player's controls closed: Back hides the pointer, and a second Back leaves playback (issue #811).
- Pages that blinked or blanked: poster tiles blinking after a page closed, a Person page blanked by a refreshed server list, Detail pages jumping back after a cast page, and the Library grid not refreshing after a server change. Thanks to tiper.
- Sound on a converted remux disappeared for long stretches. On a 4K film switched mid-film to a TrueHD track the set cannot decode, the server's remux carried the audio but about 75 seconds of it was thrown away inside the app; it is now played, and the check that threw it away only runs until audio has started.
- A remote film with Automatic quality started at 720 kbps when the server's remux answered the bandwidth probe in a way the probe refused, even if the connection had room for the original.
- A version you chose with Play Version could be re-encoded at a quality choice it fitted, because its own bitrate was not read.
- Opening the Library straight onto Collections or Recommended now puts focus on the first tile instead of leaving it on the top bar. A related symptom, a flash of the old layout when going Back to the grid, could not be reproduced here and has not been changed; neither has been seen on a television.
- A set with four cores and 2 GiB of memory decodes posters with three workers instead of two.
- ASS we can. Styled ASS and SSA subtitles with embedded fonts and heavy karaoke, such as anime openings, now use the fonts attached to the file, animate on every video frame instead of a few times a second, and a translucent sign over the picture is no longer drawn dark; this was measured with a test file on the development set, not with the reporter's file (issue #1328). Thanks to josmellop.
- Previous now always goes to the previous episode. Five seconds into an episode the button used to restart it, which rewound the progress Plex had saved for it, and before that it was dimmed, because an episode started from Continue Watching or a page had no earlier episode in its queue. The queue is now built from the show, so the earlier episodes are in it, and Restart is no longer a button face; From beginning on the player's Info tab (and in the
…menu of a HUD that lists it) starts the episode over. The show-based queue was seen working against one real server; a server that does not answer it as expected leaves the queue as before, with Previous dimmed on that episode.
Changed
-
Continue Watching now asks Plex's catalog for cover art. For each title in a Continue Watching row, the app asks discover.provider.plex.tv for its cover art with the title's Plex catalog identifier, the app's language and client identifier and, when the profile has one, its Plex account token, so Plex learns which titles are in that row. It is on whenever that row shows stills and has no setting; the details are in the privacy policy.
-
The Player HUD gallery contacts huds.plxnative.com, a host this project runs, to read its signed list of HUDs, and fetches previews without credentials; the list refreshes at most daily.
-
Installed HUD packages are stored outside the app's own folder. They go in
/media/developer/com.beb.plxnative-hudson a Developer Mode television, or the first of a few other locations the app can write to (/media/internal/.com.beb.plxnative-huds, then a private folder under/media/developer/temp, then/tmp, which a restart clears), and a package copied into that folder is offered for install. A package is a declarative description with SVG masks, not code, and the app checks it before drawing it; one installed from an address is fetched from a public host, and trust is shown beside each package. The first location survives a reinstall. -
Crash reports carry more, only if you turned them on. They now name the crashing thread and the phase of an exit, firmware-library crashes group by module and offset, and a playback refusal the app recovered from is reported once under the error-report choice, with the firmware build.
-
Settings has a new layout. Rows moved under four groups; nothing was removed.
-
Library navigation and Sort & Filter are separate. Favorite libraries stay directly selectable on the header, a library you opened that is not a favourite shows as one temporary pill, and library options (hidden libraries, refreshing shared libraries, editing favourites) have their own menu.
-
Seeking shows the loading sign until the seek lands. While you scrub, the transport keeps its rewind and fast-forward arrows; once a seek is committed (a tap, a chapter jump or the end of a scrub) it shows the loading sign until the picture is there, then the play or pause mark.
-
A managed Home profile's Skip choices read its Home administrator's plex.tv feature list. With the account's own sign-in, the app asks plex.tv, which it already talks to, for the administrator's account details and features, only to see whether the administrator has Plex Pass; nothing is written there, and the managed profile's own answer is never replaced. It happens only when the profile's own answer lacks a grant, and each read's outcome is one line in the event log, which stays on the television unless you send diagnostics. The details are in the privacy policy.
-
The event log says why Experimental did not take a play. With Playback engine set to Experimental, a play that stays on Standard now writes one line naming the reason; nothing is sent.
-
Continue Watching tiles no longer carry an amber play triangle; a white play or info glyph shows on the focused tile.
Compatibility
- Plays video, verified by watching it — 2019 LG sets. One television: an LG 49SM9000PLA, which reports platform release 4.10.2 (LG markets this generation as webOS 4.5). Several changes in this version were checked on it while they were written; the audit says which, and that the release-level suites had not been run on it when this note was written.
- Plays video, reported by someone else — 2025, 2022, 2019 and 2018 sets. On 2026-10-30 an owner reported sign-in, browsing, direct play, resume, seeking, HEVC or 4K and subtitles on an LG OLED55C24LA (2022, platform release 9.x) running 0.9.0, noting that Back can leave the app stuck on some pages: discussion 1167. On 2026-10-26 cremor reported sign-in, browsing, direct play, HDR or Dolby Vision, resume and subtitles on an LG OLED65C9PLA (2019, platform release 4.10.2) running 0.9.0: discussion 1071. On 2026-10-21 an owner reported playback on an LG OLED77B5PUA (2025, platform release 10.3.0) running 0.8.0: discussion 906, and on 2026-10-20 another on an LG 75UK6570AUA (2018, platform release 4.4.3) running 0.8.0: discussion 882. None of these ran 0.10.0.
- Sets on webOS 3.x are outside the supported range, but some work on nightly builds. On 2026-10-20 an owner reported playback on an LG 65UJ6200-UA (2017, platform release 3.9.0) on a 0.9.0 nightly: discussion 878, and a contributor (dimitrije83) made webOS 3 seek in place through LG's own Seek call, tested only on a set reporting platform release 3.9.3. Whether this release's package starts on them has not been confirmed on one.
- Starts, and nothing further is known — every other firmware from webOS 4.0 up is expected to start. This binary's libraries and symbols are checked against the firmware images webosbrew has; the result for this build is in the technical audit. That grades startup and says nothing about whether video plays.
If your set is not in the first group, tell us what happened. It working is as useful a report as it failing.
Known issues
- Direct play can hang on Buffering on some webOS 5 and newer sets. Issue #1259 tracks reports from an LG OLED55B2 (platform release 9.x, issue #1096, where 0.9.0 and nightlies buffer indefinitely on H.264) and a 60UN7310 (platform release 5.x, issue #954). The causes are not confirmed to be the same, and this release carries a candidate fix for the first that nobody has confirmed on that set.
- Some 2019 sets on LG's k5lp or k3lp chip, installed through Developer Mode, cannot play video. LG's sandbox can withhold a device the video path needs. The app says so instead of crashing (issue #74).
- Sets on webOS 3.x are outside what is supported. Menus can drop frames at 1920x1080 and issue #862 is still open.
- A crash on televisions built on LG's k6hp chip, seen only in opt-in crash reports from 0.6.6, none from 0.7.0 or later, and not reproduced (issue #174).
- The subtitle timing offset is missing a minus direction (issue #1284).
- Back can leave some pages stuck, reported on one 2022 set (discussion 1167) and not reproduced here.
- Most of this release's new features have not been seen on a television running this release's package, in particular the HUD gallery, installing a package from an address, automatic intro skipping on a real Plex Pass account, the Playback engine setting's Experimental choice, and app-decoded audio on sets other than the development one. The new Russian, Polish, Dutch and Catalan wording has not been reviewed by us.
- The Home administrator's Plex Pass for a managed profile has never been seen on a real managed account. The rule is the maintainer's choice and was built against the documented answers; a full (not managed) Home member also takes the administrator's Pass because the household list cannot tell them apart.
- Yellow subtitles are unseen on a television, and have one known cost: white signs and typesetting in a styled subtitle turn yellow too, and how the yellow and its outline look on the panel and in HDR is unchecked.
- Two Library symptoms were not seen to happen here: the old layout flashing when you go Back to the grid, and focus after opening straight onto Collections; the changes for them are unconfirmed on a television.
- Servers behind Plex's relay, and servers that require an encrypted connection, are reached but have not been watched end to end.
Help test this release
If you have a set on webOS 5 or newer, play a direct-play film, seek in it, pause for a minute and press Play, and tell us whether it carries on. If you have a FLAC or hi-res audio file, or a stereo DTS file with Force Direct Play on, tell us whether it plays, whether the sound is in step with the picture, and what the set is connected to. If you use Plex Pass, set Settings → Video & playback → Skip intros and Skip credits to Automatic and tell us whether it skips. If you use styled (ASS or SSA) subtitles, try the Yellow subtitle color and tell us whether the text you expected to change did and the rest kept its colors. Open an issue. It working is as useful a report as it failing.
Installing
Download com.beb.plxnative_0.10.0_arm.ipk and install it with the Homebrew Channel or dev-manager-desktop. You do not need a rooted TV.
Nothing in this distribution chain is signed, so this sha256 is what tells you the file you have is the file published here:
992c94fa3dde03de4f6b1f1f268900518ecd8c7e73a95f12c74ca449b25cfdc9 com.beb.plxnative_0.10.0_arm.ipk
Installing and checking a download covers the other assets, how to check the hash on each platform, and the Developer Mode expiry that uninstalls your apps. PlxNative is licensed GPL-3.0-or-later and bundles FFmpeg under LGPL-2.1-or-later and the libass subtitle renderer with its own libraries under their licences; the complete corresponding source is attached to this release. Exactly what was built, verified and shipped is in the technical audit for v0.10.0.
What's Changed
- release: audit for v0.9.0 by @GLinnik21 in #953
- Frame probe: price the back-buffer wait at the presented framebuffer's clear by @GLinnik21 in #945
- Tools: Bump @github/copilot from 1.0.96 to 1.0.100 in /tools in the node-tools group by @dependabot[bot] in #939
- Tools: Bump fonttools from 4.66.1 to 4.67.0 in /tools in the python-tools group by @dependabot[bot] in #938
- Deps: Bump the rust-minor-patch group in /rust-modules with 2 updates by @dependabot[bot] in #940
- Site: refresh the demo film and stills for v0.9.0 (and fix what broke their render) by @GLinnik21 in #960
- Site: stamp the hero's version from pkg/appinfo.json at deploy by @GLinnik21 in #963
- tests: server tier runs as a managed user from a token file, and grades what the product does by @GLinnik21 in #961
- CI: push to main with a ruleset-bypass deploy key (release bump, audit, site film) by @GLinnik21 in #962
- tv-session: screen on with the panel already lit is a no-op success by @GLinnik21 in #964
- Player: BACK leaves a load that has not produced a picture by @tiper in #909
- CI: fail when a crate the app library builds from is missing from RUST_INPUTS by @tiper in #957
- net: a finished body reads as the clean end, not a wait on the open connection by @tiper in #941
- Server updates: a library change refreshes Home, the shelves and the open grid by @tiper in #959
- Sans-IO baseline: make check ledgers that freeze IO in logic by @GLinnik21 in #971
- Session cache: peek is a pure read; the session owner refills it by @GLinnik21 in #973
- Detail store: request_detail emits a job; the app's StoreRunner starts it by @GLinnik21 in #975
- Fixture session adapter: park the cache refresh instead of starting a worker job by @GLinnik21 in #979
- Player foreground lifecycle: one step(event) machine with private state by @GLinnik21 in #977
- gfx: arm the post-120-present EGL_BUFFER_AGE probe only on a dev trigger by @GLinnik21 in #980
- gfx: a two-stop ramp program for square unfocused gradients (off fs_src's flat path) by @GLinnik21 in #981
- Collection store: emit store jobs and read the server registry as an input by @GLinnik21 in #987
- fps runs default to --panel off: a dark panel is only the backlight by @GLinnik21 in #968
- profile-tv skill: Mali T820 clock, driver utilization and bench-miss facts by @GLinnik21 in #967
- tv-session: -101 means "already off" only for screen off by @GLinnik21 in #988
- Person store: emit store jobs and read the server registry as an input by @GLinnik21 in #990
- gfx: no dev-trigger name in an embedded shader source (fixes the nightly package scan) by @GLinnik21 in #994
- gfx: a plain textured program for the image program's no-card exit by @GLinnik21 in #983
- Subtitle search and view reconcile: emit store jobs, with a refusal the step can observe by @GLinnik21 in #996
- Makefile: device-control goals keep a release-built pkg/plxnative by @GLinnik21 in #991
- Catalog store emits its read as a store job; a read that panics lands as unreachable by @GLinnik21 in #999
- Player lifecycle: transport contract and foreground drivers leave the machine's file; machine shape gate by @GLinnik21 in #1003
- Playback errors: name which demux exit raised media_source by @GLinnik21 in #1004
- Site: fix the fan posters, phone nav pill, store note and duplicate Install link by @GLinnik21 in #1005
- Site: stills re-rendered with the corrected fan crop by @GLinnik21 in #1008
- Trace tools: tv-sched-trace --app and a thread table; analyze-sched-trace --latch by @GLinnik21 in #1009
- Play Version: pick which version of a movie or episode plays by @aulonm in #955
- Hubs store emits its read as a store job; the step decides its client from ClientKeys by @GLinnik21 in #1011
- player: playback speed (0.5x-2x), done in the app by @dimitrije83 in #805
- Metadata detail chain runs its GETs through the client the runner resolved by @GLinnik21 in #1013
- Search store emits store jobs for its fetch and recents save; the scope takes the household as an input by @GLinnik21 in #1015
- Audio: FLAC decoded in the app and fed as PCM (stereo, up to 48 kHz) by @paulorichards in #950
- Browse section hubs emit store jobs for the list and row reads; the step decides the client from ClientKeys by @GLinnik21 in #1021
- gfx: Home's ground under the shelves is one flat colour, drawn as a clear by @GLinnik21 in #1017
- Metadata season switch and episode pages emit store jobs; the runner resolves the client and the detail chain is one-client by @GLinnik21 in #1023
- ViewState writes emit store jobs keyed by ClientKey; a write whose profile or client moved is dropped, never sent as another profile by @GLinnik21 in #1026
- Simulator: the desktop drawable is 1:1 with the canvas on any pixel density (Retina debug crash) by @GLinnik21 in #1000
- Browse: the Library's directory and listing-page reads leave as store jobs by @GLinnik21 in #1028
- Add Russian (ru) localization by @isaymon in #1006
- ru: the five keys the catalogue is missing (Play Version, playback speed) by @GLinnik21 in #1029
- Add FF/REW tap seeking and independent playback navigation options by @stefan-ovezea in #921
- FLAC PCM: declare sampleRate in kHz by @paulorichards in #1036
- player: webOS 3 seeks in place through LG's public Seek by @dimitrije83 in #1038
- Player: a terminal playback error lets go of the pipeline and the video plane by @tiper in #937
- Audio: Opus direct play, stereo in Auto (part of #918) by @Dr-Amp in #992
- Playback: a foreground Load refused while the plaintext grants return is claimed again by @tiper in #1018
- Audio: per-TV Opus limits, and formats the player learns to avoid by @tiper in #1034
- fleet-plan skill: lanes run make test-crate and leave the gates to PR CI by @GLinnik21 in #1051
- Route: one capability value per playback request; the planner reads no global by @GLinnik21 in #1054
- tools/pr-land.py: gate, wait and merge a PR only on a fully green CI by @GLinnik21 in #1053
- Player: one state machine rescues a play refused before its first picture by @GLinnik21 in #1060
- Transcode: audio above 48 kHz is converted, and the local gate agrees with the profile by @GLinnik21 in #1049
- tools/pr-land.py: restack a stacked branch by merges after the PR below squashes by @GLinnik21 in #1055
- tv-lock: a HEADS-UP line on a new lease, a hook that turns it into a push reminder, and a break that asks for --yes by @GLinnik21 in #1052
- Playback: a refused audio format is learned only from a retry that proved it by @GLinnik21 in #1061
- land-pr skill; outbound-guard refuses raw merges (tools/pr-land.py is the way) by @GLinnik21 in #1056
- tv-lock-guard: read the lane off the command, bound to the calling session by @GLinnik21 in #1057
- Add the pr-reviewer custom agent and a CI guard for the agents' files by @GLinnik21 in #1050
- tv-lock: the pre-flight says whether anybody is watching (IDLE / IN USE / UNKNOWN) by @GLinnik21 in #1058
- Playback: the capability answer is fixed at boot; each play start applies the stored refusals itself by @GLinnik21 in #1062
- Tests: Force Direct Play refuses a learned refusal before the Load by @GLinnik21 in #1063
- Playback: a video refused before its first picture is converted under a 1080p ceiling, and the way back never re-offers it (S1b-1, #1059) by @GLinnik21 in #1065
- Playback: ALAC and integer LPCM are decoded in the app like FLAC (S4-1, #918) by @GLinnik21 in #1067
- Dependencies: harfbuzz -> 15.0.0 by @github-actions[bot] in #1066
- Playback: one event-log line when an era-chosen sink counter never arrives, and one table of the private firmware dependencies by @GLinnik21 in #1081
- Playback: a refusal the app recovered from is reported once under the error-report consent, with the firmware build (S6, #1075) by @GLinnik21 in #1080
- Playback: a manual pick refused before its picture gets one both-facets encode before the read-out (#1059) by @GLinnik21 in #1077
- Playback: app-decoded audio is fed 400 ms later so it plays in step with the picture (#1086) by @GLinnik21 in #1087
- Playback: app-decoded audio's lead follows the sound output, and only on LG's liblxa audio stack (#1088) by @GLinnik21 in #1089
- decompile-tv-lib: decomp.sh fn keeps the whole decompiled body (it printed only the first line) by @GLinnik21 in #1094
- Playback: every LG audio stack gets its PCM lead (webOS 11/2024/2025 lgaudiosink, 2018); stacks are fingerprinted by their sink plugin by @GLinnik21 in #1093
- media: the pump flight rig stops its Engine before dropping it by @tiper in #1043
- Add Polish (pl) localization by @rawinek in #1039
- Library: a page mounted over a listing the server changed meanwhile lists it again by @tiper in #1083
- Playback: DTS is decoded in the app behind a gate, until the TV measures it (S4-2, #918) by @GLinnik21 in #1068
- Playback: MP3 and Vorbis are decoded in the app behind the lossy gate (S4-4, #918) by @GLinnik21 in #1078
- Playback: TrueHD is decoded in the app behind the lossy gate; high rates are low-passed before decimation (S4-5, #918) by @GLinnik21 in #1079
- Playback: Force Direct Play and a refused open decode lossy audio in the app, DTS enabled per row (S4, #918) by @GLinnik21 in #1082
- Hi-res lossless stereo (88.2-192 kHz FLAC, ALAC, LPCM) plays in the app at 48 or 44.1 kHz, 32-bit, instead of a lossy server conversion by @GLinnik21 in #1095
- Playback: 192 kHz and other 4x-or-more sources are resampled through a cheap half-band first stage, about half the multiply-adds by @GLinnik21 in #1097
- Metadata Related tail windows emit a store job; the runner resolves the client by @GLinnik21 in #1102
- Browse: the Library's source discovery leaves as a typed store job (B-D) by @GLinnik21 in #1103
- Browse pins: the pin logic takes the session the app reads, not the registry (B-F) by @GLinnik21 in #1106
- Watchlist W-1: the stores take the seated profile and its identity from the Bridge (#1107) by @GLinnik21 in #1108
- Playback: a refused hero preview reports preview_not_direct, not unspecified (PLX-NATIVE-1G) by @GLinnik21 in #1110
- Telemetry: playback.failed carries the codec classes, the pipeline error class and the refusal path by @GLinnik21 in #1113
- Ask for independent requests together: detail page, playback start, Home by @tiper in #956
- Playback: a new play never blocks the UI on the previous player's Unload; a hung Unload fails typed after 10 s by @GLinnik21 in #1116
- Exit: the app process never returns into libc exit(), so OpenSSL's atexit cleanup cannot free its locks under live curl workers by @GLinnik21 in #1120
- Crash reports: modules are never dropped, the crashing thread and exit phase are recorded, firmware-library crashes group by module and offset by @GLinnik21 in #1121
- tests/mkv_audio_lead.py: read only TrackEntry children of Tracks, so ffmpeg's CRC-32 cannot crash the fixture build by @GLinnik21 in #1124
- late_audio_tests: the lane sampler always takes a sample after the demuxer ends, so a fast demux cannot read 0 by @GLinnik21 in #1126
- Force Direct Play: a post-Load audio refusal names the codec (#695 scheme) by @GLinnik21 in #1128
- Task: beside asserts it is not on the frame thread, and the Sans-IO doc says who may call it by @GLinnik21 in #1132
- Library: BACK from a Detail brings the focused card back lifted, so the row below stays put by @tiper in #958
- Docs: a Sans-IO how-to for agents, loaded where each tool reads instructions by @GLinnik21 in #1131
- Posters: a backdrop left behind by a page is evicted before the posters, so tiles stop blinking by @tiper in #1105
- Detail: Back from a cast page keeps the live body's scroll by @tiper in #1099
- Player: an H.264 non-IDR I-slice at a random access point is a keyframe (seeks in Blu-ray remuxes stuck on Buffering) by @danzig666 in #1085
- Detail: a focused episode that left the landed list re-seats on its neighbour by @tiper in #1100
- Playback: leaving for the next episode marks the finished one watched by @tiper in #969
- Library: keep the A-Z rail under Unwatched and genre filters (#869) by @Bardioc1977 in #1030
- UI text: Arabic and Hebrew with RTL paragraphs by @Goo6i in #1007
- CI: the globals rule names the registry readers it missed, and the forks rule reads every machine crate by @GLinnik21 in #1134
- CI: a ledger or allowlist count that rises above the base branch's fails the PR by @GLinnik21 in #1135
- Add optional sort information below movie library posters by @isaymon in #1129
- Docs: Rotten Tomatoes reviews each request case by case, and other clients' logos are not precedent by @GLinnik21 in #1136
- HUD plugins: the package format's descriptor table, strict parser and SVG mask checker by @GLinnik21 in #1139
- Player menus: one shared anchored placer, and the menus anchor to their opener by @GLinnik21 in #1141
- HUD plugins: reachability, the More folds and the package invariants, and classic as a package by @GLinnik21 in #1142
- HUD plugins: the JSON Schema emitted from the descriptor table, the lint report, and the published examples by @GLinnik21 in #1143
- HUD split: state, model, motion and geometry; HUD travel on FocusEngine groups by @GLinnik21 in #1140
- HUD plugins: the caption band as a value through every caption reader by @GLinnik21 in #1148
- HUD PR3: command vocabulary, control identity, one performer, OK on the engine by @GLinnik21 in #1150
- CI: Bump the actions group across 2 directories with 1 update by @dependabot[bot] in #1146
- Tools: Bump the node-tools group in /tools with 2 updates by @dependabot[bot] in #1145
- Tools: Bump brotli from 1.2.0 to 1.2.1 in /tools in the python-tools group by @dependabot[bot] in #1144
- HUD packages: the package store as a pure machine (HudStore), and paths::hud_candidates() by @GLinnik21 in #1152
- HUD plugins: the layout compiler; classic compiles to the hand-written layout's geometry by @GLinnik21 in #1151
- Deps: Bump icu_provider from 2.3.1 to 2.4.0 in /rust-modules in the rust-minor-patch group by @dependabot[bot] in #1147
- Magic Remote: scroll by the screen's edges and glide rows sideways; a hover never moves the page by @danzig666 in #986
- HUD plugins: the lint, and --hud-lint / --hud-schema / --hud-export in the simulator by @GLinnik21 in #1153
- Shelf: a page that returns keeps its seat lifted under the BACK image by @GLinnik21 in #1159
- HUD plugins: one renderer for the compact HUD, Up Next and Skip; builtin:classic draws through it by @GLinnik21 in #1154
- Add Dutch (nl) UI language by @BamischijfNL in #1160
- A page opened over a closing menu leaves the host uncovered on Back by @tiper in #1158
- Scrub preview: the card reads its stills through a Stills source by @tiper in #1163
- Top bar: the glass is never dropped for the strip's width by @GLinnik21 in #1165
- Top bar: read the ground from the band's image, not framebuffer 0 by @GLinnik21 in #1168
- Person: a refreshed server list no longer blanks a loaded page by @tiper in #1137
- Library: sort value under posters, a header sort control, a capsule that carries the sort by @GLinnik21 in #1169
- A-Z rail groundwork: a read-only PMS band-count probe, its measured facts, and a mock that answers the same by @GLinnik21 in #1170
- A-Z rail bands, step 1: the pure band model and two more measured server facts by @GLinnik21 in #1171
- A-Z rail bands, step 2: the data job that reads band counts for rating, duration, unplayed and plays by @GLinnik21 in #1172
- A-Z rail bands, step 3: the rail draws and navigates a value sort's bands (rating, duration, unplayed, plays) by @GLinnik21 in #1173
- A-Z rail bands, step 4a: the data side for date added, date viewed, last episode added and release year by @GLinnik21 in #1174
- A-Z rail bands, step 4b: the rail draws and navigates the calendar bands (date added, date viewed, last episode added, release date) by @GLinnik21 in #1175
- The Seasons and Episodes views show the sort value under their cards by @GLinnik21 in #1176
- A-Z rail for a TV library's Seasons and Episodes views by @GLinnik21 in #1177
- feat(playback): add Dolby Vision Auto/Off setting to Playback prefere… by @MozgOFF in #1156
- HUD: BACK dismisses a Skip or Up Next offer and restores the discs by @LovelessCodes in #1161
- The Watchlist's sort button is the Library's sort control by @GLinnik21 in #1186
- Detail: a Go to Show disc for an episode's hero by @LovelessCodes in #1155
- Posters: a set with four cores and 2 GiB of RAM decodes with three workers, not two by @tiper in #1138
- The Under posters preview is rendered once: smooth Details push and pop by @GLinnik21 in #1188
- HUD: dismiss an offer through the metadata store's skipped set by @LovelessCodes in #1187
- feat(library): add library switcher and favorite libraries entry to S… by @MozgOFF in #1157
- Host-suite flakes fixed at their roots (test code only) by @GLinnik21 in #1189
- Playback: an MPEG-TS stream under a .mp4 name direct-plays, with its framing, audio and clock (#1084) by @GLinnik21 in #1190
- Library switcher: a visited library stays on view; the switcher is the Sources list; settings are one request by @GLinnik21 in #1191
- Belarusian: a space between a number and its hour/minute unit by @GLinnik21 in #1192
- HUD plugins: Chapters and Info are HUD sections; the strip is a cards::Shelf by @GLinnik21 in #1164
- HUD plugins: the More fold by @GLinnik21 in #1194
- Captions rise clear of an open player section (PR17) by @GLinnik21 in #1196
- HUD plugins: focus travel follows the drawn order by @GLinnik21 in #1197
- HUD plugins: the reference's gear is a gear by @GLinnik21 in #1199
- HUD plugins: the cost ceilings, measured, and every state's cost in --hud-lint (I12) by @GLinnik21 in #1198
- Player HUD: runners, the chosen HUD, the Settings page and the drop folder (PR10) by @GLinnik21 in #1195
- HUD plugins: a band travels or fades with its section, and a modal page is left toward its tabs by @GLinnik21 in #1200
- HUD plugins: install a package from an address by @GLinnik21 in #1201
- Draw a sidecar over a remux on the content's clock: a clock-only side reader by @GLinnik21 in #1202
- Honor Player HUD design declarations through shared UI components by @GLinnik21 in #1203
- Add pinned Player HUD registry simulator and preview tooling by @GLinnik21 in #1206
- Docs: URI mode by firmware — 4.x cannot bind, 5+ binds with a windowId in load by @GLinnik21 in #1208
- Dependencies: fribidi -> 1.0.18 by @github-actions[bot] in #1205
- Dependencies: sentry-native -> 0.17.5 by @github-actions[bot] in #1204
- Publish HUD authoring files and verify registry setup by @GLinnik21 in #1209
- Add opt-in firmware playback diagnostics by @GLinnik21 in #1210
- Preserve UTF-8 when truncating fixed text buffers by @GLinnik21 in #1212
- Player: add native URI probes and retain display ownership by @GLinnik21 in #1213
- Profiles: Change profile opens on the profile that is watching by @tiper in #1214
- Fix HLS Resume hanging after long sessions by @GLinnik21 in #1218
- Mark Player HUD registry PR12 shipped by @GLinnik21 in #1219
- Library: refresh the open grid in place after server changes by @tiper in #1215
- Align Home and Detail heroes and normalize logo sizing by @GLinnik21 in #1220
- Use initial 1.0 resource bundles for Player HUD plugins by @GLinnik21 in #1222
- Report diagnostic export failures and add DV CRA/IDR controls by @GLinnik21 in #1223
- Separate library navigation from Sort & Filter by @GLinnik21 in #1224
- Avoid flashing hold-options hint on short OK presses by @GLinnik21 in #1225
- Add automatic intro and credits skipping for Plex Pass viewers by @GLinnik21 in #1227
- Bound every plx_plex test server's accept, and give its deadlines room by @GLinnik21 in #1229
- Add the native Player HUD gallery and cached registry by @GLinnik21 in #1226
- Keep the preflight guard test's checkout on the tree's volume by @GLinnik21 in #1233
- Bound every plx_net test server's accept, and give its deadlines room by @GLinnik21 in #1232
- Let the playurl dev trigger start playback from the sign-in and picker pages by @GLinnik21 in #1234
- Hold the simulator's settled capture until an armed autopause lands by @GLinnik21 in #1235
- Make three timing-dependent unit tests deterministic by @GLinnik21 in #1237
- Cycle HUD preview backgrounds and use shared glass controls by @GLinnik21 in #1238
- HUD gallery: accept only a signed registry index (PR14, app half) by @GLinnik21 in #1239
- HUD plugins: a cargo-fuzz package over the package and registry parsers by @GLinnik21 in #1240
- HUD authoring: tools/hud-dev, and a dev-source HUD re-fetched on Play by @GLinnik21 in #1241
- Add Catalan localization by @seergi893 in #1230
- HUD registry: serve from huds.plxnative.com by @GLinnik21 in #1243
- Tests: the lint, screenshot and replay runs delete their temp trees by @GLinnik21 in #1244
- Settings: the built-in HUD is named Built-in by @GLinnik21 in #1247
- Site: add three outlets to Featured in by @GLinnik21 in #1252
- HUD previews: the long-title corpus covers Catalan by @GLinnik21 in #1253
- Playback: a retired PMS session gets its stopped timeline (#1236) by @GLinnik21 in #1254
- Tools: Bump fonttools from 4.67.0 to 4.68.0 in /tools in the python-tools group by @dependabot[bot] in #1248
- Tools: Bump @github/copilot from 1.0.103 to 1.0.105 in /tools in the node-tools group by @dependabot[bot] in #1249
- CI: Bump the actions group across 1 directory with 4 updates by @dependabot[bot] in #1251
- Deps: Bump encoding_rs from 0.8.42 to 0.8.44 in /rust-modules in the rust-minor-patch group by @dependabot[bot] in #1250
- Settings: v2 anatomy and root (follow-focus sentence, 48 title, groups, Diagnostics page) by @GLinnik21 in #1256
- Settings: v2 stages 2-4 and motion (grouped playback pages, Under posters split, Privacy/Legal/About, HUD pages, disabled state, push) by @GLinnik21 in #1260
- Settings: the Under posters picture names its tiles MOVIES and SHOWS by @GLinnik21 in #1262
- Interpose exit(): end a library's exit() without exit handlers and report it through the crash log by @sentry[bot] in #1242
- Settings: a pushed page's text is made resident before it moves by @GLinnik21 in #1261
- Settings: fps scenes for the pages Settings v2 added by @GLinnik21 in #1264
- Playback: a Dolby Vision resume or seek that lands on a CRA plays the HDR10 base layer by @GLinnik21 in #1263
- Playback: stop when the server ends the session by @PilaScat in #1265
- Playback contract crate, BackendRunner and attempt-metrics reducers (unwired) by @GLinnik21 in #1268
- Settings: Under posters takes composable details and the two-poster preview by @GLinnik21 in #1269
- Media codecs crate: the bundled-FFmpeg ABI, PCM decode, speed audio and the encoder leave
plx_media(P2 of the URI-first carve) by @GLinnik21 in #1271 - Lower-layer prerequisites of the neutral media crate:
plx_net::range_io,plx_base::clock,LoadVideoin platform, contract landing plan by @GLinnik21 in #1272 - Neutral playback orchestration: the Feed becomes
plx_play_feed, the app composes backends, the sink/plane seam is split (P3+P4) by @GLinnik21 in #1274 - The URI backend returns as
plx_play_uri: installed in the shipping binary, never selected, dev triggers back (P5) by @GLinnik21 in #1275 - Settings: a viewer's Plex Pass grants intro and credits skipping (auto-skip hidden from Pass holders) by @danzig666 in #1246
- Site font subset: cover the Vietnamese block the Featured in headline uses by @GLinnik21 in #1277
- The playback build/package matrix:
PLAYBACK_BACKENDSselects both, uri, feed or none (P7) by @GLinnik21 in #1276 - Preserve baseline audio codecs and size converted Opus on webOS by @Bardioc1977 in #1133
- ACB: a second boot handle (player type 0) for the URI engine by @GLinnik21 in #1281
- Net: an RFC 6455 WebSocket codec, sans-IO, for Open Watch Party by @PilaScat in #1273
- Default to a version the set can decode by @PilaScat in #1245
- Test Plex server identity during automatic episode advance by @GLinnik21 in #1282
- Give play back through the startup runner after a transcode seek by @GLinnik21 in #1285
- Admit a transcode's cold resume at the Feed start door by @GLinnik21 in #1286
- Settings: ask for a poster of a kind the Under posters preview lacks by @GLinnik21 in #1287
- Fix Magic Remote Back and cursor recovery by @GLinnik21 in #1288
- Settings > Video & playback > Playback engine: a per-profile opt-in to the URI engine, and the URI driver's anonymous bus identity (F45) by @GLinnik21 in #1279
- Key mode: every handle does a full TLS handshake, never a resumed session by @GLinnik21 in #1297
- Continue Watching as a row of stills: cover art, one-line footer, Home scroll by @GLinnik21 in #1290
- Catalan review: more natural expressions and consistent informal address by @seergi893 in #1291
- URI probe: the summary answers the drive gate, and a webOS 5+ tester protocol by @GLinnik21 in #1304
- Exported window: a live-window instrument in the host seam, and the handoff and quarantine cases it pins by @GLinnik21 in #1305
- URI exported window: the product places it like the probe, and a debug override lets a tester run the product path on webOS 5+ by @GLinnik21 in #1306
- URI exported window: selected per firmware major from an evidence table, empty today by @GLinnik21 in #1307
- Net: the WebSocket transport over libcurl CONNECT_ONLY by @PilaScat in #1283
- Keep the page's glass in the replacement capture after a page dip by @tiper in #1292
- Grid: the card focus leaves lets go from its lift on the move, not on the next tick by @tiper in #1293
- Grid: BACK to the top raises the first-row card from rest, as UP does by @tiper in #1294
- Dependencies: sentry-native -> 0.17.6 by @github-actions[bot] in #1298
- Bound Recommended shelf navigation keys across refreshes by @seergi893 in #1296
- build-bench: reject failed test runners with passing summaries by @seergi893 in #1300
- Net: a seek that cancels an HTTP/2 transfer dials a fresh connection by @fraygox in #1289
- Player: a seek that reloads keeps its target on the clock until the first frame by @tiper in #1303
- Dependencies: harfbuzz -> 15.1.0 by @github-actions[bot] in #1299
- Add an estimated local finish time to the player HUD by @seergi893 in #1295
- Recover Segment seeks that never reach the video sink by @GLinnik21 in #1313
- Polish the Home hero, Continue Watching, and Detail shading by @GLinnik21 in #1310
- play: fix the retranscode stall and the codec-declaration kills by @Psychotonikum in #1309
- URI: guard reordered audio tracks and recognize silent pause clocks by @GLinnik21 in #1314
- Grid: BACK from the first row closes its caption band over frames, as UP does by @tiper in #1312
- Show movie and TV metadata on unplayed Home heroes by @GLinnik21 in #1316
- Remember open Library pages by @GLinnik21 in #1317
- refactor(data): emit Metadata alternate-source jobs by @GLinnik21 in #1315
- refactor(browse): capture roster facts before store steps by @GLinnik21 in #1319
- Polish LG Detail, Library, and Settings screens by @GLinnik21 in #1321
- refactor(data): run notification streams as addressed jobs by @GLinnik21 in #1322
- Show playback progress and metadata on the Home hero by @GLinnik21 in #1325
- Fix autoplay trailer timeline, seeking, and HUD controls by @GLinnik21 in #1323
- fix(playback): preserve HLS when an ABR candidate is cancelled by @GLinnik21 in #1326
- refactor(session): negotiate legacy and V6 replay codecs by @GLinnik21 in #1324
- Release notes and audit for v0.10.0 by @GLinnik21 in #1330
- URI: say in the event log why the Experimental engine did not take a play by @GLinnik21 in #1332
- Version choice: measure a version picked by hand from its own fetch by @PilaScat in #1333
- abr-calibrate-plant: honour FIXTURES_OUT like the other fixture readers by @GLinnik21 in #1337
- disk tooling: never size, walk or probe trees on another volume; say when the hourly agent is not loaded by @GLinnik21 in #1338
- build-gc: age out unused FFmpeg cache keys from --auto under disk pressure by @GLinnik21 in #1336
- disk tooling: opt-in cold store parks idle build trees on an external disk instead of deleting them by @GLinnik21 in #1340
- disk preflight: restore a parked build tree from the cold store when a build needs it by @GLinnik21 in #1341
- Net: the throughput probe accepts a 200 from byte zero by @GLinnik21 in #1339
- Fix nine issues found on 0.10.0 RC 1 (Home hero, Settings, Player HUD, Library restore) by @GLinnik21 in #1335
- Feed: audio interleaved ahead of a backpressured video sink is fed, not dropped as stale by @GLinnik21 in #1343
- Subtitle color: a Yellow tone and a Settings row beside Size and Position by @GLinnik21 in #1342
- RC 2 polish: Yellow reaches SRT/ASS tracks, timed skip prompts follow the countdown, hero title gap by @GLinnik21 in #1345
- ASS subtitles: attached fonts, every-video-frame karaoke on the TV, straight colour over video (#1328) by @GLinnik21 in #1347
- Player: Previous always plays the previous episode, and a fresh play has one to go to by @GLinnik21 in #1349
- Release note and audit for v0.10.0: what the third candidate adds by @GLinnik21 in #1350
- Release note v0.10.0: a redesigned Home and ASS we can in the title by @GLinnik21 in #1352
- Release note v0.10.0: yellow subtitles in the title; HUDs are submitted in plxnative-huds by @GLinnik21 in #1353
- Release note v0.10.0: the headline leads with what people asked for by @GLinnik21 in #1354
New Contributors
- @aulonm made their first contribution in #955
- @paulorichards made their first contribution in #950
- @isaymon made their first contribution in #1006
- @stefan-ovezea made their first contribution in #921
- @Dr-Amp made their first contribution in #992
- @rawinek made their first contribution in #1039
- @Bardioc1977 made their first contribution in #1030
- @Goo6i made their first contribution in #1007
- @BamischijfNL made their first contribution in #1160
- @MozgOFF made their first contribution in #1156
- @LovelessCodes made their first contribution in #1161
- @seergi893 made their first contribution in #1230
- @sentry[bot] made their first contribution in #1242
- @PilaScat made their first contribution in #1265
- @fraygox made their first contribution in #1289
Full Changelog: v0.9.0...v0.10.0