MCPcopy Index your code
hub / github.com/Arediss/Oscarr

github.com/Arediss/Oscarr @v0.8.3

Chat with this repo
repository ↗ · DeepWiki ↗ · release v0.8.3 ↗ · + Follow
1,633 symbols 4,643 edges 329 files 75 documented · 5%
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

Oscarr

Oscarr

A modern, self-hosted media request & management platform.

Radarr & Sonarr are the source of truth. Oscarr is the interface.

Version License PRs Welcome Discord

Quality Gate Security Rating Reliability Rating Maintainability Rating

Oscarr Preview

The idea · Core capabilities · Seerr API · Installation · Plugins · Contributing


Oscarr is a lightweight, plugin-first media request interface for Radarr and Sonarr.

It gives your users a clean way to request movies and shows without exposing the *arr admin panels. Authentication, routing, quality, notifications, and a polished UI are baked into the core — the rest grows through plugins.

If Seerr / Overseerr / Jellyseerr already fits your setup, keep using it. Oscarr is for people who want something more modular, hackable, and easier to extend around their own stack.


The idea

Oscarr sits on top of your existing media stack.

  • Your users get a simple request interface.
  • Your Radarr/Sonarr instances stay central to the request, download, and import workflow.
  • Your setup grows through plugins instead of stuffing every feature into the core.

The philosophy:

  • keep the core lean;
  • avoid the "all-in-one" trap;
  • let plugins handle specific integrations and custom workflows;
  • make the app easy to self-host, customise, and extend.

Core capabilities

