2.36.0 (2026-10-12)
Features
- android: add an ExoPlayer engine (764da86)
- android: add the Android app (2132721)
- android: pass surround audio through by what the output reports (6cc6828)
- android: run voice search in the app (cf0939c)
- dashboard: add a media info page (b94647c)
- db: add the media info tables (ac93a93)
- docker: ship a minimal ffprobe (472def3)
- frontend: list every device the app runs on under Save & Install (6b33433)
- jellyfin-web: add {scheme} to the player link (9db03c5)
- jellyfin-web: add a Cache settings tab (f9c38fe)
- jellyfin-web: add Android players to the player choice (cebbc23)
- jellyfin-web: add Android players to the player choice (26a3050)
- jellyfin-web: add Original language and a default-track switch to the audio settings (4687ea2)
- jellyfin-web: add subtitle files by dropping or picking them (76d7116)
- jellyfin-web: add webOS and Tizen hosts (68241bf)
- jellyfin-web: ask whether anyone is still watching before playing on (cebbc23)
- jellyfin-web: ask whether anyone is still watching before playing on (2d52201)
- jellyfin-web: block the webOS screensaver while the video plays (cebbc23)
- jellyfin-web: block the webOS screensaver while the video plays (340818f)
- jellyfin-web: describe desktop playback failures from mpv's http error (21f24bf)
- jellyfin-web: download movies, episodes and seasons (3ad7fad)
- jellyfin-web: hand downloads to the Jellyfin Android app (3a31b1f)
- jellyfin-web: hand the Android app's player the episodes that follow (cebbc23)
- jellyfin-web: hand the Android app's player the episodes that follow (25e6f6f)
- jellyfin-web: list films on the calendar (05863cb)
- jellyfin-web: look up the next episode's versions before its prompt (cebbc23)
- jellyfin-web: look up the next episode's versions before its prompt (fe2a9dd)
- jellyfin-web: play finished downloads from their files (d377c50)
- jellyfin-web: play through AVPlay on Samsung TVs (71c8c85)
- jellyfin-web: redesign server picker (cebbc23)
- jellyfin-web: redesign server picker (8c24862)
- jellyfin-web: refresh watch state on the server socket's pushes (cebbc23)
- jellyfin-web: refresh watch state on the server socket's pushes (db18973)
- jellyfin-web: remember audio and subtitle picks per show (cebbc23)
- jellyfin-web: remember audio and subtitle picks per show (3926dda)
- jellyfin-web: replace the external player link with a player choice (3578bd3)
- jellyfin-web: save pages and artwork on the device (bb28b3b)
- jellyfin-web: show filler and recap marks and skip them when playing on (cebbc23)
- jellyfin-web: show filler and recap marks and skip them when playing on (451321c)
- jellyfin-web: start the desktop players on the server's default tracks (fb4ded4)
- jellyfin-web: switch audio tracks the video element lists (cebbc23)
- jellyfin-web: switch audio tracks the video element lists (f5a76a9)
- jellyfin-web: use relative asset paths in the standalone build (ca58c71)
- jellyfin: add ordered audio and subtitle language lists (7df1d5f)
- jellyfin: add watchlisted shows and films to the calendar (f5abba0)
- jellyfin: answer search hints from LumiereDB or Cinemeta (03ef417)
- jellyfin: ask a locked user's own session for its PIN on a switch (296bc7e)
- jellyfin: fill a version's tracks from stored probes on play (ba78352)
- jellyfin: keep a user separate, on a sign-in address of their own (0b1fe3b)
- jellyfin: mark filler and recap episodes (e17da78)
- jellyfin: rank subtitle tracks by type (d37af67), closes #1485
- jellyfin: read named trailers and video links (52c9490)
- media-info: add a tags list to audio tracks (6ff91b8), closes #1443
- media-info: fill stream details from stored probes (5c8b38d)
- media-info: probe played files with ffprobe (d0f43a3)
- media-info: serve stored media info to other instances (57d0156)
- media-info: store what StremThru and RemuxDB report (64aaffd)
- parser: read more stream details from behaviorHints (d56784e)
- parser: read stream duration from behaviorHints.duration (0b9b655), closes #1340
- presets: parse the torrent file and title where addons name them (4a27d2b)
- proxy: name a trusted stream's release in its proxy token (c3cedcf)
- remuxdb: contribute and match Prowlarr and NZBHydra results via the indexer info URL (#1450) (a046b0e)
- remuxdb: contribute stored probes (253cea2)
- remuxdb: enable contributing by default (99b6dc3)
- remuxdb: look streams up by default (99b6dc3)
- remuxdb: turn contributing off by default (b0e6e9d)
- tv: add a boot script for old TVs and startup errors (81ef44c)
- tv: build the Tizen package unsigned (82e7ac3)
- tv: package the standalone web app for webOS and Tizen (915b925)
- ui: add a right-side sheet to the modal (74b41b9)
- ui: leave a zero decimal off formatBytes (90dfa0b)
- watch-state: date a stop that arrives late by LastPlayedDate (b02a09c)
- web: add a Dolby Vision switch that plays the HDR10 picture instead (e27353e)
- web: add a follow hero that keeps its artwork in the top corner (5fe6e6d)
- web: add a frame-rate matching setting on Android TVs (9f3832c)
- web: add a solid navigation bar background and put navigation settings in one card (1cb3cf0)
- web: add a tooltip to the rating button (03554dc)
- web: add a touch rail for wide touch screens (2744be1)
- web: add a trailer player and a sheet of named trailers (b1c84c1)
- web: add a tunneled playback setting on Android TVs (433d8e2)
- web: add a TV layout (454db91)
- web: add a voice search button on Android TVs (46ef56f)
- web: add an Android app section to the settings (be699af)
- web: add an Automatic player engine and make it the default (2549a50)
- web: add an episode list to the player (34e808b), closes #1462
- web: add an only-on-Wi-Fi download setting for the Android app (20613bd)
- web: add data-nav-exit focus boxes (83e09ab)
- web: add data-ui hooks to the parts that had none (7555445)
- web: add floating and corner side rails (35533ed)
- web: add picture-in-picture and background playback settings for the Android app (c400399)
- web: allow the following hero on TVs (2f2fba5)
- web: ask who's watching when the app opens (2c02c13)
- web: blur liquid glass without its bend while it resizes (fb6a4bd)
- web: bring the page to its top for focus in the item header (dc6a50b)
- web: choose the Android app's player engine (0bef3a4)
- web: crossfade the home hero's titles with a swipe (93d4407)
- web: draw ExoPlayer's statistics over the player (4098e26)
- web: drop copying stream links on TVs (6254b27)
- web: drop downloads on Android TV (87fabc4)
- web: drop the follow hero's buttons on TVs (7e50285)
- web: drop the Shortcuts settings tab on TVs (61b6f8b)
- web: drop the versions filter on TVs (62b0cd3)
- web: enter a focus group from outside at the start of its row (2e9a4f0)
- web: export the watch history through the Android app (e5e6830)
- web: fill focused list rows instead of outlining them (6f0a4a3)
- web: fit the sign-in pickers to a remote (d5a34cf)
- web: float a TV's top bar over the page on glass (231101f)
- web: focus an item page's Play when keys open it (d05c1ef)
- web: focus the first item on Select with nothing focused (e07653e)
- web: give liquid glass a wider, stronger rim and edge highlights (2e0b379)
- web: give the Android and Android TV apps their own client names (3fc3502)
- web: glide keyed scrolls on a spring of our own (f7710b1)
- web: hear back from external players in the Android app (73138d6)
- web: hide an episode's buttons on TVs and add Details to its menu (13340e3)
- web: hide external links and skip the hero's dots on TVs (f11a7c5)
- web: hide scrollbars on TVs (4b98f25)
- web: hide the player's controls on Back before leaving on a TV (a6b5424)
- web: keep a show's Play button in place while its next episode loads (bf5e3cd)
- web: keep subtitles above the player's controls while they show (19a0d62)
- web: land focus where it last was in rows, grids and lists (712f2fc)
- web: leave volume out of the player on TVs and touch screens (273140a)
- web: let a held key's action run until the key is let go (201d55e)
- web: list only the user's subtitle languages in the subtitle menu (0afe744), closes #1490
- web: list versions in a drawer over the player and on short screens (957fc44)
- web: list versions in a side sheet over the player (6510fc7)
- web: mark a focused settings tab on its sliding marker (f5bec52)
- web: mark webOS and Tizen as TVs (cd01056)
- web: offer a ready update in a dialog on TVs (6bbe727)
- web: offer the other engine on the Android app's error screen (1e63e1e)
- web: open a TV's keyboard on Select rather than on focus (bd9ad67)
- web: open a user's own address on their sign-in (2e48202)
- web: play full screen in landscape in the Android app (58a6550)
- web: play full screen on tablets in the app (beee186)
- web: press a showing skip button on Select (05a6079), closes #1477
- web: put a TV's keyboard away on its own Enter (439c860)
- web: remove a recent search from its context menu (4565884)
- web: reuse the server's kept version list in the player (edac5c2), closes #1488
- web: rework the player's controls (bb9b11f)
- web: run a button's hold action on a held Select (e4b2452)
- web: say which picture fit the button picked (3902c74)
- web: scroll to the top when the rotating hero takes focus (c098b24)
- web: seek with a double tap and swipe for brightness and volume on touch (d1d51a6)
- web: send Back into a TV's navigation from the pages it leads to (36f1b2f)
- web: send the backdrop as now-playing artwork (3dae86e)
- web: show the display's HDR types and the Dolby Vision route in ExoPlayer's statistics (c23dc88)
- web: show the passthrough switch in the Android app (76bf5de)
- web: show the picture-in-picture setting only where the device has it (65e7798)
- web: show the player's controls on Up and Down on TVs (29ddbbd)
- web: show where a run of skips is headed on the seek bar (ea29cff), closes #1478
- web: skip row headers and hide minor buttons on TVs (c83f694)
- web: slide a TV's top bar away while focus is in the following hero's rows (3c5fa80)
- web: start Discover's focus on its first card (fc794c9)
- web: start the version picker on the first version for keys (209e0fe)
- web: step through the TV hero's titles with Left and Right (039afbc)
- web: suggest titles from search hints while typing (9f36d38), closes #1491
- web: take ordered audio and subtitle language lists (fe8b99c)
- web: take the Android app's Back (fb93b47)
- web: thicken card focus rings on TVs (56bf856)
- web: toggle playback with Enter on the seek bar (42a6d41), closes #1474
- web: toggle the player's controls with a tap (5d5df5e)
- web: wrap focus across card grid rows (ba46baa)
Bug Fixes
- cache: drop a buffered sql write on delete (c2e6bdd)
- core: drop "Usenet" from the built-in usenet service's known names (28fa990)
- core: only type a stream as external when it has no url (0f8a13d), closes #1375
- core: trust a confirmed-empty media probe over a stale guess (#1437) (f156e27)
- dedupe: copy probed tracks from a duplicate that lists them (aeb4f2f)
- frontend: add no-referrer to the marketplace and reorder modal logos (37ff00f)
- http: include the path's directory in indexer cooldown keys (ed4944f)
- jellyfin-web: clear only the position on remove from continue watching (c66e99f)
- jellyfin-web: hold Play to list the versions of a resume (cebbc23)
- jellyfin-web: hold Play to list the versions of a resume (0c26e7b)
- jellyfin-web: keep the picked season in the item page's address (b9692d9)
- jellyfin-web: replace the player controls with the error screen (c34b7b1)
- jellyfin: list a probed file's streams in the file's order (873d42f)
- jellyfin: pick each version's default tracks from the user's settings (0b98582)
- jellyfin: return a user's saved settings from /Users/{id} (fda114a)
- jellyfin: serve the sign-in picker's avatars before signing in (4a2d369)
- media-info: merge rows for one file before storing a batch (533a3bc)
- media-info: read UTF-8 file names from Content-Disposition (7673006)
- presets: mark old AnimeTosho archived, drop unneeded API key on new (#1435) (fdde68c)
- presets: note TsukiHime's per-file audio/subtitle extraction (#1436) (b17de1e)
- presets: replace the fkstream and nzbhydra logos (063a46f), closes #1361
- remuxdb: put the season and episode in the versions id (bc78e36)
- send alang and slang lists to mpv as -append options (fc10515)
- services/altmount: send season and episode for episode requests (#1475) (c27606e), closes #1473
- ui: base the carousel arrows on the scroll position (6622477)
- ui: focus a combobox's list when keys open it (7657ecd)
- ui: ignore a loading button's presses instead of disabling it (00032ad)
- ui: keep a modal's overlay and content on their own layers (ef3a7a8)
- ui: show a controlled Select's value again after a pick it didn't take (75a651c)
- ui: size a modal's column to its box rather than its widest text (3766493)
- ui: transition a tab's colours rather than all its properties (7a0c6ec)
- ui: update the Radix packages (ae82a44)
- usenet: check services by the hash of the NZB URL they are sent (546b706)
- usenet: hash proxied NZB URLs by the URL behind our proxy (9ac363f)
- watch-state: add the session start time to playback event ids (ea9ddbd)
- watch-state: keep the played mark under a resume point (a4cdbc0)
- watch-state: move a row's sort time only on a play (b3a2727)
- watch-state: skip imported spellings our own rows already cover (1ef6d01)
- watch-state: treat a favourite under any spelling as the title's (14336d0), closes #1429
- web: bring a focused field into view when the Android app's keyboard opens (5743cd6)
- web: copy mpv's decoded frames back on TVs (4ba4972)
- web: draw the watched mark on episode images on TVs (5a8eef9), closes #1472
- web: drop a page's focus spot only when the pointer leaves it (3e1a5cd)
- web: drop a show's picked language from the rest of its list (b625cd3)
- web: fade each hero backdrop in as a layer over the last (709958f)
- web: fade the backdrop's left edge in landscape (8691143)
- web: fade the item page's backdrop out at its bottom edge (e579237)
- web: fall back to the title when the hero's logo fails to load (4c0cab5)
- web: fill the player controls' focus with an inset shadow (78e1d27)
- web: fix TV focus around the rail, page starts, grids and rows (4f0e954)
- web: give focus back to what opened the version picker (cb86a88)
- web: go up or down to the nearest row when nothing is in line (197bdef)
- web: hand a remote's Back in a list to the back action (c5ed382)
- web: hide the volume step on TVs (0af0fe2)
- web: hold focus at a loading episode row (1ae1483), closes #1472
- web: ignore player swipes from the top and bottom edges (90ae6b9)
- web: jump rather than restart a smooth scroll that's still going (7f87d72)
- web: keep every arrow key on a TV (e600fdf)
- web: keep fading hero backdrops on their own layers (f7094e6)
- web: keep keyed scroll steps off the page behind a dialog (3cb138d)
- web: keep Left and Right on focus's own line (62bb409)
- web: keep presses that move the desktop window from the page (5a316fa), closes #1476
- web: keep the page still for focus in a dialog or bar (7018937)
- web: keep the player's controls awake while keys move in them (c8b76b3)
- web: keep the player's TV layout on TVs that report a touch pointer (988a1b5)
- web: leave row posters room only for the caption lines shown (1fe26e6)
- web: list ExoPlayer before mpv in the player engine setting (d724799)
- web: make the next episode card opaque and lower it while the controls hide (e2e2069)
- web: mark a focused episode on its thumbnail in rows and its row in lists (9a4d26c)
- web: measure an episode's title as its whole card for focus moves (9a15c81)
- web: measure focus moves from where scrolls under way end (effb4c0)
- web: measure in-view targets on each scroll, without the glide's offset (1e321d0)
- web: move focus sideways into the nearest bar (fa6c2a8)
- web: narrow row cards to the height left under the following hero (186d8b4)
- web: press Enter in a field on a gamepad's A (20b9954)
- web: retry rate-limited download version searches after Retry-After (5995ba5)
- web: reveal the outermost nav box and make rows nav boxes (0831343)
- web: rework the download rows for phones (4178497)
- web: ring a focused season poster inside its image (650a8a4)
- web: ring a focused version inside its card (9be856a)
- web: ring focused menu items and options inside their edges (08f3b0b)
- web: scroll a focused episode's whole card into view (a3985cd)
- web: scroll the player menu's list and footer together on short screens (e391611)
- web: set the item menu's width on phones and clamp where it opens (65f872e)
- web: show an early end of file as a failure with a resume button (a4a9dd7)
- web: skip inert elements when returning focus to a page (3b9cc3e)
- web: skip rows scrolled out of their own scroller when moving focus (0947dd7)
- web: stack keyed glides on layers again, easing held repeats in and out (3bd1644)
- web: take a held key's quick presses as repeats (fe5d6f7)
- web: treat sticky bars like fixed ones in arrow navigation (bdedc94)
Performance Improvements
- jellyfin-web: mount only the hero backdrops in use (0b22949)
- jellyfin-web: send an image Accept header with artwork fetches (8c55a18)
- jellyfin: keep an ended show's episode list for a week (2b75194)
- jellyfin: send Access-Control-Max-Age with preflight answers (1499906)
- jellyfin: size the image inside AIOMetadata poster cache addresses (b867f63)
- jellyfin: start Next Up's next show check as each one ends (db76294)
- media-info: send stored records packed from the lookup API (d9b6399)
- remuxdb: start the lookup alongside the addon fetch and time out after 2 s (99b6dc3)
- ui: glide a carousel to focus with a CSS transition (405bdfb)
- watch-state: fetch each page of recent shows in one joined query (c50ded1)
- watch-state: look up spellings through both indexes (64f62ed)
- web: ask for a show's next episode, seasons and opening episodes as its page starts to draw (f649549)
- web: ask for a title before reading its saved copy (c8932ff)
- web: ask for the show's poster for a season that carries it (a71ed35)
- web: ask the Android app's mpv for direct MediaCodec decoding (2173c62)
- web: chase keyed jumps on one layer at an even speed (ce4fa87)
- web: check a row's end in a frame rather than in its effect (db4fa6f)
- web: count saved bytes so a prune reads every entry only near the limit (9188cda)
- web: draw a home library row's cards only once it nears the screen (c32c777)
- web: draw a title's page from a loaded list's copy of it while it loads (2031f62)
- web: draw only the cards near a long row's view (93e4c55)
- web: ease keyed page and hero row scrolls on the compositor on TVs (c6cc502)
- web: fade card overlays rather than colouring them in (7cdf21d)
- web: fade cards in with the Web Animations API (d82987b)
- web: give focus transitions on cards the keyed glide's duration (52d0693)
- web: give the apps' build an empty page icon (6928b24)
- web: hold an unfetched row's place with one placeholder (3993676)
- web: hold placeholders still in rows not loading yet (9a5fd19)
- web: keep React from listening for transition and animation events (6ca93a8)
- web: keep saved artwork as Blobs (cebb61f)
- web: keep the home page while others are open (90f2def)
- web: keep the layout and Home mounted under the player (acb9b68)
- web: keep the playhead out of the player's React state (880cc8e)
- web: leave the touch navigation bar out on TVs (233ec48)
- web: make form-less buttons submit buttons on Android (1307291)
- web: measure in-view targets once a scroll settles (b878fb9)
- web: measure in-view targets once after a navigation (cc4a951)
- web: measure nearness by hand and keep link addresses in data-href on TVs (a192627)
- web: measure only cards near the screen when moving focus (f47e21a)
- web: memoise the Home page kept under other pages (c120f88)
- web: memoise the item header's toggles, overview, rating and links (9729fdb)
- web: memoise the season posters row (f7999c8)
- web: open a settings tab once focus rests on it (7ab9bf1)
- web: open item menus without blocking the page (c88ff6d)
- web: open the docked TV rail with a fade rather than a widening (1ee7d6f)
- web: pace a held key's repeats to the screen (854db60)
- web: pause the rotating hero while it is out of sight (12d13ef)
- web: put a submit button before the page's first control on Android (30e01bd)
- web: read fewer layouts when moving focus (558f416)
- web: save the small copies of shrunk artwork (f6c0ab3)
- web: scale artwork at rest and look for open dialogs only in portals (b95f252)
- web: scale focused artwork in 200 ms (b87ec97)
- web: scroll rows natively on touch screens (a0c6e01)
- web: scroll TV rows natively with a compositor glide (3595f05)
- web: share intersection observers between elements (5f1c8dc)
- web: share one item menu between all cards (e1605a7)
- web: show artwork as images kept in memory (b93abea)
- web: shrink artwork in a pool of workers (d6e8542)
- web: start gamepad support in the Android app only with a controller attached (4930925)
- web: start the artwork workers with the page and make blob addresses in them (2a32ba9)
- web: step along a row's cards without measuring the others (783cb1a)