-
JellyTau v0.11.0
StablePublish Documentation / Build & publish docs to gitea-pages (push) Successful in 6m5sTraceability Validation / Check Requirement Traces (push) Successful in 19sBuild & Release / Run Tests (push) Successful in 15m20sBuild & Release / Build Linux (push) Successful in 21m22sBuild & Release / Build Windows (push) Successful in 16m11sBuild & Release / Build Android (push) Successful in 31m49sBuild & Release / Create Release (push) Successful in 1m3sreleased this
2026-08-23 09:53:57 +00:00 | 6 commits to master since this releaseVideo can play through the native renderer on Linux, and the machinery every
platform's playback goes through was rebuilt around one contract. Nine defects
fell out of doing it — each one a capability the code had written down as a
fact about the platform rather than asking the thing that would know.✨ Changes
-
Video can decode natively on Linux, without the server re-encoding it.
Until now every video played on the desktop was transcoded by Jellyfin to
h264 and handed to the browser engine, whatever the file actually was — so the
server burned CPU on every play, and quality was capped by that conversion.
mpv can now draw the picture directly, composited beneath the interface so the
controls, subtitles and overlays still sit on top of it. Direct play means the
original file, hardware decoding, and no server work at all. This is off by
default while it settles: setJELLYTAU_NATIVE_VIDEO=1to try it. The browser
path is untouched and remains what you get otherwise. (UR-080 → DR-231 …
DR-237) -
Playback speaks one language across every player. Linux, Android and
Windows each drove their engine through a different set of calls, and a rule
learned on one did not reach the others — which is why several of the fixes
below existed on one platform and not another. All three now go through a
single contract, and one suite of behaviours runs against every engine,
including ExoPlayer on a real device. An engine is either correct or visibly
failing. Nothing about this is visible while it works, which is the point.
(UR-081 → DR-242 … DR-247)
🐛 Fixes
-
Resuming a film starts where you left it, instead of at the beginning.
Asking a player to open a file and asking it to start at a position were two
separate steps, and the second was issued before the first had finished — so
it failed, was discarded, and playback began at zero. It affected resume and
any skip on a stream the server was converting. The position is now part of
opening the file, so there is no gap for it to fall into. (DR-241) -
Skipping works on films the server is converting. A skip was routed by the
shape of the stream rather than by what the player could do with it. That
happened to be right while one particular player handled those streams and
became wrong the moment another did — after which skipping simply did nothing,
silently. Players now say what they can do and are asked. (DR-238, DR-246) -
The play and pause button follows the player again. The code that reacted
to pausing was never subscribed to the event it was waiting for, so the button
stayed where it was while playback did something else. (DR-239) -
Fullscreen fills the screen. It expanded the page rather than the window,
which was invisible while the picture was drawn inside the page and obvious as
soon as it was not. (DR-240) -
The seek bar knows how long the film is. A player that had not yet worked
out the duration reported zero, and zero was believed — leaving the bar with
no scale and nothing to drag against, even though the length had been known
since the library listed it. (DR-251) -
Leaving the player stops the sound. The stop was aimed at whichever
renderer the app believed was in charge. Enabling background audio hands over
to a different one, so afterwards the app stopped something that was no longer
playing and the film carried on as an audio track in the mini player. Closing
now stops everything, regardless of who was in charge. (DR-250) -
Coming back from background audio no longer leaves a black screen. The
stream that plays while the app is hidden has no fixed length, and the value a
player uses to say so is a very large negative number. Converting it crashed
the playback engine outright, which looked like a dead player with no
controls. (DR-252) -
Android builds again. A rule that only applied to Linux stayed attached to
code that had stopped being Linux-only, and the Android build had not compiled
since. (DR-247)
🧹 Under the hood
-
The conformance suite can be run on its own:
bun run test:playerfor the
desktop engines,bun run test:player:androidfor ExoPlayer on a connected
device. Both build a test fixture rather than carrying media in the
repository. -
docs/native-player-verification.md
records what to check before a release, including the exact sequences that
found two of the defects above — both of which passed every automated test.
Known limitations
- Resume reads progress saved on the device, not from the server, so a fresh
install or a second device will not offer to resume something watched
elsewhere. - Native video on Linux is opt-in and is not yet the default.
Downloads
Platform File Linux (portable) *.AppImage—chmod +xand runLinux (Debian/Ubuntu) *.deb—sudo dpkg -iLinux (Fedora/openSUSE) *.rpm—sudo rpm -iWindows *-setup.exe(NSIS). Unsigned — SmartScreen may warn on first run.Android *.apksideload, or*.aabfor Play ConsoleDesktop builds check for updates from here and can install a new
version in place, verifying its signature first.Verifying your download
sha256sum -c SHA256SUMSSHA256SUMScovers every file in this release. An SBOM
(*.cdx.json,frontend-dependencies.txt) lists what went into it.Requirements
- Linux: 64-bit, GLIBC 2.29+
- Windows: 64-bit Windows 10 or later
- Android: 8.0 or later, ~50 MB free
Report a problem: https://gitea.tourolle.paris/dtourolle/jellytau/issues
Downloads
-