• v0.4.8 07d10dfed7

    JellyTau v0.4.8
    🏗️ Build and Test JellyTau / Run Tests (push) Successful in 19m31s
    Publish Documentation / Build & publish docs to gitea-pages (push) Successful in 5m28s
    Traceability Validation / Check Requirement Traces (push) Successful in 22s
    Build & Release / Run Tests (push) Successful in 6m47s
    🏗️ Build and Test JellyTau / Android Compile Check (push) Successful in 10m6s
    Build & Release / Build Linux (push) Successful in 19m57s
    Build & Release / Build Windows (push) Successful in 14m14s
    Build & Release / Build Android (push) Successful in 30m26s
    Build & Release / Create Release (push) Successful in 19s
    Stable

    dtourolle released this 2026-08-11 18:11:42 +00:00 | 163 commits to master since this release

    🐛 Fixes

    • Video with an undecodable soundtrack now transcodes instead of playing
      silent.
      Advertising a webview-shaped profile (v0.4.7) turned out not to be
      enough: Jellyfin 10.11.5 enforces a direct-play profile's container and video
      codec but ignores its audio codec, offering an E-AC-3 track for direct play
      against a profile listing only AAC — and no CodecProfile or channel limit
      changes that. The client now checks the track it would actually be served
      against what its renderer can decode and forces the h264/AAC HLS transcode
      when it cannot, rather than trusting the negotiation.
      (UR-004 → DR-149)

    Downloads

    Platform File
    Android jellytau-release.apk — sideload or adb install
    Windows (portable) jellytau.exe
    Linux (Debian/Ubuntu) jellytau_0.4.8_amd64.debsudo dpkg -i
    Windows jellytau_0.4.8_x64-setup.exe (NSIS installer)

    Report a problem: https://gitea.tourolle.paris/dtourolle/jellytau/issues

    Downloads
  • v0.4.6 1b70926c36

    JellyTau v0.4.6
    🏗️ Build and Test JellyTau / Run Tests (push) Successful in 20m34s
    Publish Documentation / Build & publish docs to gitea-pages (push) Successful in 6m6s
    Traceability Validation / Check Requirement Traces (push) Successful in 18s
    Build & Release / Run Tests (push) Successful in 20m26s
    🏗️ Build and Test JellyTau / Android Compile Check (push) Successful in 10m3s
    Build & Release / Build Linux (push) Successful in 37m59s
    Build & Release / Build Windows (push) Successful in 23m0s
    Build & Release / Build Android (push) Successful in 40m26s
    Build & Release / Create Release (push) Successful in 1m20s
    Stable

    dtourolle released this 2026-08-09 14:38:47 +00:00 | 168 commits to master since this release

    Features

    • Downloaded video plays offline. Four separate defects each stopped it on
      their own. A completed download's file_path is already absolute — the worker
      rewrites it on completion — but the player rooted it a second time and handed
      the webview /data/user/0/app//data/user/0/app/videos/x.mp4; audio was
      unaffected because it resolves the same column through Rust, which is why this
      read as a video-only fault (DR-133). The asset protocol was never enabled at
      all: convertFileSrc rewrites a path to asset.localhost unconditionally, but
      Tauri only answers that origin when the cargo feature and the config are both
      present, and neither was — which also silently defeated the cached-thumbnail
      path, whose soft fallback to the server copy hid the breakage whenever the
      server was reachable (DR-134). Tauri's asset protocol then answers a range-less
      request by reading the whole file into memory and only advertises
      Accept-Ranges from inside its range branch, so the first request never learns
      ranges exist and Chromium gave up after ~31s; local media now comes from a
      loopback HTTP server streaming bounded 4 MiB chunks, confined by a per-session
      token and to the app data directory, because loopback is shared between apps on
      Android (DR-137). And release builds set usesCleartextTraffic=false, so
      Android rejected the request before any I/O — a network-security config now
      exempts 127.0.0.1 only, and a remote server must still be HTTPS (DR-138).

      Known limitation: a download taken at original quality is a byte copy, so it
      can be any container — an AVI holding XVID is served correctly and refused by
      the webview regardless.

    🐛 Fixes

    • A video queued from a media card no longer downloads as audio.
      download_item never recorded media_type, and the reconnect resolver read
      that NULL as 'audio', so a movie's URL was resolved by the audio builder and
      completed as an audio-only transcode. The item's own type now decides, and rows
      already downloaded that way are requeued on reconnect — prevention alone leaves
      them reading "downloaded" and still unplayable. (DR-135, DR-136)

    • Some videos no longer play with no sound. Jellyfin's MediaStream.Index is
      global across every stream in a media source, so index 0 is the video stream on
      virtually all files — and AudioStreamIndex=0 was sent as "the first audio
      track" on the HLS transcode URL, the background-audio handoff URL, the
      direct-play fallback and the negotiation body, asking the server to use the
      video stream as audio. Servers that honour it produce a picture with no sound;
      only those that silently correct the index hid it, which is why it surfaced as
      "some videos have no audio". The parameter is now omitted unless a track was
      actually chosen. (DR-140)

    • A multichannel track is no longer direct-played to a two-channel sink.
      MediaCodecList answers "can this device decode 5.1", which is not the question
      that decides whether anything is audible: a phone decodes AC-3 5.1 happily and
      still has two channels to play it out of. The profile carried no
      MaxAudioChannels, so the server was free to hand over the multichannel track —
      silence, or dialogue folded into surround channels that go nowhere. The route's
      actual channel count now bounds the profile; no codec is ever removed, so a
      device with genuine surround output keeps direct-playing it. (DR-141)

    • Video waits for audio focus instead of rolling silently. Video manages focus
      by hand, and all three outcomes of the request were treated as success —
      including REQUEST_DELAYED, which means the system is withholding our audio
      until it calls back. The picture rolled with no sound, indistinguishable from a
      broken stream. (DR-145)

    • The no-audio fallback picks a track the device can decode. When ExoPlayer
      selected no audio track, recovery forced group 0 / track 0 unconditionally — but
      the most likely reason nothing was selected is that this very track cannot be
      decoded here, so the override reinstated the silence it was meant to fix.
      (DR-146)

    Downloads

    Platform File
    Android jellytau-release.apk — sideload or adb install
    Windows (portable) jellytau.exe
    Linux (Debian/Ubuntu) jellytau_0.4.6_amd64.debsudo dpkg -i
    Windows jellytau_0.4.6_x64-setup.exe (NSIS installer)

    Report a problem: https://gitea.tourolle.paris/dtourolle/jellytau/issues

    Downloads
  • v0.4.1 1ef6180776

    JellyTau v0.4.1
    🏗️ Build and Test JellyTau / Run Tests (push) Successful in 18m39s
    Publish Documentation / Build & publish docs to gitea-pages (push) Successful in 5m40s
    Traceability Validation / Check Requirement Traces (push) Successful in 16s
    Build & Release / Run Tests (push) Successful in 6m1s
    🏗️ Build and Test JellyTau / Android Compile Check (push) Successful in 9m26s
    Build & Release / Build Linux (push) Successful in 19m41s
    Build & Release / Build Windows (push) Successful in 13m57s
    Build & Release / Build Android (push) Successful in 30m6s
    Build & Release / Create Release (push) Successful in 24s
    Stable

    dtourolle released this 2026-08-05 10:31:16 +00:00 | 174 commits to master since this release

    🐛 Fixes

    • The lockscreen pause works while a video's audio plays in the background.
      The handoff starts native audio and only then tears the WebView <video>
      down — and that teardown fires a DOM pause the frontend reports like any
      other, which left the controller believing webview media was still the
      player. Transport stayed aimed at it: pressing pause on the lockscreen sent a
      control command to a <video> that no longer existed while the native player
      carried on, and the element's parting position report dragged the displayed
      time backwards. A handoff is now tracked explicitly, so it hands transport to
      the native backend and ignores what the dying element still reports. A pause
      made from the lockscreen also survives the return to the app, instead of being
      undone by the play state captured when the handoff began.
      (UR-040, UR-005 → DR-052, DR-097)

    Downloads

    Platform File
    Android jellytau-release.apk — sideload or adb install
    Windows (portable) jellytau.exe
    Linux (Debian/Ubuntu) jellytau_0.4.1_amd64.debsudo dpkg -i
    Windows jellytau_0.4.1_x64-setup.exe (NSIS installer)

    Report a problem: https://gitea.tourolle.paris/dtourolle/jellytau/issues

    Downloads
  • v0.4.0 6aaa80ff92

    JellyTau v0.4.0
    🏗️ Build and Test JellyTau / Run Tests (push) Successful in 17m21s
    Publish Documentation / Build & publish docs to gitea-pages (push) Successful in 5m46s
    Traceability Validation / Check Requirement Traces (push) Successful in 16s
    Build & Release / Run Tests (push) Successful in 5m38s
    🏗️ Build and Test JellyTau / Android Compile Check (push) Successful in 8m54s
    Build & Release / Build Linux (push) Successful in 19m22s
    Build & Release / Build Windows (push) Successful in 13m55s
    Build & Release / Build Android (push) Successful in 30m12s
    Build & Release / Create Release (push) Successful in 15s
    Stable

    dtourolle released this 2026-08-04 18:22:01 +00:00 | 176 commits to master since this release

    Features

    • Favourites, across libraries. A /library/favorites page renders
      favourites from every library with All / Movies / Shows / Music scope tabs,
      reusing the standard grid so card shape still follows the media — a mixed All
      tab reads as posters, squares and thumbnails side by side. Home carries
      favourite rows below Recently Added, and a row with no items does not render
      at all, so a fresh install shows no empty rows. Server favourite state is
      mirrored into the local database as results are cached, so offline browsing
      sees the same favourites as the server; a toggle made offline is never
      overwritten by a stale server value before it has been pushed.
      (UR-067, UR-069 → DR-113, DR-114, DR-115, DR-117, DR-118)

    • Search answers from the local index. The instant leg read only downloaded
      items, so with no downloads it returned nothing and every keystroke fell
      through to a full Recursive=true server query. It now reads the whole synced
      catalog through the same availability CTE get_items uses, gated on the same
      include_catalog_browse flag, so search and browse cannot diverge. The index
      also gained MusicArtist, Playlist and People — the very groups search sorts
      results into. Re-indexing moved from a frontend startup call to a Rust
      background task with a 6h TTL, so a long session no longer searches a stale
      catalog. (UR-065 → DR-108, DR-110, DR-111)

    🐛 Fixes

    • Playback no longer restarts an episode at random on a flaky connection.
      Background audio-only playback of a video streams a progressive mp3 transcode
      over plain HTTP, which is chunked and so declares no length: when the
      connection dropped mid-episode, ExoPlayer saw end-of-input and reported
      STATE_ENDED, indistinguishable from the real end. The app ran its
      end-of-episode logic mid-episode and playback parked in STATE_ENDED, where
      the next play intent from the lockscreen, notification or a Bluetooth
      reconnect seeks an ended player to position 0 — surfacing as "the episode
      randomly restarted". The item's runtime is now what decides: an end reported
      well short of it re-opens the stream where it stopped. (UR-040 → DR-129)

    • A network hiccup no longer kills playback outright. Music and video
      declare a length, so a cut connection reaches them as an error rather than a
      phantom end — and every error stopped the player. A recoverable error now gets
      one bounded attempt at re-opening the stream where it stopped, with a growing
      backoff, leaving the rest of the queue intact. On Linux, MPV additionally
      reconnects inside the demuxer so ordinary blips never surface at all, and
      EndFile(ERROR) — previously a bare log line that left playback halted while
      the UI still showed "playing" — is now reported and recovered.
      (UR-004, UR-040 → DR-129, DR-130)

    • The player no longer reads 0:00 as a track ends on Linux. MPV exposes
      time-pos and duration as properties of the loaded file, so at EOF it
      unloads and both stop resolving — reporting zero at exactly the moment
      end-of-file handling asks where playback reached. The last reading seen while
      media was loaded is now kept and used as the fallback. (UR-005 → DR-130)

    • Server-side deletions propagate to the local catalog. DELETE FROM items
      existed nowhere, so items removed on the server lingered locally forever. A
      post-crawl mark-and-sweep now removes them, scoped to crawled types, skipping
      downloaded items, and refusing to run after a partial crawl. Separately,
      items_fts grew a full duplicate index on every catalog pass; it is now a
      real upsert, with a migration rebuilding existing indexes. (DR-110)

    • Android system bars and display cutout are handled correctly. (UR-066)

    Downloads

    Platform File
    Android jellytau-release.apk — sideload or adb install
    Windows (portable) jellytau.exe
    Linux (Debian/Ubuntu) jellytau_0.4.0_amd64.debsudo dpkg -i
    Windows jellytau_0.4.0_x64-setup.exe (NSIS installer)

    Report a problem: https://gitea.tourolle.paris/dtourolle/jellytau/issues

    Downloads
  • v0.3.0 58f2506966

    JellyTau v0.3.0
    🏗️ Build and Test JellyTau / Run Tests (push) Successful in 16m59s
    Publish Documentation / Build & publish docs to gitea-pages (push) Successful in 5m36s
    Traceability Validation / Check Requirement Traces (push) Successful in 18s
    Build & Release / Run Tests (push) Successful in 5m9s
    🏗️ Build and Test JellyTau / Android Compile Check (push) Successful in 8m54s
    Build & Release / Build Linux (push) Successful in 18m49s
    Build & Release / Build Windows (push) Successful in 14m4s
    Build & Release / Build Android (push) Successful in 30m17s
    Build & Release / Create Release (push) Successful in 18s
    Stable

    dtourolle released this 2026-08-03 18:37:49 +00:00 | 182 commits to master since this release

    Features

    • Opening a series lands on the current episode, not season 1. The viewer was
      dumped at the top of season 1, and the Play button played nothing at all: it
      resolved the first season by SortName and navigated to /player/<seasonId>,
      which the player route bounced straight back to the library. The backend could
      already answer "where is this viewer in this show" — get_next_up_episodes had
      accepted a series_id since it was written and no caller had ever passed one.
      pick_current_episode now resolves in progress → Next Up → first unwatched →
      the premiere, with the third rung serving offline where Next Up is always empty,
      and specials sorted after the numbered seasons. Seasons collapse to the current
      one, the current episode is badged and scrolled into view, and the hero button
      reads Resume S2E4 / Play S1E1. Seasons stop being a destination — a season
      URL redirects into the series — and the "More Episodes" strip spans the whole
      series, so a finale offers the next premiere instead of dead-ending. Six video
      routes collapse to two via ?view= tabs. Clear-history is wired to Jellyfin's
      recursive mark-unplayed, and refuses to run offline rather than diverging state
      the next sync would undo. (UR-062, UR-063, UR-064 → DR-101, DR-102, DR-103,
      DR-104, DR-105, DR-106, DR-107)

    🐛 Fixes

    • Re-entering a video no longer opens the audio player. Closing a
      webview-rendered video deliberately emits no "stopped" state — that would break
      the autoplay handoff — and the direct-play path does not stop the backend on
      unmount, so the controller still reported that item as its loaded media.
      Re-entering took the "already playing, just show the UI" shortcut, which returns
      before a stream URL is fetched, and the render fell through to the audio
      surface. Mostly visible on Android, where video direct-plays; Linux transcodes
      and stops the backend on unmount. (DR-100)

    Downloads

    Platform File
    Android jellytau-release.apk — sideload or adb install
    Windows (portable) jellytau.exe
    Linux (Debian/Ubuntu) jellytau_0.3.0_amd64.debsudo dpkg -i
    Windows jellytau_0.3.0_x64-setup.exe (NSIS installer)

    Report a problem: https://gitea.tourolle.paris/dtourolle/jellytau/issues

    Downloads
  • v0.2.9 a26a853f01

    JellyTau v0.2.9
    Publish Documentation / Build & publish docs to gitea-pages (push) Successful in 5m33s
    Traceability Validation / Check Requirement Traces (push) Successful in 25s
    🏗️ Build and Test JellyTau / Run Tests (push) Successful in 17m25s
    Build & Release / Run Tests (push) Successful in 6m7s
    🏗️ Build and Test JellyTau / Android Compile Check (push) Successful in 8m38s
    Build & Release / Build Linux (push) Successful in 19m23s
    Build & Release / Build Windows (push) Successful in 13m43s
    Build & Release / Build Android (push) Successful in 29m47s
    Build & Release / Create Release (push) Successful in 19s
    Stable

    dtourolle released this 2026-08-02 16:10:37 +00:00 | 184 commits to master since this release

    🐛 Fixes

    • A backgrounded audio-only episode advances instead of stalling. It stopped
      at the episode boundary and ExoPlayer parked in STATE_ENDED, where any later
      play intent — lockscreen, headset, Bluetooth reconnect — replays the ended item,
      surfacing as the episode randomly restarting. End-of-playback is dispatched from
      two places and they disagreed: the Android JNI callback carried the
      background-audio branch but can never reach it, because every load sets
      EndReason::NewTrackLoaded and nothing clears it, so the first real end consumes
      it and the decision is always Stop. The path that actually decides is the
      frontend's echo, which had no background-audio case at all and started a
      countdown whose advance is a goto() that cannot start audio while
      backgrounded. Both dispatchers now share one auto_advance_to_next_episode.
      (UR-040)

    Downloads

    Platform File
    Android jellytau-release.apk — sideload or adb install
    Windows (portable) jellytau.exe
    Linux (Debian/Ubuntu) jellytau_0.2.9_amd64.debsudo dpkg -i
    Windows jellytau_0.2.9_x64-setup.exe (NSIS installer)

    Report a problem: https://gitea.tourolle.paris/dtourolle/jellytau/issues

    Downloads
  • v0.1.5 37ffabee06

    JellyTau v0.1.5
    Build & Release / Run Tests (push) Successful in 4m35s
    Build & Release / Build Linux (push) Successful in 18m25s
    Build & Release / Build Windows (push) Successful in 13m27s
    Build & Release / Build Android (push) Successful in 29m9s
    Build & Release / Create Release (push) Successful in 16s
    Stable

    dtourolle released this 2026-07-27 23:33:32 +00:00 | 209 commits to master since this release

    v0.1.3 and v0.1.4 were never tagged; their work is included here.

    Features

    • A single tap is deferred so a double tap does not also toggle pause. A tap
      cannot be classified when it lands — it may still turn out to be the first half
      of a double tap — so play/pause waits for the 300ms window to close and is
      cancelled if a second tap arrives. Forward skip moves from 10s to 30s; back
      stays 10s. (Superseded in v0.2.7, where the deferral turned out to race the
      WebView's synthesized click.) (UR-005, UR-061 → DR-092)

    🐛 Fixes

    • Locking the screen no longer kills audio during video playback, even with
      the background-audio toggle armed. configureWebViewForMedia() ran from both
      the delayed post in onCreate and every onResume, re-registering the JS
      bridges each pass — five times in a 45s session. A WebView binds injected
      objects at page-load time, so re-injecting over a live page leaves JS holding a
      stale proxy: still truthy, and every method gone. The toggle turned blue and
      never reached native, so the handoff never ran. Bridges are now registered
      exactly once per WebView, and setBackgroundAudioEnabled reports whether native
      was actually reached, so a dead bridge can never again masquerade as an armed
      toggle. Removing the re-injection then revived a latent conflict it had been
      masking — three audio-focus requesters inside one uid, with the grant followed
      ~45ms later by a loss whose handler paused playback. The WebView already manages
      focus for <video>, so the redundant bridge is dropped entirely, consistent with
      the player-is-authoritative principle. WebView console output is now forwarded to
      logcat, which is what made this diagnosable at all. (UR-040 → IR-025, DR-051)

    • An expired sleep timer stops without triggering autoplay. Stopping the
      backend makes the native player fire its ended callback, and the timer thread
      cancels the timer first — so by the time the callback inspects it the mode reads
      Off, the sleep-timer branch is skipped, and the episode path ran, showing a
      next-episode popup right after the user's sleep timer expired. The stop is now
      recorded as user-initiated before it reaches the backend, which is the honest
      label: via the timer they set rather than the stop button. (UR-023, UR-026 →
      DR-029)

    Downloads

    Platform File
    Android jellytau-release.apk — sideload or adb install
    Windows (portable) jellytau.exe
    Linux (Debian/Ubuntu) jellytau_0.1.5_amd64.debsudo dpkg -i
    Windows jellytau_0.1.5_x64-setup.exe (NSIS installer)

    Report a problem: https://gitea.tourolle.paris/dtourolle/jellytau/issues

    Downloads
  • v0.1.2 5759a97289

    JellyTau v0.1.2
    🏗️ Build and Test JellyTau / Run Tests (push) Successful in 12m26s
    Publish Documentation / Build & publish docs to gitea-pages (push) Successful in 5m18s
    Traceability Validation / Check Requirement Traces (push) Successful in 17s
    Build & Release / Run Tests (push) Successful in 4m15s
    🏗️ Build and Test JellyTau / Android Compile Check (push) Successful in 7m49s
    Build & Release / Build Linux (push) Successful in 17m46s
    Build & Release / Build Windows (push) Successful in 13m20s
    Build & Release / Build Android (push) Successful in 29m14s
    Build & Release / Create Release (push) Successful in 15s
    Stable

    dtourolle released this 2026-07-25 14:21:33 +00:00 | 213 commits to master since this release

    Features

    • Search results are ordered by how well they match. A name that starts
      with the query now outranks one matching mid-word — typing "parks" finds
      "Parks and Recreation" before "Sparks of Love" — and at equal match quality a
      container outranks its contents, so a series lands above its own episodes.
      Ranking is applied to the instant cached results and to the merged
      cache+server list alike, so the list no longer reshuffles when server results
      arrive. (UR-060, DR-090)
    • Separate Shows, Episodes and People result groups. The combined "TV Shows"
      group splits into Shows and Episodes so a show never competes with its own
      episodes for a slot, and a new People group means searching an actor's name
      reaches their bio page. Default order is Shows → Episodes → Movies → Songs →
      Albums → Artists → People; a group order saved before the split keeps the
      position it was dragged to. (UR-060, DR-091)

    🐛 Bug Fixes

    • The library header search bar works on every library page. It previously
      searched in place and depended on /library rendering results inline, so on
      any other /library/** route the results were fetched and never shown.
      /search is now the single surface that renders results, and the header bar
      hands its query and scope over via the URL. (UR-049, DR-063)
    • Video smaller than the window is scaled up to fit. Sizing only ever shrank
      oversized media, so a 480p source on a 1080p display played as a small picture
      in the middle of a black frame. The picture now fits whichever axis constrains
      it, in both directions, preserving aspect ratio. (UR-005)

    📋 Requirements

    Linux: 64-bit, GLIBC 2.29+
    Android: 8.0+

    Downloads

    Platform File
    Android jellytau-release.apk — sideload or adb install
    Windows (portable) jellytau.exe
    Linux (Debian/Ubuntu) jellytau_0.1.2_amd64.debsudo dpkg -i
    Windows jellytau_0.1.2_x64-setup.exe (NSIS installer)

    Report a problem: https://gitea.tourolle.paris/dtourolle/jellytau/issues

    Downloads
  • v0.1.1 4b9350c949

    JellyTau v0.1.1
    🏗️ Build and Test JellyTau / Run Tests (push) Successful in 12m25s
    Publish Documentation / Build & publish docs to gitea-pages (push) Successful in 5m17s
    Traceability Validation / Check Requirement Traces (push) Successful in 16s
    Build & Release / Run Tests (push) Successful in 3m52s
    🏗️ Build and Test JellyTau / Android Compile Check (push) Successful in 9m52s
    Build & Release / Build Linux (push) Successful in 17m32s
    Build & Release / Build Windows (push) Successful in 13m14s
    Build & Release / Build Android (push) Successful in 29m7s
    Build & Release / Create Release (push) Successful in 13s
    Stable

    dtourolle released this 2026-07-25 07:26:04 +00:00 | 219 commits to master since this release

    🐛 Fixes

    • "More Episodes" is populated for series without season folders. The strip
      collapsed to just the current episode on some series, for two reasons: a series
      exposing episodes directly as children rather than under season folders yielded
      an empty season fetch, and isCurrentEpisode over-matched, because episodes
      with no season or episode number compared equal (undefined === undefined) and
      every one of them looked like the focused episode. Flat children are now grouped
      by season number under synthesized headers, and the strip's logic is extracted so
      both behaviours are unit-tested. (UR-058 → DR-087)

    • Autoplay advances in background audio mode. An episode handed off to the
      audio-only path is a MediaType::Audio item, so autoplay's video-only checks
      stopped recognising it as an episode and playback simply ended at the boundary.
      Episode identity is now carried through the handoff, and because the frontend's
      usual advance is a navigation that is unavailable while the WebView is
      suspended, the backend performs it directly — fetching the next episode,
      building its audio-only URL and loading it into the native player, preserving
      identity so the following boundary advances too. (UR-040, UR-023 → DR-052)

    Features

    • Skipping an episode marks it watched rather than paused. Skipping left a
      mid-episode resume point behind, so the skipped episode reappeared in Continue
      Watching with a partial progress bar — but skipping means "done with this one",
      not "stopped here". A one-shot suppression keeps the player's post-navigation
      unmount stop report from overwriting the 100% progress with the partial one, and
      Continue Watching now drops resume entries superseded by Next Up. (UR-059 →
      DR-088, DR-089)

    📋 Documentation

    • CLAUDE.md states the failing-test-first rule explicitly: write a test that
      reproduces the bug and watch it fail before applying the fix, and extract buried
      logic into a plain .ts module so it can be unit-tested. A test written against
      already-fixed code can pass for the wrong reason.

    Downloads

    Platform File
    Android jellytau-release.apk — sideload or adb install
    Windows (portable) jellytau.exe
    Linux (Debian/Ubuntu) jellytau_0.1.1_amd64.debsudo dpkg -i
    Windows jellytau_0.1.1_x64-setup.exe (NSIS installer)

    Report a problem: https://gitea.tourolle.paris/dtourolle/jellytau/issues

    Downloads
  • v0.1.0 c3ead64748

    JellyTau v0.1.0
    🏗️ Build and Test JellyTau / Run Tests (push) Successful in 18m37s
    Publish Documentation / Build & publish docs to gitea-pages (push) Successful in 5m13s
    Traceability Validation / Check Requirement Traces (push) Successful in 17s
    Build & Release / Run Tests (push) Successful in 4m48s
    🏗️ Build and Test JellyTau / Android Compile Check (push) Successful in 4m36s
    Build & Release / Build Linux (push) Successful in 17m58s
    Build & Release / Build Windows (push) Successful in 22m16s
    Build & Release / Build Android (push) Successful in 29m7s
    Build & Release / Create Release (push) Successful in 15s
    Stable

    dtourolle released this 2026-07-24 22:02:42 +00:00 | 224 commits to master since this release

    Features

    • Cross-platform desktop packaging, with a Windows NSIS installer built on tag.
    • A webview audio backend for platforms without a native one.
    • A graphic equalizer with presets and custom bands.
    • Home cards distinguish tap from long-press — tap opens detail, long-press
      plays.

    🐛 Fixes

    • Downloaded browse groups by container and loads on large libraries.

    Downloads

    Platform File
    Android jellytau-release.apk — sideload or adb install
    Windows (portable) jellytau.exe
    Linux (Debian/Ubuntu) jellytau_0.1.0_amd64.debsudo dpkg -i
    Windows jellytau_0.1.0_x64-setup.exe (NSIS installer)

    Report a problem: https://gitea.tourolle.paris/dtourolle/jellytau/issues

    Downloads