• JellyTau v0.11.0
    Publish Documentation / Build & publish docs to gitea-pages (push) Successful in 6m5s
    Traceability Validation / Check Requirement Traces (push) Successful in 19s
    Build & Release / Run Tests (push) Successful in 15m20s
    Build & Release / Build Linux (push) Successful in 21m22s
    Build & Release / Build Windows (push) Successful in 16m11s
    Build & Release / Build Android (push) Successful in 31m49s
    Build & Release / Create Release (push) Successful in 1m3s
    Stable

    dtourolle released this 2026-08-23 09:53:57 +00:00 | 6 commits to master since this release

    Video 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: set JELLYTAU_NATIVE_VIDEO=1 to 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:player for the
      desktop engines, bun run test:player:android for 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) *.AppImagechmod +x and run
    Linux (Debian/Ubuntu) *.debsudo dpkg -i
    Linux (Fedora/openSUSE) *.rpmsudo rpm -i
    Windows *-setup.exe (NSIS). Unsigned — SmartScreen may warn on first run.
    Android *.apk sideload, or *.aab for Play Console

    Desktop builds check for updates from here and can install a new
    version in place, verifying its signature first.

    Verifying your download

    sha256sum -c SHA256SUMS
    

    SHA256SUMS covers 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