-
JellyTau v0.4.8
Stable🏗️ Build and Test JellyTau / Run Tests (push) Successful in 19m31sPublish Documentation / Build & publish docs to gitea-pages (push) Successful in 5m28sTraceability Validation / Check Requirement Traces (push) Successful in 22sBuild & Release / Run Tests (push) Successful in 6m47s🏗️ Build and Test JellyTau / Android Compile Check (push) Successful in 10m6sBuild & Release / Build Linux (push) Successful in 19m57sBuild & Release / Build Windows (push) Successful in 14m14sBuild & Release / Build Android (push) Successful in 30m26sBuild & Release / Create Release (push) Successful in 19sreleased 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 noCodecProfileor 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 oradb installWindows (portable) jellytau.exeLinux (Debian/Ubuntu) jellytau_0.4.8_amd64.deb—sudo dpkg -iWindows jellytau_0.4.8_x64-setup.exe(NSIS installer)
Report a problem: https://gitea.tourolle.paris/dtourolle/jellytau/issues
Downloads
- Video with an undecodable soundtrack now transcodes instead of playing
-
JellyTau v0.4.6
Stable🏗️ Build and Test JellyTau / Run Tests (push) Successful in 20m34sPublish Documentation / Build & publish docs to gitea-pages (push) Successful in 6m6sTraceability Validation / Check Requirement Traces (push) Successful in 18sBuild & Release / Run Tests (push) Successful in 20m26s🏗️ Build and Test JellyTau / Android Compile Check (push) Successful in 10m3sBuild & Release / Build Linux (push) Successful in 37m59sBuild & Release / Build Windows (push) Successful in 23m0sBuild & Release / Build Android (push) Successful in 40m26sBuild & Release / Create Release (push) Successful in 1m20sreleased 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'sfile_pathis 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:convertFileSrcrewrites a path toasset.localhostunconditionally, 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-Rangesfrom 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 setusesCleartextTraffic=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
originalquality 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_itemnever recordedmedia_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.Indexis
global across every stream in a media source, so index 0 is the video stream on
virtually all files — andAudioStreamIndex=0was 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.
MediaCodecListanswers "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 —
includingREQUEST_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 oradb installWindows (portable) jellytau.exeLinux (Debian/Ubuntu) jellytau_0.4.6_amd64.deb—sudo dpkg -iWindows jellytau_0.4.6_x64-setup.exe(NSIS installer)
Report a problem: https://gitea.tourolle.paris/dtourolle/jellytau/issues
Downloads
-
-
JellyTau v0.4.1
Stable🏗️ Build and Test JellyTau / Run Tests (push) Successful in 18m39sPublish Documentation / Build & publish docs to gitea-pages (push) Successful in 5m40sTraceability Validation / Check Requirement Traces (push) Successful in 16sBuild & Release / Run Tests (push) Successful in 6m1s🏗️ Build and Test JellyTau / Android Compile Check (push) Successful in 9m26sBuild & Release / Build Linux (push) Successful in 19m41sBuild & Release / Build Windows (push) Successful in 13m57sBuild & Release / Build Android (push) Successful in 30m6sBuild & Release / Create Release (push) Successful in 24sreleased 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 DOMpausethe 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 oradb installWindows (portable) jellytau.exeLinux (Debian/Ubuntu) jellytau_0.4.1_amd64.deb—sudo dpkg -iWindows jellytau_0.4.1_x64-setup.exe(NSIS installer)
Report a problem: https://gitea.tourolle.paris/dtourolle/jellytau/issues
Downloads
- The lockscreen pause works while a video's audio plays in the background.
-
JellyTau v0.4.0
Stable🏗️ Build and Test JellyTau / Run Tests (push) Successful in 17m21sPublish Documentation / Build & publish docs to gitea-pages (push) Successful in 5m46sTraceability Validation / Check Requirement Traces (push) Successful in 16sBuild & Release / Run Tests (push) Successful in 5m38s🏗️ Build and Test JellyTau / Android Compile Check (push) Successful in 8m54sBuild & Release / Build Linux (push) Successful in 19m22sBuild & Release / Build Windows (push) Successful in 13m55sBuild & Release / Build Android (push) Successful in 30m12sBuild & Release / Create Release (push) Successful in 15sreleased this
2026-08-04 18:22:01 +00:00 | 176 commits to master since this release✨ Features
-
Favourites, across libraries. A
/library/favoritespage 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 fullRecursive=trueserver query. It now reads the whole synced
catalog through the same availability CTEget_itemsuses, gated on the same
include_catalog_browseflag, 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 inSTATE_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-posanddurationas 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_ftsgrew 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 oradb installWindows (portable) jellytau.exeLinux (Debian/Ubuntu) jellytau_0.4.0_amd64.deb—sudo dpkg -iWindows jellytau_0.4.0_x64-setup.exe(NSIS installer)
Report a problem: https://gitea.tourolle.paris/dtourolle/jellytau/issues
Downloads
-
-
JellyTau v0.3.0
Stable🏗️ Build and Test JellyTau / Run Tests (push) Successful in 16m59sPublish Documentation / Build & publish docs to gitea-pages (push) Successful in 5m36sTraceability Validation / Check Requirement Traces (push) Successful in 18sBuild & Release / Run Tests (push) Successful in 5m9s🏗️ Build and Test JellyTau / Android Compile Check (push) Successful in 8m54sBuild & Release / Build Linux (push) Successful in 18m49sBuild & Release / Build Windows (push) Successful in 14m4sBuild & Release / Build Android (push) Successful in 30m17sBuild & Release / Create Release (push) Successful in 18sreleased 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_episodeshad
accepted aseries_idsince it was written and no caller had ever passed one.
pick_current_episodenow 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
readsResume 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 oradb installWindows (portable) jellytau.exeLinux (Debian/Ubuntu) jellytau_0.3.0_amd64.deb—sudo dpkg -iWindows jellytau_0.3.0_x64-setup.exe(NSIS installer)
Report a problem: https://gitea.tourolle.paris/dtourolle/jellytau/issues
Downloads
- Opening a series lands on the current episode, not season 1. The viewer was
-
JellyTau v0.2.9
StablePublish Documentation / Build & publish docs to gitea-pages (push) Successful in 5m33sTraceability Validation / Check Requirement Traces (push) Successful in 25s🏗️ Build and Test JellyTau / Run Tests (push) Successful in 17m25sBuild & Release / Run Tests (push) Successful in 6m7s🏗️ Build and Test JellyTau / Android Compile Check (push) Successful in 8m38sBuild & Release / Build Linux (push) Successful in 19m23sBuild & Release / Build Windows (push) Successful in 13m43sBuild & Release / Build Android (push) Successful in 29m47sBuild & Release / Create Release (push) Successful in 19sreleased 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 inSTATE_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::NewTrackLoadedand 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 agoto()that cannot start audio while
backgrounded. Both dispatchers now share oneauto_advance_to_next_episode.
(UR-040)
Downloads
Platform File Android jellytau-release.apk— sideload oradb installWindows (portable) jellytau.exeLinux (Debian/Ubuntu) jellytau_0.2.9_amd64.deb—sudo dpkg -iWindows jellytau_0.2.9_x64-setup.exe(NSIS installer)
Report a problem: https://gitea.tourolle.paris/dtourolle/jellytau/issues
Downloads
- A backgrounded audio-only episode advances instead of stalling. It stopped
-
JellyTau v0.1.5
StableBuild & Release / Run Tests (push) Successful in 4m35sBuild & Release / Build Linux (push) Successful in 18m25sBuild & Release / Build Windows (push) Successful in 13m27sBuild & Release / Build Android (push) Successful in 29m9sBuild & Release / Create Release (push) Successful in 16sreleased this
2026-07-27 23:33:32 +00:00 | 209 commits to master since this releasev0.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 inonCreateand everyonResume, 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, andsetBackgroundAudioEnabledreports 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 oradb installWindows (portable) jellytau.exeLinux (Debian/Ubuntu) jellytau_0.1.5_amd64.deb—sudo dpkg -iWindows jellytau_0.1.5_x64-setup.exe(NSIS installer)
Report a problem: https://gitea.tourolle.paris/dtourolle/jellytau/issues
Downloads
- A single tap is deferred so a double tap does not also toggle pause. A tap
-
JellyTau v0.1.2
Stable🏗️ Build and Test JellyTau / Run Tests (push) Successful in 12m26sPublish Documentation / Build & publish docs to gitea-pages (push) Successful in 5m18sTraceability Validation / Check Requirement Traces (push) Successful in 17sBuild & Release / Run Tests (push) Successful in 4m15s🏗️ Build and Test JellyTau / Android Compile Check (push) Successful in 7m49sBuild & Release / Build Linux (push) Successful in 17m46sBuild & Release / Build Windows (push) Successful in 13m20sBuild & Release / Build Android (push) Successful in 29m14sBuild & Release / Create Release (push) Successful in 15sreleased 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/libraryrendering results inline, so on
any other/library/**route the results were fetched and never shown.
/searchis 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 oradb installWindows (portable) jellytau.exeLinux (Debian/Ubuntu) jellytau_0.1.2_amd64.deb—sudo dpkg -iWindows jellytau_0.1.2_x64-setup.exe(NSIS installer)
Report a problem: https://gitea.tourolle.paris/dtourolle/jellytau/issues
Downloads
- Search results are ordered by how well they match. A name that starts
-
JellyTau v0.1.1
Stable🏗️ Build and Test JellyTau / Run Tests (push) Successful in 12m25sPublish Documentation / Build & publish docs to gitea-pages (push) Successful in 5m17sTraceability Validation / Check Requirement Traces (push) Successful in 16sBuild & Release / Run Tests (push) Successful in 3m52s🏗️ Build and Test JellyTau / Android Compile Check (push) Successful in 9m52sBuild & Release / Build Linux (push) Successful in 17m32sBuild & Release / Build Windows (push) Successful in 13m14sBuild & Release / Build Android (push) Successful in 29m7sBuild & Release / Create Release (push) Successful in 13sreleased 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, andisCurrentEpisodeover-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 aMediaType::Audioitem, 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.tsmodule 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 oradb installWindows (portable) jellytau.exeLinux (Debian/Ubuntu) jellytau_0.1.1_amd64.deb—sudo dpkg -iWindows jellytau_0.1.1_x64-setup.exe(NSIS installer)
Report a problem: https://gitea.tourolle.paris/dtourolle/jellytau/issues
Downloads
-
-
JellyTau v0.1.0
Stable🏗️ Build and Test JellyTau / Run Tests (push) Successful in 18m37sPublish Documentation / Build & publish docs to gitea-pages (push) Successful in 5m13sTraceability Validation / Check Requirement Traces (push) Successful in 17sBuild & Release / Run Tests (push) Successful in 4m48s🏗️ Build and Test JellyTau / Android Compile Check (push) Successful in 4m36sBuild & Release / Build Linux (push) Successful in 17m58sBuild & Release / Build Windows (push) Successful in 22m16sBuild & Release / Build Android (push) Successful in 29m7sBuild & Release / Create Release (push) Successful in 15sreleased 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 oradb installWindows (portable) jellytau.exeLinux (Debian/Ubuntu) jellytau_0.1.0_amd64.deb—sudo dpkg -iWindows jellytau_0.1.0_x64-setup.exe(NSIS installer)
Report a problem: https://gitea.tourolle.paris/dtourolle/jellytau/issues
Downloads