Skip to content

chore: upgrade to eslint v9#2574

Merged
fallenbagel merged 10 commits intoseerr-team:developfrom
michaelhthomas:chore/upgrade-eslint
Mar 16, 2026
Merged

chore: upgrade to eslint v9#2574
fallenbagel merged 10 commits intoseerr-team:developfrom
michaelhthomas:chore/upgrade-eslint

Conversation

@michaelhthomas
Copy link
Copy Markdown
Contributor

@michaelhthomas michaelhthomas commented Feb 24, 2026

Description

It's always good to be on the newest versions of tools. While ESLint v10 is out now, some plugins aren't yet compatible. But getting off the deprecated ESLint v8 and upgrading to the new configuration format is desirable nonetheless.

The new versions of ESLint have a new config file format, so some manual migration is required. Also, newer versions of plugins have additional / fixed rules, so there are some fixes to conform with those new lints.

How Has This Been Tested?

Lint passes

Screenshots / Logs (if applicable)

Checklist:

  • I have read and followed the contribution guidelines.
  • Disclosed any use of AI (see our policy)
  • I have updated the documentation accordingly.
  • All new and existing tests passed.
  • Successful build pnpm build
  • Translation keys pnpm i18n:extract
  • Database migration (if required)

Fixes #2645

Summary by CodeRabbit

  • Bug Fixes

    • Fixed pagination calculation for watchlist pages.
  • Refactors

    • Improved error propagation to include original causes for better diagnostics.
    • Simplified and standardized error handling across many components.
    • Migrated ESLint configuration to the newer flat/config format.
  • Chores

    • Updated development, linting, and formatting tooling and dev dependencies.

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Feb 24, 2026

📝 Walkthrough

Walkthrough

Replaces legacy ESLint config with a new flat config and upgrades lint tooling; applies widespread lint-driven edits including switching many catch (e) to bare catch, adding Error { cause: e } propagation, and small typing/import/pagination/UI tweaks across server and client code.

Changes

Cohort / File(s) Summary
ESLint config & deps
./.eslintrc.js, ./eslint.config.mts, ./package.json, ./tailwind.config.js
Remove legacy .eslintrc.js, add new flat eslint.config.mts, upgrade ESLint and related devDependencies, and update lint-disable comments.
Error cause propagation
server/api/animelist.ts, server/api/plextv.ts, server/api/pushover.ts, server/api/rating/..., server/api/servarr/..., server/api/tautulli.ts, server/api/themoviedb/index.ts, src/utils/pushSubscriptionHelpers.ts, src/components/Settings/SettingsMetadata.tsx
Thrown Errors now include { cause: e } in many catch paths to preserve original error context; no public API signature changes.
Unbound catch updates (remove unused error binding)
server/api/jellyfin.ts, server/api/tvdb/index.ts, server/lib/imageproxy.ts, server/routes/..., server/utils/..., src/components/..., src/i18n/extractMessages.ts, src/pages/_app.tsx, ...
Convert numerous catch (e)catch where the error was unused; behavior preserved but exception objects are no longer bound in those blocks.
Pagination & filter tweaks
server/routes/discover.ts, server/routes/user/index.ts, server/routes/media.ts
Adjust page parsing to conditional fallback (defaults to 1) and remove an explicit default filter branch, slightly altering control flow for edge inputs.
Type/import/UX minor fixes
server/interfaces/api/common.ts, server/lib/notifications/index.ts, server/lib/overseerrMerge.ts, server/types/custom.d.ts, server/utils/appVersion.ts, src/components/BlocklistBlock/..., src/components/Layout/...
Update lint directives, tweak type annotations/import style, use optional chaining for callbacks, rename an import alias, and small UI/refactor changes.

Sequence Diagram(s)

(omitted)

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Suggested reviewers

  • gauthier-th
  • 0xSysR3ll
  • fallenbagel

Poem

A rabbit nudges configs with a hop and a twitch,
Flat rules settle in, the old file in a ditch.
Errors now carry the thread of their past,
Catches grow lighter, letting unused names pass.
Hoppy linting—carrots for you! 🥕🐇

🚥 Pre-merge checks | ✅ 4
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'chore: upgrade to eslint v9' directly and clearly summarizes the primary change in the PR - upgrading ESLint from v8 to v9.
Linked Issues check ✅ Passed All coding requirements from issue #2645 are met: ESLint v9 upgrade complete [#2645], new configuration syntax implemented [#2645], plugins updated [#2645], and linting passes [#2645].
Out of Scope Changes check ✅ Passed Changes are all directly related to the ESLint v9 migration: configuration format updates, dependency upgrades, and code fixes for new lint rules introduced by plugin updates.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

📝 Coding Plan
  • Generate coding plan for human review comments

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Tip

CodeRabbit can use TruffleHog to scan for secrets in your code with verification capabilities.

Add a TruffleHog config file (e.g. trufflehog-config.yml, trufflehog.yml) to your project to customize detectors and scanning behavior. The tool runs only when a config file is present.

@michaelhthomas michaelhthomas force-pushed the chore/upgrade-eslint branch 2 times, most recently from c4de878 to a7587b8 Compare February 24, 2026 19:42
@gauthier-th gauthier-th changed the title refactor: upgrade to eslint v9 chore: upgrade to eslint v9 Feb 25, 2026
@github-actions github-actions Bot added the merge conflict Cannot merge due to merge conflicts label Feb 27, 2026
@github-actions
Copy link
Copy Markdown

This pull request has merge conflicts. Please resolve the conflicts so the PR can be successfully reviewed and merged.

@github-actions github-actions Bot removed the merge conflict Cannot merge due to merge conflicts label Mar 6, 2026
@michaelhthomas michaelhthomas marked this pull request as ready for review March 6, 2026 15:09
@michaelhthomas michaelhthomas requested a review from a team as a code owner March 6, 2026 15:09
Comment thread eslint.config.mts Outdated
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 10

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (5)
src/components/UserProfile/UserSettings/UserNotificationSettings/UserNotificationsPushover.tsx (1)

91-111: ⚠️ Potential issue | 🟠 Major

Persist the selected Pushover sound.

This form renders a sound field, but these initial values and the save payload never include it. Right now a user can change the sound, get a success toast, and then have revalidate() snap the selector back because nothing was actually stored.

Proposed fix
       initialValues={{
         pushoverApplicationToken: data?.pushoverApplicationToken,
         pushoverUserKey: data?.pushoverUserKey,
+        sound: data?.pushoverSound ?? '',
         types: data?.notificationTypes.pushover ?? 0,
       }}
