Skip to main content

Upstream review, 2026-09-19

Source: seerr-team/seerr develop at 59d5947b4df8591882bda70ae199f3a3480cc4da. Base: Foreseerr github/develop at 339bd9bb (v0.9.1). Each row records an individual review. Applied commits carry an Upstream-Commit trailer; skipped commits record why.

Upstream commitDecisionForeseerr commit / reason
1fd35f9aApplied8b279581 — fix invalid alert nesting in TV request modal
93c0b6a6SkippedAlready implemented: anime routing uses isAnime independent of seriesType; covered by existing test
42bee2aaSkippedAlready implemented: resolveSonarrSeriesRouting uses configured seriesType for non-anime requests; covered by existing test
7baed837SkippedAlready implemented verbatim in Foreseerr 4906d7aa; scanner recognizes custom Plex provider GUIDs and resolves their external IDs
090c659bAppliedSuppress verbose stdout from GHCR and Docker Hub Cosign attestation checks; Foreseerr runs both checks in its release job
c8c8f7a1SkippedSeerr-only release bump (seerr-chart 3.9.1 / app v3.4.1); Foreseerr's own chart is 0.9.1 / v0.9.1, tied to its package and image versions by the release workflow and version-consistency check.
dea59605AppliedAdapted AI disclosure and security-report guidance to Foreseerr; kept the Bun build command and pointed the PR-label response at Foreseerr's own policy.
afb17aa4SkippedAlready ported in Foreseerr 87058c58 (included in 4906d7aa): Gotify settings toggle, Markdown poster image, client::notification.bigImageUrl, and English label are present; Gotify's default embedPoster: false and settings save path support the option.
bd971f86SkippedNode 22.23.2 Docker image pin does not apply: Foreseerr's production and local Dockerfiles use oven/bun:1.4.1-alpine for build and runtime, matching its Bun package scripts and lockfile.
d3c070e1SkippedAlready ported in Foreseerr dce92404: Plex Web App URL tip names https://app.plex.tv/desktop, and the input suggests a server-hosted /web/index.html URL; both are present in the current UI and English locale.
d103787aAppliedBehavior already ported in Foreseerr 4906d7aa: both Emby UI buttons are hidden, all login and account-linking Quick Connect endpoints reject Emby, and new Quick Connect users are Jellyfin users. Adapted the remaining upstream account-linking regression tests; the three login endpoint guards already had tests.
39ff48c6SkippedAlready ported verbatim in Foreseerr 4906d7aa: the General Settings Cypress suite resets trustProxy through /api/v1/settings/network in afterEach, so a failed test cannot leave the restart-required state for later tests.
985ddef3AppliedPlex and Jellyfin library GETs now only read settings; explicit PUT toggles a single library and POST sync refreshes the list, so opening settings no longer disables libraries. Adapted the import conflict with Foreseerr's mapping settings route.
c9f2ac58AppliedPlex and Jellyfin library sync now match saved settings by stable server library ID, preserving the enabled flag across a rename while updating the display name; Jellyfin also retains the existing lastScan value. Fits Foreseerr's explicit sync flow introduced by 985ddef3.
4d17e08bAppliedPropagate Plex and Jellyfin connection failures through sync and login, retain Plex library settings when migration cannot reach its server, and show the setup connection error. Adapted startup and setup UI conflicts to Foreseerr's managed runtime and React Router; changed the Jellyfin toast to name Foreseerr.
059008cbAppliedAdapted media subscriber request updates and nested status saves to use the owning TypeORM manager, retaining Foreseerr's episode request logic and existing transactional request lookups. SQLite keeps its shared manager; PostgreSQL uses a nested transaction. Added the PostgreSQL pool acquisition timeout and documented it.
7fae95bbAppliedOverride lookup now uses the configured Radarr/Sonarr server ID instead of its array index, and skips lookup when no default exists. Adapted six request tests for Foreseerr's request flow; movie and TV overrides work with non-index IDs and ID 0.
92f84043AppliedGuard regular and 4K collection availability checks against empty parts; Foreseerr has the same every() logic and otherwise shows empty collections as available.
aae88167AppliedAdded a debounced user-list search adapted to Foreseerr's React Router pagination; its existing q API searches username, email, Plex username, and Jellyfin username. Preserved Foreseerr's media-server import controls.
59ad5f19AppliedAdapted a 15-minute, 2,000-entry TMDB scan tier within Foreseerr's existing shared 256 MiB weighted LRU budget; scanner TV and external-ID lookups use narrow responses, while anime metadata provider fallback remains intact. Dropped the redundant Plex GUID cache, requested inline GUIDs for recent movies, and stripped unread TV credits. Kept Foreseerr's cache implementation and node-cache dependency (still used by the Servarr route).
92bad10cAppliedAdded optional comma-separated ntfy tags through settings, API schema, UI, and docs; the agent trims and omits empty tags before sending. Foreseerr uses the same ntfy integration, so the upstream change applies directly.
a123d20bAppliedSend Foreseerr/<version> on outbound Axios calls, including shared API, Tautulli, and image clients; preserve explicit service-specific or caller-provided User-Agent headers.
5af32cb2SkippedAlready implemented in Foreseerr 66693021: both General and Network saves revalidate all /api/v1/status SWR keys, including the modal's /api/v1/status?checkUpdateAvailable=false key and the version-status variant.
0be53e6eAppliedKeep person results when hide-available or hide-blocklisted is enabled in both discover pages and mixed sliders; continue filtering movie/TV statuses. Foreseerr's trending results include people, and its extra AniList, Simkl, and MDBList sources may also have items without a declared media type, which these settings should not discard.
2759058aAppliedAdapted TMDB movie/TV sort lists and per-type query validation to Foreseerr's split Discover router; TV title sorting now uses original_name. Updated blocklisted-tag scans to use valid sort keys per media type and corrected page iteration, retaining Foreseerr's existing filtering and pagination.
0f79ee66AppliedAdapted the test database guard so accidental seed/reset outside test mode fails before database access; the intentional Cypress prepare script opts in. Foreseerr already has generated explicit registration for its compiled binary (including 16 fork-specific entities), source globs exclude tests, and its server build excludes test files, so upstream's shorter hard-coded registry and build changes would regress fork coverage.
cc592e8dAppliedAdded 30 Catalan server notification translations and corrected the movie label casing. All keys match the English catalog and preserve its interpolation variables; the {applicationTitle} messages use Foreseerr's configured title. Corrected two obvious translation typos.
da4b555cAppliedRemoved appear from the Modal and SlideOver Transition.Child elements: Headless UI 1.7.19 forwards it to their DOM nodes. Parent Transition elements retain appear for entrance animations.
d7b08bddAppliedMoved the PostgreSQL flag into an import-free module so entity decorators resolve timestamp columns without a datasource import cycle. Foreseerr's lazy datasource and release-state code also use this flag, so their imports were adapted.
1cc2f116AppliedUpgraded Headless UI from 1.7.19 to 2.2.10 in Foreseerr's Bun manifest and lockfile. React 19 now satisfies its declared peer range. Added explicit div transition wrappers in the seven affected UI components and fixed the Jellyfin link modal's opacity class typo; retained Foreseerr's existing transition and fork-specific components.
df743f46AppliedMatched the shared SlideOver backdrop's exit fade to its panel's 500 ms / 700 ms slide-out. The Headless UI 2.2.10 transition remains mounted through the longer child animation; the previous 300 ms backdrop fade could flash during close. This applies to Foreseerr's library and Servarr panels as well as Seerr-derived panels.
aa8e0de0AppliedSwitched shared Headless UI menus, listboxes, transitions, disclosure, and labels to flat named exports after the 2.2.10 upgrade. Kept Foreseerr's click-only dropdown button, custom item styles, and TV season test hook through conflict resolution. Left RadioGroup.Option for the following upstream Radio refactor.
46d5915dAppliedReplaced the issue modal's RadioGroup.Option with the Headless UI 2.2 Radio component and changed its focus indicator to use focus; Foreseerr retains the same issue-type selector and this was its only remaining RadioGroup.Option usage.
7997f756AppliedIgnore scanner file counts for provider seasons with zero episodes, and compare the actual requestable season numbers in the TV page and modal so phantom specials cannot block requests. Adapted the TV page's coverage check to Foreseerr's episode requests: a processing season with an active partial episode request remains eligible for a full-season request.
5f4cb1eaAppliedSQLite's latest push-subscription table still enforced UNIQUE(auth) despite the entity requiring only UNIQUE(endpoint, userId). Added the upstream table rebuild, preserving rows, foreign key, and user index while removing the stale constraint; registered it for the compiled binary.
9f6403e1AppliedEnforced pending-only edits and approve/decline, failed-only retry, and rejection of unsupported status verbs. These shared routes cover Foreseerr's movie, TV season, and episode requests; collection requests create individual movie requests. Preserved the episode-selection edit flow and documented the new responses.
5a5f0590AppliedUpdated 75 applicable pinned action references across the 17 affected workflows, including checkout, Docker, CodeQL, cache, Helm, Cypress, and release tooling. Foreseerr's Bun setup and lockfile references replace upstream's pnpm/Node actions, and its job permissions and release behavior remain intact.
5c04640bAppliedApplied all 531 changed translation entries across 12 locales. Adapted 20 entries for Foreseerr branding or small wording corrections, retaining the fork's existing branded strings where upstream overlapped them. All files parse as JSON; all changed nonempty messages parse as ICU and match English interpolation arguments where an English key exists.
e73825b2AppliedLoad the issue reporter when fetching a new comment so comment webhook payloads can resolve reportedBy_settings_discordIds; Foreseerr has the same explicit relation and webhook field.
970bb545AppliedReset orphaned pending/processing TV season status after request deletion, limited to the removed request's seasons and quality. Adapted coverage checks for Foreseerr's episode requests: an active episode request keeps its season processing, while deleting the last episode request also clears its orphaned season. Request-route regressions cover re-requesting, other seasons, 4K isolation, and overlapping requests.
17fc4cc6AppliedFull-season request edits now add only seasons that are not held by another active request of the same quality. Foreseerr's episode-selection edit path is separate; the route regression verifies both requests keep their own seasons.
d7dc7bddAppliedSerialized the full request flow per target user, so concurrent collection movie requests count toward quota and duplicate movies are rejected after the first save. The shared entry point also covers Foreseerr's full-season and episode requests; its existing series-quality lock remains nested only for rolling episode selections. Foreseerr's AsyncLock already returned generic callback results, so only the request wrapper and its dedicated lock were needed. Added concurrent quota and duplicate regressions.
a4f5eaa2AppliedAdded no-new-privileges and cap-drop ALL to the Unix and Windows Docker CLI and Compose examples, retaining Foreseerr's image, volume, health check, and Bun runtime. The production image already runs as unprivileged bun and listens on port 5055, so these hardening options fit its documented startup.
c604bcccAppliedScoped both request card layouts, including their missing-title states, to the request's own TV seasons or exact Foreseerr episode selections; movie downloads remain unfiltered. Excluded TV downloads without episode metadata and empty TV selections to avoid showing unrelated series progress. Added focused regressions and included client utility tests in the default Bun test run.
6bf3d048AppliedUpdated 35 applicable pinned Action references across 17 Foreseerr workflows: checkout v7, cache v6, stale v11, and the issue-index artifact downloader v24. Upstream's setup-node v7 changes do not apply because these jobs use Bun. Preserved Foreseerr's jobs, permissions, cache keys, and release flow.
979978fcAppliedTypeORM 0.3.31 was already pinned in Foreseerr. Updated the remaining PostgreSQL driver pin from pg 8.20.0 to 8.23.0 and regenerated the Bun lockfile, including its pg-cloudflare, pg-connection-string, pg-pool, and pg-protocol updates. Kept Foreseerr's Bun package manager and existing database configuration.
a3dbbd94AppliedUpdated the six applicable pinned Action references in CI, CodeQL, tag creation, and Trivy scanning to the upstream versions. Foreseerr runs these same actions; its Bun test command, workflow jobs, permissions, and release flow are unchanged.
5f972275AppliedApplied all three Catalan web push translations, changing formal address to the informal form already used in Foreseerr's Catalan email notifications. The same keys and interpolation placeholders are present in the fork, with no Seerr branding.
6f5a1773AppliedAdded the optional hide-requested setting across public settings, General Settings, API schema, and docs. Mark pending or approved requests on TMDB Discover, collection, recommendation, and similar results; search remains unfiltered. Adapted Foreseerr's AniList, Simkl, Trakt, MDBList, and Plex Discover tiles and sliders to hide mapped active requests while retaining unmapped items and people. Verified movie/TV ID separation and request status transitions with a database regression.
68c5bc8cAppliedAdded 25 Ukrainian server notification translations and the Catalan auto-approved wording update. The notification keys are shared by Foreseerr, contain no Seerr branding, and are unrelated to the hide-requested setting. Corrected upstream's translated {тип} token to the required {type} interpolation; all added keys and placeholders now match the English catalog.
1dbf19b8AppliedSkip TMDB seasons with zero episodes in the server's seasons: 'all' request path. Foreseerr's modal and TV availability checks already exclude empty seasons, but its quick-request API still included them, creating phantom season requests and quota usage; episode selections remain separate. Added a saved-request regression for season numbers and quota units.
4fc265b6AppliedRemoved the duplicate tag-based Cosign command from the Kubernetes guide; its digest-based chart guide already used Foreseerr's correct helm.yml@refs/heads/develop identity. Corrected image wording, workflow name, package link, unsupported chart SBOM attestation, and Seerr 3.x example tags to the published foreseerr-chart:0.9.0 (registry digest confirmed).
de57e7acSkippedAlready implemented in Foreseerr e86ed8f3: Jellyfin/Emby logout device deletion sends the shared Foreseerr MediaBrowser header as Authorization (including the API token) rather than X-Emby-Authorization. The existing logout regression checks the header and device ID; Foreseerr's session and desktop logout behavior is retained.
7a76142aAppliedAdded the upstream mock-timer helper to Foreseerr's Jellyfin, Radarr, and Sonarr scanner tests, replacing their direct scan runs. Foreseerr retains its 4-second production scan interval and Bun test runner; all 37 affected tests pass with timers advanced during each scan.
a53f49bdAppliedForward invalid avatar IDs and proxy fetch failures to the HTTP error handler so requests finish; delegate errors after headers have been sent. Applied the same handling to Foreseerr's additional AniList/Simkl image proxy validation, preserving its host allowlist, cache headers, and 400/403 statuses.
abe2f3bbAppliedBlock outbound HTTP/HTTPS in unit tests, plus Bun fetch, and fail the suite if a swallowed call still reached the network. Stubbed imported scanner TMDB instances; restored MediaRequest.request after the watchlist suite so later files are not left with a stub. Live Simkl checks skip unless ALLOW_NETWORK=true.
d4eeea85AppliedRefresh the Jellyfin avatar on Quick Connect login the same way password login already does, skipping the desktop runtime so a slow media-server image route cannot stall the session response. Route regression covers a changed remote avatar.
b2116523AppliedDrop the unused media-server auth header from the avatar ImageProxy. Foreseerr had already switched that header to Authorization / MediaBrowser; the proxy still does not need it to fetch avatars.
34b28d0aAppliedConfirm PROCESSING movies/shows against Radarr/Sonarr by TMDB/TVDB id before orphan cleanup. A lookup miss still resets; a hit or unreachable server leaves the item processing. Scanner tests use Foreseerr mock timers.
2bebae83AppliedRemap leftover Overseerr DELETED=6 media/season rows to Seerr DELETED=7, leaving true blocklist rows at 6. Registered the SQLite and Postgres migrations in the compiled binary registry.
6fa7473dAppliedReplace dawidd6/action-download-artifact in the duplicate-issue workflow with actions/download-artifact plus a gh lookup of the last successful index rebuild. Foreseerr still installs the detector with Bun.
59d5947bAppliedRegister push subscriptions by endpoint, rotate stale rows by auth instead of user-agent, resubscribe only when the browser subscription belongs to this user, and time-box push cleanup on logout. Adapted to Foreseerr's React Router dropdown.