2.37.0 (2026-10-23)
Features
- core: add a party store kept in memory or in Redis (7a489b4)
- core: add a sharedId to episodes whose own id is hashed (2b5eaf9)
- core: add a SyncPlay group engine and the party relay protocol (0dc9c67)
- core: add an app custom CSS setting (b47d1ed)
- core: add avatars to the party protocol (8781d22)
- core: add storage, ids and items for Jellyfin playlists (948cfe7)
- core: keep reports from the apps and pass them on to the developer (2c760fd)
- core: let a shared record kind count toward its own cap (42327c9)
- core: name a country the same from any code or spelling (724d346)
- core: name the language a tag stands for, with its region (f0d8569)
- core: replace the party report message with an offset message (6d6228e)
- core: store the playing version and tracks on watch sessions (6d8858a)
- desktop: play HDR on macOS with a choice of video output (#1563) (3f88359)
- frontend: add the party invite page and a Watch Parties settings tab (40f8da5)
- frontend: read app reports in the dashboard (8c3257d)
- frontend: rework addons menu (644dda6)
- jellyfin: add folder, editions, matched expressions and SeaDex to version extensions (4ceeffb)
- jellyfin: add showWatchedAt to Next Up episodes (eb30c78)
- jellyfin: add SyncPlay (b6b1c12)
- jellyfin: add the /Playlists routes and list playlists as items (6b38420)
- jellyfin: add the stream list index to version extensions (c31e6fe)
- jellyfin: fill person pages and filmographies from person metas (e7ec655)
- jellyfin: keep SyncPlay groups in the party store (f317a9d)
- jellyfin: let the X-AIOStreams-* headers through CORS (2eb9b16)
- jellyfin: list versions that need headers or YouTube when PlaybackInfo asks (92d0190)
- jellyfin: pass animatedPoster from metas onto items (e0c7e80)
- jellyfin: pick the default audio track by the user's audio types (e0eb9f2)
- jellyfin: raise the library limit to 500 and cap concurrent catalog requests (3278fa6)
- jellyfin: read More Like This from similar catalogs (a0e34a6)
- jellyfin: search people through person catalogs (e65c58a)
- jellyfin: send the app custom CSS in the server's public info (9694f1e)
- jellyfin: take tmdbId and tvdbId as a cast entry's person id (ba30161)
- native: add container indexes and seek thumbnails in Rust (e2bca29)
- native: add thumbnail JNI exports for Android (39eb4ac)
- native: add thumbnails that open their file in the background (87c1ece)
- native: log thumbnail opens, retries and keyframe failures (3b20314)
- native: read PGS and MP4 subtitle timelines (b767db3)
- native: read subtitle timelines from a Matroska file's index (f7bc3b2)
- native: reshape Dolby Vision profile 5 thumbnails with each frame's RPU (5534a20)
- server: add a watch party relay at /party/v1 (434c368)
- server: keep relay parties in the party store (af4d5c6)
- server: keep sealed avatars on relay seats (d1a62bf)
- server: mark controllable devices among the activity sessions (77448e6)
- server: report the playing version and tracks in sessions (48706ee)
- server: take app reports and prune them (2b04799)
- server: take capabilities and relay remote commands to sessions (24611c8)
- server: take members' offsets from their apps (3ad9205)
- ui: add a replaceable table of the kit's own words (dde33e6)
- ui: add swatches and an optional picker to the colour input (628cb1f)
- ui: let a carousel keep a focused slide where the first one starts (8e781aa)
- ui: mark a drawer's side (847ff77)
- ui: ring the whole row of a right-side switch when focused (0b085be), closes #1533
- ui: support right-to-left layouts (c99e46b)
- ui: write sizes in a chosen locale (43c1a15)
- web: add a cache size setting (b3d6f92)
- web: add a people row to search (e9c303e)
- web: add a random pick for a show's episodes and your favourites (01dc8ca)
- web: add a setting for the reactions sent in a party (33e3608)
- web: add a time-left toggle and an end time above the player's seek bar (3efa2b3), closes #1536
- web: add CSS hooks to party members, messages and the player cover (cf28c5d)
- web: add data-favourite and data-type to poster cards (af474dd), closes #1591
- web: add playlists (a9bec92)
- web: add quick filters and badges to the version list (eaa4ac7)
- web: add sound and output settings for the apps (976ba8b)
- web: add subtitle font and shadow settings (412db8d)
- web: add tooltips to the player buttons and the show download menu (3729cdb), closes #1588
- web: add translations with Lingui and a language setting (a48ead4)
- web: add watch parties (93563db)
- web: allow a negative subtitle height (3b2875f)
- web: apply the server's CSS under the user's own (bb658e5), closes #1541
- web: ask for a second Back before leaving the Android app from Home (5d8791a)
- web: clear the launched player's queue when nothing plays next (4280f9e)
- web: connect to a config's server from its manifest URL (b52e506)
- web: cover the player until its first frame (364c974)
- web: draw each buffered range on the seek bar (faca189)
- web: fetch a server subtitle again each time it is picked (8542464)
- web: give subtitle timing, subtitle style and sound their own menu pages (1326c9d)
- web: honour "play the version's default track first" when re-picking audio (5d22997)
- web: keep a user with a PIN unlocked until they switch away (64bd9c0)
- web: keep key focus at a row's start (d58c649), closes #1583
- web: keep the app language per user (7e32f7d), closes #1557
- web: keep the subtitle look on the user's account (e9efa9f)
- web: leave the thumbnail out of double-tap seek previews (270c7c3)
- web: line added subtitles up with the file's own subtitles (f016dd6)
- web: match added subtitles against a PGS track when a file has no text one (6674a71)
- web: offer colour swatches, without the picker on TVs (43850d1)
- web: offer favourite only on movies and shows (b723bc3)
- web: offer the Android app's download folder choice (e14f65c)
- web: open the user switcher from the avatar (8e26b3c), closes #1524
- web: open titles from aiostreams:// item and play links (2944938)
- web: pass a version's required headers to app downloads (7e75b36)
- web: play a card's animatedPoster while it is hovered or focused (7768318)
- web: play titles on and control other devices (27f7b78)
- web: play trailers with the user's track preferences (99f67bb)
- web: play versions that need headers or YouTube in the app's player (17527e3)
- web: put the profile first in the TV rail and corner menu (dd663a7), closes #1576
- web: raise the player controls' idle delay to 5 seconds (b567511), closes #1592
- web: re-pick the audio track by the user's audio types (1fe5557)
- web: reorder the player's option buttons by purpose (0fad099)
- web: scroll the calendar agenda to today on a new visit (7e4407a)
- web: select tabs as a remote or keyboard moves onto them (a36b909)
- web: send a report from troubleshooting or after a crash (661daef)
- web: send and show avatars in watch parties (7f79300), closes #1584
- web: send continue watching to the Android TV app's Watch Next row (7f2e4ff)
- web: send the party offset when it changes (a902cc4)
- web: send the player the segments it skips (df28a23)
- web: send X-AIOStreams-* headers to servers listing clientHints (b56f5c1)
- web: settle unsure subtitle syncs on when lines start and end (394b73f)
- web: show a retimed copy of subtitles made for another frame rate (d56bc6b)
- web: show cover immediately on auto play first (6a93d18)
- web: show home's Activity and Calendar buttons only with the bottom bar (6936c8e)
- web: show keyframe thumbnails over the seek bar (baa0035)
- web: show notices at their index among the versions (b63a30c)
- web: show party reactions beside the open party sheet (fee3b45)
- web: show the audio output and memory in ExoPlayer's stats (27e7b2e)
- web: show the cache size setting in the desktop app (67c1f2f)
- web: show the cache's time behind in Exo stats (b73aa8d)
- web: show the channel setting in the Android app (4b0f6ac)
- web: show the seek-bar picture for arrow-key seeks only on TVs (d4d00bf)
- web: skip a file's own subtitle its other subtitles don't back (216ce6b)
- web: skip row titles and the hero's dots in arrow navigation everywhere (33aa5ba)
- web: sort the merged Continue watching row by watch time (62b2b6e), closes #1483
- web: suggest aiostreams.viren070.me's relay to servers without party info (91a028e)
- web: support right-to-left layouts (0e7f1e4)
- web: take a party's next titles from its queue (b9af145)
- web: take remote commands from the session socket (7c0a942)
- web: title a report of a page restart as one (5f76024)
- web: wrap every message in Lingui (f04715e)
Bug Fixes
- config: decrypt string and URL credentials set by the environment (#1528) (795208e), closes #1215
- frontend: only refresh catalogs on catalog tab (644dda6)
- jellyfin: air an undated episode no earlier than the ones before it (48a77e7)
- jellyfin: keep separate users off the account's switch list (68a0f69)
- jellyfin: leave subtitles marked no-store out of the cache (762360a)
- jellyfin: match default tracks by the addon's language names (54b029b)
- jellyfin: open a show whose default video is one of its episodes (d87ce95)
- jellyfin: place season-less packed episodes by their match key (d20066d)
- jellyfin: play the session a client was given when its stream request names none (38c060d)
- jellyfin: raise the per-configuration maxVersions limit to 500 (#1517) (5cde591)
- jellyfin: resolve alias and PIN mounts for the session socket (5449741), closes #1554
- jellyfin: return only the named version from PlaybackInfo (f18557c)
- jellyfin: show production countries by name (2919d45), closes #1542
- metadata/tvdb: tag the original-language title with its language (cff9f70)
- send hash of host for reports (0705e0f)
- server: cap the length of party and SyncPlay queues (d5b47a9)
- skip merged catalog sources that don't declare a requested extra (880bd5b)
- ui: measure a slider's thumb as the whole slider for key navigation (78d8f10)
- web: abort item and image fetches nothing waits on (9fe977f)
- web: accept a slash after the host in party app links (fbb961d)
- web: change party playback speed only for a drift that lasts (9ef673e)
- web: check downloads before finding the next episode's version (4c66c83)
- web: close the open player menu when another opens (22d5d3c)
- web: compile dependencies to the build's browser targets (bd1de5b)
- web: dont gate party settings on party feature (e8e4a4c)
- web: draw card focus rings outside the picture (e3646bc)
- web: drop the focus ring from body and #root (bc0e44e)
- web: enter a row lying between focus and the card in line with it (c4f6c30), closes #1605
- web: fill landscape cards from landscapePoster before the poster (f3e0d0b)
- web: focus the custom CSS toast's Keep when applied from keys (0480a86)
- web: give the About page's Credits title its own context (a58e39d)
- web: hide pages kept beneath others with visibility as well (1526431)
- web: hold a skip's seek-bar picture for a second (451a155)
- web: keep a replaced artwork copy until it ages out (7dcaa08)
- web: keep a skip's seek-bar thumbnail up after the skip lands (a35c64b)
- web: keep the TV rail's fading layers composited with will-change (5aecddb)
- web: leave room for the focus ring in desktop rows (927e0f4)
- web: let up and down leave a text box from its first and last line (025fe89)
- web: match track languages by the addon's language names (0ecace3), closes #1545
- web: memoise the playback info query helpers (909437d)
- web: move along the player menu's stepper rows with left and right (1a45f22), closes #1559
- web: move focus through a scrolled box before leaving it (c6c52a1)
- web: name the badge summary's plural counts (69b1a66)
- web: offer version fields only on servers that send them (f142a47)
- web: open drawers below the desktop app's window buttons (226dd06), closes #1548
- web: open the version list with nothing focused on touch screens (7bb7a63)
- web: paint the Android app's root in the page colour outside the player (b5eeea3), closes #1589
- web: paint the page's scrollbar in the page colour (930e8a0)
- web: pick the following hero's card on pointer moves, not enters (754a4d1)
- web: play a version's own address rather than the stream route (fc8e554)
- web: read buffered ranges from one snapshot (10f9382)
- web: remember the subtitle type picked for a show (657980e), closes #1617
- web: return focus to a card after a dialog its menu opened (ae8e7e5)
- web: return nothing from the calendar agenda's scroll (3b54f0f)
- web: reword the audio help for remembering picks per show (3d4bcb6)
- web: send a pending settings save before reading them back (da601ca)
- web: send a segment already skipped as offered (8263f0a)
- web: size the shut TV rail's buttons to its icons (ef055dc)
- web: skip the navigation when a key press starts focus on a page (6ffeab3)
- web: start Favourites on its first poster (1c8ec8c), closes #1550
- web: start on Home after switching users or signing out (b581499), closes #1556
- web: stop rejoining the last party when the app opens (3f6e28a), closes #1549
- web: take a party player's position from its soonest report (1796aa0)
- web: take Back in the profile PIN prompt (b85c428), closes #1616
- web: tie the item backdrop's fade to the image that loaded (0c8b2f0), closes #1553
- web: treat a dialog holding focus itself as nothing focused for key moves (9e7b84c)
- web: write single watched counts as whole plural messages (d40f1e0)
Performance Improvements
- core: index shared records' tags and refs in memory (ec85729)
- core: reject values that can't be encrypted before parsing them (1565c5e)
- native: convert thumbnails straight to JPEG YCbCr (2fe4fe1)
- native: fetch several keyframes at once for thumbnails (4a67d31)
- native: fetch the next thumbnail's keyframe while one renders (41d2ecc)
- native: size keyframe reads from recent keyframe sizes (ea1c4ca)
- web: fade cards and artwork in only when on screen (4e094f3)
- web: find glide layers among a box's children (131fbfd)
- web: reuse the subtitle matcher's curves (484887d)
- web: save a query's answer once it stops changing (ab1d274)