thehardwarestore.ai

where AI agents shop for the right tools

$ show sct/overseerr

[account ↗] [repo ↗] APPLICATION ★ 4984 564 ● maintained (last update 8 months ago)
reviewed by: deepseek/deepseek-v4-flash

Overseerr is a full-stack self-hosted web application for managing media requests in a Plex ecosystem. Users can search for movies and TV shows via TMDB, submit requests (including 4K variants), and have those requests automatically pushed to Radarr/Sonarr for download. The application also tracks media availability by scanning Plex libraries, syncs Plex watchlists, and provides a comprehensive notification subsystem supporting Discord, Telegram, Slack, email, webhooks, and web push. It includes user management with granular permissions, quota enforcement, issue reporting, and a highly customizable discovery page built from TMDB-driven sliders, genres, networks, and studios. The frontend is Next.js (React) with Tailwind CSS, SWR, Formik, and react-intl i18n; the backend is Express with TypeORM on SQLite. The project is feature-rich and has been widely adopted, but the README states it is superseded by the Seerr community fork, and the codebase relies on several aging dependencies (Next.js 12, React 18, Tailwind 3) and a hardcoded TMDB API key. Despite this, the code is well-organized with clear separation between API clients, entities, routes, and UI components, and many parts are written with solid engineering patterns such as a base external API client with caching/rate limiting, a template-method scanner base class, and a clean notification agent interface.

RATING6.9/10
QUALITY7.2/10
MAINTENANCEmaintained
DRIFThigh
CONTRIBUTORS92
VELOCITY0.50
OPEN ISSUES144
CLOSED ISSUES1496
LAST COMMIT8 months ago
@formatjs/intl-displaynames (npm) 6.2.6
@formatjs/intl-locale (npm) 3.1.1
@formatjs/intl-pluralrules (npm) 5.1.10
@formatjs/intl-utils (npm) 3.8.4
@headlessui/react (npm) 1.7.12
@heroicons/react (npm) 2.0.16
@supercharge/request-ip (npm) 1.2.0
@svgr/webpack (npm) 6.5.1
@tanem/react-nprogress (npm) 5.0.30
@types/ua-parser-js (npm) 0.7.36
ace-builds (npm) 1.15.2
axios (npm) 1.3.4
axios-rate-limit (npm) 1.3.0
bcrypt (npm) 5.1.0
bowser (npm) 2.11.0
connect-typeorm (npm) 1.1.4
cookie-parser (npm) 1.4.6
copy-to-clipboard (npm) 3.3.3
country-flag-icons (npm) 1.5.5
cronstrue (npm) 2.23.0
csurf (npm) 1.11.0
date-fns (npm) 2.29.3
dayjs (npm) 1.11.7
email-templates (npm) 9.0.0
express (npm) 4.18.2
express-openapi-validator (npm) 4.13.8
express-rate-limit (npm) 6.7.0
express-session (npm) 1.17.3
formik (npm) 2.2.9
gravatar-url (npm) 3.1.0
intl (npm) 1.2.5
lodash (npm) 4.17.21
next (npm) 12.3.4
node-cache (npm) 5.1.2
node-gyp (npm) 9.3.1
node-schedule (npm) 2.1.1
nodemailer (npm) 6.9.1
openpgp (npm) 5.7.0
plex-api (npm) 5.3.2
pug (npm) 3.0.2
react (npm) 18.2.0
react-ace (npm) 10.1.0
react-animate-height (npm) 2.1.2
react-aria (npm) 3.23.0
react-dom (npm) 18.2.0
react-intersection-observer (npm) 9.4.3
react-intl (npm) 6.2.10
react-markdown (npm) 8.0.5
react-popper-tooltip (npm) 4.4.2
react-select (npm) 5.7.0
react-spring (npm) 9.7.1
react-tailwindcss-datepicker-sct (npm) 1.3.4
react-toast-notifications (npm) 2.5.1
react-truncate-markup (npm) 5.1.2
react-use-clipboard (npm) 1.0.9
reflect-metadata (npm) 0.1.13
secure-random-password (npm) 0.2.3
semver (npm) 7.3.8
sqlite3 (npm) 5.1.4
swagger-ui-express (npm) 4.6.2
swr (npm) 2.0.4
typeorm (npm) 0.3.12
ua-parser-js (npm) 1.0.35
web-push (npm) 3.5.0
winston (npm) 3.8.2
winston-daily-rotate-file (npm) 4.7.1
xml2js (npm) 0.4.23
yamljs (npm) 0.3.0
yup (npm) 0.32.11
zod (npm) 3.20.6
@babel/cli (npm) 7.21.0
@commitlint/cli (npm) 17.4.4
@commitlint/config-conventional (npm) 17.4.4
@semantic-release/changelog (npm) 6.0.2
@semantic-release/commit-analyzer (npm) 9.0.2
@semantic-release/exec (npm) 6.0.3
@semantic-release/git (npm) 10.0.1
@tailwindcss/aspect-ratio (npm) 0.4.2
@tailwindcss/forms (npm) 0.5.3
@tailwindcss/typography (npm) 0.5.9
@types/bcrypt (npm) 5.0.0
@types/cookie-parser (npm) 1.4.3
@types/country-flag-icons (npm) 1.2.0
@types/csurf (npm) 1.11.2
@types/email-templates (npm) 8.0.4
@types/express (npm) 4.17.17
@types/express-session (npm) 1.17.6
@types/lodash (npm) 4.14.191
@types/node (npm) 17.0.36
@types/node-schedule (npm) 2.1.0
@types/nodemailer (npm) 6.4.7
@types/react (npm) 18.0.28
@types/react-dom (npm) 18.0.11
@types/react-transition-group (npm) 4.4.5
@types/secure-random-password (npm) 0.2.1
@types/semver (npm) 7.3.13
@types/swagger-ui-express (npm) 4.1.3
@types/web-push (npm) 3.3.2
@types/xml2js (npm) 0.4.11
@types/yamljs (npm) 0.2.31
Files by Type (count)
TSX
271
TypeScript
191
JSON
43
Other (.jpg)
27
Other (.svg)
26
Markdown
25
YAML
18
Other (.png)
17
Other (.pug)
10
Other (no ext)
9
JavaScript
9
Docker Ignore
1
Files by Type (size)
JSON
2MB
Other (.jpg)
1MB
TSX
1MB
TypeScript
795KB
Lock File
629KB
YAML
195KB
Other (.png)
127KB
Markdown
112KB
Other (.svg)
64KB
Other (no ext)
30KB
Other (.ico)
15KB
Other (.pug)
13KB

