2.35.0 (2026-09-26)
Features
- anime-database: answer many season and episode lookups from one read (6c89dc0)
- builtins: add TsukiHime built-in addon (#1293) (c33ea50)
- core: add a cached autoplay attribute (ae02dcd)
- core: backfill probe data from RemuxDB (#1244) (0a440cb)
- core: list and clear watch history (d16ec82)
- core: tell whether a meta can be fetched (057b3b1)
- db: make the PostgreSQL pool size configurable (b8ecce7)
- db: refuse a database migrated by a different build (f28c6ac)
- debrid: carry StremThru's video hash through to streams (c2800f1)
- desktop: add a Windows shell with mpv under WebView2 (d084d89)
- desktop: draw the window's title bar in the page (be6bb14)
- desktop: release the desktop app when its web app changes (36fc7ff)
- desktop: run on macOS (fae9f8d)
- desktop: serve the standalone web app (bde9066)
- desktop: show mpv's statistics overlay from the player (9b7c4a8)
- docs: add a gallery component (917f752)
- failover: add only-same-release failover toggle (#1319) (3483fda)
- filters: add opt-in check to block results predating release/air date (#1312) (50ad7ea)
- formatter: add ::unique list modifier (051a342)
- formatter: add
{stream.site}(1b2585a) - formatter: add audioTitles and subtitleTitles fields (09152cd)
- formatter: add audioTracks and subtitleTracks with where, pluck and each modifiers (0ae7d3e)
- formatter: add trim modifier (79d64bb)
- formatter: add user lists and field references (b9bc591)
- formatter: apply ::replace to lists (57dbc55)
- formatter: edit audio and subtitle tracks in the preview (0ae7d3e)
- formatter: highlight and lint templates inside each() (0ae7d3e)
- formatter: raise template limit and budget the cache (3c3363b)
- frontend: add primer declaring instance limits to jellyfin modal (35d0db5)
- frontend: drop a show from its page (8efd198)
- frontend: link the desktop app on the Jellyfin Connect tab (bbafbb4)
- frontend: restore home row positions on back (01a4a53)
- frontend: review unsaved drafts before restoring (096dcaf)
- frontend: set up Jellyfin from the save and install page (1564a4c)
- frontend: show enabled segment providers in UI (1342ab8)
- frontend: show max versions in primer (a470d94)
- frontend: show notice titles, kinds and links in the version picker (98772f6)
- frontend: sign in with the password on jellyfin picker addresses (95e656d)
- jellyfin-web: add a hero that follows the selected card (4c7f50d)
- jellyfin-web: add a season menu and drop the season watched button (1329dfe)
- jellyfin-web: add a setting to merge continue watching and next up (8b97546)
- jellyfin-web: add a settings page (feb8517)
- jellyfin-web: add a standalone build that picks its server (c0ab405)
- jellyfin-web: add chapters to the desktop app's player (456a621)
- jellyfin-web: add data-ui selectors across the app (7e2022f)
- jellyfin-web: add previous and next episode to the player (a738260)
- jellyfin-web: add the desktop app as a playback host (5561530)
- jellyfin-web: add themes and custom CSS (d14e276)
- jellyfin-web: cap how wide hero and title backdrops get (485b52b)
- jellyfin-web: confirm before removing a saved server (f5301d3)
- jellyfin-web: fit, crop or stretch the picture (df8838f)
- jellyfin-web: flash seeks on the side they skip to (042065a)
- jellyfin-web: hide the browser's right-click menu in the desktop app and the player (8279bf8)
- jellyfin-web: keep a search history per user (62b344d)
- jellyfin-web: let the latest episode button press win (e4f12dc)
- jellyfin-web: list a picker address's users at sign-in (49dd070)
- jellyfin-web: mark watched up to an episode on any server (8bd314b)
- jellyfin-web: move account actions from the sidebar into an avatar menu (1582c65)
- jellyfin-web: move row arrows off the artwork into the row's header (eaea9c1)
- jellyfin-web: offer next up as a featured source (53bdc0d)
- jellyfin-web: offer the next episode near the end (75342eb)
- jellyfin-web: open the desktop app's logs and copy diagnostics from settings (a729d0b)
- jellyfin-web: play the first version on by default when none matches (f89518f)
- jellyfin-web: point browsers to the desktop app (eff3d03)
- jellyfin-web: resume straight into the last-played version (036c434)
- jellyfin-web: scroll player menu lists on their own, keeping subtitle sync in view (4c2e491)
- jellyfin-web: show a notice while another episode's versions load (76d358b)
- jellyfin-web: show desktop app updates and switch their channel (7831b0a)
- jellyfin-web: show sub-collections on a collection's page (c50f123)
- jellyfin-web: show the show's logo for episodes in the hero (e192573)
- jellyfin-web: show the signed-in user's own activity on any server (278d3e0)
- jellyfin-web: sign in as AIOStreams Desktop on the computer's name in the desktop app (08daa97)
- jellyfin-web: sign in with Quick Connect (170adac)
- jellyfin-web: skip by the file's chapters in the desktop app (3bd7ec4)
- jellyfin-web: split search results into movie and show rows (cc9d024)
- jellyfin-web: start pages at the rail and run rows to the edge (a062be3)
- jellyfin-web: sync subtitles and switch versions in the player (2c75b60)
- jellyfin-web: sync subtitles by tapping when a line is heard and when it shows (1d7c6fa)
- jellyfin-web: work with any Jellyfin server (da200a0)
- jellyfin/segments: add PMDB provider (1342ab8)
- jellyfin/segments: answer once the requested marker types are decided (4edf5c9)
- jellyfin/segments: implement MediaSegments for intros, recaps and credits from IntroDB, AniSkip and Anime-Skip (5786b1a)
- jellyfin/segments: resolve IMDb ids for TMDB-keyed movies (b107a10)
- jellyfin/segments: share identical provider lookups between concurrent requests (4edf5c9)
- jellyfin/segments: support movie end credits from IntroDB (5ef9d51)
- jellyfin: add a mark watched up to here episode action (ea7f171)
- jellyfin: add a short sign-in picker address from a configuration's alias (1b7146a)
- jellyfin: add a versions feature for the aiostreams version object (c79220d)
- jellyfin: add a web app at /web (5c116c4)
- jellyfin: add api keys (5a95a5f)
- jellyfin: add library limit and search catalog concurrency limit (022d5bf)
- jellyfin: add row and list episode layouts (6d0b7d1)
- jellyfin: choose trackers per user (b960e8d)
- jellyfin: decide playable entries before a sweep lands (1ad2f1f)
- jellyfin: derive version ids from the release instead of its position (b865b1a)
- jellyfin: draw the web app edge to edge (7a1853b)
- jellyfin: enable skip markers by default (2001105)
- jellyfin: enable the api and watch state by default (cc82343)
- jellyfin: enrich external subtitle tracks (0f5ad0d)
- jellyfin: fall back through item backdrops to a poster wash (61bf600)
- jellyfin: give the web app each version's own id in PlaybackInfo (42b6722)
- jellyfin: let one configuration sign in as several users (76f8be1)
- jellyfin: list numbered tracks from known languages (43bc30e)
- jellyfin: list playing sessions in /Sessions (eb3a182), closes #1327
- jellyfin: list the server's extensions and honour GenreIds in a library (414a0e7)
- jellyfin: mark channel sources live (58a7929)
- jellyfin: open clamped overviews from a More button (6c828f9)
- jellyfin: pass external notice links to clients (f3fc09c)
- jellyfin: person details and filmography from TMDB (85af525)
- jellyfin: PINs for users (90f1a24)
- jellyfin: play entries that have nothing to open (4aba386)
- jellyfin: read extended meta fields (11b257c)
- jellyfin: recommend similar titles from TMDB (798cdbe)
- jellyfin: report hearing impaired, original and other track flags on media streams (fdb324f)
- jellyfin: report playback and watched marks to watch-state addons (d1c1b1b)
- jellyfin: require the password on picker addresses and aliases (8c990f0)
- jellyfin: send each version's binge group (59d9a90)
- jellyfin: send the configure page's address in the public server info (eaefbb9)
- jellyfin: send undropped when a play picks a dropped show back up (8ecd577)
- jellyfin: serve a Jellyfin-compatible API so Jellyfin clients can browse and play (dd8ea9c)
- jellyfin: serve collections of any title type (6be31e0)
- jellyfin: serve the web app with its own PWA manifest (b508b2e)
- jellyfin: show addon notices, errors and statistics as versions (c998327)
- jellyfin: show watch-state trackers from the configuration in a Trackers tab (e09a055)
- jellyfin: sign in with a PIN alone on the picker address (53df916)
- jellyfin: store users' playback preferences (24db694)
- linked-accounts: make the per-user link limit configurable (cf80bb0)
- media-info: keep each probed audio and subtitle track (14ac79c)
- media-info: parse commentary, dub, original and accessibility flags on audio and subtitle tracks (fdb324f)
- parser: ignore repost suffixes when parsing names (1563000)
- parser: update parse-torrent-title to 0.9.0 (6a88d69)
- presets/bitmagnet: expose search mode option (b1c145a), closes #1322
- presets/newznab: add SquareEyed indexer (#1350) (6d37fe3)
- presets: add penguplay preset (ff01f94)
- ratelimit: let a route spend a limiter token without failing the request (dd8ea9c)
- release-blocklist: add a master enable/disable toggle (#1330) (3d7c536)
- remember config sign-ins by default (1e405f4)
- schemas: add native epg fields (e6daf4a)
- sel: add audioTitle() and subtitleTitle() filters (ec2ec03)
- sel: add audioTrack() and subtitleTrack() filters (0ae7d3e)
- sel: add editions(), network(), container() and extension() filters (0ae7d3e)
- settings: add an orderable multi-select field (2f2e1f0)
- settings: add Jellyfin and Watch State tabs (bfce5d1)
- show the server's build in About and diagnostics (c08e496)
- ui: add a colour input (4cffffe)
- ui: allow the tab indicator animation to be turned off (1780c48)
- variants: add an insert instruction for list positions (022b0e1)
- variants: let [*] walk an object's values (5afa43c)
- watch-state: add the watch_state addon resource (02d1d4e)
- watch-state: hide and report dropped shows (1dfeaaa)
- watch-state: record watch state and playback sessions (67c9791)
- watch-state: sync addon watchlists with favourites (9a58fb2)
- watch-state: sync playback and watch history with addons that declare watch_state (60aa8b6)
Bug Fixes
- allow any resource string (64f9e21)
- anime-database: preserve IMDb identity for episode mappings (#1301) (e2224d9)
- anime: match releases numbered in tvdb's season (5d319f5)
- anime: scope imdb hints and fix episode mapping (cdaee68)
- api: refuse encrypted passwords on the jellyfin routes (f1b78df)
- builtins/easynews-search: preserve season and episode separators (#1284) (3686c3d)
- builtins/library: escape item ids (f8f3f83)
- builtins: compute torrent age from pubDate for torznab/prowlarr (#1306) (f1daac3)
- builtins: preserve zero seeder counts (#1320) (23c7749)
- cache: make a forced write wait for a flush already in progress (3feb117)
- cache: retry redis writes from a failed flush instead of dropping them (f3ddb83)
- cache: slide TTLs on the Redis and SQL backends (3feb117)
- config: use
byteSizeschema for max pull response bytes (64ff9ba) - core/sync: log each fetch failure once (4a5d387)
- core/sync: make the vouched URL list the refresh set (a6554f2)
- core/sync: stop refetching every URL on allowlist changes (e293f11)
- core: make trailer source and type optional (19d7c12)
- core: repair garbled startup warning (f8c6db9)
- core: revive DOMException from the lock cache (105d9de)
- debrid/torbox: align timeoutMs with stremthru (#1281) (0ddf328)
- debrid: count an account item as cached only when the service says so (bc4acbf)
- dedup: take languages and tracks from a probed source instead of merging them (e5b5182)
- distributed-lock: release redis locks before publishing (668aa4d)
- distributed-lock: run the work when the holder finishes before a waiter subscribes (7afe512)
- docs: version changelog preview image links by their content (876a481)
- filters: route digital-release rejections by which rule matched (#1333) (b767cd4)
- filters: run the digital release check once per request (168a94f)
- filters: stop forcing the digital-release info stream for single stale results (#1328) (0c9f895)
- formatter: stop the formatter browser's tab indicator replaying (4ebb7ce)
- frontend: add no-referrer for addon logos (#1347) (1c60ba4)
- frontend: anchor popped sign-in views to the screen (22575a1)
- frontend: blur the focused field on bottom nav taps (28b0242)
- frontend: clarify digital release filter description scope (#1310) (346e8e0)
- frontend: disable desktop subtitles with track 0 instead of -1 (37be686)
- frontend: end the version picker's art at the list (b644af6)
- frontend: keep context menus on screen (46150fb)
- frontend: keep loaded configs' values when status arrives late (9fd6c67)
- frontend: keep the Profile card of a saved configuration after a reload (d76e44d)
- frontend: mark the web app search box as a search input (510a2b0)
- frontend: only report value changes the user made (f597c79)
- frontend: only select text meant to be copied in the web app (48c8064)
- frontend: re-check drafts on save and compare them with the review diff (1442fc5)
- frontend: render the season pill check as a right icon (55ae08e)
- frontend: size the version picker art by width (04166b8)
- frontend: stop animating diff viewer tabs (819470c)
- frontend: stop clipboard copies hanging in embedded browsers (df0a3fe)
- frontend: try the next image when a card's fails to load (07415a3)
- http: back off on 429 using Retry-After (#1292) (f48573d)
- ignore desktop-nightly when finding the latest server nightly (dc7d470)
- jellyfin-web: ask the server again for a version picked from the list (84451ee)
- jellyfin-web: clamp overviews by height instead of line-clamp (a99e6fb)
- jellyfin-web: clear the episode lookup notice when it resolves at once (c3a3cd0)
- jellyfin-web: define NEXT_PUBLIC_PLATFORM for the ui kit (95a39f0)
- jellyfin-web: drop the scroll lock's scrollbar margin (f6465ae)
- jellyfin-web: handle undated plays and servers that ignore the played filter (e2016eb)
- jellyfin-web: hide empty catalog rows' placeholders (bf394e7)
- jellyfin-web: keep a subtitle URL's query when asking for WebVTT (ee6aa0e)
- jellyfin-web: keep sticky parts in place while a menu locks scrolling (aaa0cfb)
- jellyfin-web: keep the page scrollbar on the server screens too (c69dcc9)
- jellyfin-web: let filter tabs scroll on narrow screens (c54bab0)
- jellyfin-web: offer syncing to a line only for subtitles the player can read (1d4efb6)
- jellyfin-web: scroll a new page before its first paint (9854832)
- jellyfin-web: unpause mpv before each file in the desktop player (0c4f9e6)
- jellyfin: anchor next up on the last episode watched (12a1735)
- jellyfin: charge pin attempts before checking them (c89e21e)
- jellyfin: don't paginate on search (ce27dc1)
- jellyfin: fall back through episode images in the info banner (190774c)
- jellyfin: fall back to the cast photo on person items (ed90002)
- jellyfin: fill the phone version picker with placeholders (931a03e)
- jellyfin: keep a version's added subtitles when its streams are resolved again (9bebe70)
- jellyfin: keep episode ratings their own (f11ab35)
- jellyfin: keep live playback out of watch state (1d42966)
- jellyfin: list embedded tracks only in the file's own order (407c323)
- jellyfin: log why a catalog page returned errors (24f1fab)
- jellyfin: mark a show watched once its aired episodes are (8470854)
- jellyfin: play and sign in from the Android app (e1aff12)
- jellyfin: play streams carried on a meta's video instead of querying stream addons (37955a9)
- jellyfin: read seasonPosters keyed by season (99b62d5)
- jellyfin: rebuild the signed-in user for requests without a token (6717441)
- jellyfin: reuse a failed resolve for 30 seconds instead of retrying on every playback request (37845e0)
- jellyfin: send the client's token in external subtitle URLs (5a28107)
- jellyfin: share one stream resolve between concurrent opens of an item (81a9719)
- jellyfin: show a spinner on the episode watched toggle (15d2690)
- jellyfin: show the title when an item's logo fails to load (a073d33)
- jellyfin: skip removed catalogs in the featured setting (9cb6f61)
- jellyfin: take the playback runtime from the played source (6a7ed9c)
- keep & and = inside catalog and subtitle extra values (0af3424)
- languages: resolve Bokmål and Nynorsk codes to Norwegian (c8c81f9)
- loosen trailer type schema (4436496), closes #1307
- metadata: update default user agent for skyhook (a82a8c0)
- parser: detect hls urls with a query string (b74283f)
- parser: match tags followed directly by an opening bracket (579697a), closes #1263
- parser: take release groups from title parser only (460f20b)
- presets/gdrive: fix logo (376d716)
- proxy: stop forwarding hop-by-hop response headers (782f819)
- remuxdb: log lookup failures loudly instead of silently at debug (#1356) (ff64174)
- remuxdb: update lookup endpoint to match RemuxDB's current API (#1353) (a8a124e)
- server: expose Content-Range and Accept-Ranges to browser players (#1277) (db8afbe)
- streams: stop suppressing statistics across an await (3e2eac0)
- stremio: stop logging the user's config on meta requests (3bb0235)
- templates: detect placeholders in any field and type inputs by field (f62d7ee)
- ui: give plain and loading toasts a grey surface (05c2884)
- ui: keep toasts and title bar buttons usable while a modal is open (2d76af3)
- ui: stop checkbox group rows resizing when toggled (e397310)
- usenet: look up by-id hashes outside the tree projection (2235d53)
- usenet: verify file contents at import (e4d1428)
- variants: bound the instructions one request can run (9f477fa)
- watch-state: deliver fresh events ahead of backlogs (66f1a39)
- watch-state: key long-running anime episodes by their TVDB season (ebb22d9)
- watch-state: make playstate upsert work on postgres (9d2b3d9)
- watch-state: match TVDB and TMDB ids to the IMDb id from the id mappings (3a76201)
- watch-state: pick one row per series before limiting recent series (b17c829)
- watch-state: round pulled times and positions to whole milliseconds (09a9c01)
- wrapper: key cached subtitles by their extras (2dcf85c)
Performance Improvements
- builtins/library: time-slice the library scan (9713fd0)
- builtins: cache only the search result fields the addons read (c0470c5)
- builtins: parse each debrid file name once and yield while parsing (0498171)
- builtins: skip .torrent download for pre-validated bad matches (#1259) (479f809)
- cache: compress large redis values with zstd (28cba47)
- cache: evict the memory backend's least recently used entry in constant time (3feb117)
- cache: sweep expired memory cache entries every minute (00cb428)
- config: skip re-testing stream expressions that already passed validation (95c8697)
- config: skip save-time variant validation on read paths (fc55a2c)
- core: clear the withTimeout timer once the operation settles (0d109c5)
- core: derive config keys with pbkdf2 on the thread pool (29d4ef5)
- core: match ranked regexes once per file name and yield between slices (6d80a47)
- core: memoise language normalisation (58dda74)
- db: raise the config key cache ttl to 24h (743da3d)
- debrid: batch cached StremThru availability reads with mget (a4411f5)
- debrid: cache only the files StremThru availability checks can select (f9de485)
- debrid: parse only the file names selection reads when resolving (66560eb)
- distributed-lock: publish a lock's result only when a waiter is subscribed (7afe512)
- frontend: memoise catalog rows and mount one MenuTabs layout (59a11db)
- http: skip the recursion counter for requests that ignore it (7dde970)
- jellyfin-web: decode artwork off the main thread (4889472)
- jellyfin: fetch catalogs ahead for rows without a library (4c1067c)
- jellyfin: skip collection sources that cannot hold the requested kinds (f968659)
- jellyfin: stream the watch history export (30b071f)
- logging: skip records below the log level (b13f5de)
- nab: parse torznab/newznab responses with a byte scanner (b08d4d1)
- parser: cache the title regex and pattern entries (1c28184)
- parser: cache title lists by identity and prune title matches (3f88925)
- parser: compile service name regexes once instead of per stream (09f654a)
- parser: skip unicode folding for ascii titles and clean titles in one pass (3bedcc6)
- streams: time-slice the filterer passes (797eae0)
- watch-state: rank only the chosen shows for next up (fcf41d9)
- wrapper: skip re-validating a cached meta (2dcf85c)