2.9.0 (2026-07-30)
Features
- add gemini-3.5-flash-lite, gemini-3.5-flash and gemini-3.6-flash (99a8dd1)
- add granular control on image caching per-provider (cee0571)
- add per-type controls for watch tracking (5f2f559)
- add per-type controls for watch tracking (aed365a)
- add POSTER_PROXY_ALLOW_PRIVATE to gate private art hosts (81e93f1)
- add trigger keyword to AI search (a64097f)
- add trigger keyword to AI search (3231795)
- ai-catalog: add a model selector to the AI Catalog Builder (99a8dd1)
- aliases: resolve human-readable user aliases to UUIDs (6dbd084)
- aliases: resolve human-readable user aliases to UUIDs (5cc40bd)
- allow custom art placeholders to be marked optional (2ab610c)
- catalogs: import and remap existing collection files (cef456f)
- catalogs: serve collection and widget JSON over HTTP (cef456f)
- catalogs: visual builder for Nuvio collections and Fusion widgets (cef456f)
- clear cached art by media id (ed8f729)
- configurable poster cache validity period (667ad07)
- dashboard: clear cache entries by meta id or catalog id (e2f4f75)
- experimental aiom image caching engine (67f33e7)
- expose the full TMDB discover sort options (17aed03)
- implement meta cold store (a4f0a65)
- make the art proxy routes' client cache configurable (667ad07)
- movielens: apply taste tags on non-prediction catalog sorts (2a12df2)
- movielens: implement "your rated collection" and refactor (11b72b1)
- movielens: import user-created lists as catalogs (828bd07)
- movielens: multi-user MovieLens recommendations (fad8105)
- movielens: support genre filtering in watchlist catalog (ace3b70)
- poster-cache: cache rendered rating and custom-art posters (1fff141)
- redesign oauth popups (7f44c91)
- reuse cold store dashboard stats for a configurable window (f8c77df)
- settings: register TMDB rendition toggles (ab2ccc9)
- show the title when clearing cached entries by ID (a0983a4)
- surface image warming on the dashboard (651f9c7)
- tmdb: add central image rendition helper (dbea454)
- tmdb: make all rendition toggles opt-in (10c73b6)
- tmdb: size art-batch logos and backdrops via helper (19479a9)
- tmdb: size landscape posters independently of backgrounds (f9ce52d)
- tmdb: size meta logos and backdrops via helper (7a95b05)
- tmdb: size provider logos and backdrops via helper (cc0848a)
- tmdb: size search logos and backdrops via helper (bc514d4)
- top10: broaden service coverage, handle regional variants (fbe5d75)
- top10: broaden service coverage, handle regional variants (a1ed440)
- tracking: point users at the login when they enable watch tracking (c38d88b)
Bug Fixes
- ai-catalog: resolve the model against the provider actually used (99a8dd1)
- aliases: back off the alias map refresh after a failed load (4a34119)
- aliases: hide alias controls when the feature is disabled (4a34119)
- aliases: keep a missing user_aliases table from breaking the user list (4a34119)
- aliases: preserve query string encoding when rewriting userUUID (4a34119)
- aliases: read CONFIG_LOAD_RATE_LIMIT_PER_MIN from the settings registry (4a34119)
- aliases: require ADMIN_KEY for alias changes (4a34119)
- aliases: resolve aliases on /api/config/clear-cache (4a34119)
- allow rootless users with built-in poster cache enabled (34be89d)
- allow rootless users with built-in poster cache enabled (c2f84a2)
- cache empty movielens list pages (359a732)
- catalogs: make collection persistence and catalog warnings honest (cef456f)
- dashboard: keep the logs service filter visible (cca2179)
- drop the cold store epoch index that turned lookups into scans (ee42df5)
- honor per-class image cache toggles for custom art (81864a7)
- hydrate release dates on TVDB movie search results so the digital release filter can act on them (fa533b2)
- include Simkl activity fingerprint in warmed catalog keys (e94e3f2)
- keep the warmer's freshness test in step with the store (b9742d4)
- keep the warmer's freshness test in step with the store (ec05f8d)
- key MovieLens explore catalogs by resolved group tags (ee2931c)
- let Refresh accept an art-proxy image URL (26a9be1)
- log cache hits that are answered with a 304 (71e84b9)
- logo: cache metahub image-existence checks for the full TTL (e679561)
- logo: verify metahub logo fallbacks exist before serving them (44f90de)
- mal & trakt oauth on multi-replica setups (afa5205)
- meta: keep IMDB episode ids when a season is missing from Cinemeta (89be187)
- paginate Trakt watched fetches and prioritize recently aired shows in unwatched catalog (415725f)
- proxy episode thumbnails so clients can load them (bd96abf)
- proxy episode thumbnails through the art proxy (2cc7dba)
- replace retired gemini-2.5-flash-lite default (99a8dd1), closes #604
- report the database dialect before initialize() has run (87296b7)
- request Trakt watched shows with extended=progress so hide-watched works again (963dd96)
- resolve frontend typecheck errors (6d6643e)
- scope MovieLens catalog cache to the connected account (c69d4e1)
- search: let OpenRouter AI search run without credits (b294d84)
- search: request posters at w600_and_h900_bestv2 like every other path (bc24573)
- sign the warmer's proxy-art URLs so private art hosts resolve (60122ec)
- skip rendered art the warmer has already cached (e42ecf5)
- stale catalog name in movielens edit modal (a719e59)
- stale catalog name in movielens edit modal (5018028)
- stop forcing a vote count floor on discover catalogs (61334bc)
- stop inferring a rating poster provider from saved API keys (a7a2359)
- stop logging missing poster art as an error (694a1c1)
- stop signing image proxy URLs with the MovieLens credential key (607f820)
- surface MovieLens list fetch failures instead of truncating (f752d60)
- tmdb: never request a rendition larger than the asset (032cb08)
- trakt: serve the integration logo from our own assets (b507ac1)
- warm on cache epoch change rather than addon version (5785c15)
- warm the default poster when a rating poster cannot be built (4b2c096)