@@
           await axios.post(`/api/v1/user/${user?.id}/settings/notifications`, {
             pgpKey: data?.pgpKey,
             discordId: data?.discordId,
             pushbulletAccessToken: data?.pushbulletAccessToken,
             pushoverApplicationToken: values.pushoverApplicationToken,
+            pushoverSound: values.sound,
             pushoverUserKey: values.pushoverUserKey,
             telegramChatId: data?.telegramChatId,
             telegramSendSilently: data?.telegramSendSilently,
             notificationTypes: {
               pushover: values.types,
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@src/components/UserProfile/UserSettings/UserNotificationSettings/UserNotificationsPushover.tsx`
around lines 91 - 111, The Pushover sound field isn't persisted: add the sound
value to initialValues and include it in the save payload so changes are stored
and survive revalidate. Specifically, set initialValues to include
data?.pushoverSound (alongside pushoverApplicationToken, pushoverUserKey, types)
and in the onSubmit axios.post body include the selected sound from the form
(e.g., pushoverSound: values.sound or the actual field name used in the form).
Update references in UserNotificationsPushover (initialValues and onSubmit) to
use that field name so the backend receives and persists the selected sound.
src/components/Settings/SettingsNetwork/index.tsx (1)

149-169: ⚠️ Potential issue | 🟡 Minor

Unconditionally coercing disabled numeric fields sends NaN to the backend.

When dnsCacheForceMinTtl, dnsCacheForceMaxTtl, or proxyPort are disabled (via their feature flags), their form values remain undefined. Lines 156–157 and 162 still post Number(values.dnsCacheForceMinTtl), Number(values.dnsCacheForceMaxTtl), and Number(values.proxyPort) unconditionally, which coerces undefined to NaN.

The backend's POST handler (server/routes/settings/index.ts:91–98) performs no validation and merges the request body directly into settings. NaN persists in storage, and on app startup (server/utils/dnsCache.ts:22–23), the check typeof NaN === 'number' incorrectly passes, allowing NaN to propagate into DnsCacheManager initialization.

Guard these fields conditionally or omit them from the payload when disabled to prevent NaN from being saved.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/Settings/SettingsNetwork/index.tsx` around lines 149 - 169,
The payload currently coerces undefined to NaN by unconditionally calling
Number(...) for dnsCacheForceMinTtl, dnsCacheForceMaxTtl, and proxyPort in the
axios POST inside the SettingsNetwork component; update the request construction
so those numeric fields are only included (or converted) when their feature
flags are enabled (e.g. values.dnsCacheEnabled for
dnsCache.{forceMinTtl,forceMaxTtl} and values.proxyEnabled for proxy.port) and
otherwise omit them from the dnsCache and proxy objects in the POST body to
avoid sending NaN to the backend.
src/components/Login/AddEmailModal.tsx (1)

64-75: ⚠️ Potential issue | 🟠 Major

Surface submit failures instead of swallowing them.

This required first-login step still fails silently. If the POST rejects, the modal stays open with no field error, status message, or toast, which leaves the user without a recovery path.

I can wire this up with a Formik status/error message or a toast if you want me to sketch the patch.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/Login/AddEmailModal.tsx` around lines 64 - 75, The onSubmit
handler in AddEmailModal currently swallows errors from the
axios.post('/api/v1/auth/jellyfin') call; update the onSubmit implementation to
catch the thrown error object, call formikHelpers.setSubmitting(false), and
surface the failure to the user by either setting a Formik status (e.g.,
formikHelpers.setStatus({submitError: error.message})) or setting a field error
with formikHelpers.setFieldError('email', '...'), and/or trigger a toast (e.g.,
toast.error(error.message)); keep the successful path calling onSave()
unchanged.
src/pages/_app.tsx (1)

296-305: ⚠️ Potential issue | 🟠 Major

Only redirect on expected auth failures.

This catch currently turns any failure from /api/v1/auth/me into a /login redirect. A 5xx, timeout, or local API misconfiguration will look like an expired session and hide the real outage. Please only redirect for the unauthenticated case and let unexpected failures bubble or be logged.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/pages/_app.tsx` around lines 296 - 305, The catch block currently
redirects on any error; change it to only redirect when the failure is an
authentication error (e.g., HTTP 401/403 or a specific UnauthenticatedError) and
rethrow or log other errors so they bubble up; specifically, in the code around
the call that fetches /api/v1/auth/me (the try/catch that leads to the redirect
using router.pathname and ctx.res.writeHead/ctx.res.end), inspect the response
status or error type and perform the ctx.res.writeHead(307, { Location: '/login'
}) only when status === 401 (or 403 depending on your auth semantics), otherwise
rethrow or log the error instead of redirecting.
server/api/servarr/radarr.ts (1)

108-115: ⚠️ Potential issue | 🟡 Minor

Don't rewrite every lookup failure as "Movie not found".

This catch collapses auth errors, timeouts, and Radarr 5xxs into the same error as an actual empty lookup result. That makes add/remove failures much harder to diagnose. Only map the explicit no-result case to "Movie not found" and preserve other lookup failures as lookup errors.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@server/api/servarr/radarr.ts` around lines 108 - 115, The catch in the Radarr
TMDB lookup (the catch block around the get-by-TMDB-ID lookup, e.g.,
getMovieByTmdbId) incorrectly maps all failures to a generic "Movie not found";
change it so only an explicit no-result/404 case is converted to a new
Error('Movie not found') while all other errors are rethrown or preserved.
Concretely, inspect the caught error (e) for a 404 status or an empty-response
condition and only then log and throw the "Movie not found" error; otherwise log
the original error details and rethrow (or throw a wrapped error that preserves
e as the cause) so auth/timeouts/5xx retain their original diagnostics. Ensure
logger.error keeps the original error message/stack for non-404 cases and do not
swallow the original error information when rethrowing.
🧹 Nitpick comments (1)
src/components/UserList/BulkEditModal.tsx (1)

60-64: Preserve the error context before swallowing it.

This now drops all failure details, which makes bulk-update issues much harder to diagnose from client telemetry. If you don't need branching, consider keeping the error binding and forwarding it to your logger/reporting path before showing the toast.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/UserList/BulkEditModal.tsx` around lines 60 - 64, The catch
block in BulkEditModal.tsx swallows the thrown error; change the catch to
capture the error (e.g., catch (error)) and forward it to your logging/reporting
path (e.g., call the project logger or error reporter, or console.error) before
calling addToast(intl.formatMessage(messages.userfail), ...); reference the
catch block surrounding addToast and the
addToast/int1.formatMessage(messages.userfail) usage so you preserve error
context for telemetry while still showing the user-facing toast.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@server/api/themoviedb/index.ts`:
- Around line 364-366: The thrown Error messages are mislabelled — update each
rethrow so the message matches the surrounding method (e.g., replace “[TMDB]
Failed to fetch TV show details” inside the TV show method with the correct
label, and likewise fix the messages in the rethrows inside discoverMovies, the
trending aggregator, and the other wrappers). Locate the throw new Error({...})
calls inside the functions that wrap TMDB calls (e.g., the TV show details
handler, discoverMovies handler, trending/all-trending handler) and change the
string to accurately describe that function’s operation while preserving the
original e.message and cause: e.g., throw new Error(`[TMDB] Failed to <actual
operation>: ${e.message}`, { cause: e }). Ensure all occurrences noted in the
review are updated consistently.

In `@server/lib/imageproxy.ts`:
- Around line 257-259: The current catch in server/lib/imageproxy.ts swallows
all filesystem errors when reading the cache; change it to catch (err) and only
treat missing files (err.code === 'ENOENT') as an empty cache, while rethrowing
or logging and throwing any other errors so upstream failures are not silently
ignored. Locate the cache-read code path (the try surrounding the cache
read/fs.readFile call in imageproxy.ts) and update the catch to inspect
err.code, return the empty-cache behaviour for ENOENT, and propagate non-ENOENT
errors (e.g., throw err or processLogger.error(...) then throw) so real IO
problems surface.

In `@server/routes/discover.ts`:
- Around line 881-883: The page parsing currently trusts req.query.page
truthiness and can yield 0, negatives or NaN; update the logic that sets page
(used to compute offset) to parse the query value and only accept it if it's a
positive integer, otherwise default to 1 — e.g. parse Number(req.query.page) (or
parseInt), then check Number.isInteger(page) && page > 0 before assigning to
page and computing offset; keep itemsPerPage and offset calculations the same
but use the validated page value.

In `@server/routes/user/index.ts`:
- Around line 879-881: req.query.page can be non-numeric or <=0 causing page and
offset to be NaN/negative; parse and validate it before computing offset:
convert req.query.page to an integer (e.g. parseInt or Number), if the result is
not a finite positive integer default to 1, then clamp with Math.max(1,
parsedPage) and use that value for page and offset calculation (itemsPerPage and
offset variables reference) so skip/offset are always a non-negative integer.
- Around line 293-295: The catch block currently maps every exception to a 404;
change it to differentiate EntityNotFoundError from other DB errors by importing
EntityNotFoundError (from TypeORM or your ORM) and using catch (err) { if (err
instanceof EntityNotFoundError) next({ status: 404, message: 'User subscriptions
not found.' }); else next(err); } so only missing-entity errors become 404s
while other exceptions propagate to the centralized error handler; apply the
same pattern to the other catch sites mentioned (around the blocks at 317–319,
371–373, 516–518) and ensure callers using Repository.find() are not expecting
exceptions for empty results (use findOneOrFail where you intend a not-found
exception).

In `@src/components/BlocklistedTagsSelector/index.tsx`:
- Around line 279-280: The bare catch that always throws
intl.formatMessage(messages.invalidKeyword, { keywordId }) masks real errors; in
the function where you validate the TMDB keyword (the catch block that
references keywordId and messages.invalidKeyword), inspect the caught error
(e.g., use axios.isAxiosError(error)) and examine error.response/data to
determine if the backend indicates "unknown keyword" before mapping to
invalidKeyword; for any other/unexpected axios errors rethrow or throw a wrapped
error that preserves the original error object so service failures (500,
network, rate-limit) are not misreported as invalidKeyword.

In `@src/components/RequestModal/MovieRequestModal.tsx`:
- Around line 170-172: The catch block only clears isUpdating on error; update
the cancel flow in the function that performs the cancel (e.g., the cancel
handler where setIsUpdating is used, likely handleCancel or cancelRequest) to
always reset the updating state by moving setIsUpdating(false) into a finally
block or calling it after the awaited request succeeds and in catch; ensure you
still invoke onComplete() if present but do not rely on it to clear isUpdating.

In `@src/components/Settings/OverrideRule/OverrideRuleModal.tsx`:
- Around line 194-196: In OverrideRuleModal's submit catch block, don't swallow
errors — set a visible error state and surface a toast/form error before
resolving; specifically, in the catch inside the component's submit handler
(OverrideRuleModal -> onSubmit / save flow) call your error UI (e.g.,
setSaveError or form.setError for the form field and/or toast.error with the
caught error message), ensure isSaving/isLoading is reset (e.g.,
setIsSaving(false)), and either rethrow or return a rejected promise so the
caller knows the save failed instead of silently returning to idle.

In `@src/components/Settings/RadarrModal/index.tsx`:
- Around line 271-273: The catch block in the RadarrModal submit flow currently
swallows failures; update the catch to accept the error, call the modal/form
error handler (e.g. setFormError or setErrorState) or trigger a toast with the
error message, ensure any submitting flag (e.g. setSubmitting) is cleared, and
do not proceed to reset/close the modal or resolve the submit handler; instead
return or rethrow after surfacing the error so the user sees the failure. Use
the existing submit handler (handleSubmit/onSave) and modal close/reset
functions in this file to locate where to stop closure and where to set the
error.

In `@src/components/Settings/SonarrModal/index.tsx`:
- Around line 307-309: The catch block in the SonarrModal submit flow currently
swallows errors; change it to catch (err) and surface the failure by setting the
form/error state and stopping the spinner — e.g., call the existing toast/error
UI (toast.error) or set a form-level error (setError or setSubmitError) with a
descriptive message including err.message, and ensure isSubmitting or submitting
state is set to false; do not treat the request as successful. Locate the submit
handler in SonarrModal (the async submit/handleSubmit function) and update its
catch to set the error UI and reset submitting state instead of leaving it
empty.

---

Outside diff comments:
In `@server/api/servarr/radarr.ts`:
- Around line 108-115: The catch in the Radarr TMDB lookup (the catch block
around the get-by-TMDB-ID lookup, e.g., getMovieByTmdbId) incorrectly maps all
failures to a generic "Movie not found"; change it so only an explicit
no-result/404 case is converted to a new Error('Movie not found') while all
other errors are rethrown or preserved. Concretely, inspect the caught error (e)
for a 404 status or an empty-response condition and only then log and throw the
"Movie not found" error; otherwise log the original error details and rethrow
(or throw a wrapped error that preserves e as the cause) so auth/timeouts/5xx
retain their original diagnostics. Ensure logger.error keeps the original error
message/stack for non-404 cases and do not swallow the original error
information when rethrowing.

In `@src/components/Login/AddEmailModal.tsx`:
- Around line 64-75: The onSubmit handler in AddEmailModal currently swallows
errors from the axios.post('/api/v1/auth/jellyfin') call; update the onSubmit
implementation to catch the thrown error object, call
formikHelpers.setSubmitting(false), and surface the failure to the user by
either setting a Formik status (e.g., formikHelpers.setStatus({submitError:
error.message})) or setting a field error with
formikHelpers.setFieldError('email', '...'), and/or trigger a toast (e.g.,
toast.error(error.message)); keep the successful path calling onSave()
unchanged.

In `@src/components/Settings/SettingsNetwork/index.tsx`:
- Around line 149-169: The payload currently coerces undefined to NaN by
unconditionally calling Number(...) for dnsCacheForceMinTtl,
dnsCacheForceMaxTtl, and proxyPort in the axios POST inside the SettingsNetwork
component; update the request construction so those numeric fields are only
included (or converted) when their feature flags are enabled (e.g.
values.dnsCacheEnabled for dnsCache.{forceMinTtl,forceMaxTtl} and
values.proxyEnabled for proxy.port) and otherwise omit them from the dnsCache
and proxy objects in the POST body to avoid sending NaN to the backend.

In
`@src/components/UserProfile/UserSettings/UserNotificationSettings/UserNotificationsPushover.tsx`:
- Around line 91-111: The Pushover sound field isn't persisted: add the sound
value to initialValues and include it in the save payload so changes are stored
and survive revalidate. Specifically, set initialValues to include
data?.pushoverSound (alongside pushoverApplicationToken, pushoverUserKey, types)
and in the onSubmit axios.post body include the selected sound from the form
(e.g., pushoverSound: values.sound or the actual field name used in the form).
Update references in UserNotificationsPushover (initialValues and onSubmit) to
use that field name so the backend receives and persists the selected sound.

In `@src/pages/_app.tsx`:
- Around line 296-305: The catch block currently redirects on any error; change
it to only redirect when the failure is an authentication error (e.g., HTTP
401/403 or a specific UnauthenticatedError) and rethrow or log other errors so
they bubble up; specifically, in the code around the call that fetches
/api/v1/auth/me (the try/catch that leads to the redirect using router.pathname
and ctx.res.writeHead/ctx.res.end), inspect the response status or error type
and perform the ctx.res.writeHead(307, { Location: '/login' }) only when status
=== 401 (or 403 depending on your auth semantics), otherwise rethrow or log the
error instead of redirecting.

---

Nitpick comments:
In `@src/components/UserList/BulkEditModal.tsx`:
- Around line 60-64: The catch block in BulkEditModal.tsx swallows the thrown
error; change the catch to capture the error (e.g., catch (error)) and forward
it to your logging/reporting path (e.g., call the project logger or error
reporter, or console.error) before calling
addToast(intl.formatMessage(messages.userfail), ...); reference the catch block
surrounding addToast and the addToast/int1.formatMessage(messages.userfail)
usage so you preserve error context for telemetry while still showing the
user-facing toast.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 5c90f366-e312-44f4-acf2-af992c2e69f1

📥 Commits

Reviewing files that changed from the base of the PR and between f047cab and 2c9e6c4.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (83)
  • .eslintrc.js
  • eslint.config.mts
  • package.json
  • server/api/animelist.ts
  • server/api/jellyfin.ts
  • server/api/plextv.ts
  • server/api/pushover.ts
  • server/api/rating/imdbRadarrProxy.ts
  • server/api/rating/rottentomatoes.ts
  • server/api/servarr/base.ts
  • server/api/servarr/radarr.ts
  • server/api/servarr/sonarr.ts
  • server/api/tautulli.ts
  • server/api/themoviedb/index.ts
  • server/api/tvdb/index.ts
  • server/interfaces/api/common.ts
  • server/lib/imageproxy.ts
  • server/lib/notifications/index.ts
  • server/lib/overseerrMerge.ts
  • server/routes/avatarproxy.ts
  • server/routes/discover.ts
  • server/routes/media.ts
  • server/routes/user/index.ts
  • server/types/custom.d.ts
  • server/utils/appDataVolume.ts
  • server/utils/appVersion.ts
  • src/components/BlocklistBlock/index.tsx
  • src/components/BlocklistedTagsSelector/index.tsx
  • src/components/Discover/CreateSlider/index.tsx
  • src/components/Discover/DiscoverSliderEdit/index.tsx
  • src/components/Discover/index.tsx
  • src/components/IssueDetails/IssueComment/index.tsx
  • src/components/IssueDetails/index.tsx
  • src/components/IssueModal/CreateIssueModal/index.tsx
  • src/components/Layout/UserDropdown/MiniQuotaDisplay/index.tsx
  • src/components/Login/AddEmailModal.tsx
  • src/components/Login/JellyfinLogin.tsx
  • src/components/Login/LocalLogin.tsx
  • src/components/MovieDetails/index.tsx
  • src/components/NotificationTypeSelector/index.tsx
  • src/components/RequestCard/index.tsx
  • src/components/RequestList/RequestItem/index.tsx
  • src/components/RequestModal/CollectionRequestModal.tsx
  • src/components/RequestModal/MovieRequestModal.tsx
  • src/components/RequestModal/TvRequestModal.tsx
  • src/components/Settings/Notifications/NotificationsDiscord.tsx
  • src/components/Settings/Notifications/NotificationsEmail.tsx
  • src/components/Settings/Notifications/NotificationsGotify/index.tsx
  • src/components/Settings/Notifications/NotificationsNtfy/index.tsx
  • src/components/Settings/Notifications/NotificationsPushbullet/index.tsx
  • src/components/Settings/Notifications/NotificationsPushover/index.tsx
  • src/components/Settings/Notifications/NotificationsSlack/index.tsx
  • src/components/Settings/Notifications/NotificationsTelegram.tsx
  • src/components/Settings/Notifications/NotificationsWebPush/index.tsx
  • src/components/Settings/Notifications/NotificationsWebhook/index.tsx
  • src/components/Settings/OverrideRule/OverrideRuleModal.tsx
  • src/components/Settings/RadarrModal/index.tsx
  • src/components/Settings/SettingsJobsCache/index.tsx
  • src/components/Settings/SettingsMain/index.tsx
  • src/components/Settings/SettingsMetadata.tsx
  • src/components/Settings/SettingsNetwork/index.tsx
  • src/components/Settings/SettingsPlex.tsx
  • src/components/Settings/SettingsUsers/index.tsx
  • src/components/Settings/SonarrModal/index.tsx
  • src/components/Setup/JellyfinSetup.tsx
  • src/components/Setup/index.tsx
  • src/components/TitleCard/index.tsx
  • src/components/UserList/BulkEditModal.tsx
  • src/components/UserList/JellyfinImportModal.tsx
  • src/components/UserList/PlexImportModal.tsx
  • src/components/UserList/index.tsx
  • src/components/UserProfile/UserSettings/UserNotificationSettings/UserNotificationsDiscord.tsx
  • src/components/UserProfile/UserSettings/UserNotificationSettings/UserNotificationsEmail.tsx
  • src/components/UserProfile/UserSettings/UserNotificationSettings/UserNotificationsPushbullet.tsx
  • src/components/UserProfile/UserSettings/UserNotificationSettings/UserNotificationsPushover.tsx
  • src/components/UserProfile/UserSettings/UserNotificationSettings/UserNotificationsTelegram.tsx
  • src/components/UserProfile/UserSettings/UserNotificationSettings/UserNotificationsWebPush/index.tsx
  • src/components/UserProfile/UserSettings/UserPasswordChange/index.tsx
  • src/components/UserProfile/UserSettings/UserPermissions/index.tsx
  • src/i18n/extractMessages.ts
  • src/pages/_app.tsx
  • src/utils/pushSubscriptionHelpers.ts
  • tailwind.config.js
💤 Files with no reviewable changes (2)
  • .eslintrc.js
  • server/routes/media.ts

Comment thread server/api/themoviedb/index.ts
Comment thread server/lib/imageproxy.ts
Comment thread server/routes/discover.ts
Comment thread server/routes/user/index.ts
Comment thread server/routes/user/index.ts
Comment thread src/components/BlocklistedTagsSelector/index.tsx
Comment thread src/components/RequestModal/MovieRequestModal.tsx
Comment thread src/components/Settings/OverrideRule/OverrideRuleModal.tsx
Comment thread src/components/Settings/RadarrModal/index.tsx
Comment thread src/components/Settings/SonarrModal/index.tsx
gauthier-th
gauthier-th previously approved these changes Mar 11, 2026
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR upgrades the repo’s linting toolchain to ESLint v9 and migrates configuration from legacy .eslintrc to the new flat config format, along with a set of code tweaks to satisfy updated lint rules.

Changes:

  • Upgrade ESLint and related plugins/deps; add a new eslint.config.mts flat config and remove .eslintrc.js.
  • Update various catch blocks and error construction (including cause) to satisfy newer TypeScript ESLint rules.
  • Fix watchlist pagination page parsing logic (server-side) and apply minor refactors/renames prompted by new linting rules.

Reviewed changes

Copilot reviewed 81 out of 84 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
eslint.config.mts Introduces ESLint v9 flat config with TS/React/Next/a11y/FormatJS rules.
package.json Bumps ESLint ecosystem deps and adds new config-related packages.
pnpm-lock.yaml Locks updated dependency graph for ESLint v9 and plugins.
.eslintrc.js Removed legacy ESLint config.
server/routes/user/index.ts Updates watchlist pagination page parsing.
server/routes/discover.ts Updates watchlist pagination page parsing.
Various src/** and server/** files Lint-driven refactors (unused catch vars removed, optional chaining, error cause, etc.).
Files not reviewed (1)
  • pnpm-lock.yaml: Language not supported

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

You can also share your feedback on Copilot code review. Take the survey.

Comment thread package.json Outdated
Comment thread server/routes/user/index.ts
Comment thread server/routes/discover.ts
gauthier-th
gauthier-th previously approved these changes Mar 12, 2026
@github-actions github-actions Bot added the merge conflict Cannot merge due to merge conflicts label Mar 12, 2026
@github-actions
Copy link
Copy Markdown

This pull request has merge conflicts. Please resolve the conflicts so the PR can be successfully reviewed and merged.

@github-actions github-actions Bot removed the merge conflict Cannot merge due to merge conflicts label Mar 15, 2026
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

♻️ Duplicate comments (1)
src/components/Settings/OverrideRule/OverrideRuleModal.tsx (1)

194-196: ⚠️ Potential issue | 🟠 Major

Surface submit failures instead of silently ignoring them.

Line 194–196 still swallows save errors, so users get no failure feedback when create/update fails.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/Settings/OverrideRule/OverrideRuleModal.tsx` around lines 194
- 196, In OverrideRuleModal's submit handler (the try/catch around the
create/update call) replace the empty catch by capturing the thrown error,
calling the component's error state setter (e.g., setSubmitError or setError)
with a user-friendly message plus the error.message, ensure any loading flag is
cleared (e.g., setIsSaving(false) or setLoading(false)), and surface the failure
to the user via the existing error UI or by invoking an onError/onFailure
callback or toast; do not silently swallow the error.
🧹 Nitpick comments (2)
src/components/Settings/Notifications/NotificationsWebPush/index.tsx (1)

73-77: Consider logging the error for debugging purposes.

Switching to bare catch satisfies the lint rule for unused variables, but discarding the error entirely makes debugging failed API calls harder. If the codebase has a logger available, you could capture and log the error while still satisfying the lint rule.

-          } catch {
+          } catch (e) {
+            // eslint-disable-next-line no-console
+            console.error('Failed to save web push settings:', e);
             addToast(intl.formatMessage(messages.webpushsettingsfailed), {

If the lint-driven bare catch approach is intentional across the codebase for consistency, this is fine as-is.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/Settings/Notifications/NotificationsWebPush/index.tsx` around
lines 73 - 77, The catch block currently swallows the error; change it from a
bare catch to catch (error) and log the error before showing the toast — e.g.
call the existing logger (logger.error(error, 'webpush settings save failed'))
or console.error(error) and then call
addToast(intl.formatMessage(messages.webpushsettingsfailed), { appearance:
'error', autoDismiss: true }); keep the rest of the flow unchanged so debugging
information is preserved while the user-facing toast remains the same.
src/utils/pushSubscriptionHelpers.ts (1)

107-109: Normalize caught values before reading .message property.

Lines 107, 156, and 187 access error.message directly from caught values, which is brittle since JavaScript allows throwing any value, not just Error instances. Create a helper function to safely normalize caught values:

♻️ Proposed refactor
+const getErrorMessage = (error: unknown): string =>
+  error instanceof Error ? error.message : String(error);
+
 ...
-      throw new Error(`[SW] Resubscribe failed: ${error.message}`, {
+      throw new Error(`[SW] Resubscribe failed: ${getErrorMessage(error)}`, {
         cause: error,
       });
 ...
-      `Issue subscribing to push notifications: ${error.message}`,
+      `Issue subscribing to push notifications: ${getErrorMessage(error)}`,
       { cause: error }
     );
 ...
-      `Issue unsubscribing to push notifications: ${error.message}`,
+      `Issue unsubscribing to push notifications: ${getErrorMessage(error)}`,
       { cause: error }
     );
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/utils/pushSubscriptionHelpers.ts` around lines 107 - 109, Create a small
helper (e.g., normalizeCaughtError or getErrorMessage) that accepts any caught
value and returns a safe Error-like object or at minimum a string message (use
value instanceof Error ? value.message : String(value || 'Unknown error')); then
replace direct reads of error.message in the failing throw at `[SW] Resubscribe
failed: ${error.message}` and the other two occurrences (lines flagged 156 and
187) to use this helper so thrown Error messages and the cause are always safe
and informative.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@server/api/animelist.ts`:
- Around line 177-181: The catch block that throws "Failed to download
Anime-List mapping" uses e.message unsafely; change the catch to accept unknown
and narrow the error before accessing message (e.g., check if e instanceof Error
to read e.message, otherwise use String(e) as a fallback) and pass the original
error as the cause (casting/typing appropriately) so the thrown Error uses a
safe, well-typed message and a valid cause; update the catch in the Anime-List
download block (the try/catch that currently throws `Failed to download
Anime-List mapping: ${e.message}`) accordingly.
- Around line 156-160: The catch block that throws `new Error("Failed to load
Anime-List mappings: ${e.message}", { cause: e })` uses the untyped `e`; change
it to narrow `e` before reading `message` and before setting `cause` (e.g. check
`e instanceof Error`), fall back to `String(e)` or a default message when it's
not an Error, and only pass `cause: e` if `e` is an Error (or leave cause
undefined otherwise) so TypeScript strict `useUnknownInCatchVariables` rules are
satisfied.

In `@server/api/pushover.ts`:
- Around line 50-54: The catch block in server/api/pushover.ts currently uses
e.message unsafely; change the error extraction in the catch where the Pushover
sounds are retrieved to a safe form (e.g., if (e instanceof Error) msg =
e.message; else msg = String(e)) and use that msg when constructing the new
Error(`[Pushover] Failed to retrieve sounds: ${msg}`, { cause: e }); keep the
original throw and cause but replace direct e.message access with the
narrowed/normalized message.

In `@server/api/rating/imdbRadarrProxy.ts`:
- Around line 193-198: In the catch block that throws the new Error in
server/api/rating/imdbRadarrProxy.ts (the one using catch (e) and referencing
e.message), narrow the error safely by treating e as unknown and extracting the
message with a guard (e.g. const msg = e instanceof Error ? e.message :
String(e)); then throw the Error using that msg and pass the original error as
the cause; replace direct e.message access with this safe extraction to avoid
unsafe property access on unknowns.

---

Duplicate comments:
In `@src/components/Settings/OverrideRule/OverrideRuleModal.tsx`:
- Around line 194-196: In OverrideRuleModal's submit handler (the try/catch
around the create/update call) replace the empty catch by capturing the thrown
error, calling the component's error state setter (e.g., setSubmitError or
setError) with a user-friendly message plus the error.message, ensure any
loading flag is cleared (e.g., setIsSaving(false) or setLoading(false)), and
surface the failure to the user via the existing error UI or by invoking an
onError/onFailure callback or toast; do not silently swallow the error.

---

Nitpick comments:
In `@src/components/Settings/Notifications/NotificationsWebPush/index.tsx`:
- Around line 73-77: The catch block currently swallows the error; change it
from a bare catch to catch (error) and log the error before showing the toast —
e.g. call the existing logger (logger.error(error, 'webpush settings save
failed')) or console.error(error) and then call
addToast(intl.formatMessage(messages.webpushsettingsfailed), { appearance:
'error', autoDismiss: true }); keep the rest of the flow unchanged so debugging
information is preserved while the user-facing toast remains the same.

In `@src/utils/pushSubscriptionHelpers.ts`:
- Around line 107-109: Create a small helper (e.g., normalizeCaughtError or
getErrorMessage) that accepts any caught value and returns a safe Error-like
object or at minimum a string message (use value instanceof Error ?
value.message : String(value || 'Unknown error')); then replace direct reads of
error.message in the failing throw at `[SW] Resubscribe failed:
${error.message}` and the other two occurrences (lines flagged 156 and 187) to
use this helper so thrown Error messages and the cause are always safe and
informative.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 8593618c-304c-49e2-b8ac-07fb07e97078

📥 Commits

Reviewing files that changed from the base of the PR and between 733364b and a6cca63.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (83)
  • .eslintrc.js
  • eslint.config.mts
  • package.json
  • server/api/animelist.ts
  • server/api/jellyfin.ts
  • server/api/plextv.ts
  • server/api/pushover.ts
  • server/api/rating/imdbRadarrProxy.ts
  • server/api/rating/rottentomatoes.ts
  • server/api/servarr/base.ts
  • server/api/servarr/radarr.ts
  • server/api/servarr/sonarr.ts
  • server/api/tautulli.ts
  • server/api/themoviedb/index.ts
  • server/api/tvdb/index.ts
  • server/interfaces/api/common.ts
  • server/lib/imageproxy.ts
  • server/lib/notifications/index.ts
  • server/lib/overseerrMerge.ts
  • server/routes/avatarproxy.ts
  • server/routes/discover.ts
  • server/routes/media.ts
  • server/routes/user/index.ts
  • server/types/custom.d.ts
  • server/utils/appDataVolume.ts
  • server/utils/appVersion.ts
  • src/components/BlocklistBlock/index.tsx
  • src/components/BlocklistedTagsSelector/index.tsx
  • src/components/Discover/CreateSlider/index.tsx
  • src/components/Discover/DiscoverSliderEdit/index.tsx
  • src/components/Discover/index.tsx
  • src/components/IssueDetails/IssueComment/index.tsx
  • src/components/IssueDetails/index.tsx
  • src/components/IssueModal/CreateIssueModal/index.tsx
  • src/components/Layout/UserDropdown/MiniQuotaDisplay/index.tsx
  • src/components/Login/AddEmailModal.tsx
  • src/components/Login/JellyfinLogin.tsx
  • src/components/Login/LocalLogin.tsx
  • src/components/MovieDetails/index.tsx
  • src/components/NotificationTypeSelector/index.tsx
  • src/components/RequestCard/index.tsx
  • src/components/RequestList/RequestItem/index.tsx
  • src/components/RequestModal/CollectionRequestModal.tsx
  • src/components/RequestModal/MovieRequestModal.tsx
  • src/components/RequestModal/TvRequestModal.tsx
  • src/components/Settings/Notifications/NotificationsDiscord.tsx
  • src/components/Settings/Notifications/NotificationsEmail.tsx
  • src/components/Settings/Notifications/NotificationsGotify/index.tsx
  • src/components/Settings/Notifications/NotificationsNtfy/index.tsx
  • src/components/Settings/Notifications/NotificationsPushbullet/index.tsx
  • src/components/Settings/Notifications/NotificationsPushover/index.tsx
  • src/components/Settings/Notifications/NotificationsSlack/index.tsx
  • src/components/Settings/Notifications/NotificationsTelegram.tsx
  • src/components/Settings/Notifications/NotificationsWebPush/index.tsx
  • src/components/Settings/Notifications/NotificationsWebhook/index.tsx
  • src/components/Settings/OverrideRule/OverrideRuleModal.tsx
  • src/components/Settings/RadarrModal/index.tsx
  • src/components/Settings/SettingsJobsCache/index.tsx
  • src/components/Settings/SettingsMain/index.tsx
  • src/components/Settings/SettingsMetadata.tsx
  • src/components/Settings/SettingsNetwork/index.tsx
  • src/components/Settings/SettingsPlex.tsx
  • src/components/Settings/SettingsUsers/index.tsx
  • src/components/Settings/SonarrModal/index.tsx
  • src/components/Setup/JellyfinSetup.tsx
  • src/components/Setup/index.tsx
  • src/components/TitleCard/index.tsx
  • src/components/UserList/BulkEditModal.tsx
  • src/components/UserList/JellyfinImportModal.tsx
  • src/components/UserList/PlexImportModal.tsx
  • src/components/UserList/index.tsx
  • src/components/UserProfile/UserSettings/UserNotificationSettings/UserNotificationsDiscord.tsx
  • src/components/UserProfile/UserSettings/UserNotificationSettings/UserNotificationsEmail.tsx
  • src/components/UserProfile/UserSettings/UserNotificationSettings/UserNotificationsPushbullet.tsx
  • src/components/UserProfile/UserSettings/UserNotificationSettings/UserNotificationsPushover.tsx
  • src/components/UserProfile/UserSettings/UserNotificationSettings/UserNotificationsTelegram.tsx
  • src/components/UserProfile/UserSettings/UserNotificationSettings/UserNotificationsWebPush/index.tsx
  • src/components/UserProfile/UserSettings/UserPasswordChange/index.tsx
  • src/components/UserProfile/UserSettings/UserPermissions/index.tsx
  • src/i18n/extractMessages.ts
  • src/pages/_app.tsx
  • src/utils/pushSubscriptionHelpers.ts
  • tailwind.config.js
💤 Files with no reviewable changes (2)
  • .eslintrc.js
  • server/routes/media.ts
✅ Files skipped from review due to trivial changes (2)
  • server/utils/appVersion.ts
  • tailwind.config.js
🚧 Files skipped from review as they are similar to previous changes (42)
  • src/components/Settings/SettingsUsers/index.tsx
  • server/lib/overseerrMerge.ts
  • src/components/Login/AddEmailModal.tsx
  • src/components/Settings/Notifications/NotificationsNtfy/index.tsx
  • src/components/Login/JellyfinLogin.tsx
  • server/api/servarr/radarr.ts
  • src/components/UserList/JellyfinImportModal.tsx
  • src/components/Settings/SettingsPlex.tsx
  • src/components/UserProfile/UserSettings/UserPasswordChange/index.tsx
  • src/components/Layout/UserDropdown/MiniQuotaDisplay/index.tsx
  • src/components/BlocklistedTagsSelector/index.tsx
  • src/components/Settings/RadarrModal/index.tsx
  • src/components/Settings/Notifications/NotificationsGotify/index.tsx
  • src/components/UserProfile/UserSettings/UserNotificationSettings/UserNotificationsWebPush/index.tsx
  • eslint.config.mts
  • server/routes/user/index.ts
  • src/components/Discover/DiscoverSliderEdit/index.tsx
  • src/components/Settings/SettingsMetadata.tsx
  • src/components/UserList/index.tsx
  • server/interfaces/api/common.ts
  • src/components/TitleCard/index.tsx
  • src/components/Discover/index.tsx
  • src/components/RequestCard/index.tsx
  • src/components/UserProfile/UserSettings/UserNotificationSettings/UserNotificationsEmail.tsx
  • src/i18n/extractMessages.ts
  • src/components/UserProfile/UserSettings/UserNotificationSettings/UserNotificationsDiscord.tsx
  • src/components/Login/LocalLogin.tsx
  • server/types/custom.d.ts
  • src/components/Settings/Notifications/NotificationsPushover/index.tsx
  • server/routes/discover.ts
  • src/components/RequestList/RequestItem/index.tsx
  • src/components/UserProfile/UserSettings/UserNotificationSettings/UserNotificationsPushover.tsx
  • src/components/UserList/PlexImportModal.tsx
  • src/components/Settings/SonarrModal/index.tsx
  • src/components/MovieDetails/index.tsx
  • src/components/IssueDetails/IssueComment/index.tsx
  • src/components/Setup/JellyfinSetup.tsx
  • server/lib/imageproxy.ts
  • src/components/Settings/SettingsJobsCache/index.tsx
  • src/components/RequestModal/MovieRequestModal.tsx
  • src/components/Settings/Notifications/NotificationsPushbullet/index.tsx
  • server/api/tvdb/index.ts

Comment thread server/api/animelist.ts
Comment thread server/api/animelist.ts
Comment thread server/api/pushover.ts
Comment thread server/api/rating/imdbRadarrProxy.ts
Copy link
Copy Markdown
Collaborator

@fallenbagel fallenbagel left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@fallenbagel fallenbagel merged commit 36243a0 into seerr-team:develop Mar 16, 2026
14 checks passed
@cypress
Copy link
Copy Markdown

cypress Bot commented Mar 16, 2026

seerr    Run #3303

Run Properties:  status check passed Passed #3303  •  git commit 36243a0deb: chore: upgrade to eslint v9 (#2574)
Project seerr
Branch Review develop
Run status status check passed Passed #3303
Run duration 02m 26s
Commit git commit 36243a0deb: chore: upgrade to eslint v9 (#2574)
Committer Michael Thomas
View all properties for this run ↗︎

Test results
Tests that failed  Failures 0
Tests that were flaky  Flaky 0
Tests that did not run due to a developer annotating a test with .skip  Pending 0
Tests that did not run due to a failure in a mocha hook  Skipped 0
Tests that passed  Passing 31
View all changes introduced in this branch ↗︎

gwlsn pushed a commit to gwlsn/seerr that referenced this pull request Mar 21, 2026
@fallenbagel fallenbagel added this to the v3.2.0 milestone Mar 28, 2026
ecsousa pushed a commit to ecsousa/seerr that referenced this pull request Apr 5, 2026
eleboucher pushed a commit to eleboucher/homelab that referenced this pull request Apr 16, 2026
This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [seerr/seerr](https://github.com/seerr-team/seerr) | minor | `v3.1.1` → `v3.2.0` |

---

### Release Notes

<details>
<summary>seerr-team/seerr (seerr/seerr)</summary>

### [`v3.2.0`](https://github.com/seerr-team/seerr/releases/tag/v3.2.0)

[Compare Source](seerr-team/seerr@v3.1.1...v3.2.0)

##### [3.2.0](https://github.com/seerr-team/seerr/compare/v3.1.1..v3.2.0) - 2026-04-15

##### 🚀 Features

- *(blocklist)* Add support for collections ([#&#8203;1841](seerr-team/seerr#1841)) - ([993ae4c](seerr-team/seerr@993ae4c))
- *(discover)* Handle errors gracefully when content is available ([#&#8203;1542](seerr-team/seerr#1542)) - ([7920970](seerr-team/seerr@7920970))
- *(i18n)* Add Estonian language support ([#&#8203;2611](seerr-team/seerr#2611)) - ([56b79ff](seerr-team/seerr@56b79ff))
- *(i18n)* Add Luxembourgish language support ([#&#8203;2671](seerr-team/seerr#2671)) - ([dccdc95](seerr-team/seerr@dccdc95))
- *(i18n)* Add Vietnamese language support ([#&#8203;2670](seerr-team/seerr#2670)) - ([40edaea](seerr-team/seerr@40edaea))
- *(jellyfin)* Allow Jellyfin Guids with dashes for import-from-jellyfin endpoint ([#&#8203;2340](seerr-team/seerr#2340)) - ([3557745](seerr-team/seerr@3557745))
- *(notifications)* Add ntfy markdown formatting ([#&#8203;2602](seerr-team/seerr#2602)) - ([77f2c13](seerr-team/seerr@77f2c13))
- *(notifications)* Webhook custom headers ([#&#8203;2230](seerr-team/seerr#2230)) - ([3152f72](seerr-team/seerr@3152f72))
- *(notifications)* Add priority setting for ntfy agent ([#&#8203;2306](seerr-team/seerr#2306)) - ([61e0377](seerr-team/seerr@61e0377))
- *(person)* Add tmdb- and imdb link on person detail page ([#&#8203;2136](seerr-team/seerr#2136)) - ([fb2ee7c](seerr-team/seerr@fb2ee7c))
- *(quota)* Added support for unlimited quota days ([#&#8203;2797](seerr-team/seerr#2797)) - ([6d8b2b7](seerr-team/seerr@6d8b2b7))
- *(requests)* Mark requests as failed when Radarr/Sonarr unreachable ([#&#8203;2171](seerr-team/seerr#2171)) - ([c23117e](seerr-team/seerr@c23117e))
- *(settings)* Add blocklist region and language options ([#&#8203;1802](seerr-team/seerr#1802)) - ([ff469cb](seerr-team/seerr@ff469cb))
- *(settings)* Add help tooltips for services setup ([#&#8203;2662](seerr-team/seerr#2662)) - ([f5115da](seerr-team/seerr@f5115da))
- *(sonarr)* Add monitorNewItems option to sonarr settings & modal ([#&#8203;2071](seerr-team/seerr#2071)) - ([5c34c91](seerr-team/seerr@5c34c91))
- *(trending)* Add filter options ([#&#8203;2137](seerr-team/seerr#2137)) - ([4ce0db1](seerr-team/seerr@4ce0db1))
- *(ui)* Add loading state to request approve/decline buttons ([#&#8203;2815](seerr-team/seerr#2815)) - ([bd8f2d4](seerr-team/seerr@bd8f2d4))
- *(userlist)* Add sortable columns to User List ([#&#8203;1615](seerr-team/seerr#1615)) - ([eaf397a](seerr-team/seerr@eaf397a))
- *(webhook)* Add imdbid to webhook notification ([#&#8203;2658](seerr-team/seerr#2658)) - ([2432e8d](seerr-team/seerr@2432e8d))
- Sort quality profiles ASC in request and service configuration ([#&#8203;1805](seerr-team/seerr#1805)) - ([25e376c](seerr-team/seerr@25e376c))
- Add trailing whitespace warning on login username field ([#&#8203;2040](seerr-team/seerr#2040)) ([#&#8203;2177](seerr-team/seerr#2177)) - ([636dcb9](seerr-team/seerr@636dcb9))

##### 🐛 Bug Fixes

- *(auth)* Resolve Plex OAuth client ID mismatch ([#&#8203;2746](seerr-team/seerr#2746)) - ([15b3109](seerr-team/seerr@15b3109))
- *(email)* Correctly classify final MIME header in PGP email encryption ([#&#8203;2618](seerr-team/seerr#2618)) - ([9ec3d58](seerr-team/seerr@9ec3d58))
- *(email)* Preserve newlines in PGP key textarea fields ([#&#8203;2617](seerr-team/seerr#2617)) - ([835e917](seerr-team/seerr@835e917))
- *(emby)* Use static version in auth header for emby only ([#&#8203;2821](seerr-team/seerr#2821)) - ([fe2c041](seerr-team/seerr@fe2c041))
- *(entities)* Replace MySQL-only onUpdate with [@&#8203;UpdateDateColumn](https://github.com/UpdateDateColumn) ([#&#8203;2823](seerr-team/seerr#2823)) - ([0b8f872](seerr-team/seerr@0b8f872))
- *(generate-password)* Await setPassword to fix race condition ([#&#8203;2845](seerr-team/seerr#2845)) - ([061121c](seerr-team/seerr@061121c))
- *(issues)* Update issue timestamp when adding comments ([#&#8203;2616](seerr-team/seerr#2616)) - ([a16d046](seerr-team/seerr@a16d046))
- *(jellyfin-scanner)* Add TheMovieDb provider fallback for Jellyfin scanner ([#&#8203;2605](seerr-team/seerr#2605)) - ([10f23f0](seerr-team/seerr@10f23f0))
- *(login)* Resolve stuck transition when switching login forms ([#&#8203;2779](seerr-team/seerr#2779)) - ([735ec47](seerr-team/seerr@735ec47))
- *(media)* Exclude null mediaAddedAt entries ([#&#8203;2607](seerr-team/seerr#2607)) - ([001f6b1](seerr-team/seerr@001f6b1))
- *(migration)* Repair postgres blocklist id sequence ([#&#8203;2686](seerr-team/seerr#2686)) - ([f40323c](seerr-team/seerr@f40323c))
- *(movie,tv)* Respect display language for trailers ([#&#8203;2674](seerr-team/seerr#2674)) - ([90d407d](seerr-team/seerr@90d407d))
- *(open-api)* Add missing mediaType query parameter to blocklist and watchlist ([#&#8203;2722](seerr-team/seerr#2722)) - ([c7185d4](seerr-team/seerr@c7185d4))
- *(override-rules)* Remove users from `useEffect` dependency array ([#&#8203;2771](seerr-team/seerr#2771)) - ([be57997](seerr-team/seerr@be57997))
- *(overseerr-merge)* Sanitise corrupt quota values during overseerr migration ([#&#8203;2863](seerr-team/seerr#2863)) - ([43eff25](seerr-team/seerr@43eff25))
- *(plex)* Set 4K Plex URLs whenever ratingKey4k is set ([#&#8203;2635](seerr-team/seerr#2635)) - ([1548948](seerr-team/seerr@1548948))
- *(proxy)* Add path validation guardrail to imageproxy ([#&#8203;2531](seerr-team/seerr#2531)) - ([e086081](seerr-team/seerr@e086081))
- *(region-selector)* Prevent empty region reporting during sync ([#&#8203;2636](seerr-team/seerr#2636)) - ([fbfcb43](seerr-team/seerr@fbfcb43))
- *(request)* Record modifiedBy on retry and add route tests  ([#&#8203;2824](seerr-team/seerr#2824)) - ([20ccd4b](seerr-team/seerr@20ccd4b))
- *(request)* Correct delete permission check and await movie save ([#&#8203;2742](seerr-team/seerr#2742)) - ([6aeab38](seerr-team/seerr@6aeab38))
- *(requests)* Mark requests as completed when media is already available ([#&#8203;2462](seerr-team/seerr#2462)) - ([d25d0ca](seerr-team/seerr@d25d0ca))
- *(settings)* Persist new settings defaults to disk on startup ([#&#8203;2884](seerr-team/seerr#2884)) - ([66130be](seerr-team/seerr@66130be))
- *(settings)* Serialize settings writes and prevent partial overwrites ([#&#8203;2696](seerr-team/seerr#2696)) - ([6c52a2f](seerr-team/seerr@6c52a2f))
- *(settings)* Remove beta info banner ([#&#8203;2615](seerr-team/seerr#2615)) - ([fece753](seerr-team/seerr@fece753))
- *(setup)* Fix Plex login not proceeding after authentication ([#&#8203;2596](seerr-team/seerr#2596)) - ([1dc5154](seerr-team/seerr@1dc5154))
- *(watchlist-sync)* Handle empty watchlists on PostgreSQL ([#&#8203;2718](seerr-team/seerr#2718)) - ([865396f](seerr-team/seerr@865396f))
- Improve local login UX ([#&#8203;2849](seerr-team/seerr#2849)) - ([aef2481](seerr-team/seerr@aef2481))
- Await missing repository saves ([#&#8203;2760](seerr-team/seerr#2760)) - ([1bb638e](seerr-team/seerr@1bb638e))
- Helm chart liveness and readiness probe ([#&#8203;2755](seerr-team/seerr#2755)) - ([4434c45](seerr-team/seerr@4434c45))
- Disambiguate tmdb ids by media type across lookups ([#&#8203;2577](seerr-team/seerr#2577)) - ([0be1896](seerr-team/seerr@0be1896))
- Anchor streaming service filter check icon to each provider card ([#&#8203;2634](seerr-team/seerr#2634)) - ([94ccd47](seerr-team/seerr@94ccd47))

##### 📖 Documentation

- *(contributing-guide)* Fix a typo ([#&#8203;2807](seerr-team/seerr#2807)) - ([6f9b743](seerr-team/seerr@6f9b743))
- *(docker)* Replace backslashes by backticks in windows docker run commands \[skip-ci] ([#&#8203;2557](seerr-team/seerr#2557)) - ([40e02bb](seerr-team/seerr@40e02bb))
- Clarify Docker volume creation instructions on fresh Windows install ([#&#8203;2861](seerr-team/seerr#2861)) - ([a133930](seerr-team/seerr@a133930))
- Move network-related docs to a dedicated tab ([#&#8203;2791](seerr-team/seerr#2791)) - ([5bbdc52](seerr-team/seerr@5bbdc52))
- Promote Nixpkgs as an official installation method ([#&#8203;2775](seerr-team/seerr#2775)) - ([05ad60c](seerr-team/seerr@05ad60c))
- Fix PM2 start command syntax ([#&#8203;2713](seerr-team/seerr#2713)) - ([5373da4](seerr-team/seerr@5373da4))

##### 🚜 Refactor

- *(imageproxy)* Reduce noisy image cache logging ([#&#8203;2789](seerr-team/seerr#2789)) - ([036d000](seerr-team/seerr@036d000))
- *(notifications)* Move event from author to title field in Discord Embed ([#&#8203;2119](seerr-team/seerr#2119)) - ([a2d1e1b](seerr-team/seerr@a2d1e1b))
- *(userlist)* Responsive columns and buttons ([#&#8203;2083](seerr-team/seerr#2083)) - ([dbe1fca](seerr-team/seerr@dbe1fca))
- *(watchlistsync)* Log media request creation after success instead of before ([#&#8203;2790](seerr-team/seerr#2790)) - ([685cb44](seerr-team/seerr@685cb44))
- Rename Error components to ErrorPage ([#&#8203;2668](seerr-team/seerr#2668)) - ([d5c5f1f](seerr-team/seerr@d5c5f1f))

##### 🧪 Testing

- *(user-list)* Deflake sorting assertions ([#&#8203;2766](seerr-team/seerr#2766)) - ([20c2ed8](seerr-team/seerr@20c2ed8))
- Support server-side unit testing ([#&#8203;2485](seerr-team/seerr#2485)) - ([8563362](seerr-team/seerr@8563362))

##### ⚙️ Miscellaneous Tasks

- *(actions)* Update github actions ([#&#8203;2683](seerr-team/seerr#2683)) - ([a2154f9](seerr-team/seerr@a2154f9))
- *(actions)* Update github actions ([#&#8203;2672](seerr-team/seerr#2672)) - ([f047cab](seerr-team/seerr@f047cab))
- *(actions)* Update github actions ([#&#8203;2632](seerr-team/seerr#2632)) - ([e25c1a5](seerr-team/seerr@e25c1a5))
- *(create-tag)* Correct quote style in commit message for tag preparation ([#&#8203;2593](seerr-team/seerr#2593)) - ([687f18b](seerr-team/seerr@687f18b))
- *(docker)* Release alias for major and minor version series ([#&#8203;2881](seerr-team/seerr#2881)) - ([1cc73a8](seerr-team/seerr@1cc73a8))
- *(i18n)* Update translations from Weblate - ([e85216a](seerr-team/seerr@e85216a))
- *(i18n)* Update translations from Weblate - ([b1adc79](seerr-team/seerr@b1adc79))
- *(i18n)* Update translations from Weblate ([#&#8203;2419](seerr-team/seerr#2419)) - ([4bd7c19](seerr-team/seerr@4bd7c19))
- *(pr-validation)* Make checklist box detection case-insensitive ([#&#8203;2802](seerr-team/seerr#2802)) - ([58514ec](seerr-team/seerr@58514ec))
- *(pr-validation)* Update pull request permissions to write for validation jobs ([#&#8203;2800](seerr-team/seerr#2800)) - ([986761f](seerr-team/seerr@986761f))
- *(pr-validation)* Disable package manager cache in nodejs setup ([#&#8203;2799](seerr-team/seerr#2799)) - ([67e27d5](seerr-team/seerr@67e27d5))
- *(release)* Prepare v3.2.0 - ([e0b2a1c](seerr-team/seerr@e0b2a1c))
- *(release)* Merge develop into main - ([c5800a0](seerr-team/seerr@c5800a0))
- Bump minimum required node version to 22.19.0 ([#&#8203;2873](seerr-team/seerr#2873)) - ([891265f](seerr-team/seerr@891265f))
- Add PR validation workflow and update contributing guidelines ([#&#8203;2777](seerr-team/seerr#2777)) - ([772e83d](seerr-team/seerr@772e83d))
- Upgrade to eslint v9 ([#&#8203;2574](seerr-team/seerr#2574)) - ([36243a0](seerr-team/seerr@36243a0))
- Ignore helm scope in git-cliff ([#&#8203;2638](seerr-team/seerr#2638)) - ([4d2b658](seerr-team/seerr@4d2b658))

##### New Contributors ❤️

- [@&#8203;aslafy-z](https://github.com/aslafy-z) made their first contribution
- [@&#8203;leereilly](https://github.com/leereilly) made their first contribution
- [@&#8203;jisef](https://github.com/jisef) made their first contribution
- [@&#8203;dougrathbone](https://github.com/dougrathbone) made their first contribution
- [@&#8203;bobziroll](https://github.com/bobziroll) made their first contribution
- [@&#8203;v3DJG6GL](https://github.com/v3DJG6GL) made their first contribution
- [@&#8203;Roboroads](https://github.com/Roboroads) made their first contribution
- [@&#8203;costajohnt](https://github.com/costajohnt) made their first contribution
- [@&#8203;tiagodefendi](https://github.com/tiagodefendi) made their first contribution
- [@&#8203;Jyasapara](https://github.com/Jyasapara) made their first contribution
- [@&#8203;Sym-jay](https://github.com/Sym-jay) made their first contribution
- [@&#8203;bibi0019](https://github.com/bibi0019) made their first contribution
- [@&#8203;redondos](https://github.com/redondos) made their first contribution
- [@&#8203;bogo22](https://github.com/bogo22) made their first contribution
- [@&#8203;jabloink](https://github.com/jabloink) made their first contribution
- [@&#8203;YakGravity](https://github.com/YakGravity) made their first contribution
- [@&#8203;dj0024javia](https://github.com/dj0024javia) made their first contribution
- [@&#8203;Jerra94](https://github.com/Jerra94) made their first contribution
- [@&#8203;its-wizza](https://github.com/its-wizza) made their first contribution
- [@&#8203;ventiph](https://github.com/ventiph) made their first contribution
- [@&#8203;RinZ27](https://github.com/RinZ27) made their first contribution<!-- generated by git-cliff -->

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these updates again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xMDEuMSIsInVwZGF0ZWRJblZlciI6IjQzLjEwMS4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJyZW5vdmF0ZS9jb250YWluZXIiLCJ0eXBlL21pbm9yIl19-->

Reviewed-on: https://git.erwanleboucher.dev/eleboucher/homelab/pulls/180
Co-authored-by: bot-owl <bot@erwanleboucher.dev>
Co-committed-by: bot-owl <bot@erwanleboucher.dev>
eleboucher pushed a commit to eleboucher/homelab that referenced this pull request Apr 16, 2026
This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [seerr/seerr](https://github.com/seerr-team/seerr) | minor | `v3.1.1` → `v3.2.0` |

---

### Release Notes

<details>
<summary>seerr-team/seerr (seerr/seerr)</summary>

### [`v3.2.0`](https://github.com/seerr-team/seerr/releases/tag/v3.2.0)

[Compare Source](seerr-team/seerr@v3.1.1...v3.2.0)

##### [3.2.0](https://github.com/seerr-team/seerr/compare/v3.1.1..v3.2.0) - 2026-04-15

##### 🚀 Features

- *(blocklist)* Add support for collections ([#&#8203;1841](seerr-team/seerr#1841)) - ([993ae4c](seerr-team/seerr@993ae4c))
- *(discover)* Handle errors gracefully when content is available ([#&#8203;1542](seerr-team/seerr#1542)) - ([7920970](seerr-team/seerr@7920970))
- *(i18n)* Add Estonian language support ([#&#8203;2611](seerr-team/seerr#2611)) - ([56b79ff](seerr-team/seerr@56b79ff))
- *(i18n)* Add Luxembourgish language support ([#&#8203;2671](seerr-team/seerr#2671)) - ([dccdc95](seerr-team/seerr@dccdc95))
- *(i18n)* Add Vietnamese language support ([#&#8203;2670](seerr-team/seerr#2670)) - ([40edaea](seerr-team/seerr@40edaea))
- *(jellyfin)* Allow Jellyfin Guids with dashes for import-from-jellyfin endpoint ([#&#8203;2340](seerr-team/seerr#2340)) - ([3557745](seerr-team/seerr@3557745))
- *(notifications)* Add ntfy markdown formatting ([#&#8203;2602](seerr-team/seerr#2602)) - ([77f2c13](seerr-team/seerr@77f2c13))
- *(notifications)* Webhook custom headers ([#&#8203;2230](seerr-team/seerr#2230)) - ([3152f72](seerr-team/seerr@3152f72))
- *(notifications)* Add priority setting for ntfy agent ([#&#8203;2306](seerr-team/seerr#2306)) - ([61e0377](seerr-team/seerr@61e0377))
- *(person)* Add tmdb- and imdb link on person detail page ([#&#8203;2136](seerr-team/seerr#2136)) - ([fb2ee7c](seerr-team/seerr@fb2ee7c))
- *(quota)* Added support for unlimited quota days ([#&#8203;2797](seerr-team/seerr#2797)) - ([6d8b2b7](seerr-team/seerr@6d8b2b7))
- *(requests)* Mark requests as failed when Radarr/Sonarr unreachable ([#&#8203;2171](seerr-team/seerr#2171)) - ([c23117e](seerr-team/seerr@c23117e))
- *(settings)* Add blocklist region and language options ([#&#8203;1802](seerr-team/seerr#1802)) - ([ff469cb](seerr-team/seerr@ff469cb))
- *(settings)* Add help tooltips for services setup ([#&#8203;2662](seerr-team/seerr#2662)) - ([f5115da](seerr-team/seerr@f5115da))
- *(sonarr)* Add monitorNewItems option to sonarr settings & modal ([#&#8203;2071](seerr-team/seerr#2071)) - ([5c34c91](seerr-team/seerr@5c34c91))
- *(trending)* Add filter options ([#&#8203;2137](seerr-team/seerr#2137)) - ([4ce0db1](seerr-team/seerr@4ce0db1))
- *(ui)* Add loading state to request approve/decline buttons ([#&#8203;2815](seerr-team/seerr#2815)) - ([bd8f2d4](seerr-team/seerr@bd8f2d4))
- *(userlist)* Add sortable columns to User List ([#&#8203;1615](seerr-team/seerr#1615)) - ([eaf397a](seerr-team/seerr@eaf397a))
- *(webhook)* Add imdbid to webhook notification ([#&#8203;2658](seerr-team/seerr#2658)) - ([2432e8d](seerr-team/seerr@2432e8d))
- Sort quality profiles ASC in request and service configuration ([#&#8203;1805](seerr-team/seerr#1805)) - ([25e376c](seerr-team/seerr@25e376c))
- Add trailing whitespace warning on login username field ([#&#8203;2040](seerr-team/seerr#2040)) ([#&#8203;2177](seerr-team/seerr#2177)) - ([636dcb9](seerr-team/seerr@636dcb9))

##### 🐛 Bug Fixes

- *(auth)* Resolve Plex OAuth client ID mismatch ([#&#8203;2746](seerr-team/seerr#2746)) - ([15b3109](seerr-team/seerr@15b3109))
- *(email)* Correctly classify final MIME header in PGP email encryption ([#&#8203;2618](seerr-team/seerr#2618)) - ([9ec3d58](seerr-team/seerr@9ec3d58))
- *(email)* Preserve newlines in PGP key textarea fields ([#&#8203;2617](seerr-team/seerr#2617)) - ([835e917](seerr-team/seerr@835e917))
- *(emby)* Use static version in auth header for emby only ([#&#8203;2821](seerr-team/seerr#2821)) - ([fe2c041](seerr-team/seerr@fe2c041))
- *(entities)* Replace MySQL-only onUpdate with [@&#8203;UpdateDateColumn](https://github.com/UpdateDateColumn) ([#&#8203;2823](seerr-team/seerr#2823)) - ([0b8f872](seerr-team/seerr@0b8f872))
- *(generate-password)* Await setPassword to fix race condition ([#&#8203;2845](seerr-team/seerr#2845)) - ([061121c](seerr-team/seerr@061121c))
- *(issues)* Update issue timestamp when adding comments ([#&#8203;2616](seerr-team/seerr#2616)) - ([a16d046](seerr-team/seerr@a16d046))
- *(jellyfin-scanner)* Add TheMovieDb provider fallback for Jellyfin scanner ([#&#8203;2605](seerr-team/seerr#2605)) - ([10f23f0](seerr-team/seerr@10f23f0))
- *(login)* Resolve stuck transition when switching login forms ([#&#8203;2779](seerr-team/seerr#2779)) - ([735ec47](seerr-team/seerr@735ec47))
- *(media)* Exclude null mediaAddedAt entries ([#&#8203;2607](seerr-team/seerr#2607)) - ([001f6b1](seerr-team/seerr@001f6b1))
- *(migration)* Repair postgres blocklist id sequence ([#&#8203;2686](seerr-team/seerr#2686)) - ([f40323c](seerr-team/seerr@f40323c))
- *(movie,tv)* Respect display language for trailers ([#&#8203;2674](seerr-team/seerr#2674)) - ([90d407d](seerr-team/seerr@90d407d))
- *(open-api)* Add missing mediaType query parameter to blocklist and watchlist ([#&#8203;2722](seerr-team/seerr#2722)) - ([c7185d4](seerr-team/seerr@c7185d4))
- *(override-rules)* Remove users from `useEffect` dependency array ([#&#8203;2771](seerr-team/seerr#2771)) - ([be57997](seerr-team/seerr@be57997))
- *(overseerr-merge)* Sanitise corrupt quota values during overseerr migration ([#&#8203;2863](seerr-team/seerr#2863)) - ([43eff25](seerr-team/seerr@43eff25))
- *(plex)* Set 4K Plex URLs whenever ratingKey4k is set ([#&#8203;2635](seerr-team/seerr#2635)) - ([1548948](seerr-team/seerr@1548948))
- *(proxy)* Add path validation guardrail to imageproxy ([#&#8203;2531](seerr-team/seerr#2531)) - ([e086081](seerr-team/seerr@e086081))
- *(region-selector)* Prevent empty region reporting during sync ([#&#8203;2636](seerr-team/seerr#2636)) - ([fbfcb43](seerr-team/seerr@fbfcb43))
- *(request)* Record modifiedBy on retry and add route tests  ([#&#8203;2824](seerr-team/seerr#2824)) - ([20ccd4b](seerr-team/seerr@20ccd4b))
- *(request)* Correct delete permission check and await movie save ([#&#8203;2742](seerr-team/seerr#2742)) - ([6aeab38](seerr-team/seerr@6aeab38))
- *(requests)* Mark requests as completed when media is already available ([#&#8203;2462](seerr-team/seerr#2462)) - ([d25d0ca](seerr-team/seerr@d25d0ca))
- *(settings)* Persist new settings defaults to disk on startup ([#&#8203;2884](seerr-team/seerr#2884)) - ([66130be](seerr-team/seerr@66130be))
- *(settings)* Serialize settings writes and prevent partial overwrites ([#&#8203;2696](seerr-team/seerr#2696)) - ([6c52a2f](seerr-team/seerr@6c52a2f))
- *(settings)* Remove beta info banner ([#&#8203;2615](seerr-team/seerr#2615)) - ([fece753](seerr-team/seerr@fece753))
- *(setup)* Fix Plex login not proceeding after authentication ([#&#8203;2596](seerr-team/seerr#2596)) - ([1dc5154](seerr-team/seerr@1dc5154))
- *(watchlist-sync)* Handle empty watchlists on PostgreSQL ([#&#8203;2718](seerr-team/seerr#2718)) - ([865396f](seerr-team/seerr@865396f))
- Improve local login UX ([#&#8203;2849](seerr-team/seerr#2849)) - ([aef2481](seerr-team/seerr@aef2481))
- Await missing repository saves ([#&#8203;2760](seerr-team/seerr#2760)) - ([1bb638e](seerr-team/seerr@1bb638e))
- Helm chart liveness and readiness probe ([#&#8203;2755](seerr-team/seerr#2755)) - ([4434c45](seerr-team/seerr@4434c45))
- Disambiguate tmdb ids by media type across lookups ([#&#8203;2577](seerr-team/seerr#2577)) - ([0be1896](seerr-team/seerr@0be1896))
- Anchor streaming service filter check icon to each provider card ([#&#8203;2634](seerr-team/seerr#2634)) - ([94ccd47](seerr-team/seerr@94ccd47))

##### 📖 Documentation

- *(contributing-guide)* Fix a typo ([#&#8203;2807](seerr-team/seerr#2807)) - ([6f9b743](seerr-team/seerr@6f9b743))
- *(docker)* Replace backslashes by backticks in windows docker run commands \[skip-ci] ([#&#8203;2557](seerr-team/seerr#2557)) - ([40e02bb](seerr-team/seerr@40e02bb))
- Clarify Docker volume creation instructions on fresh Windows install ([#&#8203;2861](seerr-team/seerr#2861)) - ([a133930](seerr-team/seerr@a133930))
- Move network-related docs to a dedicated tab ([#&#8203;2791](seerr-team/seerr#2791)) - ([5bbdc52](seerr-team/seerr@5bbdc52))
- Promote Nixpkgs as an official installation method ([#&#8203;2775](seerr-team/seerr#2775)) - ([05ad60c](seerr-team/seerr@05ad60c))
- Fix PM2 start command syntax ([#&#8203;2713](seerr-team/seerr#2713)) - ([5373da4](seerr-team/seerr@5373da4))

##### 🚜 Refactor

- *(imageproxy)* Reduce noisy image cache logging ([#&#8203;2789](seerr-team/seerr#2789)) - ([036d000](seerr-team/seerr@036d000))
- *(notifications)* Move event from author to title field in Discord Embed ([#&#8203;2119](seerr-team/seerr#2119)) - ([a2d1e1b](seerr-team/seerr@a2d1e1b))
- *(userlist)* Responsive columns and buttons ([#&#8203;2083](seerr-team/seerr#2083)) - ([dbe1fca](seerr-team/seerr@dbe1fca))
- *(watchlistsync)* Log media request creation after success instead of before ([#&#8203;2790](seerr-team/seerr#2790)) - ([685cb44](seerr-team/seerr@685cb44))
- Rename Error components to ErrorPage ([#&#8203;2668](seerr-team/seerr#2668)) - ([d5c5f1f](seerr-team/seerr@d5c5f1f))

##### 🧪 Testing

- *(user-list)* Deflake sorting assertions ([#&#8203;2766](seerr-team/seerr#2766)) - ([20c2ed8](seerr-team/seerr@20c2ed8))
- Support server-side unit testing ([#&#8203;2485](seerr-team/seerr#2485)) - ([8563362](seerr-team/seerr@8563362))

##### ⚙️ Miscellaneous Tasks

- *(actions)* Update github actions ([#&#8203;2683](seerr-team/seerr#2683)) - ([a2154f9](seerr-team/seerr@a2154f9))
- *(actions)* Update github actions ([#&#8203;2672](seerr-team/seerr#2672)) - ([f047cab](seerr-team/seerr@f047cab))
- *(actions)* Update github actions ([#&#8203;2632](seerr-team/seerr#2632)) - ([e25c1a5](seerr-team/seerr@e25c1a5))
- *(create-tag)* Correct quote style in commit message for tag preparation ([#&#8203;2593](seerr-team/seerr#2593)) - ([687f18b](seerr-team/seerr@687f18b))
- *(docker)* Release alias for major and minor version series ([#&#8203;2881](seerr-team/seerr#2881)) - ([1cc73a8](seerr-team/seerr@1cc73a8))
- *(i18n)* Update translations from Weblate - ([e85216a](seerr-team/seerr@e85216a))
- *(i18n)* Update translations from Weblate - ([b1adc79](seerr-team/seerr@b1adc79))
- *(i18n)* Update translations from Weblate ([#&#8203;2419](seerr-team/seerr#2419)) - ([4bd7c19](seerr-team/seerr@4bd7c19))
- *(pr-validation)* Make checklist box detection case-insensitive ([#&#8203;2802](seerr-team/seerr#2802)) - ([58514ec](seerr-team/seerr@58514ec))
- *(pr-validation)* Update pull request permissions to write for validation jobs ([#&#8203;2800](seerr-team/seerr#2800)) - ([986761f](seerr-team/seerr@986761f))
- *(pr-validation)* Disable package manager cache in nodejs setup ([#&#8203;2799](seerr-team/seerr#2799)) - ([67e27d5](seerr-team/seerr@67e27d5))
- *(release)* Prepare v3.2.0 - ([e0b2a1c](seerr-team/seerr@e0b2a1c))
- *(release)* Merge develop into main - ([c5800a0](seerr-team/seerr@c5800a0))
- Bump minimum required node version to 22.19.0 ([#&#8203;2873](seerr-team/seerr#2873)) - ([891265f](seerr-team/seerr@891265f))
- Add PR validation workflow and update contributing guidelines ([#&#8203;2777](seerr-team/seerr#2777)) - ([772e83d](seerr-team/seerr@772e83d))
- Upgrade to eslint v9 ([#&#8203;2574](seerr-team/seerr#2574)) - ([36243a0](seerr-team/seerr@36243a0))
- Ignore helm scope in git-cliff ([#&#8203;2638](seerr-team/seerr#2638)) - ([4d2b658](seerr-team/seerr@4d2b658))

##### New Contributors ❤️

- [@&#8203;aslafy-z](https://github.com/aslafy-z) made their first contribution
- [@&#8203;leereilly](https://github.com/leereilly) made their first contribution
- [@&#8203;jisef](https://github.com/jisef) made their first contribution
- [@&#8203;dougrathbone](https://github.com/dougrathbone) made their first contribution
- [@&#8203;bobziroll](https://github.com/bobziroll) made their first contribution
- [@&#8203;v3DJG6GL](https://github.com/v3DJG6GL) made their first contribution
- [@&#8203;Roboroads](https://github.com/Roboroads) made their first contribution
- [@&#8203;costajohnt](https://github.com/costajohnt) made their first contribution
- [@&#8203;tiagodefendi](https://github.com/tiagodefendi) made their first contribution
- [@&#8203;Jyasapara](https://github.com/Jyasapara) made their first contribution
- [@&#8203;Sym-jay](https://github.com/Sym-jay) made their first contribution
- [@&#8203;bibi0019](https://github.com/bibi0019) made their first contribution
- [@&#8203;redondos](https://github.com/redondos) made their first contribution
- [@&#8203;bogo22](https://github.com/bogo22) made their first contribution
- [@&#8203;jabloink](https://github.com/jabloink) made their first contribution
- [@&#8203;YakGravity](https://github.com/YakGravity) made their first contribution
- [@&#8203;dj0024javia](https://github.com/dj0024javia) made their first contribution
- [@&#8203;Jerra94](https://github.com/Jerra94) made their first contribution
- [@&#8203;its-wizza](https://github.com/its-wizza) made their first contribution
- [@&#8203;ventiph](https://github.com/ventiph) made their first contribution
- [@&#8203;RinZ27](https://github.com/RinZ27) made their first contribution<!-- generated by git-cliff -->

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these updates again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xMDEuMSIsInVwZGF0ZWRJblZlciI6IjQzLjEwMS4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJyZW5vdmF0ZS9jb250YWluZXIiLCJ0eXBlL21pbm9yIl19-->

Reviewed-on: https://git.erwanleboucher.dev/eleboucher/homelab/pulls/187
Co-authored-by: bot-owl <bot@erwanleboucher.dev>
Co-committed-by: bot-owl <bot@erwanleboucher.dev>
eleboucher pushed a commit to eleboucher/homelab that referenced this pull request Apr 16, 2026
This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [seerr/seerr](https://github.com/seerr-team/seerr) | minor | `v3.1.1` → `v3.2.0` |

---

### Release Notes

<details>
<summary>seerr-team/seerr (seerr/seerr)</summary>

### [`v3.2.0`](https://github.com/seerr-team/seerr/releases/tag/v3.2.0)

[Compare Source](seerr-team/seerr@v3.1.1...v3.2.0)

##### [3.2.0](https://github.com/seerr-team/seerr/compare/v3.1.1..v3.2.0) - 2026-04-15

##### 🚀 Features

- *(blocklist)* Add support for collections ([#&#8203;1841](seerr-team/seerr#1841)) - ([993ae4c](seerr-team/seerr@993ae4c))
- *(discover)* Handle errors gracefully when content is available ([#&#8203;1542](seerr-team/seerr#1542)) - ([7920970](seerr-team/seerr@7920970))
- *(i18n)* Add Estonian language support ([#&#8203;2611](seerr-team/seerr#2611)) - ([56b79ff](seerr-team/seerr@56b79ff))
- *(i18n)* Add Luxembourgish language support ([#&#8203;2671](seerr-team/seerr#2671)) - ([dccdc95](seerr-team/seerr@dccdc95))
- *(i18n)* Add Vietnamese language support ([#&#8203;2670](seerr-team/seerr#2670)) - ([40edaea](seerr-team/seerr@40edaea))
- *(jellyfin)* Allow Jellyfin Guids with dashes for import-from-jellyfin endpoint ([#&#8203;2340](seerr-team/seerr#2340)) - ([3557745](seerr-team/seerr@3557745))
- *(notifications)* Add ntfy markdown formatting ([#&#8203;2602](seerr-team/seerr#2602)) - ([77f2c13](seerr-team/seerr@77f2c13))
- *(notifications)* Webhook custom headers ([#&#8203;2230](seerr-team/seerr#2230)) - ([3152f72](seerr-team/seerr@3152f72))
- *(notifications)* Add priority setting for ntfy agent ([#&#8203;2306](seerr-team/seerr#2306)) - ([61e0377](seerr-team/seerr@61e0377))
- *(person)* Add tmdb- and imdb link on person detail page ([#&#8203;2136](seerr-team/seerr#2136)) - ([fb2ee7c](seerr-team/seerr@fb2ee7c))
- *(quota)* Added support for unlimited quota days ([#&#8203;2797](seerr-team/seerr#2797)) - ([6d8b2b7](seerr-team/seerr@6d8b2b7))
- *(requests)* Mark requests as failed when Radarr/Sonarr unreachable ([#&#8203;2171](seerr-team/seerr#2171)) - ([c23117e](seerr-team/seerr@c23117e))
- *(settings)* Add blocklist region and language options ([#&#8203;1802](seerr-team/seerr#1802)) - ([ff469cb](seerr-team/seerr@ff469cb))
- *(settings)* Add help tooltips for services setup ([#&#8203;2662](seerr-team/seerr#2662)) - ([f5115da](seerr-team/seerr@f5115da))
- *(sonarr)* Add monitorNewItems option to sonarr settings & modal ([#&#8203;2071](seerr-team/seerr#2071)) - ([5c34c91](seerr-team/seerr@5c34c91))
- *(trending)* Add filter options ([#&#8203;2137](seerr-team/seerr#2137)) - ([4ce0db1](seerr-team/seerr@4ce0db1))
- *(ui)* Add loading state to request approve/decline buttons ([#&#8203;2815](seerr-team/seerr#2815)) - ([bd8f2d4](seerr-team/seerr@bd8f2d4))
- *(userlist)* Add sortable columns to User List ([#&#8203;1615](seerr-team/seerr#1615)) - ([eaf397a](seerr-team/seerr@eaf397a))
- *(webhook)* Add imdbid to webhook notification ([#&#8203;2658](seerr-team/seerr#2658)) - ([2432e8d](seerr-team/seerr@2432e8d))
- Sort quality profiles ASC in request and service configuration ([#&#8203;1805](seerr-team/seerr#1805)) - ([25e376c](seerr-team/seerr@25e376c))
- Add trailing whitespace warning on login username field ([#&#8203;2040](seerr-team/seerr#2040)) ([#&#8203;2177](seerr-team/seerr#2177)) - ([636dcb9](seerr-team/seerr@636dcb9))

##### 🐛 Bug Fixes

- *(auth)* Resolve Plex OAuth client ID mismatch ([#&#8203;2746](seerr-team/seerr#2746)) - ([15b3109](seerr-team/seerr@15b3109))
- *(email)* Correctly classify final MIME header in PGP email encryption ([#&#8203;2618](seerr-team/seerr#2618)) - ([9ec3d58](seerr-team/seerr@9ec3d58))
- *(email)* Preserve newlines in PGP key textarea fields ([#&#8203;2617](seerr-team/seerr#2617)) - ([835e917](seerr-team/seerr@835e917))
- *(emby)* Use static version in auth header for emby only ([#&#8203;2821](seerr-team/seerr#2821)) - ([fe2c041](seerr-team/seerr@fe2c041))
- *(entities)* Replace MySQL-only onUpdate with [@&#8203;UpdateDateColumn](https://github.com/UpdateDateColumn) ([#&#8203;2823](seerr-team/seerr#2823)) - ([0b8f872](seerr-team/seerr@0b8f872))
- *(generate-password)* Await setPassword to fix race condition ([#&#8203;2845](seerr-team/seerr#2845)) - ([061121c](seerr-team/seerr@061121c))
- *(issues)* Update issue timestamp when adding comments ([#&#8203;2616](seerr-team/seerr#2616)) - ([a16d046](seerr-team/seerr@a16d046))
- *(jellyfin-scanner)* Add TheMovieDb provider fallback for Jellyfin scanner ([#&#8203;2605](seerr-team/seerr#2605)) - ([10f23f0](seerr-team/seerr@10f23f0))
- *(login)* Resolve stuck transition when switching login forms ([#&#8203;2779](seerr-team/seerr#2779)) - ([735ec47](seerr-team/seerr@735ec47))
- *(media)* Exclude null mediaAddedAt entries ([#&#8203;2607](seerr-team/seerr#2607)) - ([001f6b1](seerr-team/seerr@001f6b1))
- *(migration)* Repair postgres blocklist id sequence ([#&#8203;2686](seerr-team/seerr#2686)) - ([f40323c](seerr-team/seerr@f40323c))
- *(movie,tv)* Respect display language for trailers ([#&#8203;2674](seerr-team/seerr#2674)) - ([90d407d](seerr-team/seerr@90d407d))
- *(open-api)* Add missing mediaType query parameter to blocklist and watchlist ([#&#8203;2722](seerr-team/seerr#2722)) - ([c7185d4](seerr-team/seerr@c7185d4))
- *(override-rules)* Remove users from `useEffect` dependency array ([#&#8203;2771](seerr-team/seerr#2771)) - ([be57997](seerr-team/seerr@be57997))
- *(overseerr-merge)* Sanitise corrupt quota values during overseerr migration ([#&#8203;2863](seerr-team/seerr#2863)) - ([43eff25](seerr-team/seerr@43eff25))
- *(plex)* Set 4K Plex URLs whenever ratingKey4k is set ([#&#8203;2635](seerr-team/seerr#2635)) - ([1548948](seerr-team/seerr@1548948))
- *(proxy)* Add path validation guardrail to imageproxy ([#&#8203;2531](seerr-team/seerr#2531)) - ([e086081](seerr-team/seerr@e086081))
- *(region-selector)* Prevent empty region reporting during sync ([#&#8203;2636](seerr-team/seerr#2636)) - ([fbfcb43](seerr-team/seerr@fbfcb43))
- *(request)* Record modifiedBy on retry and add route tests  ([#&#8203;2824](seerr-team/seerr#2824)) - ([20ccd4b](seerr-team/seerr@20ccd4b))
- *(request)* Correct delete permission check and await movie save ([#&#8203;2742](seerr-team/seerr#2742)) - ([6aeab38](seerr-team/seerr@6aeab38))
- *(requests)* Mark requests as completed when media is already available ([#&#8203;2462](seerr-team/seerr#2462)) - ([d25d0ca](seerr-team/seerr@d25d0ca))
- *(settings)* Persist new settings defaults to disk on startup ([#&#8203;2884](seerr-team/seerr#2884)) - ([66130be](seerr-team/seerr@66130be))
- *(settings)* Serialize settings writes and prevent partial overwrites ([#&#8203;2696](seerr-team/seerr#2696)) - ([6c52a2f](seerr-team/seerr@6c52a2f))
- *(settings)* Remove beta info banner ([#&#8203;2615](seerr-team/seerr#2615)) - ([fece753](seerr-team/seerr@fece753))
- *(setup)* Fix Plex login not proceeding after authentication ([#&#8203;2596](seerr-team/seerr#2596)) - ([1dc5154](seerr-team/seerr@1dc5154))
- *(watchlist-sync)* Handle empty watchlists on PostgreSQL ([#&#8203;2718](seerr-team/seerr#2718)) - ([865396f](seerr-team/seerr@865396f))
- Improve local login UX ([#&#8203;2849](seerr-team/seerr#2849)) - ([aef2481](seerr-team/seerr@aef2481))
- Await missing repository saves ([#&#8203;2760](seerr-team/seerr#2760)) - ([1bb638e](seerr-team/seerr@1bb638e))
- Helm chart liveness and readiness probe ([#&#8203;2755](seerr-team/seerr#2755)) - ([4434c45](seerr-team/seerr@4434c45))
- Disambiguate tmdb ids by media type across lookups ([#&#8203;2577](seerr-team/seerr#2577)) - ([0be1896](seerr-team/seerr@0be1896))
- Anchor streaming service filter check icon to each provider card ([#&#8203;2634](seerr-team/seerr#2634)) - ([94ccd47](seerr-team/seerr@94ccd47))

##### 📖 Documentation

- *(contributing-guide)* Fix a typo ([#&#8203;2807](seerr-team/seerr#2807)) - ([6f9b743](seerr-team/seerr@6f9b743))
- *(docker)* Replace backslashes by backticks in windows docker run commands \[skip-ci] ([#&#8203;2557](seerr-team/seerr#2557)) - ([40e02bb](seerr-team/seerr@40e02bb))
- Clarify Docker volume creation instructions on fresh Windows install ([#&#8203;2861](seerr-team/seerr#2861)) - ([a133930](seerr-team/seerr@a133930))
- Move network-related docs to a dedicated tab ([#&#8203;2791](seerr-team/seerr#2791)) - ([5bbdc52](seerr-team/seerr@5bbdc52))
- Promote Nixpkgs as an official installation method ([#&#8203;2775](seerr-team/seerr#2775)) - ([05ad60c](seerr-team/seerr@05ad60c))
- Fix PM2 start command syntax ([#&#8203;2713](seerr-team/seerr#2713)) - ([5373da4](seerr-team/seerr@5373da4))

##### 🚜 Refactor

- *(imageproxy)* Reduce noisy image cache logging ([#&#8203;2789](seerr-team/seerr#2789)) - ([036d000](seerr-team/seerr@036d000))
- *(notifications)* Move event from author to title field in Discord Embed ([#&#8203;2119](seerr-team/seerr#2119)) - ([a2d1e1b](seerr-team/seerr@a2d1e1b))
- *(userlist)* Responsive columns and buttons ([#&#8203;2083](seerr-team/seerr#2083)) - ([dbe1fca](seerr-team/seerr@dbe1fca))
- *(watchlistsync)* Log media request creation after success instead of before ([#&#8203;2790](seerr-team/seerr#2790)) - ([685cb44](seerr-team/seerr@685cb44))
- Rename Error components to ErrorPage ([#&#8203;2668](seerr-team/seerr#2668)) - ([d5c5f1f](seerr-team/seerr@d5c5f1f))

##### 🧪 Testing

- *(user-list)* Deflake sorting assertions ([#&#8203;2766](seerr-team/seerr#2766)) - ([20c2ed8](seerr-team/seerr@20c2ed8))
- Support server-side unit testing ([#&#8203;2485](seerr-team/seerr#2485)) - ([8563362](seerr-team/seerr@8563362))

##### ⚙️ Miscellaneous Tasks

- *(actions)* Update github actions ([#&#8203;2683](seerr-team/seerr#2683)) - ([a2154f9](seerr-team/seerr@a2154f9))
- *(actions)* Update github actions ([#&#8203;2672](seerr-team/seerr#2672)) - ([f047cab](seerr-team/seerr@f047cab))
- *(actions)* Update github actions ([#&#8203;2632](seerr-team/seerr#2632)) - ([e25c1a5](seerr-team/seerr@e25c1a5))
- *(create-tag)* Correct quote style in commit message for tag preparation ([#&#8203;2593](seerr-team/seerr#2593)) - ([687f18b](seerr-team/seerr@687f18b))
- *(docker)* Release alias for major and minor version series ([#&#8203;2881](seerr-team/seerr#2881)) - ([1cc73a8](seerr-team/seerr@1cc73a8))
- *(i18n)* Update translations from Weblate - ([e85216a](seerr-team/seerr@e85216a))
- *(i18n)* Update translations from Weblate - ([b1adc79](seerr-team/seerr@b1adc79))
- *(i18n)* Update translations from Weblate ([#&#8203;2419](seerr-team/seerr#2419)) - ([4bd7c19](seerr-team/seerr@4bd7c19))
- *(pr-validation)* Make checklist box detection case-insensitive ([#&#8203;2802](seerr-team/seerr#2802)) - ([58514ec](seerr-team/seerr@58514ec))
- *(pr-validation)* Update pull request permissions to write for validation jobs ([#&#8203;2800](seerr-team/seerr#2800)) - ([986761f](seerr-team/seerr@986761f))
- *(pr-validation)* Disable package manager cache in nodejs setup ([#&#8203;2799](seerr-team/seerr#2799)) - ([67e27d5](seerr-team/seerr@67e27d5))
- *(release)* Prepare v3.2.0 - ([e0b2a1c](seerr-team/seerr@e0b2a1c))
- *(release)* Merge develop into main - ([c5800a0](seerr-team/seerr@c5800a0))
- Bump minimum required node version to 22.19.0 ([#&#8203;2873](seerr-team/seerr#2873)) - ([891265f](seerr-team/seerr@891265f))
- Add PR validation workflow and update contributing guidelines ([#&#8203;2777](seerr-team/seerr#2777)) - ([772e83d](seerr-team/seerr@772e83d))
- Upgrade to eslint v9 ([#&#8203;2574](seerr-team/seerr#2574)) - ([36243a0](seerr-team/seerr@36243a0))
- Ignore helm scope in git-cliff ([#&#8203;2638](seerr-team/seerr#2638)) - ([4d2b658](seerr-team/seerr@4d2b658))

##### New Contributors ❤️

- [@&#8203;aslafy-z](https://github.com/aslafy-z) made their first contribution
- [@&#8203;leereilly](https://github.com/leereilly) made their first contribution
- [@&#8203;jisef](https://github.com/jisef) made their first contribution
- [@&#8203;dougrathbone](https://github.com/dougrathbone) made their first contribution
- [@&#8203;bobziroll](https://github.com/bobziroll) made their first contribution
- [@&#8203;v3DJG6GL](https://github.com/v3DJG6GL) made their first contribution
- [@&#8203;Roboroads](https://github.com/Roboroads) made their first contribution
- [@&#8203;costajohnt](https://github.com/costajohnt) made their first contribution
- [@&#8203;tiagodefendi](https://github.com/tiagodefendi) made their first contribution
- [@&#8203;Jyasapara](https://github.com/Jyasapara) made their first contribution
- [@&#8203;Sym-jay](https://github.com/Sym-jay) made their first contribution
- [@&#8203;bibi0019](https://github.com/bibi0019) made their first contribution
- [@&#8203;redondos](https://github.com/redondos) made their first contribution
- [@&#8203;bogo22](https://github.com/bogo22) made their first contribution
- [@&#8203;jabloink](https://github.com/jabloink) made their first contribution
- [@&#8203;YakGravity](https://github.com/YakGravity) made their first contribution
- [@&#8203;dj0024javia](https://github.com/dj0024javia) made their first contribution
- [@&#8203;Jerra94](https://github.com/Jerra94) made their first contribution
- [@&#8203;its-wizza](https://github.com/its-wizza) made their first contribution
- [@&#8203;ventiph](https://github.com/ventiph) made their first contribution
- [@&#8203;RinZ27](https://github.com/RinZ27) made their first contribution<!-- generated by git-cliff -->

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these updates again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xMDEuMSIsInVwZGF0ZWRJblZlciI6IjQzLjEwMS4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJyZW5vdmF0ZS9jb250YWluZXIiLCJ0eXBlL21pbm9yIl19-->

Reviewed-on: https://git.erwanleboucher.dev/eleboucher/homelab/pulls/187
Co-authored-by: bot-owl <bot@erwanleboucher.dev>
Co-committed-by: bot-owl <bot@erwanleboucher.dev>
lucianchauvin pushed a commit to lucianchauvin/jellyseerr that referenced this pull request Apr 20, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Chore]: Upgrade to ESLint v9

5 participants