{ "version": "0.11.0", "notes": "\nVideo can play through the native renderer on Linux, and the machinery every\nplatform's playback goes through was rebuilt around one contract. Nine defects\nfell out of doing it — each one a capability the code had written down as a\nfact about the platform rather than asking the thing that would know.\n\n### ✨ Changes\n\n- **Video can decode natively on Linux, without the server re-encoding it.**\n Until now every video played on the desktop was transcoded by Jellyfin to\n h264 and handed to the browser engine, whatever the file actually was — so the\n server burned CPU on every play, and quality was capped by that conversion.\n mpv can now draw the picture directly, composited beneath the interface so the\n controls, subtitles and overlays still sit on top of it. Direct play means the\n original file, hardware decoding, and no server work at all. This is off by\n default while it settles: set `JELLYTAU_NATIVE_VIDEO=1` to try it. The browser\n path is untouched and remains what you get otherwise. (UR-080 → DR-231 …\n DR-237)\n\n- **Playback speaks one language across every player.** Linux, Android and\n Windows each drove their engine through a different set of calls, and a rule\n learned on one did not reach the others — which is why several of the fixes\n below existed on one platform and not another. All three now go through a\n single contract, and one suite of behaviours runs against every engine,\n including ExoPlayer on a real device. An engine is either correct or visibly\n failing. Nothing about this is visible while it works, which is the point.\n (UR-081 → DR-242 … DR-247)\n\n### 🐛 Fixes\n\n- **Resuming a film starts where you left it, instead of at the beginning.**\n Asking a player to open a file and asking it to start at a position were two\n separate steps, and the second was issued before the first had finished — so\n it failed, was discarded, and playback began at zero. It affected resume and\n any skip on a stream the server was converting. The position is now part of\n opening the file, so there is no gap for it to fall into. (DR-241)\n\n- **Skipping works on films the server is converting.** A skip was routed by the\n *shape* of the stream rather than by what the player could do with it. That\n happened to be right while one particular player handled those streams and\n became wrong the moment another did — after which skipping simply did nothing,\n silently. Players now say what they can do and are asked. (DR-238, DR-246)\n\n- **The play and pause button follows the player again.** The code that reacted\n to pausing was never subscribed to the event it was waiting for, so the button\n stayed where it was while playback did something else. (DR-239)\n\n- **Fullscreen fills the screen.** It expanded the page rather than the window,\n which was invisible while the picture was drawn inside the page and obvious as\n soon as it was not. (DR-240)\n\n- **The seek bar knows how long the film is.** A player that had not yet worked\n out the duration reported zero, and zero was believed — leaving the bar with\n no scale and nothing to drag against, even though the length had been known\n since the library listed it. (DR-251)\n\n- **Leaving the player stops the sound.** The stop was aimed at whichever\n renderer the app believed was in charge. Enabling background audio hands over\n to a different one, so afterwards the app stopped something that was no longer\n playing and the film carried on as an audio track in the mini player. Closing\n now stops everything, regardless of who was in charge. (DR-250)\n\n- **Coming back from background audio no longer leaves a black screen.** The\n stream that plays while the app is hidden has no fixed length, and the value a\n player uses to say so is a very large negative number. Converting it crashed\n the playback engine outright, which looked like a dead player with no\n controls. (DR-252)\n\n- **Android builds again.** A rule that only applied to Linux stayed attached to\n code", "pub_date": "2026-08-23T16:06:09Z", "platforms": { "linux-x86_64": { "signature": "dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVSczV4N1FMRVFQaW10WUtnODJld1N3aU1jZ0VtVDF3QUhwSHQwM0lkWFZZbnV5cE1UL09NdTVXUEZSVmtxdXlhYVcxcW93Qy8zcEVETUhIc3BkT2ZDVVFXdGVWTDJzQ1FvPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNzg3NDk3ODE2CWZpbGU6SmVsbHlUYXVfMC4xMS4wX2FtZDY0LkFwcEltYWdlCjg4OUdyUm1PcWVwMVJkT1JhWEVtTzk0amdYUWRjU0VDaTJBcHZwTlEwRUVpWG5oOXBNRjM5clZQMUxRcGx1SGFNamlCSTcyakVNQjIrRmFodTZYeUJnPT0K", "url": "https://gitea.tourolle.paris/dtourolle/jellytau/releases/download/v0.11.0/JellyTau_0.11.0_amd64.AppImage" }, "windows-x86_64": { "signature": "dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVSczV4N1FMRVFQaXRUTW1vZHNLT2dlbHErWHZ5clN2OTJmdXBvU1NGVlF5TUE1RWRtbU01ZkhnVmZicFR4MDJsZE5NYnR4bSszcnEyS1VCTDkwUXpqZWtsU2hybEZ4VEFvPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNzg3NDk4ODE0CWZpbGU6SmVsbHlUYXVfMC4xMS4wX3g2NC1zZXR1cC5leGUKTkFUZjZBOGNHdjNabVhWNkswMXFvOGp3dkg1cFJHSk1FWUJWNTJBSHlycFlFZXNrbHlUelV0RkZvN0g3bzFyYWpqZVBBK0ZUeHRmU2YyTTVidzFURHc9PQo=", "url": "https://gitea.tourolle.paris/dtourolle/jellytau/releases/download/v0.11.0/JellyTau_0.11.0_x64-setup.exe" } } }