What ships in the core, no plugin needed:

  • Multi-instance Radarr & Sonarr with priority-based folder rules (genre, language, country, user, role, keyword tag) so a 4K library, an anime Sonarr and a regional Radarr coexist naturally.
  • Quality selection for users — SD / HD / 4K / 4K HDR mapped to specific *arr profiles per service, with role-based gating.
  • Multi-provider auth — Email + password, Plex OAuth, Jellyfin, Emby, Discord. Each provider toggleable independently.
  • AES-256-GCM encryption at rest for stored service credentials. Master key derived from the OSCARR_SECRET_KEY env var via HKDF-SHA256.
  • Per-app API keys with revocation (Admin → Access → API Keys) so each external integration gets its own scoped credential.
  • Seerr-compatible API at /api/v1/* so existing Seerr-aware tools can talk to Oscarr without a custom integration. See below.
  • Customisable admin dashboard with drag-and-drop widgets and multi-tab layout.
  • Notification matrix (Discord, Telegram, Email) per event type, plus VAPID web push.
  • Backups with HMAC-signed archives and a re-auth gate before restore.
  • i18n — EN + FR shipped, more locales contribution-friendly.
  • PWA — installable, offline-tolerant.

Seerr-compatible API

Oscarr exposes an experimental Seerr-compatible API layer at /api/v1/*, so third-party tools that already speak Overseerr / Jellyseerr / Seerr can point to Oscarr without waiting for a native Oscarr integration.

Tested clients:

  • Homarr (dashboard widget integration)
  • Doplarr (Discord request bot)

Each external app gets its own revokable API key from Admin → Access → API Keys. Endpoints not yet implemented return a clean 501 Not Implemented so clients degrade gracefully instead of hanging.

Compatibility is best-effort and limited to the endpoints third-party clients commonly call (status, auth/me, search, request, media, movie/tv, settings, user). Oscarr is not affiliated with Overseerr, Jellyseerr or Seerr — this is interoperability, not a clone.


Installation

Quick Start with Docker

Generate a secret key (32-byte hex) — keep it safe, lose it = stored credentials unrecoverable:

node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
services:
  oscarr:
    image: ghcr.io/arediss/oscarr:latest
    container_name: oscarr
    restart: unless-stopped
    network_mode: host
    volumes:
      - oscarr-data:/data
    environment:
      - JWT_SECRET=your_random_jwt_secret
      - OSCARR_SECRET_KEY=your_64_hex_chars_key

volumes:
  oscarr-data:
docker compose up -d

Open http://localhost:3456 and follow the setup wizard.

network_mode: host lets Oscarr reach Radarr/Sonarr/Plex on the local network. If OSCARR_SECRET_KEY is missing or malformed, the container exits at boot with a friendly message + a freshly-generated key you can copy-paste.

macOS Docker Desktop caveat: containers can't reach LAN IPs even with --network host. Use Colima locally, or deploy to a Linux host for end-to-end testing.

Manual / development install

See docs/installation.md for bare-metal, dev mode, full env-var reference, and the project structure walkthrough.


Plugins

Plugins are optional. The base app works out of the box: connect Radarr/Sonarr, configure your users, request media.

Plugins exist so Oscarr can grow around your own setup — think browser extensions: install what you need, ignore the rest.

Featured plugins

Plugin What it does
Leonarr Discord bridge: link accounts, search TMDB, submit requests with slash commands, DMs when media is ready.
Subscription Per-user subscription tiers with automatic role changes and expiration notifications.
Communication Broadcast markdown announcements with scheduled publishing, role targeting, severity levels.
qBittorrent Manager View qBittorrent queue and transfer stats inside Oscarr.
Radarr Manager Library browser, quality monitoring, releases, analytics, file management.
Sonarr Manager Series browser, season/episode drill-down, releases, analytics, file management.
Support Ticket system extracted from the core in 0.8.0 — users open tickets, admins reply.

Discover and install from Admin → Plugins → Discover. Each install shows the manifest's requested capabilities so you can review what the plugin is allowed to do.

Building a plugin? See docs/plugins.md.


Verifying image provenance

Published ghcr.io/arediss/oscarr images are keyless-signed by the GitHub Actions release workflow (Sigstore / cosign). Each signed manifest also carries an SPDX SBOM.

cosign verify ghcr.io/arediss/oscarr:latest \
  --certificate-identity-regexp 'https://github.com/arediss/Oscarr/.github/workflows/release.yml@.*' \
  --certificate-oidc-issuer https://token.actions.githubusercontent.com

Any image without a valid signature from this workflow is not an official Oscarr release.


Contributing

Contributions welcome — bug reports, features, plugins, real-stack testing.

Before opening a large PR, please open an issue first so we can discuss the direction.

Development workflow — This project uses Claude Code as a dev assistant for code reviews, security audits, brainstorming, documentation, and issue/PR management. All architecture decisions and implementation are made by the maintainers — Claude serves as a quality and productivity tool, much like a linter or a CI pipeline.


License

MIT

Extension points exported contracts — how you extend this code

ArrClient (Interface)
(no doc) [3 implementers]
packages/backend/src/providers/types.ts
UserProviderInfo (Interface)
(no doc)
packages/frontend/src/types/index.ts
PluginMedia (Interface)
(no doc)
packages/shared/src/pluginContext.ts
RetryOptions (Interface)
Retry helper for external HTTP calls (TMDB, *arr, GitHub, web-push, Discord OAuth). * * Retries once after a short ba
packages/backend/src/utils/fetchWithRetry.ts
User (Interface)
(no doc)
packages/frontend/src/types/index.ts
PluginMediaRequest (Interface)
(no doc)
packages/shared/src/pluginContext.ts
AuthResult (Interface)
* Email is an auth-only provider: no media-service counterpart, no OAuth redirect flow. * Login is served by the generi
packages/backend/src/providers/email/index.ts
AdminUser (Interface)
(no doc)
packages/frontend/src/types/index.ts

Core symbols most depended-on inside this repo

t
called by 1090
packages/frontend/public/_plugin-runtime/oscarr.js
send
called by 388
packages/backend/src/notifications/types.ts
get
called by 378
packages/backend/src/plugins/router.ts
logEvent
called by 152
packages/backend/src/utils/logEvent.ts
post
called by 134
packages/backend/src/plugins/router.ts
set
called by 99
packages/backend/src/plugins/storage/kv.ts
delete
called by 95
packages/backend/src/plugins/router.ts
put
called by 60
packages/backend/src/plugins/router.ts

Shape

Function 1,037
Interface 360
Method 210
Class 26

Languages

TypeScript100%

Modules by API surface

packages/backend/src/providers/types.ts52 symbols
packages/backend/src/plugins/context/v1.ts46 symbols
packages/backend/src/providers/sonarr/client.ts37 symbols
packages/backend/src/plugins/types.ts37 symbols
packages/backend/src/providers/radarr/client.ts32 symbols
packages/backend/src/services/tmdb.ts27 symbols
packages/backend/src/plugins/engine.ts27 symbols
packages/frontend/src/pages/admin/RoutingRulesTab.tsx25 symbols
packages/frontend/src/components/account/AvatarEditor.tsx24 symbols
packages/backend/src/plugins/registry.ts18 symbols
packages/frontend/src/pages/admin/UsersTab.tsx17 symbols
packages/frontend/src/pages/admin/dashboard/DashboardGrid.tsx16 symbols

For agents

$ claude mcp add Oscarr \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact