A modern, self-hosted movie collection manager. Built on lessons learned from the *arr ecosystem — lightweight, fast, and designed from scratch in Go and React.
$ docker run -d -p 8282:8282 -v data:/config ghcr.io/luminarr/luminarr
Each preset combines resolution, source, codec, and HDR into one line. Check the ones you want, pick a cutoff, and you're done — no scoring rules to write.
| Resolution | Source | Codec | HDR | |
|---|---|---|---|---|
| 1080p | WEBDL | x264 | None | ✓ |
| 1080p | WEBRip | x265 | None | ✓ |
| 1080p | Bluray | x265 | None | ✓ |
| 1080p | Remux | x265 | None |
Poster grid or list view. Filter by status, quality, library, and search. TMDB metadata, cast, and posters.
RSS sync, automatic grabbing, downloading, and importing. File renaming, bulk editor, blocklist, and backup/restore built in.
No analytics, no crash reports, no update checks, no phone home. Credentials use a Secret type that redacts in all output.
Import quality profiles, libraries, indexers, download clients, and your entire movie list from a running Radarr instance.
qBittorrent, Deluge, Transmission, SABnzbd, and NZBGet. Per-indexer seed ratio and time limits for private trackers. Live queue with WebSocket updates.
Optional ffprobe integration verifies actual codec, resolution, and HDR. Flags mislabelled releases with a mismatch badge.
Discord, Slack, Telegram, Gotify, ntfy, Pushover, webhook, email, and custom scripts. Subscribe each channel to specific events.
Monthly calendar colour-coded by status. Wanted page shows missing and cutoff-unmet movies. Manual search with release comparison.
Decade distribution, collection growth, genre breakdown, quality and storage charts. Interactive dashboards powered by Recharts.
Compare your Plex, Emby, or Jellyfin library against Luminarr. See what's missing on each side and import with one click. Auto-refresh on import.
Execute any code when events happen. Bash, Python, Ruby — your script, your language. Full guide →
Constant-time auth, WebSocket auth, SSRF protection, path traversal checks, secret redaction, CSP headers. Security model →
In-memory ring buffer captures the last 1,000 log entries. View them in the UI with level filtering, color-coded badges, and auto-refresh. No external logging stack needed.
Radarr pioneered automated movie management. Luminarr builds on that foundation with a fresh tech stack, different trade-offs, and a few ideas of our own.
| Radarr | Luminarr | |
|---|---|---|
| Backend | .NET / Mono | Go |
| Frontend | Angular | React |
| Database | SQLite / Postgres | SQLite |
| Memory (idle) | 300 – 500 MB | 30 – 60 MB |
| Startup time | 10 – 30 s | < 1 s |
| Quality system | Custom Formats + scoring | Explicit codec & HDR |
| Telemetry | Optional analytics | None |
| Download clients | 6 clients | 5 (qBit, Deluge, Transmission, SAB, NZBGet) |
| Notifications | 7 channels | 9 channels + custom scripts |
| Media server sync | — | Plex, Emby, Jellyfin |
| Migration | — | One-click import from Radarr |
| Ecosystem | — | Radarr v3 API built in |
Radarr keeps running during the import. There's no cutover moment. Take your time, verify everything, then switch when you're ready.
Enter your Radarr URL and API key
See everything Luminarr found
Pick what to bring over and click Import
Profiles, libraries, indexers, clients, movies — all there
Luminarr speaks Radarr's API. Point your tools at Luminarr and they just work — no native integrations needed.
Request movies, sync libraries, manage quality profiles
Movie count, queue status, and activity widgets
Sensors for library size, queue depth, and download status
Any app with a Radarr integration section works out of the box
Pick your method. No keys to configure — just start and go.
services: luminarr: image: ghcr.io/luminarr/luminarr:latest ports: - "8282:8282" volumes: - /path/to/config:/config - /path/to/movies:/movies restart: unless-stopped
$ docker run -d \ --name luminarr \ -p 8282:8282 \ -v /path/to/config:/config \ -v /path/to/movies:/movies \ --restart unless-stopped \ ghcr.io/luminarr/luminarr:latest
apiVersion: apps/v1 kind: Deployment metadata: name: luminarr spec: replicas: 1 selector: matchLabels: app: luminarr template: metadata: labels: app: luminarr spec: containers: - name: luminarr image: ghcr.io/luminarr/luminarr:latest ports: - containerPort: 8282 volumeMounts: - name: config mountPath: /config - name: movies mountPath: /movies volumes: - name: config persistentVolumeClaim: claimName: luminarr-config - name: movies persistentVolumeClaim: claimName: luminarr-movies
# Download the latest release $ curl -Lo luminarr \ https://github.com/luminarr/luminarr/releases/latest/download/luminarr-linux-amd64 $ chmod +x luminarr # Run it $ ./luminarr
Open http://localhost:8282 and you're good to go.
Luminarr connects only to services you explicitly configure. Nothing else.
No usage data, events, or analytics are sent anywhere. Errors are logged locally only.
Errors are logged locally and viewable in the built-in log viewer. No Sentry, no Bugsnag, no third-party services.
Luminarr never contacts any server to check for updates. You update when you choose to.
A Secret type renders as *** in all log output and JSON serialization. Keys never leak.
Luminarr was built with Claude as the primary code generator, with human design and review throughout. We think that's worth being upfront about.
Every architectural decision was made by a human and documented
Security-sensitive code was explicitly designed and reviewed
Consistent patterns throughout — no style drift halfway through
600+ tests across 42 packages — unit tests, plugin tests, and 59 API integration tests run on every change
MIT licensed. One binary. Takes 60 seconds to set up.