2026.10.10.2334-nightly
- fix(web): fall back to the title when the hero's logo fails to load (4c0cab5)
- docs(apps): show the apps on phones, tablets, TVs and computers (637ffa1)
- fix(jellyfin): serve the sign-in picker's avatars before signing in (4a2d369)
- feat(frontend): list every device the app runs on under Save & Install (6b33433)
- docs(apps): give the apps a section of their own, with Android and smart TV guides (fd529e0)
- feat(web): fit the sign-in pickers to a remote (d5a34cf)
- feat(web): open a user's own address on their sign-in (2e48202)
- feat(jellyfin): keep a user separate, on a sign-in address of their own (0b1fe3b)
- fix(android): hide the video view once the page closes the player (51a7fbe)
- fix(ui): transition a tab's colours rather than all its properties (7a0c6ec)
- fix(ui): ignore a loading button's presses instead of disabling it (00032ad)
- feat(web): keep a show's Play button in place while its next episode loads (bf5e3cd)
- perf(web): ask for a show's next episode, seasons and opening episodes as its page starts to draw (f649549)
- perf(web): draw a title's page from a loaded list's copy of it while it loads (2031f62)
- perf(web): draw only the cards near a long row's view (93e4c55)
- refactor(android): split the extractors into Extractors, Matroska and Subtitles (beec481)
- feat(android): rewrite Dolby Vision samples in native code, profile 7 RPUs as 8.1 with libdovi (0bae7a7)
- feat(web): show the display's HDR types and the Dolby Vision route in ExoPlayer's statistics (c23dc88)
- feat(android): decode Dolby Vision profile 5 in software in mpv (484ce7c)
- feat(android): route Dolby Vision tracks by the display's HDR types and the decoders' profiles (a97ff28)
- fix(web): skip inert elements when returning focus to a page (3b9cc3e)
- fix(web): fade each hero backdrop in as a layer over the last (709958f)
- perf(web): count saved bytes so a prune reads every entry only near the limit (9188cda)
- perf(web): start the artwork workers with the page and make blob addresses in them (2a32ba9)
- perf(web): scale artwork at rest and look for open dialogs only in portals (b95f252)
- feat(web): give the Android and Android TV apps their own client names (3fc3502)
- feat(android): lower the minimum SDK to 24 (0b901d8)
- feat(web): list versions in a drawer over the player and on short screens (957fc44)
- feat(web): draw ExoPlayer's statistics over the player (4098e26)
- feat(android): answer player-stats with ExoPlayer's formats and the app's CPU time (8b1cd9f)
- fix(web): set the item menu's width on phones and clamp where it opens (65f872e)
- fix(ui): keep a modal's overlay and content on their own layers (ef3a7a8)
- fix(web): move focus sideways into the nearest bar (fa6c2a8)
- feat(android): run downloads in a user-initiated data transfer job on Android 14 and later (943b52b)
- fix(web): retry rate-limited download version searches after Retry-After (5995ba5)
- fix(web): rework the download rows for phones (4178497)
- fix(web): list ExoPlayer before mpv in the player engine setting (d724799)
- feat(web): add a follow hero that keeps its artwork in the top corner (5fe6e6d)
- fix(web): measure focus moves from where scrolls under way end (effb4c0)
- fix(android): start libass's renderer over when clearing a file's fonts (e08efdf)
- perf(web): keep the playhead out of the player's React state (880cc8e)
- perf(web): pause the rotating hero while it is out of sight (12d13ef)
- perf(web): give focus transitions on cards the keyed glide's duration (52d0693)
- perf(web): measure nearness by hand and keep link addresses in data-href on TVs (a192627)
- perf(web): open the docked TV rail with a fade rather than a widening (1ee7d6f)
- perf(web): save the small copies of shrunk artwork (f6c0ab3)
- perf(web): open a settings tab once focus rests on it (7ab9bf1)
- perf(web): ease keyed page and hero row scrolls on the compositor on TVs (c6cc502)
- perf(web): fade card overlays rather than colouring them in (7cdf21d)
- perf(web): put a submit button before the page's first control on Android (30e01bd)
- fix(web): keep the player's TV layout on TVs that report a touch pointer (988a1b5)
- fix(web): hide the volume step on TVs (0af0fe2)
- fix(web): fix TV focus around the rail, page starts, grids and rows (4f0e954)
- feat(web): play full screen on tablets in the app (beee186)
- feat(web): list versions in a side sheet over the player (6510fc7)
- feat(web): rework the player's controls (bb9b11f)
- feat(web): let a held key's action run until the key is let go (201d55e)
- feat(ui): add a right-side sheet to the modal (74b41b9)
- fix(web): skip rows scrolled out of their own scroller when moving focus (0947dd7)
- perf(web): keep the home page while others are open (90f2def)
- perf(web): show artwork as images kept in memory (b93abea)
- perf(jellyfin): size the image inside AIOMetadata poster cache addresses (b867f63)
- perf(web): draw a home library row's cards only once it nears the screen (c32c777)
- feat(web): drop the follow hero's buttons on TVs (7e50285)
- fix(web): leave row posters room only for the caption lines shown (1fe26e6)
- feat(web): scroll to the top when the rotating hero takes focus (c098b24)
- fix(web): keep keyed scroll steps off the page behind a dialog (3cb138d)
- feat(web): start Discover's focus on its first card (fc794c9)
- feat(web): wrap focus across card grid rows (ba46baa)
- feat(web): enter a focus group from outside at the start of its row (2e9a4f0)
- fix(web): measure an episode's title as its whole card for focus moves (9a15c81)
- feat(web): add floating and corner side rails (35533ed)
- feat(web): blur liquid glass without its bend while it resizes (fb6a4bd)
- feat(web): add data-nav-exit focus boxes (83e09ab)
- feat(web): add a solid navigation bar background and put navigation settings in one card (1cb3cf0)
- feat(web): give liquid glass a wider, stronger rim and edge highlights (2e0b379)
- fix(http): include the path's directory in indexer cooldown keys (ed4944f)
- feat(web): slide a TV's top bar away while focus is in the following hero's rows (3c5fa80)
- fix(web): narrow row cards to the height left under the following hero (186d8b4)
- perf(web): check a row's end in a frame rather than in its effect (db4fa6f)
- perf(web): keep React from listening for transition and animation events (6ca93a8)
- perf(web): share intersection observers between elements (5f1c8dc)
- perf(web): scale focused artwork in 200 ms (b87ec97)
- perf(web): read fewer layouts when moving focus (558f416)
- feat(web): glide keyed scrolls on a spring of our own (f7710b1)
- fix(web): give focus back to what opened the version picker (cb86a88)
- feat(web): run a button's hold action on a held Select (e4b2452)
- feat(web): add a tooltip to the rating button (03554dc)
- feat(web): focus an item page's Play when keys open it (d05c1ef)
- feat(web): send Back into a TV's navigation from the pages it leads to (36f1b2f)
- perf(web): make form-less buttons submit buttons on Android (1307291)
- feat(web): float a TV's top bar over the page on glass (231101f)
- feat(web): show the picture-in-picture setting only where the device has it (65e7798)
- feat(android): tell the page whether the device has picture-in-picture (abc59e4)
- fix(ui): size a modal's column to its box rather than its widest text (3766493)
- feat(web): take ordered audio and subtitle language lists (fe8b99c)
- fix(ui): show a controlled Select's value again after a pick it didn't take (75a651c)
- feat(jellyfin): add ordered audio and subtitle language lists (7df1d5f)
- feat(web): leave volume out of the player on TVs and touch screens (273140a)
- feat(web): export the watch history through the Android app (e5e6830)
- feat(android): save files the page sends to Downloads (59e175a)
- feat(web): drop the Shortcuts settings tab on TVs (61b6f8b)
- feat(web): put a TV's keyboard away on its own Enter (439c860)
- feat(web): bring the page to its top for focus in the item header (dc6a50b)
- perf(web): shrink artwork in a pool of workers (d6e8542)
- fix(web): drop a page's focus spot only when the pointer leaves it (3e1a5cd)
- perf(web): share one item menu between all cards (e1605a7)
- perf(web): fade cards in with the Web Animations API (d82987b)
- perf(web): keep saved artwork as Blobs (cebb61f)
- fix(web): keep fading hero backdrops on their own layers (f7094e6)
- feat(web): allow the following hero on TVs (2f2fba5)
- fix(web): reveal the outermost nav box and make rows nav boxes (0831343)
- perf(web): scroll TV rows natively with a compositor glide (3595f05)
- perf(ui): glide a carousel to focus with a CSS transition (405bdfb)
- perf(web): measure only cards near the screen when moving focus (f47e21a)
- perf(web): hold placeholders still in rows not loading yet (9a5fd19)
- perf(web): leave the touch navigation bar out on TVs (233ec48)
- perf(web): open item menus without blocking the page (c88ff6d)
- perf(web): start gamepad support in the Android app only with a controller attached (4930925)
- perf(android): tell the page whether a game controller is attached (1c679bc)
- perf(web): pace a held key's repeats to the screen (854db60)
- fix(web): go up or down to the nearest row when nothing is in line (197bdef)
- fix(web): ring focused menu items and options inside their edges (08f3b0b)
- fix(web): keep Left and Right on focus's own line (62bb409)
- fix(web): scroll a focused episode's whole card into view (a3985cd)
- fix(web): fade the item page's backdrop out at its bottom edge (e579237)
- feat(web): add a voice search button on Android TVs (46ef56f)
- feat(android): open the system's speech recogniser for the page (7657b76)
- feat(web): show the passthrough switch in the Android app (76bf5de)
- feat(android): turn ExoPlayer's passthrough on and off with audio-spdif (8a1af3e)
- feat(web): add a tunneled playback setting on Android TVs (433d8e2)
- feat(android): add tunneled playback to ExoPlayer (58be863)
- feat(web): add a frame-rate matching setting on Android TVs (9f3832c)
- feat(android): switch the display mode to the video's frame rate (a7d94f8)
- fix(web): copy mpv's decoded frames back on TVs (4ba4972)
- feat(web): hide an episode's buttons on TVs and add Details to its menu (13340e3)
- fix(web): mark a focused episode on its thumbnail in rows and its row in lists (9a4d26c)
- feat(web): hide external links and skip the hero's dots on TVs (f11a7c5)
- feat(web): mark a focused settings tab on its sliding marker (f5bec52)
- feat(web): fill focused list rows instead of outlining them (6f0a4a3)
- feat(web): remove a recent search from its context menu (4565884)
- fix(android): copy the web build into the app on every build (4829b1e)
- feat(web): thicken card focus rings on TVs (56bf856)
- fix(web): ring a focused season poster inside its image (650a8a4)
- fix(web): ring a focused version inside its card (9be856a)
- feat(web): drop copying stream links on TVs (6254b27)
- feat(web): start the version picker on the first version for keys (209e0fe)
- feat(web): show the player's controls on Up and Down on TVs (29ddbbd)
- fix(web): keep the player's controls awake while keys move in them (c8b76b3)
- fix(web): keep the page still for focus in a dialog or bar (7018937)
- feat(web): skip row headers and hide minor buttons on TVs (c83f694)
- feat(web): land focus where it last was in rows, grids and lists (712f2fc)
- fix(web): take a held key's quick presses as repeats (fe5d6f7)
- feat(web): offer the other engine on the Android app's error screen (1e63e1e)
- feat(android): play a failed file again on the other engine when the page asks (ba2416c)
- feat(android): inflate zlib-compressed Matroska tracks for ExoPlayer (196737f)
- fix(android): fall back to mpv on ExoPlayer failures other than loading the link (21d1201)
- feat(smart-tv): set the webOS app's resolution to 1280x720 (af70648)
- feat(web): hide scrollbars on TVs (4b98f25)
- fix(web): hand a remote's Back in a list to the back action (c5ed382)
- feat(web): mark webOS and Tizen as TVs (cd01056)
- fix(web): jump rather than restart a smooth scroll that's still going (7f87d72)
- feat(web): drop downloads on Android TV (87fabc4)
- fix(web): keep every arrow key on a TV (e600fdf)
- fix(web): treat sticky bars like fixed ones in arrow navigation (bdedc94)
- fix(web): press Enter in a field on a gamepad's A (20b9954)
- fix(ui): focus a combobox's list when keys open it (7657ecd)
- feat(web): hide the player's controls on Back before leaving on a TV (a6b5424)
- fix(web): bring a focused field into view when the Android app's keyboard opens (5743cd6)
- feat(web): focus the first item on Select with nothing focused (e07653e)
- feat(web): drop the versions filter on TVs (62b0cd3)
- feat(web): open a TV's keyboard on Select rather than on focus (bd9ad67)
- feat(web): add a TV layout (454db91)
- feat(android): tell the page it runs on a TV (da3281c)
- feat(android): add an Android TV launcher entry and banner (9c945d1)
- fix(android): write mpv's CA bundle from Android's certificate store (1a3f43d)
- chore(android): ignore the bin folders VS Code's Java tooling writes (645c494)
- perf(web): ask the Android app's mpv for direct MediaCodec decoding (2173c62)
- feat(android): fetch libmpv from a pinned, hash-checked release (983666a)
- fix(android): strip native libraries with the pinned NDK (cf96344)
- feat(android): read back to the subtitle lines a seek lands in (7592d22)
- fix(android): replace the launcher PNG with an adaptive icon (79ad343)
- feat(web): add an Automatic player engine and make it the default (2549a50)
- feat(android): fall back to mpv when ExoPlayer can't decode a file (e54d2b6)
- fix(android): time embedded text subtitles by the video's frames (3c4db7b)
- fix(android): apply sub-ass-override to ASS in ExoPlayer (2e4da69)
- refactor(android): rename the player modules to mpv and exoplayer (42b0cd5)
- feat(web): say which picture fit the button picked (3902c74)
- feat(web): choose the Android app's player engine (0bef3a4)
- feat(android): add an ExoPlayer engine (764da86)
- feat(web): take the Android app's Back (fb93b47)
- feat(android): hand Back to the page (36ae5a0)
- feat(web): hear back from external players in the Android app (73138d6)
- feat(android): open aiostreams:// links and external players (f38203a)
- ci(android): build, sign and publish the Android app (d3009f7)
- feat(android): update from the release feeds (f6cdf7c)
- feat(web): add an Android app section to the settings (be699af)
- feat(android): add the subtitle files the page sends (18b972c)
- feat(web): add an only-on-Wi-Fi download setting for the Android app (20613bd)
- feat(android): add a download queue in a foreground service (d9ee314)
- feat(web): add a touch rail for wide touch screens (2744be1)
- feat(web): keep subtitles above the player's controls while they show (19a0d62)
- feat(web): send the backdrop as now-playing artwork (3dae86e)
- fix(web): make the next episode card opaque and lower it while the controls hide (e2e2069)
- feat(web): add picture-in-picture and background playback settings for the Android app (c400399)
- feat(android): add a media session with picture-in-picture and audio focus (9e64db8)
- feat(web): seek with a double tap and swipe for brightness and volume on touch (d1d51a6)
- feat(android): set the media volume and window brightness for the page (0c77762)
- fix(web): scroll the player menu's list and footer together on short screens (e391611)
- feat(android): add the Android app (2132721)
- feat(web): play full screen in landscape in the Android app (58a6550)
- fix(web): fade the backdrop's left edge in landscape (8691143)
- feat(web): toggle the player's controls with a tap (5d5df5e)
- refactor: name the apps' bridge window.aiostreamsApp (3e2b868)
- refactor: rename packages/tv to packages/smart-tv (c56648f)
- refactor: rename packages/jellyfin-web to packages/web (1630409)
- fix(watch-state): skip imported spellings our own rows already cover (1ef6d01)
- fix(ui): base the carousel arrows on the scroll position (6622477)
- fix(jellyfin-web): keep the picked season in the item page's address (b9692d9)
- fix(ui): update the Radix packages (ae82a44)
- feat(jellyfin-web): hand downloads to the Jellyfin Android app (3a31b1f)
- feat(jellyfin-web): play finished downloads from their files (d377c50)
- feat(watch-state): date a stop that arrives late by LastPlayedDate (b02a09c)
- feat(desktop): let the page play the files it downloaded (744d386)
- feat(jellyfin-web): download movies, episodes and seasons (3ad7fad)
- feat(desktop): download what the page hands over (6e73d39)
- perf(jellyfin): send Access-Control-Max-Age with preflight answers (1499906)
- feat(jellyfin-web): add a Cache settings tab (f9c38fe)
- feat(jellyfin-web): save pages and artwork on the device (bb28b3b)
- perf(jellyfin-web): send an image Accept header with artwork fetches (8c55a18)
- perf(jellyfin-web): mount only the hero backdrops in use (0b22949)
- feat(ui): leave a zero decimal off formatBytes (90dfa0b)