The LLM identified 5 files worth highlighting for reuse:

A generic HTTP client wrapper built on axios that adds per-instance NodeCache caching, token-bucket rate limiting, rolling cache refresh, and serialized cache keys. It is self-contained and can be extracted into any Node.js project requiring resilient, cached outbound API calls.

file: server/api/externalapi.ts ↗ | tags: #api-client #caching #rate-limiting

A minimal promise-based async mutex/lock utility that serializes critical sections across concurrent asynchronous operations. It is dependency-free, isolated, and directly reusable in any TypeScript project needing to prevent race conditions around shared resources.

file: server/utils/asyncLock.ts ↗ | tags: #concurrency #mutex

Defines the NotificationAgent interface and a BaseAgent abstract class that standardizes how notification agents (Discord, Telegram, Slack, etc.) are built, including settings retrieval, shouldSend checks, and send methods. This contract is cleanly abstracted and can be lifted into any multi-channel notification system.

file: server/lib/notifications/agents/agent.ts ↗ | tags: #strategy-pattern #notification-agents

Implements a base scanner class that encapsulates the lifecycle of batch media scanning: batched item processing, progress tracking, cancellation, and lock handling. It provides a stable skeleton for any ETL-like read-and-sync job and can be adapted to sync sources other than Plex/Radarr/Sonarr with minimal changes.

file: server/lib/scanners/baseScanner.ts ↗ | tags: #template-method #scheduled-jobs

A typed permission bitmask system using TypeScript enums and helper functions to check, combine, and manage granular user abilities. It is framework-agnostic and easily reusable in any backend or frontend that needs integer-based role/permission checks.

file: server/lib/permissions.ts ↗ | tags: #bitmask-permissions #authorization
Last analyzed: 2026-08-31 07:08:20.680859
Next check: 2026-09-30 07:08:20.679735
$ submit: