2.38.0 (2026-11-07)
Features
- connections: add a count-as-watched setting to each connection card (c25c37a)
- episode-order: server-wide TVDB/TMDB default plus a bulk re-map action (9415575)
- filter and sort by my rating (#136) (eac0494), closes #274
- i18n: add translatable UI infrastructure and interface language setting (e8b7ae4)
- i18n: translate account pages and add a signed-out language picker (9c63745)
- i18n: translate browse and detail pages (96e4313)
- i18n: translate shared components (4d9cf1e)
- i18n: translate the admin panel (6ac3176)
- i18n: translate the app shell (layout, shared modals, 404, about) (75d04e1)
- i18n: translate the connections page (d245178)
- i18n: translate tracking and social pages (7126a9a)
- lists: move the Watchlist sync info below the items, full width (ebe6604)
- lists: show which services sync with the Watchlist, and in which direction (141367b)
- native watchlist that every service syncs with (88b7907)
- next-up: add option to follow most recent watch (8e0ee41)
- plex: push playback progress (resume points) to Plex (17d863d)
- scrobble: let each connection set the percent that counts as watched (82e1a3b)
- settings: show TMDB, TVDB and RPDB keys as collapsible cards like the admin page, with an RPDB icon (09d9fd1)
- stats: add full most played shows and movies pages (53481c6)
- stats: show plays, watch time and last watched date on detail pages (6260c37)
- webhooks: accept optional source field in Jellyfin webhook (ddffd53), closes #504
Bug Fixes
- episode-order: address review feedback on the default order (c5474b6), closes #379
- history: show and clear plays from every Media row of the same episode (#527) (27542d3)
- i18n: format dates and numbers in the viewer's region (c5f64f3)
- i18n: format ratings and decimals with the UI locale (7d035ba), closes #409
- i18n: format the remaining raw user ratings (ef45606)
- i18n: send Vary: Cookie, Accept-Language on HTML only (83ebcf9)
- i18n: translate the progress sort and Radarr/Sonarr free-space labels (6d3691e), closes #409
- i18n: translate UI strings the extraction missed (3e25243)
- lists: keep the watchlist's name and privacy fixed; update the #497 progress test (8b9fdb5)
- migrations: put the ui_language migration after upstream's head (1166668)
- next-up: apply 'follows latest watch' in the Next Up position query (ab33b6f)
- plex: gate the stop-time progress push on the connection's watched threshold (cc6612f)
- scrobble: keep 90% as the default, chain the migrations after eodefault (4ef413e)
- stats: count only completed watches as plays on detail pages (919c00e)
- stremio: decode in Cinemeta order and retry failed lookups (#2) (b5f8df4)
- stremio: stop retrying unmatched items after 5 failed syncs (03e0a4e)
- sync: size Jellyfin/Emby episode totals by the expanded row count (b3acdf3), closes #138
- sync: stop sync_items overwriting the job total, the pull already sizes it (#497) (66752d4)
Performance Improvements
- i18n: keep the language picker script inline on signed-out pages (1ea3d29)
- i18n: skip the Paraglide middleware on backend proxy requests (1947b25)
- next-up: compute Next Up in the database (e8ca07e)
- stats: count most played titles in SQL, and link TVDB-only shows on the full list (0ef9d5d)
- tmdb: reuse one keep-alive HTTP client across requests (21ec543)