# Technical Documentation: seerr-team/seerr

> ℹ️ **Provenance:** Multi-Tier Ingestion · [CodeWiki Reference](https://codewiki.google/github.com/seerr-team/seerr)

### Overview (README.md)

<p align="center">
<img src="./public/logo_full.svg" alt="Seerr" style="margin: 20px 0;">
</p>
<p align="center">
<img src="https://github.com/seerr-team/seerr/actions/workflows/release.yml/badge.svg" alt="Seerr Release" />
<img src="https://github.com/seerr-team/seerr/actions/workflows/ci.yml/badge.svg" alt="Seerr CI">
</p>
<p align="center">
<a href="https://discord.gg/seerr"><img src="https://img.shields.io/discord/783137440809746482" alt="Discord"></a>
<a href="https://hub.docker.com/r/seerr/seerr"><img src="https://img.shields.io/docker/pulls/seerr/seerr" alt="Docker pulls"></a>
<a href="https://translate.seerr.dev/engage/seerr/"><img src="https://translate.seerr.dev/widget/seerr/svg-badge.svg" alt="Translation status" /></a>
<a href="https://github.com/seerr-team/seerr/blob/develop/LICENSE"><img alt="GitHub" src="https://img.shields.io/github/license/seerr-team/seerr"></a>

**Seerr** is a free and open source software application for managing requests for your media library. It integrates with the media server of your choice: [Jellyfin](https://jellyfin.org), [Plex](https://plex.tv), and [Emby](https://emby.media/). In addition, it integrates with your existing services, such as **[Sonarr](https://sonarr.tv/)**, **[Radarr](https://radarr.video/)**.

## Current Features

- Full Jellyfin/Emby/Plex integration including authentication with user import & management.
- Support for **PostgreSQL** and **SQLite** databases.
- Supports Movies, Shows and Mixed Libraries.
- Ability to change email addresses for SMTP purposes.
- Easy integration with your existing services. Currently, Seerr supports Sonarr and Radarr. More to come!
- Jellyfin/Emby/Plex library scan, to keep track of the titles which are already available.
- Customizable request system, which allows users to request individual seasons or movies in a friendly, easy-to-use interface.
- Incredibly simple request management UI. Don't dig through the app to simply approve recent requests!
- Granular permission system.
- Support for various notification agents.
- Mobile-friendly design, for when you need to approve requests on the go!
- Support for watchlisting & blocklisting media.

With more features on the way! Check out our [issue tracker](/../../issues) to see the features which have already been requested.

## Getting Started

Check out our documentation for instructions on how to install and run Seerr:

https://docs.seerr.dev/getting-started/

## Preview

<img src="./public/preview.jpg" alt="Seerr application preview" />

## Migrating from Overseerr/Jellyseerr to Seerr

Read our [release announcement](https://docs.seerr.dev/blog/seerr-release) to learn what Seerr means for Jellyseerr and Overseerr users.

Please follow our [migration guide](https://docs.seerr.dev/migration-guide) for detailed instructions on migrating from Overseerr or Jellyseerr.

## Support

- Check out the [Seerr Documentation](https://docs.seerr.dev) before asking for help. Your question might already be in the docs!
- You can get support on [Discord](https://discord.gg/seerr).
- You can ask questions in the Help category of our [GitHub Discussions](/../../discussions).
- Bug reports and feature requests can be submitted via [GitHub Issues](/../../issues).

## API Documentation

You can access the API documentation from your local Seerr install at http://localhost:5055/api-docs

## Community

You can ask questions, share ideas, and more in [GitHub Discussions](/../../discussions).

If you would like to chat with other members of our growing community, [join the Seerr Discord server](https://discord.gg/seerr)!

Our [Code of Conduct](./CODE_OF_CONDUCT.md) applies to all Seerr community channels.

## Contributing

You can help improve Seerr too! Check out our [Contribution Guide](./CONTRIBUTING.md) to get started.

## Contributors ✨

[](https://opencollective.com/seerr/#backers)

[](https://opencollective.com/seerr/#backers)
[](https://opencollective.com/seerr/#sponsors)

---

### README (`docs/README.md`)

---
slug: /
sidebar_position: 1
---

# Introduction

Welcome to the Seerr Documentation.

**Seerr** is a free and open source software application for managing requests for your media library. It integrates with the media server of your choice: [Jellyfin](https://jellyfin.org), [Plex](https://plex.tv), and [Emby](https://emby.media/). In addition, it integrates with your existing services, such as **[Sonarr](https://sonarr.tv/)**, **[Radarr](https://radarr.video/)**.

## Features

- **Full Jellyfin/Emby/Plex integration**. Login and manage user access with Jellyfin/Emby/Plex.
- **Syncs to your Jellyfin/Emby/Plex library** to show what titles you already have.
- Supports Movies, Shows and Mixed Libraries.
- **Integrates with Sonarr and Radarr**. With more services to come in the future.
- Optionally set **Override rules** for requests to match with your defined conditions.
- **Easy to use request system** allowing users to request individual seasons or movies in a friendly, clean UI.
- **Simple request management UI**. Don't dig through the app to approve recent requests.
- **Mobile-friendly design**, for when you need to approve requests on the go.
- Granular permission system.
- Localization into other languages.
- Support for **PostgreSQL** and **SQLite** databases.
- Support for various notification agents.
- Easily **Watchlist** or **Blocklist** media.
- More features to come!

## We need your help!

[Seerr](https://github.com/seerr-team/seerr) is an ambitious project developers/contributors poured a lot of work into, and we still have a lot more to do. Seerr is the result of a collaborative effort between the original Overseerr project and the Jellyseerr fork, created to deliver an excellent request management solution for Plex, Jellyfin and Emby users.

We value your feedback and support in identifying and fixing bugs to make Seerr even better. As an open-source project, we welcome contributions from everyone. Contribution includes building new features, patching bugs, translating the application, or even just writing documentation.

If you would like to contribute, please be sure to review our [contribution guidelines](https://github.com/seerr-team/seerr/blob/develop/CONTRIBUTING.md).

---

### Getting Started Index (`docs/getting-started/index.mdx`)

---
title: Getting Started
---
import DocCardList from '@theme/DocCardList';

:::info
After running Seerr for the first time, configure it by visiting the web UI at `http://[address]:5055` and completing the setup steps.
:::

<DocCardList />

---

### Getting Started Third Parties Index (`docs/getting-started/third-parties/index.mdx`)

---
title: Third-party Installation Methods
---
import DocCardList from '@theme/DocCardList';

:::warning
Third-party installation methods are maintained by the community. The Seerr team is not responsible for these packages.
:::

:::info
Want to add a third-party installation method? Contributions are welcome! Feel free to open a pull request.
:::


<DocCardList />

---

### Using Seerr Advanced Index (`docs/using-seerr/advanced/index.mdx`)

---
title: Advanced Features
description: Advanced configuration and use cases.
sidebar_position: 6
---

# Advanced Features

## Advanced Configuration and Use Cases

Seerr currently offers advanced features for power users and specific use cases:

import DocCardList from '@theme/DocCardList';

<DocCardList />

---

### Using Seerr Notifications Index (`docs/using-seerr/notifications/index.mdx`)

---
title: Notifications
description: Configure notifications for your users.
sidebar_position: 3
---

# Notifications

## Supported Notification Agents

Seerr currently supports the following notification agents:

import DocCardList from '@theme/DocCardList';

<DocCardList />

## Setting Up Notifications

Simply configure your desired notification agents in **Settings -> Notifications** in the Seerr web UI.

Users can customize their notification preferences in their own user notification settings.

## Requesting New Notification Agents

If we do not currently support your preferred notification agent, feel free to [submit a feature request on GitHub](https://github.com/seerr-team/seerr/issues). However, please be sure to search first and confirm that there is not already an existing request for the agent!

---

### Using Seerr Plex Index (`docs/using-seerr/plex/index.md`)

---
title: Overview
description: Learn about Seerr's Plex integration features
sidebar_position: 1
---

# Plex Features Overview

Seerr provides integration features that connect with your Plex media server to automate media management tasks.

## Available Features

- [Watchlist Auto Request](./watchlist-auto-request) - Automatically request media from your Plex Watchlist
- More features coming soon!

## Prerequisites

:::info Authentication Required
To use any Plex integration features, you must have logged into Seerr at least once with your Plex account.
:::

**Requirements:**
- Plex account with access to the configured Plex server
- Seerr configured with Plex as the media server
- User authentication via Plex login
- Appropriate user permissions for specific features

## Getting Started

1. Authenticate at least once using your Plex credentials
2. Verify you have the necessary permissions for desired features
3. Follow individual feature guides for setup instructions

:::note Server Configuration
Plex server configuration is handled by your administrator. If you cannot log in with your Plex account, contact your administrator to verify the server setup.
:::

---

### Migration Guide (`docs/migration-guide.mdx`)

---
title: Migration guide
---

import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';

:::important
Read our [release announcement](/blog/seerr-release) to learn what Seerr means for Jellyseerr and Overseerr users.
:::

Whether you come from Overseerr or Jellyseerr, you don't need to perform any manual migration steps, your instance will automatically be migrated to Seerr.
This migration will run automatically the first time you start your instance using the Seerr codebase (Docker image or source build or Kubernetes, etc.).
An additional migration will happen for Overseerr users, to migrate their configuration to the new codebase.

:::danger
Before doing anything you should backup your existing instance so that you can rollback in case something goes wrong.
See [Backups](/using-seerr/backups) for details on how to properly backup your instance.
:::

:::warning
Installation methods are now divided into two categories: official and third-party methods.
The Seerr team is only responsible for official installation methods, while third-party methods are maintained by the community.
Some methods are currently not maintained, but this does not mean they are permanently discontinued. The community may restore and support them if they choose to do so.

- **Snap package:** Not maintained
:::

## Docker
Refer to [Seerr Docker Documentation](/getting-started/docker), all of our examples have been updated to reflect the below change.

:::info
Seerr provides a secure, fully featured image with everything you need included.
We sincerely appreciate the past contributions from third-party maintainers, which helped enhance this image and its capabilities.
To maintain consistency and security, we encourage everyone to use the features available in the official Seerr image.
If you feel something is missing, please submit a feature request—your feedback is always welcome!

Our Docker images are available with the following tags:

- `latest`: Always points to the most recent stable release.
- Version tags (e.g., `v3.0.0`): For specific stable versions.
- Major version aliases (e.g., `v3`): Alias for the latest stable release in the respective major version series.
- Minor version aliases (e.g., `v3.0`): Alias for the latest stable release in the respective minor version series.
- `develop`: Rolling release/nightly builds for using the latest changes (use with caution).
:::

Changes :
- Renamed all references from `overseerr` or `jellyseerr` to `seerr`.
- The container image reference has been updated.
- The container can now be run as a non-root user (`node` user); remove the `user` directive if you have configured it.
- The container no longer provides an init process, so you must configure it by adding `init: true` for Docker Compose or `--init` for the Docker CLI.

#### Config folder permissions
:::info
Since the container now runs as the `node` user (UID 1000), you must ensure your config folder has the correct permissions. The `node` user must have read and write access to the `/app/config` directory.

If you're migrating from a previous installation, you may need to update the ownership of your config folder:

```bash
docker run --rm -v /path/to/appdata/config:/data alpine chown -R 1000:1000 /data
```

This ensures the `node` user (UID 1000) owns the config directory and can read and write to it.
:::

### Unix

Summary of changes :
<Tabs groupId="docker-methods" queryString>
  <TabItem value="docker-compose" label="Docker compose">
  ```yaml {3-6}
  ---
  services:
    seerr:
      image: ghcr.io/seerr-team/seerr:latest
      init: true
      container_name: seerr
      environment:
        - LOG_LEVEL=debug
        - TZ=Asia/Tashkent
        - PORT=5055 #optional
      ports:
        - 5055:5055
      volumes:
        - /path/to/appdata/config:/app/config
      healthcheck:
        test: wget --no-verbose --tries=1 --spider http://localhost:5055/api/v1/settings/public || exit 1
        start_period: 20s
        timeout: 3s
        interval: 15s
        retries: 3
      restart: unless-stopped
  ```
  </TabItem>
  <TabItem value="docker-cli" label="Docker CLI">
  ```bash {2-3,10}
  docker run -d \
    --name seerr \
    --init \
    -e LOG_LEVEL=debug \
    -e TZ=Asia/Tashkent \
    -e PORT=5055 \
    -p 5055:5055 \
    -v /path/to/appdata/config:/app/config \
    --restart unless-stopped \
    ghcr.io/seerr-team/seerr:latest
  ```
  </TabItem>
</Tabs>

### Windows

Summary of changes :
<Tabs groupId="docker-methods" queryString>
  <TabItem value="docker-compose" label="Docker compose">
  ```yaml {3-6,13,23}
  ---
  services:
    seerr:
      image: ghcr.io/seerr-team/seerr:latest
      init: true
      container_name: seerr
      environment:
        - LOG_LEVEL=debug
        - TZ=Asia/Tashkent
      ports:
        - 5055:5055
      volumes:
        - seerr-data:/app/config
      healthcheck:
        test: wget --no-verbose --tries=1 --spider http://localhost:5055/api/v1/settings/public || exit 1
        start_period: 20s
        timeout: 3s
        interval: 15s
        retries: 3
      restart: unless-stopped

  volumes:
    seerr-data:
      external: true
  ```
  </TabItem>
  <TabItem value="docker-cli" label="Docker CLI (PowerShell)">
  ```powershell {2-3,8,10}
  docker run -d `
    --name seerr `
    --init `
    -e LOG_LEVEL=debug `
    -e TZ=Asia/Tashkent `
    -e PORT=5055 `
    -p 5055:5055 `
    -v seerr-data:/app/config `
    --restart unless-stopped `
    ghcr.io/seerr-team/seerr:latest
  ```
  </TabItem>

  <TabItem value="docker-cli-cmd" label="Docker CLI (CMD)">
  ```batch {2-3,8,10}
  docker run -d ^
    --name seerr ^
    --init ^
    -e LOG_LEVEL=debug ^
    -e TZ=Asia/Tashkent ^
    -e PORT=5055 ^
    -p 5055:5055 ^
    -v seerr-data:/app/config ^
    --restart unless-stopped ^
    ghcr.io/seerr-team/seerr:latest
  ```
  </TabItem>
</Tabs>


## Build From Source
Refer to [Seerr Build From Source Documentation](/getting-started/buildfromsource), all of our examples have been updated to reflect the below change.

Install from scratch by following the documentation, restore your data as described in [Backups](/using-seerr/backups), and then start Seerr. No additional steps are required.

## Kubernetes
Refer to [Seerr Kubernetes Documentation](/getting-started/kubernetes), all of our examples have been updated to reflect the below change.

Changes :
- All references to `jellyseerr` have been renamed to `seerr` in the manifests.
- The container image reference has been updated.
- The default `securityContext` and `podSecurityContext` have been updated to support running the container without root permissions.

Summary of changes :
<Tabs groupId="kubernetes-values" queryString>
  <TabItem value="old" label="Old values">
  ```yaml
  image:
    repository: fallenbagel/jellyseerr
  podSecurityContext: {}
  securityContext: {}
  ```
  </TabItem>
  <TabItem value="new" label="New values">
  ```yaml
  image:
    repository: seerr-team/seerr
  podSecurityContext:
    fsGroup: 1000
    fsGroupChangePolicy: OnRootMismatch
  securityContext:
    allowPrivilegeEscalation: false
    capabilities:
      drop:
        - ALL
    readOnlyRootFilesystem: false
    runAsNonRoot: true
    privileged: false
    runAsUser: 1000
    runAsGroup: 1000
    seccompProfile:
      type: RuntimeDefault
  ```
  </TabItem>
</Tabs>

## Nix

Refer to [Seerr Documentation](/getting-started/nixpkg), all of our examples have been updated to reflect the below change.

The Seerr service and package are available as of the 26.05 release.

## Third-party installation methods

:::warning
Third-party installation methods are maintained by the community. The Seerr team is not responsible for these packages.
:::

### AUR

See https://aur.archlinux.org/packages/seerr

### TrueNAS

Refer to [Seerr TrueNAS Documentation](/getting-started/third-parties/truenas), all of our examples have been updated to reflect the below change.

For detailed community-maintained TrueNAS SCALE walkthroughs, see the [Host Path setup](https://github.com/truenas/apps/issues/3374#issuecomment-3916418872) and [ixVolume setup](https://github.com/truenas/apps/issues/3374#issuecomment-3916700870) guides.

<Tabs groupId="truenas-migration" queryString>
  <TabItem value="hostpath" label="Host Path">
    **This guide describes how to migrate from Host Path storage (not ixVolume).**
    1. Stop Jellyseerr/Overseerr
    2. Install Seerr and use the same Host Path storage that was used by Jellyseerr/Overseerr
    3. Start Seerr app
    4. Delete Jellyseerr/Overseerr app
  </TabItem>
  <TabItem value="ixvolume" label="ixVolume">
    **This guide describes how to migrate from ixVolume storage (not Host Path).**
    1. Stop Jellyseerr/Overseerr
    2. Create a dataset for Seerr
          If your apps normally store data under something like:
          ```
          /mnt/storage/<app-name>
          ```
          then create a dataset named:
          ```
          storage/seerr
          ```
          resulting in:
          ```
          /mnt/storage/seerr
          ```
    3. Copy ixVolume Data
          Open System Settings → Shell, or SSH into your TrueNAS server as root and run :
          ```bash
          rsync -av --chown=568:568 /mnt/.ix-apps/app_mounts/jellyseerr/ /mnt/storage/seerr/
          ```
    4. Install Seerr and use the same Host Path storage that was created before (`/mnt/storage/seerr/config` in our example)
    5. Start Seerr app
    6. Delete Jellyseerr/Overseerr app
  </TabItem>
</Tabs>

### Unraid

Refer to [Seerr Unraid Documentation](/getting-started/third-parties/unraid), all of our examples have been updated to reflect the below change.

Seerr will automatically migrate your existing Overseerr or Jellyseerr data on first startup. No manual database migration is needed.

**1. Stop the existing container**
In the Unraid **Docker** tab, stop your Overseerr (or Jellyseerr) container.
**⚠️ Do not remove the container or delete the appdata folder yet ⚠️**

**2. Copy existing data to Seerr appdata**
Open the Unraid terminal and copy your existing appdata folder into the new Seerr appdata directory:
```bash
cp -a /mnt/user/appdata/overseerr /mnt/user/appdata/seerr
```

*(For Jellyseerr users, replace `overseerr` with `jellyseerr` in the paths).*

**3. Set permissions and install Seerr**
Follow the [Unraid Installation Guide](/getting-started/third-parties/unraid#2-set-folder-permissions), **starting from step 2** — this covers setting the correct folder permissions and adding the Docker container. The guide offers two permission methods (**Seerr Default** and **Unraid Default**), each with trade-offs — read the descriptions before choosing.

**4. Start the new Seerr app**
Start the newly created Seerr container. Check the container logs to confirm the automatic migration completed successfully.

**5. Remove the old app**
Once you have confirmed Seerr is working properly and your data has successfully migrated, you can safely **Remove** the old Overseerr (or Jellyseerr) container from Unraid.

---

### Troubleshooting (`docs/troubleshooting.mdx`)

---
title: Troubleshooting
---

import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';

## [TMDB] failed to retrieve/fetch XXX

### Option 1: Change your DNS servers

This error often comes from your Internet Service Provider (ISP) blocking TMDB API. The ISP may block the DNS resolution to the TMDB API hostname.

To fix this, you can change your DNS servers to a public DNS service like Google's DNS or Cloudflare's DNS:

<Tabs groupId="methods" queryString>
  <TabItem value="docker-cli" label="Docker CLI">

Add the following to your `docker run` command to use Google's DNS:
```bash
--dns=8.8.8.8
```
or for Cloudflare's DNS:
```bash
--dns=1.1.1.1
```
or for Quad9 DNS:
```bash
--dns=9.9.9.9
```

You can try them all and see which one works for your network.

  </TabItem>

  <TabItem value="docker-compose" label="Docker Compose">

Add the following to your `compose.yaml` to use Google's DNS:
```yaml
---
services:
  seerr:
    dns:
      - 8.8.8.8
```
or for Cloudflare's DNS:
```yaml
---
services:
  seerr:
    dns:
      - 1.1.1.1
```
or for Quad9's DNS:
```yaml
---
services:
  seerr:
    dns:
      - 9.9.9.9
```

You can try them all and see which one works for your network.

  </TabItem>

  <TabItem value="windows" label="Windows">

1. Open the Control Panel.
2. Click on Network and Internet.
3. Click on Network and Sharing Center.
4. Click on Change adapter settings.
5. Right-click the network interface connected to the internet and select Properties.
6. Select Internet Protocol Version 4 (TCP/IPv4) and click Properties.
7. Select Use the following DNS server addresses and enter `8.8.8.8` for Google's DNS or `1.1.1.1` for Cloudflare's DNS or `9.9.9.9` for Quad9's DNS.

  </TabItem>

  <TabItem value="linux" label="Linux">

1. Open a terminal.
2. Edit the `/etc/resolv.conf` file with your favorite text editor.
3. Add the following line to use Google's DNS:
    ```bash
    nameserver 8.8.8.8
    ```
    or for Cloudflare's DNS:

    ```bash
    nameserver 1.1.1.1
    ```
    or for Quad9's DNS:
    ```bash
    nameserver 9.9.9.9
    ```

  </TabItem>
</Tabs>

### Option 2: Use Seerr through a proxy

If you can't change your DNS servers or force IPV4 resolution, you can use Seerr through a proxy.

In some places (like China), the ISP blocks not only the DNS resolution but also the connection to the TMDB API.

You can configure Seerr to use a proxy with the [HTTP(S) Proxy](/using-seerr/settings/network#enable-proxy-support) setting.

### Option 3: Force IPV4 resolution first

Sometimes there are configuration issues with IPV6 that prevent the hostname resolution from working correctly.

You can try to force the resolution to use IPV4 first by going to `Settings > Networking > Advanced Networking` and enabling `Force IPv4 Resolution First` setting and restarting Seerr.

### Option 4: Check that your server can reach TMDB API

Make sure that your server can reach the TMDB API by running the following command:

<Tabs groupId="methods" queryString>
  <TabItem value="docker-cli" label="Docker CLI">

```bash
docker exec -it seerr sh -c "apk update && apk add curl && curl -L https://api.themoviedb.org"
```

  </TabItem>

  <TabItem value="docker-compose" label="Docker Compose">

```bash
docker compose exec seerr sh -c "apk update && apk add curl && curl -L https://api.themoviedb.org"
```

  </TabItem>
  <TabItem value="linux" label="Linux">

In a terminal:
```bash
curl -L https://api.themoviedb.org
```

  </TabItem>
  <TabItem value="windows" label="Windows">

In a PowerShell window:
```powershell
(Invoke-WebRequest -Uri "https://api.themoviedb.org" -Method Get).Content
```

  </TabItem>

</Tabs>

If you can't get a response, then your server can't reach the TMDB API.
This is usually due to a network configuration issue or a firewall blocking the connection.

## Account does not have admin privileges

If your admin account no longer has admin privileges, this is typically because your Jellyfin/Emby user ID has changed on the server side.

This can happen if you have a new installation of Jellyfin/Emby or if you have changed the user ID of your admin account.

### Solution: Reset admin access

1. Back up your `settings.json` file (located in your Seerr data directory)
2. Stop the Seerr container/service
3. Delete the `settings.json` file
4. Start Seerr again
5. This will force the setup page to appear
6. Go through the setup process with the same login details
7. You can skip the services setup
8. Once you reach the discover page, stop Seerr
9. Restore your backed-up `settings.json` file
10. Start Seerr again

This process should restore your admin privileges while preserving your settings.

## Failed to enable web push notifications

### Option 1: You are using Pi-hole

When using Pi-hole, you need to whitelist the proper domains in order for the queries to not be intercepted and blocked by Pi-hole.
If you are using a chromium based browser (eg: Chrome, Brave, Edge...), the domain you need to whitelist is `fcm.googleapis.com`
If you are using Firefox, the domain you need to whitelist is `push.services.mozilla.com`

1. Log into your Pi-hole through the admin interface, then click on Domains situated under GROUP MANAGEMENT.
2. Add the domain corresponding to your browser in the `Domain to be added` field and then click on Add to allowed domains.
3. Now in order for those changes to be used you need to flush your current dns cache.
4. You can do so by using this command line in your Pi-hole terminal:
    ```bash
    pihole restartdns
    ```
If this command fails (which is unlikely), use this equivalent:
    ```bash
    pihole -f && pihole restartdns
    ```
5. Then restart your Seerr instance and try to enable the web push notifications again.


### Option 2: You are using Brave browser

Brave is a "De-Googled" browser. So by default or if you refused a prompt in the past, it cuts the access to the FCM (Firebase Cloud Messaging) service, which is mandatory for the web push notifications on Chromium based browsers.

1. Open Brave and paste this address in the url bar: `brave://settings/privacy`
2. Look for the option: "Use Google services for push messaging"
3. Activate this option
4. Relaunch Brave completely
5. You should now see the notifications prompt appearing instead of an error message.

If you still encounter issues, please reach out on our support channels.

---

### Extending Seerr Database Config (`docs/extending-seerr/database-config.mdx`)

---
title: Configuring the Database (Advanced)
description: Configure the database for Seerr
sidebar_position: 2
---
# Configuring the Database

Seerr supports SQLite and PostgreSQL. The database connection can be configured using the following environment variables:

## SQLite Options

If you want to use SQLite, you can simply set the `DB_TYPE` environment variable to `sqlite`. This is the default configuration so even if you don't set any other options, SQLite will be used.

```dotenv
DB_TYPE=sqlite # Which DB engine to use, either sqlite or postgres. The default is sqlite.
CONFIG_DIRECTORY="config" # (optional) The path to the config directory where the db file is stored. The default is "config".
DB_LOG_QUERIES="false" # (optional) Whether to log the DB queries for debugging. The default is "false".
```

## PostgreSQL Options

:::caution
When migrating Postgres from version 17 to 18 in Docker, note that the data mount point has changed. Instead of using `/var/lib/postgresql/data`, the correct mount path is now `/var/lib/postgresql`.
Refer to the [PostgreSQL Docker documentation](https://hub.docker.com/_/postgres/#pgdata) to learn how to migrate or opt out of this change.
:::

### TCP Connection

If your PostgreSQL server is configured to accept TCP connections, you can specify the host and port using the `DB_HOST` and `DB_PORT` environment variables. This is useful for remote connections where the server uses a network host and port.

```dotenv
DB_TYPE=postgres # Which DB engine to use, either sqlite or postgres. The default is sqlite.
DB_HOST=localhost # (optional) The host (URL) of the database. The default is "localhost".
DB_PORT="5432" # (optional) The port to connect to. The default is "5432".
DB_USER= # (required) Username used to connect to the database.
DB_PASS= # (required) Password of the user used to connect to the database.
DB_NAME="seerr" # (optional) The name of the database to connect to. The default is "seerr".
DB_POOL_SIZE="10" # (optional) The number of connections to maintain in the connection pool. The default is "10".
DB_CONNECT_TIMEOUT_MS="30000" # (optional) How long to wait for a free connection from the pool before erroring, in milliseconds. The default is "30000". Set to "0" to wait indefinitely.
DB_LOG_QUERIES="false" # (optional) Whether to log the DB queries for debugging. The default is "false".
```

### Unix Socket Connection

If your PostgreSQL server is configured to accept Unix socket connections, you can specify the path to the socket directory using the `DB_SOCKET_PATH` environment variable. This is useful for local connections where the server uses a Unix socket.

```dotenv
DB_TYPE=postgres # Which DB engine to use, either sqlite or postgres. The default is sqlite.
DB_SOCKET_PATH="/var/run/postgresql" # (required) The path to the PostgreSQL Unix socket directory.
DB_USER= # (required) Username used to connect to the database.
DB_PASS= # (optional) Password of the user used to connect to the database, depending on the server's authentication configuration.
DB_NAME="seerr" # (optional) The name of the database to connect to. The default is "seerr".
DB_POOL_SIZE="10" # (optional) The number of connections to maintain in the connection pool. The default is "10".
DB_CONNECT_TIMEOUT_MS="30000" # (optional) How long to wait for a free connection from the pool before erroring, in milliseconds. The default is "30000". Set to "0" to wait indefinitely.
DB_LOG_QUERIES="false" # (optional) Whether to log the DB queries for debugging. The default is "false".
```

:::info
**Finding Your PostgreSQL Socket Path**

The PostgreSQL socket path varies by operating system and installation method:

- **Ubuntu/Debian**: `/var/run/postgresql`
- **CentOS/RHEL/Fedora**: `/var/run/postgresql`
- **macOS (Homebrew)**: `/tmp` or `/opt/homebrew/var/postgresql`
- **macOS (Postgres.app)**: `/tmp`
- **Windows**: Not applicable (uses TCP connections)

You can find your socket path by running:
```bash
# Find PostgreSQL socket directory
find /tmp /var/run /run -name ".s.PGSQL.*" 2>/dev/null | head -1 | xargs dirname

# Or check PostgreSQL configuration
sudo -u postgres psql -c "SHOW unix_socket_directories;"
```
:::

### SSL configuration

The following options can be used to further configure ssl. Certificates can be provided as a string or a file path, with the string version taking precedence.

```dotenv
DB_USE_SSL="false" # (optional) Whether to enable ssl for database connection. This must be "true" to use the other ssl options. The default is "false".
DB_SSL_REJECT_UNAUTHORIZED="true" # (optional) Whether to reject ssl connections with unverifiable certificates i.e. self-signed certificates without providing the below settings. The default is "true".
DB_SSL_CA= # (optional) The CA certificate to verify the connection, provided as a string. The default is "".
DB_SSL_CA_FILE= # (optional) The path to a CA certificate to verify the connection. The default is "".
DB_SSL_KEY= # (optional) The private key for the connection in PEM format, provided as a string. The default is "".
DB_SSL_KEY_FILE= # (optional) Path to the private key for the connection in PEM format. The default is "".
DB_SSL_CERT= # (optional) Certificate chain in pem format for the private key, provided as a string. The default is "".
DB_SSL_CERT_FILE= # (optional) Path to certificate chain in pem format for the private key. The default is "".
```

---

### Migrating from SQLite to PostgreSQL

1. Set up your PostgreSQL database and configure Seerr to use it
2. Run Seerr to create the tables in the PostgreSQL database
3. Stop Seerr
4. Run the following command to export the data from the SQLite database and import it into the PostgreSQL database:

:::info
Edit the postgres connection string (without the \{\{ and \}\} brackets) to match your setup.

If you don't have or don't want to use docker, you can build the working pgloader version [in this PR](https://github.com/dimitri/pgloader/pull/1531) from source and use the same options as below.
:::

:::caution
The most recent release of pgloader has an issue quoting the table columns. Use the version in the docker container to avoid this issue.
:::

import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';

<Tabs>
<TabItem value="docker" label="Using pgloader Container (Recommended)" default>

**Recommended method**: Use the pgloader container even for standalone Seerr installations. This avoids building from source and ensures compatibility.

```bash
# For standalone installations (no Docker network needed)
docker run --rm \
  -v /path/to/your/config/db.sqlite3:/db.sqlite3:ro \
  ghcr.io/ralgar/pgloader:pr-1531 \
  pgloader --with "quote identifiers" --with "data only" \
  /db.sqlite3 postgresql://{{DB_USER}}:{{DB_PASS}}@{{DB_HOST}}:{{DB_PORT}}/{{DB_NAME}}
```

**For Docker Compose setups**: Add the network parameter if your PostgreSQL is also in a container:
```bash
docker run --rm \
  --network your-seerr-network \
  -v /path/to/your/config/db.sqlite3:/db.sqlite3:ro \
  ghcr.io/ralgar/pgloader:pr-1531 \
  pgloader --with "quote identifiers" --with "data only" \
  /db.sqlite3 postgresql://{{DB_USER}}:{{DB_PASS}}@{{DB_HOST}}:{{DB_PORT}}/{{DB_NAME}}
```

</TabItem>
<TabItem value="standalone" label="Building pgloader from Source">

For users who prefer not to use Docker or need a custom build:

```bash
# Clone the repository and checkout the working version
git clone https://github.com/dimitri/pgloader.git
cd pgloader
git fetch origin pull/1531/head:pr-1531
git checkout pr-1531

# Follow the official installation instructions
# See: https://github.com/dimitri/pgloader/blob/master/INSTALL.md
```

:::info
**Building pgloader from source requires following the complete installation process outlined in the [official pgloader INSTALL.md](https://github.com/dimitri/pgloader/blob/master/INSTALL.md).**

Please refer to the official documentation for detailed, up-to-date installation instructions.
:::

Once pgloader is built, run the migration:

```bash
# Run migration (adjust path to your config directory)
./pgloader --with "quote identifiers" --with "data only" \
  /path/to/your/config/db.sqlite3 \
  postgresql://{{DB_USER}}:{{DB_PASS}}@{{DB_HOST}}:{{DB_PORT}}/{{DB_NAME}}
```

</TabItem>
</Tabs>

5. Start Seerr

---

### Extending Seerr Fail2ban (`docs/extending-seerr/fail2ban.mdx`)

---
title: Fail2ban
description: Configure Fail2ban for Seerr
sidebar_position: 3
---

# Fail2ban

:::warning
If you are running Seerr behind a reverse proxy, make sure that the **Enable Proxy Support** setting is **enabled**.
:::

To use Fail2ban with Seerr, create a new file named `seerr.local` in your Fail2ban `filter.d` directory with the following filter definition:

```
[Definition]
failregex = .*\[warn\]\[(API|Auth)\]\: Failed sign-in attempt.*"ip":"<HOST>"
```

You can then add a jail using this filter in `jail.local`. Please see the [Fail2ban documentation](https://github.com/fail2ban/fail2ban/wiki) for details on how to configure the jail.

---

### Extending Seerr Reverse Proxy (`docs/extending-seerr/reverse-proxy.mdx`)

---
title: Reverse Proxy
description: Configure a reverse proxy for Seerr.
sidebar_position: 1
---

# Reverse Proxy

:::warning
Base URLs cannot be configured in Seerr. With this limitation, only subdomain configurations are supported.

A Nginx subfolder workaround configuration is provided below, but it is not officially supported.
:::

## Nginx

import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';

<Tabs groupId="nginx-reverse-proxy" queryString>
    <TabItem value="subdomain" label="Subdomain">
Add the following configuration to a new file `/etc/nginx/sites-available/seerr.example.com.conf`:

```nginx
server {
    listen 80;
    server_name seerr.example.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name seerr.example.com;

    ssl_certificate /etc/letsencrypt/live/seerr.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/seerr.example.com/privkey.pem;

    proxy_set_header Referer $http_referer;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Real-Port $remote_port;
    proxy_set_header X-Forwarded-Host $host:$remote_port;
    proxy_set_header X-Forwarded-Server $host;
    proxy_set_header X-Forwarded-Port $remote_port;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-Ssl on;

    location / {
        proxy_pass http://127.0.0.1:5055;
    }
}
```

Then, create a symlink to `/etc/nginx/sites-enabled`:

```bash
sudo ln -s /etc/nginx/sites-available/seerr.example.com.conf /etc/nginx/sites-enabled/seerr.example.com.conf
```

    </TabItem>

    <TabItem value="subfolder" label="Subfolder">

:::warning
This Nginx subfolder reverse proxy is an unsupported workaround, and only provided as an example. The filters may stop working when Seerr is updated.

If you encounter any issues with Seerr while using this workaround, we may ask you to try to reproduce the problem without the Nginx proxy.
:::

Add the following location block to your existing `nginx.conf` file.

```nginx
location ^~ /seerr {
    set $app 'seerr';

    # Remove /seerr path to pass to the app
    rewrite ^/seerr/?(.*)$ /$1 break;
    proxy_pass http://127.0.0.1:5055; # NO TRAILING SLASH

    # Redirect location headers
    proxy_redirect ^ /$app;
    proxy_redirect /setup /$app/setup;
    proxy_redirect /login /$app/login;

    # Sub filters to replace hardcoded paths
    proxy_set_header Accept-Encoding "";
    sub_filter_once off;
    sub_filter_types *;
    sub_filter 'href="/"' 'href="/$app"';
    sub_filter 'href="/login"' 'href="/$app/login"';
    sub_filter 'href:"/"' 'href:"/$app"';
    sub_filter '\/_next' '\/$app\/_next';
    sub_filter '/_next' '/$app/_next';
    sub_filter '/api/v1' '/$app/api/v1';
    sub_filter '/login/plex/loading' '/$app/login/plex/loading';
    sub_filter '/images/' '/$app/images/';
    sub_filter '/imageproxy/' '/$app/imageproxy/';
    sub_filter '/avatarproxy/' '/$app/avatarproxy/';
    sub_filter '/android-' '/$app/android-';
    sub_filter '/apple-' '/$app/apple-';
    sub_filter '/favicon' '/$app/favicon';
    sub_filter '/logo_' '/$app/logo_';
    sub_filter '/site.webmanifest' '/$app/site.webmanifest';
}
```

    </TabItem>

    <TabItem value="swag" label="SWAG">

A sample proxy configuration is included in [SWAG (Secure Web Application Gateway)](https://github.com/linuxserver/docker-swag).

However, this page is still the only source of truth, so the SWAG sample configuration is not guaranteed to be up-to-date. If you find an inconsistency, please [report it to the LinuxServer team](https://github.com/linuxserver/reverse-proxy-confs/issues/new) or [submit a pull request to update it](https://github.com/linuxserver/reverse-proxy-confs/pulls).

To use the bundled configuration file, simply rename `seerr.subdomain.conf.sample` in the `proxy-confs` folder to `seerr.subdomain.conf`.

Alternatively, you can create a new file `seerr.subdomain.conf` in `proxy-confs` with the following configuration:

```nginx
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    server_name seerr.*;

    include /config/nginx/ssl.conf;

    client_max_body_size 0;

    location / {
        include /config/nginx/proxy.conf;
        resolver 127.0.0.11 valid=30s;
        set $upstream_app seerr;
        set $upstream_port 5055;
        set $upstream_proto http;
        proxy_pass $upstream_proto://$upstream_app:$upstream_port;
    }

}
```

</TabItem>

    <TabItem value="nginx-proxy-manager" label="Nginx Proxy Manager">

Add a new proxy host with the following settings:

### Details

- **Domain Names:** Your desired external Seerr hostname; e.g., `seerr.example.com`
- **Scheme:** `http`
- **Forward Hostname / IP:** Internal Seerr hostname or IP
- **Forward Port:** `5055`
- **Cache Assets:** yes
- **Block Common Exploits:** yes

### SSL

- **SSL Certificate:** Select one of the options; if you are not sure, pick “Request a new SSL Certificate”
- **Force SSL:** yes
- **HTTP/2 Support:** yes

Then, click “Save” and “Apply Changes”.

      </TabItem>

  </Tabs>

## Caddy (v2)

Create a Caddyfile with the following content:

```caddyfile
seerr.example.com {
    reverse_proxy http://127.0.0.1:5055
}
```

Deploy the Caddyfile by running:

```bash

sudo caddy run --config /path/to/Caddyfile
```

Verify by visiting https://seerr.example.com in your browser.

:::note
Caddy will automatically obtain and renew SSL certificates for your domain.
:::

## Traefik (v2)

Add the following labels to the Seerr service in your `compose.yaml` file:

```yaml
labels:
  - 'traefik.enable=true'
  ## HTTP Routers
  - 'traefik.http.routers.seerr-rtr.entrypoints=https'
  - 'traefik.http.routers.seerr-rtr.rule=Host(`seerr.domain.com`)'
  - 'traefik.http.routers.seerr-rtr.tls=true'
  ## HTTP Services
  - 'traefik.http.routers.seerr-rtr.service=seerr-svc'
  - 'traefik.http.services.seerr-svc.loadbalancer.server.port=5055'
```

For more information, please refer to the [Traefik documentation](https://doc.traefik.io/traefik/user-guides/docker-compose/basic-example/).

## Apache2 HTTP Server

<Tabs groupId="apache2-reverse-proxy" queryString>
    <TabItem value="subdomain" label="Subdomain">

Add the following Location block to your existing Server configuration.

```apache
# Seerr
		ProxyPreserveHost On
		ProxyPass / http://localhost:5055 retry=0 connectiontimeout=5 timeout=30 keepalive=on
		ProxyPassReverse http://localhost:5055 /
		RequestHeader set Connection ""
```

</TabItem>

<TabItem value="subfolder" label="Subfolder">

:::warning
This Apache2 subfolder reverse proxy is an unsupported workaround, and only provided as an example. The filters may stop working when Seerr is updated.

If you encounter any issues with Seerr while using this workaround, we may ask you to try to reproduce the problem without the Apache2 proxy.
:::

Add the following Location block to your existing Server configuration.

```apache
# Seerr
# We will use "/seerr" as subfolder
# You can replace it with any that you like
	<Location /seerr>
		ProxyPreserveHost On
		ProxyPass http://localhost:5055 retry=0 connectiontimeout=5 timeout=30 keepalive=on
		ProxyPassReverse http://localhost:5055
		RequestHeader set Connection ""

		# Header update, to support subfolder
		# Please Replace "FQDN" with your domain
		Header edit location ^/login https://FQDN/seerr/login
		Header edit location ^/setup https://FQDN/seerr/setup

		AddOutputFilterByType INFLATE;SUBSTITUTE text/html application/javascript application/json
		SubstituteMaxLineLength 2000K
		# This is HTML and JS update
		# Please update "/seerr" if needed
		Substitute "s|href=\"|href=\"/seerr|inq"
		Substitute "s|src=\"|src=\"/seerr|inq"
		Substitute "s|/api/|/seerr/api/|inq"
		Substitute "s|\"/_next/|\"/seerr/_next/|inq"
		# This is JSON update
		Substitute "s|\"/avatarproxy/|\"/seerr/avatarproxy/|inq"
	</Location>
```

</TabItem>

</Tabs>

## HAProxy (v3)

:::warning
This is a third-party documentation maintained by the community. We can't provide support for this setup and are unable to test it.
:::

    Add the following frontend and backend configurations for your seerr instance:
    ```haproxy
    frontend seerr-frontend
      bind 0.0.0.0:80
      bind 0.0.0.0:443 ssl crt /etc/ssl/private/seerr.example.com.pem
      mode http
      log global
      option httplog
      option http-keep-alive
      http-request set-header X-Real-IP %[src]
      option forwardfor
      acl seerr hdr(host) -i seerr.example.com
      redirect scheme https code 301 if !{ ssl_fc }
      use_backend seerr-backend if seerr

    backend seerr-backend
      mode http
      log global
      option httplog
      http-response set-header Strict-Transport-Security max-age=15552000
      option httpchk GET /api/v1/settings/public
      timeout connect 30000
      timeout server 30000
      retries 3
      server seerr 127.0.0.1:5055 check inter 1000
    ```

---

### Extending Seerr Terraform Provider (`docs/extending-seerr/terraform-provider.mdx`)

---
title: Terraform/OpenTofu Provider (Advanced)
description: Manage Seerr settings and integrations with the community Terraform/OpenTofu provider.
sidebar_position: 4
---

# Terraform/OpenTofu Provider (Advanced)

:::warning
This provider is maintained by the community, not by the Seerr team. Please report bugs or feature requests in the [provider repository](https://github.com/Josh-Archer/terraform-provider-seerr).
:::

The community-maintained [Seerr Terraform/OpenTofu provider](https://search.opentofu.org/provider/josh-archer/seerr/latest) can manage Seerr settings and integrations from infrastructure-as-code workflows.

## Basic Example

Configure the provider with your Seerr URL and API key, then manage Seerr resources in the same configuration as the rest of your infrastructure.

```hcl
terraform {
  required_providers {
    seerr = {
      source = "registry.opentofu.org/josh-archer/seerr"
    }
  }
}

variable "seerr_api_key" {
  type      = string
  sensitive = true
}

provider "seerr" {
  url                  = "https://seerr.example.com"
  api_key              = var.seerr_api_key
  insecure_skip_verify = false # Set to true for self-signed certificates.
}

resource "seerr_main_settings" "main" {
  app_title               = "Seerr"
  application_url         = "https://seerr.example.com"
  locale                  = "en"
  movie_requests_enabled  = true
  series_requests_enabled = true
}
```

The provider also includes resources and data sources for common Seerr integrations:

- Plex
- Jellyfin
- Emby
- Radarr
- Sonarr
- Tautulli
- Notifications
- Users
- Permissions
- Requests
- Issues
- Background job schedules
- And many more.

---

### Getting Started Buildfromsource (`docs/getting-started/buildfromsource.mdx`)

---
title: Build From Source (Advanced)
description: Install Seerr by building from source
sidebar_position: 2
---
# Build from Source (Advanced)
:::warning
This method is not recommended for most users. It is intended for advanced users who are familiar with managing their own server infrastructure.

Refer to [Configuring Databases](/extending-seerr/database-config#postgresql-options) for details on how to configure your database.
:::

import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';

### Prerequisites
    - [Node.js 22.x](https://nodejs.org/en/download/)
    - [Pnpm 10.x](https://pnpm.io/installation)
    - [Git](https://git-scm.com/downloads)

## Unix (Linux, macOS)
### Installation
1. Assuming you want the working directory to be `/opt/seerr`, create the directory and navigate to it:
```bash
sudo mkdir -p /opt/seerr && cd /opt/seerr
```
2. Clone the Seerr repository and checkout the main branch:
```bash
git clone https://github.com/seerr-team/seerr.git .
git checkout main
```
3. Install the dependencies:
```bash
CYPRESS_INSTALL_BINARY=0 pnpm install --frozen-lockfile
```
4. Build the project:
```bash
pnpm build
```
5. Start Seerr:
```bash
pnpm start
```

:::info
You can now access Seerr by visiting `http://localhost:5055` in your web browser.
:::

#### Extending the installation
<Tabs groupId="unix-extensions" queryString>
  <TabItem value="linux" label="Linux">
To run seerr as a systemd service:
1. create the environment file at `/etc/seerr/seerr.conf`:
```bash
## Seerr's default port is 5055, if you want to use both, change this.
## specify on which port to listen
PORT=5055

## specify on which interface to listen, by default seerr listens on all interfaces
#HOST=127.0.0.1

## Uncomment if you want to force Node.js to resolve IPv4 before IPv6 (advanced users only)
# FORCE_IPV4_FIRST=true
```
2. Then run the following commands:
```bash
which node
```
Copy the path to node, it should be something like `/usr/bin/node`.

3. Create the systemd service file at `/etc/systemd/system/seerr.service`, using either `sudo systemctl edit seerr` or `sudo nano /etc/systemd/system/seerr.service`:
```bash
[Unit]
Description=Seerr Service
Wants=network-online.target
After=network-online.target

[Service]
EnvironmentFile=/etc/seerr/seerr.conf
Environment=NODE_ENV=production
Type=exec
Restart=on-failure
WorkingDirectory=/opt/seerr
ExecStart=/usr/bin/node dist/index.js

[Install]
WantedBy=multi-user.target
```
:::note
If you are using a different path to node, replace `/usr/bin/node` with the path to node.
:::

4. Enable and start the service:
```bash
sudo systemctl enable seerr
sudo systemctl start seerr
```
  </TabItem>
  <TabItem value="macos" label="macOS">
To run seerr as a launchd service:
1. Find the path to node:
```bash
which node
```
Copy the path to node, it should be something like `/usr/local/bin/node`.

2. Create a launchd plist file at `~/Library/LaunchAgents/com.seerr.plist`:
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>com.seerr</string>
  <key>ProgramArguments</key>
  <array>
    <string>/usr/local/bin/node</string>
    <string>/opt/seerr/dist/index.js</string>
  </array>
  <key>WorkingDirectory</key>
  <string>/opt/seerr</string>
  <key>EnvironmentVariables</key>
  <dict>
    <key>NODE_ENV</key>
    <string>production</string>
    <key>PORT</key>
    <string>5055</string>
  </dict>
  <key>RunAtLoad</key>
  <true/>
  <key>KeepAlive</key>
  <true/>
</dict>
</plist>
```
:::note
If you are using a different path to node, replace `/usr/local/bin/node` with the path to node.
:::
3. Load the service:
```bash
sudo launchctl load ~/Library/LaunchAgents/com.seerr.plist
```
3. Start the service:
```bash
sudo launchctl start com.seerr
```
4. To ensure the service starts on boot, run the following command:
```bash
sudo lauchctl load
```
  </TabItem>
  <TabItem value="pm2" label="PM2">
To run seerr as a PM2 service:
1. Install PM2:
```bash
npm install pm2
```
2. Start seerr with PM2:
```bash
NODE_ENV=production pm2 start dist/index.js --name seerr
```
3. Save the process list:
```bash
pm2 save
```
4. Ensure PM2 starts on boot:
```bash
pm2 startup
```
**Managing the service**
- To start the service:
```powershell
pm2 start seerr
```
- To stop the service:
```powershell
pm2 stop seerr
```
- To restart the service:
```powershell
pm2 restart seerr
```
- To view the logs:
```powershell
pm2 logs seerr
```
- To view the status:
```powershell
pm2 status seerr
```
  </TabItem>
</Tabs>

## Windows
### Installation
1. Assuming you want the working directory to be `C:\seerr`, create the directory and navigate to it:
```powershell
mkdir C:\seerr
cd C:\seerr
```
2. Clone the Seerr repository and checkout the main branch:
```powershell
git clone https://github.com/seerr-team/seerr.git .
git checkout main
```
3. Install the dependencies:
```powershell
npm install win-node-env
$env:CYPRESS_INSTALL_BINARY = 0; pnpm install --frozen-lockfile
```
4. Build the project:
```powershell
pnpm build
```
5. Start Seerr:
```powershell
pnpm start
```

:::tip
You can add the environment variables to a `.env` file in the Seerr directory.
:::

:::info
You can now access Seerr by visiting `http://localhost:5055` in your web browser.
:::

#### Extending the installation
<Tabs groupId="windows-extensions" queryString>
  <TabItem value="task-scheduler" label="Task Scheduler">
To run seerr as a bat script:
1. Create a file named `start-seerr.bat` in the seerr directory:
```batch
@echo off
set PORT=5055
set NODE_ENV=production
node dist/index.js
```
2. Create a task in Task Scheduler:
- Open Task Scheduler
- Click on "Create Basic Task"
- Name the task "Seerr"
- Set the trigger to "When the computer starts"
- Set the action to "Start a program"
- Set the program/script to the path of the `start-seerr.bat` file
- Set the "Start in" to the seerr directory.
- Click "Finish"

Now, Seerr will start when the computer boots up in the background.
  </TabItem>

  <TabItem value="nssm" label="NSSM">
To run seerr as a service:
1. Download the [Non-Sucking Service Manager](https://nssm.cc/download)
2. Install NSSM:
```powershell
nssm install Seerr "C:\Program Files\nodejs\node.exe" "C:\seerr\dist\index.js"
nssm set Seerr AppDirectory "C:\seerr"
nssm set Seerr AppEnvironmentExtra NODE_ENV=production
```
3. Start the service:
```powershell
nssm start Seerr
```
4. To ensure the service starts on boot, run the following command:
```powershell
nssm set Seerr Start SERVICE_AUTO_START
```
  </TabItem>
  <TabItem value="pm2" label="PM2">
To run seerr as a PM2 service:
1. Install PM2:
```powershell
npm install pm2
```
2. Start seerr with PM2:
```powershell
$env:NODE_ENV = "production"; pm2 start dist/index.js --name seerr
```
3. Save the process list:
```powershell
pm2 save
```
4. Ensure PM2 starts on boot:
```powershell
pm2 startup
```
##### Managing the service
- To start the service:
```powershell
pm2 start seerr
```
- To stop the service:
```powershell
pm2 stop seerr
```
- To restart the service:
```powershell
pm2 restart seerr
```
- To view the logs:
```powershell
pm2 logs seerr
```
- To view the status:
```powershell
pm2 status seerr
```
  </TabItem>
</Tabs>

### Updating
To update Seerr, navigate to the Seerr directory and run the following commands:
```bash
git pull
```
Then, follow the steps in the installation section to rebuild and restart Seerr.

---

### Getting Started Docker (`docs/getting-started/docker.mdx`)

---
title: Docker (Recommended)
description: Install Seerr using Docker
sidebar_position: 1
---
# Docker
:::info
This is the recommended method for most users.
Details on how to install Docker can be found on the [official Docker website](https://docs.docker.com/get-docker/).

Refer to [Configuring Databases](/extending-seerr/database-config#postgresql-options) for details on how to configure your database.
:::

:::info
An alternative Docker image is available on Docker Hub for this project. You can find it at [Docker Hub Repository Link](https://hub.docker.com/r/seerr/seerr)

Our Docker images are available with the following tags:

- `latest`: Always points to the most recent stable release.
- Version tags (e.g., `v3.0.0`): For specific stable versions.
- Major version aliases (e.g., `v3`): Alias for the latest stable release in the respective major version series.
- Minor version aliases (e.g., `v3.0`): Alias for the latest stable release in the respective minor version series.
- `develop`: Rolling release/nightly builds for using the latest changes (use with caution).
:::

:::info
All official Seerr images are cryptographically signed and include a verified [Software Bill of Materials (SBOM)](https://cyclonedx.org/).

To confirm that the container image you are using is authentic and unmodified, please refer to the [Verifying Signed Artifacts](/using-seerr/advanced/verifying-signed-artifacts#verifying-signed-images) guide.
:::

## Unix (Linux, macOS)
:::warning
Be sure to replace `/path/to/appdata/config` in the below examples with a valid host directory path. If this volume mount is not configured correctly, your Seerr settings/data will not be persisted when the container is recreated (e.g., when updating the image or rebooting your machine).

    The `TZ` environment variable value should also be set to the [TZ database name](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) of your time zone!

:::

import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';

<Tabs groupId="docker-methods" queryString>
  <TabItem value="docker-cli" label="Docker CLI">
For details on the Docker CLI, please [review the official `docker run` documentation](https://docs.docker.com/engine/reference/run/).

#### Installation:

```bash
# Create the appdata folder
mkdir /path/to/appdata/config
# Chown the folder as the container runs as the `node` user (UID 1000).
chown -R 1000:1000 /path/to/appdata/config
```

```bash
docker run -d \
  --name seerr \
  --init \
  -e LOG_LEVEL=debug \
  -e TZ=Asia/Tashkent \
  -e PORT=5055 \
  -p 5055:5055 \
  -v /path/to/appdata/config:/app/config \
  --restart unless-stopped \
  --health-cmd "wget --no-verbose --tries=1 --spider http://localhost:5055/api/v1/settings/public || exit 1" \
  --health-start-period 20s \
  --health-timeout 3s \
  --health-interval 15s \
  --health-retries 3 \
  --security-opt no-new-privileges \
  --cap-drop ALL \
  ghcr.io/seerr-team/seerr:latest
```

The argument `-e PORT=5055` is optional.

To run the container as a specific user/group, you may optionally add `--user=[ user | user:group | uid | uid:gid | user:gid | uid:group ]` to the above command.

#### Updating:

Stop and remove the existing container:
```bash
docker stop seerr && docker rm seerr
```
Pull the latest image:
```bash
docker pull ghcr.io/seerr-team/seerr:latest
```
Finally, run the container with the same parameters originally used to create the container:
```bash
docker run -d ...
```

:::tip
You may alternatively use a third-party updating mechanism, such as [Watchtower](https://github.com/containrrr/watchtower) or [Ouroboros](https://github.com/pyouroboros/ouroboros), to keep Seerr up-to-date automatically.

You could also use [diun](https://github.com/crazy-max/diun) to receive notifications when a new image is available.
:::
  </TabItem>

  <TabItem value="docker-compose" label="Docker Compose">
For details on how to use Docker Compose, please [review the official Compose documentation](https://docs.docker.com/compose/reference/).

#### Installation:
Define the `seerr` service in your `compose.yaml` as follows:
```yaml
---
services:
  seerr:
    image: ghcr.io/seerr-team/seerr:latest
    init: true
    container_name: seerr
    environment:
      - LOG_LEVEL=debug
      - TZ=Asia/Tashkent
      - PORT=5055 #optional
    ports:
      - 5055:5055
    volumes:
      - /path/to/appdata/config:/app/config
    healthcheck:
      test: wget --no-verbose --tries=1 --spider http://localhost:5055/api/v1/settings/public || exit 1
      start_period: 20s
      timeout: 3s
      interval: 15s
      retries: 3
    security_opt:
      - no-new-privileges
    cap_drop:
      - ALL
    restart: unless-stopped
```

```bash
# Create the appdata folder
mkdir /path/to/appdata/config
# Chown the folder as the container runs as the `node` user (UID 1000).
chown -R 1000:1000 /path/to/appdata/config
```

Then, start all services defined in the Compose file:
```bash
docker compose up -d
```

#### Updating:
Pull the latest image:
```bash
docker compose pull seerr
```
Then, restart all services defined in the Compose file:
```bash
docker compose up -d
```
  </TabItem>
</Tabs>

## Windows

Please refer to the [Docker Desktop for Windows user manual](https://docs.docker.com/docker-for-windows/) for details on how to install Docker on Windows. There is no need to install a Linux distro if using named volumes like in the example below.
:::warning
**WSL2 will need to be installed to prevent DB corruption!** Please see the [Docker Desktop WSL 2 backend documentation](https://docs.docker.com/docker-for-windows/wsl/) for instructions on how to enable WSL2. The commands below will only work with WSL2 installed!
:::

First, create a volume to store the configuration data for Seerr using using either the Docker CLI:
```bash
docker volume create seerr-data
```

or the Docker Desktop app:
1. Open the Docker Desktop app
2. Head to the Volumes tab
3. Click on the "Create a volume" in the center of the page. Or if you have other volumes already, click on the "Create" button on the top right of the page.
4. Enter a name for the volume (example: `seerr-data`) and hit "Create"

Then, create and start the Seerr container:
<Tabs groupId="docker-methods" queryString>
  <TabItem value="docker-cli" label="Docker CLI (PowerShell)">
```powershell
docker run -d `
  --name seerr `
  --init `
  -e LOG_LEVEL=debug `
  -e TZ=Asia/Tashkent `
  -e PORT=5055 `
  -p 5055:5055 `
  -v seerr-data:/app/config `
  --restart unless-stopped `
  --health-cmd "wget --no-verbose --tries=1 --spider http://localhost:5055/api/v1/settings/public || exit 1" `
  --health-start-period 20s `
  --health-timeout 3s `
  --health-interval 15s `
  --health-retries 3 `
  --security-opt no-new-privileges `
  --cap-drop ALL `
  ghcr.io/seerr-team/seerr:latest
```

The argument `-e PORT=5055` is optional.

#### Updating:

Stop and remove the existing container:
```powershell
docker stop seerr; docker rm seerr
```
Pull the latest image:
```powershell
docker pull ghcr.io/seerr-team/seerr:latest
```
Finally, run the container with the same parameters originally used to create the container:
```powershell
docker run -d ...
```

  </TabItem>

  <TabItem value="docker-cli-cmd" label="Docker CLI (CMD)">
```batch
docker run -d ^
  --name seerr ^
  --init ^
  -e LOG_LEVEL=debug ^
  -e TZ=Asia/Tashkent ^
  -e PORT=5055 ^
  -p 5055:5055 ^
  -v seerr-data:/app/config ^
  --restart unless-stopped ^
  --health-cmd "wget --no-verbose --tries=1 --spider http://localhost:5055/api/v1/settings/public || exit 1" ^
  --health-start-period 20s ^
  --health-timeout 3s ^
  --health-interval 15s ^
  --health-retries 3 ^
  --security-opt no-new-privileges ^
  --cap-drop ALL ^
  ghcr.io/seerr-team/seerr:latest
```

The argument `-e PORT=5055` is optional.

#### Updating:

Stop and remove the existing container:
```batch
docker stop seerr && docker rm seerr
```
Pull the latest image:
```batch
docker pull ghcr.io/seerr-team/seerr:latest
```
Finally, run the container with the same parameters originally used to create the container:
```batch
docker run -d ...
```

  </TabItem>

  <TabItem value="docker-compose" label="Docker Compose">
```yaml
---
services:
  seerr:
    image: ghcr.io/seerr-team/seerr:latest
    init: true
    container_name: seerr
    environment:
      - LOG_LEVEL=debug
      - TZ=Asia/Tashkent
    ports:
      - 5055:5055
    volumes:
      - seerr-data:/app/config
    healthcheck:
      test: wget --no-verbose --tries=1 --spider http://localhost:5055/api/v1/settings/public || exit 1
      start_period: 20s
      timeout: 3s
      interval: 15s
      retries: 3
    security_opt:
      - no-new-privileges
    cap_drop:
      - ALL
    restart: unless-stopped

volumes:
  seerr-data:
    external: true
```

#### Updating:
Pull the latest image:
```bash
docker compose pull seerr
```
Then, restart all services defined in the Compose file:
```bash
docker compose up -d
```
  </TabItem>
</Tabs>

To access the files inside the volume created above, navigate to `\\wsl$\docker-desktop-data\version-pack-data\community\docker\volumes\seerr-data\_data` using File Explorer.

:::info
Docker on Windows works differently than it does on Linux; it runs Docker inside of a stripped-down Linux VM. Volume mounts are exposed to Docker inside this VM via SMB mounts. While this is fine for media, it is unacceptable for the `/app/config` directory because SMB does not support file locking. This will eventually corrupt your database, which can lead to slow behavior and crashes.

**If you must run Docker on Windows, you should put the `/app/config` directory mount inside the VM and not on the Windows host.** (This also applies to other containers with SQLite databases.)

Named volumes, like in the example commands above, are automatically mounted inside the VM. Therefore the warning on the setup about the `/app/config` folder being incorrectly mounted page should be ignored.
:::

---

### Getting Started Kubernetes (`docs/getting-started/kubernetes.mdx`)

---
title: Kubernetes (Advanced)
description: Install Seerr in Kubernetes
sidebar_position: 3
---
# Kubernetes
:::warning
This method is not recommended for most users. It is intended for advanced users who are using Kubernetes.
:::

:::info
All official Seerr charts are cryptographically signed and include a verified [Software Bill of Materials (SBOM)](https://cyclonedx.org/).

To confirm that the chart you are using is authentic and unmodified, please refer to the [Verifying Signed Artifacts](/using-seerr/advanced/verifying-signed-artifacts#verifying-signed-helm-charts) guide.
:::

## Installation
```console
helm install seerr oci://ghcr.io/seerr-team/seerr/seerr-chart
```
Helm values can be found in the Seerr repository under [charts/seerr-chart/README.md](https://github.com/seerr-team/seerr/tree/develop/charts/seerr-chart).

---

### Getting Started Nixpkg (`docs/getting-started/nixpkg.mdx`)

---
title: Nix Package Manager (Advanced)
description: Install Seerr using Nixpkgs
sidebar_position: 4
---

import { SeerrVersion, NixpkgVersion } from '@site/src/components/SeerrVersion';
import Admonition from '@theme/Admonition';
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';

# Nix Package Manager
:::warning
This method is not recommended for most users. It is intended for advanced users who are using NixOS distribution.
The Seerr service and package are available as of the 26.05 release.
:::

Refer to [NixOS documentation](https://search.nixos.org/options?channel=26.05&query=seerr)

export const VersionMismatchWarning = () => {
  let seerrVersion = null;
  let nixpkgVersions = null;
  try {
    seerrVersion = SeerrVersion();
    nixpkgVersions = NixpkgVersion();
  } catch (err) {
    return (
      <Admonition type="error">
        Failed to load version information. Error: {err.message || JSON.stringify(err)}
      </Admonition>
    );
  }
    if (!nixpkgVersions || nixpkgVersions.error) {
    return (
      <Admonition type="error">
        Failed to fetch Nixpkg versions: {nixpkgVersions?.error || 'Unknown error'}
      </Admonition>
    );
  }
  const isUnstableUpToDate = seerrVersion === nixpkgVersions.unstable;
  const isStableUpToDate = seerrVersion === nixpkgVersions.stable;
  return (
     <>
      {!isStableUpToDate ? (
  <Admonition type="warning">
    The{' '}
    <a href="https://github.com/NixOS/nixpkgs/blob/nixos-26.05/pkgs/by-name/se/seerr/package.nix#L23">
      upstream Seerr Nix Stable Package (v{nixpkgVersions.stable})
    </a>{' '}
    is not <b>up-to-date</b>. If you want to use <b>Seerr v{seerrVersion}</b>,{' '}
    {isUnstableUpToDate ? (
      <>
        consider using the{' '}
        <a href="https://github.com/NixOS/nixpkgs/blob/nixos-unstable/pkgs/by-name/se/seerr/package.nix">
          unstable package
        </a>{' '}
        instead.
      </>
    ) : (
      <>
        you will need to{' '} override the package derivation.
      </>
    )}
  </Admonition>
) : null}
    </>
  );
};

<VersionMismatchWarning />

## Installation
To get up and running with seerr using Nix, you can add the following to your `configuration.nix`:
```nix
{ config, pkgs, ... }:
{
  services.seerr.enable = true;
}
```

After adding the configuration to your `configuration.nix`, you can run the following command to install seerr:
```bash
nixos-rebuild switch
```
After rebuild is complete seerr should be running, verify that it is with the following command.
```bash
systemctl status seerr
```
:::info
You can now access Seerr by visiting `http://localhost:5055` in your web browser.
:::

---

### Using Seerr Backups (`docs/using-seerr/backups.md`)

---
title: Backups
description: Understand which data you should back up.
sidebar_position: 4
---

# Which data does Seerr save and where?

## Settings  

All configurations from the **Settings** panel in the Seerr web UI are saved, including integrations with Radarr, Sonarr, Jellyfin, Plex, and notification settings.  
These settings are stored in the `settings.json` file located in the Seerr data folder.

## User Data  

Apart from the settings, all other data—including user accounts, media requests, blocklist etc. are stored in the database (either SQLite or PostgreSQL).

# Backup

### SQLite

If your backup system uses filesystem snapshots (such as Kubernetes with Volsync), you can directly back up the Seerr data folder.  
Otherwise, you need to stop the Seerr application and back up the `config` folder.

For advanced users, it's possible to back up the database without stopping the application by using the [SQLite CLI](https://www.sqlite.org/download.html). Run the following command to create a backup:  

```bash
sqlite3 db/db.sqlite3 ".backup '/tmp/seerr_db.sqlite3.bak'"
```  

Then, copy the `/tmp/seerr_dump.sqlite3.bak` file to your desired backup location.

### PostgreSQL

You can back up the `config` folder and dump the PostgreSQL database without stopping the Seerr application.

Install [postgresql-client](https://www.postgresql.org/download/) and run the following command to create a backup (just replace the placeholders):

:::info
Depending on how your PostgreSQL instance is configured, you may need to add these options to the command below.

  -h, --host=HOSTNAME      database server host or socket directory

  -p, --port=PORT          database server port number
:::

```bash
pg_dump -U <database_user> -d <database_name> -f /tmp/seerr_db.sql
```

# Restore

### SQLite

After restoring your `db/db.sqlite3` file and, optionally, the `settings.json` file, the `config` folder structure should look like this:

```
.
├── cache            <-- Optional
├── db
│   └── db.sqlite3
├── logs             <-- Optional
└── settings.json    <-- Optional (required if you want to avoid reconfiguring Seerr)
```

Once the files are restored, start the Seerr application.

### PostgreSQL

Install the [PostgreSQL client](https://www.postgresql.org/download/) and restore the PostgreSQL database using the following command (replace the placeholders accordingly):

:::info
Depending on how your PostgreSQL instance is configured, you may need to add these options to the command below.

  -h, --host=HOSTNAME      database server host or socket directory

  -p, --port=PORT          database server port number
:::

```bash
pg_restore -U <database_user> -d <database_name> /tmp/seerr_db.sql
```

Optionally, restore the `settings.json` file. The `config` folder structure should look like this:

```
.
├── cache            <-- Optional
├── logs             <-- Optional
└── settings.json    <-- Optional (required if you want to avoid reconfiguring Seerr)
```

Once the database and files are restored, start the Seerr application.

---

### Getting Started Third Parties Aur (`docs/getting-started/third-parties/aur.mdx`)

---
title: AUR (Advanced)
description: Install Seerr using the Arch User Repository
sidebar_position: 1
---

# AUR
:::warning
Third-party installation methods are maintained by the community. The Seerr team is not responsible for these packages.
:::

:::warning
This method is not recommended for most users. It is intended for advanced users who are using Arch Linux or an Arch-based distribution.
:::

## Installation

To install Seerr from the AUR, you can use an AUR helper like `yay` or `paru`:

import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';

<Tabs groupId="aur-methods" queryString>
  <TabItem value="yay" label="yay">
    ```bash
    yay -S seerr
    ```
  </TabItem>
  <TabItem value="paru" label="paru">
    ```bash
    paru -S seerr
    ```
  </TabItem>
</Tabs>

:::info
After installing Seerr, configure it by visiting the web UI at `http://[address]:5055` and completing the setup steps.
:::

:::tip
You can find the environment file at `/etc/conf.d/seerr` and the service file at `/etc/systemd/system/seerr.service`.
:::

---

### Getting Started Third Parties Synology (`docs/getting-started/third-parties/synology.mdx`)

---
title: Synology (Advanced)
description: Install Seerr on Synology NAS using SynoCommunity
sidebar_position: 4
---

# Synology

:::warning
Third-party installation methods are maintained by the community. The Seerr team is not responsible for these packages.
:::

:::warning
This method is not recommended for most users. It is intended for advanced users who are using Synology NAS.
:::

## Prerequisites

- Synology NAS running **DSM 7.2** or later
- 64-bit architecture (x86_64 or ARMv8)
- [SynoCommunity package source](https://synocommunity.com/) added to Package Center

## Adding the SynoCommunity Package Source

If you haven't already added SynoCommunity to your Package Center:

1. Open **Package Center** in DSM
2. Click **Settings** in the top-right corner
3. Go to the **Package Sources** tab
4. Click **Add**
5. Enter the following:
   - **Name**: `SynoCommunity`
   - **Location**: `https://packages.synocommunity.com`
6. Click **OK**

## Installation

1. In **Package Center**, search for **Seerr**
2. Click **Install**
3. Follow the installation wizard prompts
4. Package Center will automatically install any required dependencies (Node.js v22)

### Access Seerr

Once installed, access Seerr at:

```
http://<your-synology-ip>:5055
```

You can also click the **Open** button in Package Center or find Seerr in the DSM main menu.

## Configuration

Seerr's configuration files are stored at:

```
/var/packages/seerr/var/config
```

:::info
The Seerr package runs as a dedicated service user managed by DSM. No manual permission configuration is required.
:::

## Managing the Service

You can start, stop, and restart Seerr from **Package Center** → Find Seerr → Use the action buttons.

## Updating

When a new version is available:

1. Open **Package Center**
2. Go to **Installed** packages
3. Find **Seerr** and click **Update** if available

:::tip
Enable automatic updates in Package Center settings to keep Seerr up to date.
:::

## Troubleshooting

### Viewing Logs

Seerr logs are located at `/var/packages/seerr/var/config/logs` and can be accessed using:

- **File Browser** package (recommended for most users)
- SSH (advanced users)

### Port Conflicts

Seerr uses port 5055. If this port is already in use:

- **Docker containers**: Remap the conflicting container to a different port
- **Other packages**: The conflicting package will need to be uninstalled as Seerr's port cannot be changed

SynoCommunity ensures there are no port conflicts with other SynoCommunity packages or official Synology packages.

### Package Won't Start

Ensure Node.js v22 is installed and running by checking its status in **Package Center**.

## Uninstallation

1. Open **Package Center**
2. Find **Seerr** in your installed packages
3. Click **Uninstall**

:::caution
Uninstalling will remove the application but preserve your configuration data by default. Select "Remove data" during uninstallation if you want a complete removal.
:::

---

### Getting Started Third Parties Truenas (`docs/getting-started/third-parties/truenas.mdx`)

---
title: TrueNAS (Advanced)
description: Install Seerr using TrueNAS
sidebar_position: 3
---
# TrueNAS
:::warning
Third-party installation methods are maintained by the community. The Seerr team is not responsible for these packages.
:::

:::warning
This method is not recommended for most users. It is intended for advanced users who are using TrueNAS distribution.
:::

## Installation

Go to the 'Apps' menu, click the 'Discover Apps' button in the top right, search for 'Seerr' in the search bar, and install the app.

---

### Getting Started Third Parties Unraid (`docs/getting-started/third-parties/unraid.mdx`)

---
title: Unraid (Advanced)
description: Install Seerr using Unraid
sidebar_position: 2
---

import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';

# Unraid

:::warning
Third-party installation methods are maintained by the community. The Seerr team is not responsible for these packages.
:::

:::warning
This method is not recommended for most users. It is intended for advanced users who are using Unraid.
:::

## Template installation

Several templates from Unraid Community are available right now
- [Unraid Community Apps](https://unraid.net/community/apps#community-apps-iframe)

In case you still want to do it manually, please follow the instructions below.

## Manual Installation

Before proceeding, choose which installation method best suits your server:

**Seerr Default** (`UID 1000:1000`) — Runs with the container's native `node` user. Matches the official image, but may break SMB share access, trigger "Fix Common Problems" warnings, and cause issues with backup plugins (such as CA Appdata Backup) and network integrations (such as Tailscale).

**Unraid Default** (`UID 99:100`) — Runs with Unraid's native `nobody:users` ownership. Follows Unraid best practices, but overrides Seerr's built-in rootless user and may cause compatibility issues with future Seerr updates.

<Tabs groupId="unraid-permissions" queryString>
  <TabItem value="seerr-default" label="Seerr Default">

  ### 1. Create the config directory

  Open the Unraid terminal and run:

  ```bash
  mkdir -p /mnt/user/appdata/seerr
  ```

  ### 2. Set folder permissions

  ```bash
  chown -R 1000:1000 /mnt/user/appdata/seerr
  ```

  ### 3. Add the Docker container

  :::warning
  The **Extra Parameters** field is critical. You **must** add `--init --restart=unless-stopped` (see table below). Without `--init`, the container will not handle signals properly or shut down cleanly. Without `--restart=unless-stopped`, the container will not automatically restart after a reboot.

  To see the **Extra Parameters** field, click **Basic View** in the top-right corner of the template page to switch to the advanced editor.
  :::

  Navigate to the **Docker** tab in Unraid and click **Add Container**. Fill in the following:

  | Field | Value |
  |---|---|
  | **Name** | `seerr` |
  | **Repository** | `ghcr.io/seerr-team/seerr:latest` |
  | **Icon URL** | `https://raw.githubusercontent.com/seerr-team/seerr/develop/public/android-chrome-512x512.png` |
  | **WebUI** | `http://[IP]:[PORT:5055]` |
  | **Extra Parameters** | `--init --restart=unless-stopped` |
  | **Network Type** | `bridge` |
  | **Privileged** | `Off` |

  Then click **Add another Path, Port, Variable** to add:

  **Port:**
  | Field | Value |
  |---|---|
  | Container Port | `5055` |
  | Host Port | `5055` |
  | Connection Type | `TCP` |

  **Path:**
  | Field | Value |
  |---|---|
  | Container Path | `/app/config` |
  | Host Path | `/mnt/user/appdata/seerr` |

  **Variable:**
  | Field | Value |
  |---|---|
  | Key | `TZ` |
  | Value | Your [TZ database name](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) (e.g., `America/New_York`) |

  **Variable (optional):**
  | Field | Value |
  |---|---|
  | Key | `LOG_LEVEL` |
  | Value | `info` |

  Click **Apply** to create and start the container.

  ### 4. Access Seerr

  Open the WebUI at `http://<your-unraid-ip>:5055` and follow the setup wizard.

  </TabItem>
  <TabItem value="unraid-default" label="Unraid Default">

  ### 1. Create the config directory

  Open the Unraid terminal and run:

  ```bash
  mkdir -p /mnt/user/appdata/seerr
  ```

  ### 2. Set folder permissions

  ```bash
  chown -R 99:100 /mnt/user/appdata/seerr
  ```

  ### 3. Add the Docker container

  :::warning
  The **Extra Parameters** field is critical. You **must** add `--init --restart=unless-stopped --user 99:100` (see table below). Without `--init`, the container will not handle signals properly or shut down cleanly. Without `--restart=unless-stopped`, the container will not automatically restart after a reboot. The `--user 99:100` parameter runs the container process with Unraid's default UID/GID and avoids permission errors accessing your shares without changing host folder ownership.

  To see the **Extra Parameters** field, click **Basic View** in the top-right corner of the template page to switch to the advanced editor.
  :::

  Navigate to the **Docker** tab in Unraid and click **Add Container**. Fill in the following:

  | Field | Value |
  |---|---|
  | **Name** | `seerr` |
  | **Repository** | `ghcr.io/seerr-team/seerr:latest` |
  | **Icon URL** | `https://raw.githubusercontent.com/seerr-team/seerr/develop/public/android-chrome-512x512.png` |
  | **WebUI** | `http://[IP]:[PORT:5055]` |
  | **Extra Parameters** | `--init --restart=unless-stopped --user 99:100` |
  | **Network Type** | `bridge` |
  | **Privileged** | `Off` |

  Then click **Add another Path, Port, Variable** to add:

  **Port:**
  | Field | Value |
  |---|---|
  | Container Port | `5055` |
  | Host Port | `5055` |
  | Connection Type | `TCP` |

  **Path:**
  | Field | Value |
  |---|---|
  | Container Path | `/app/config` |
  | Host Path | `/mnt/user/appdata/seerr` |

  **Variable:**
  | Field | Value |
  |---|---|
  | Key | `TZ` |
  | Value | Your [TZ database name](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) (e.g., `America/New_York`) |

  **Variable (optional):**
  | Field | Value |
  |---|---|
  | Key | `LOG_LEVEL` |
  | Value | `info` |

  Click **Apply** to create and start the container.

  ### 4. Access Seerr

  Open the WebUI at `http://<your-unraid-ip>:5055` and follow the setup wizard.

  </TabItem>
</Tabs>

---

### Using Seerr Advanced Self Signed Certificates (`docs/using-seerr/advanced/self-signed-certificates.mdx`)

---
id: self-signed-certificates
title: Self-Signed Certificates
sidebar_label: Self-Signed Certificates
description: How to configure Seerr to work with services that use self-signed SSL certificates.
---

import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';

# Self-Signed Certificates

If your media server or services (Radarr, Sonarr, etc.) use self-signed SSL certificates, Seerr will reject the connection because it does not trust them by default. The fix is to add your CA certificate to Node.js.

## Add Your CA Certificate

The `NODE_EXTRA_CA_CERTS` environment variable tells Node.js to trust additional Certificate Authority (CA) certificates. This approach keeps certificate validation active while trusting your specific certificate.

You will need to mount your certificate file (in PEM format) into the container and set the environment variable to point to it.

:::note
These examples show only the certificate-related configuration. For a complete setup, see the [Getting Started](/getting-started) guide.
:::

<Tabs>
<TabItem value="docker-cli" label="Docker CLI">

```bash
docker run -d \
  --name seerr \
  -e NODE_EXTRA_CA_CERTS=/certs/my-ca.pem \
  -v /path/to/my-ca.pem:/certs/my-ca.pem:ro \
  -p 5055:5055 \
  ghcr.io/seerr-team/seerr:latest
```

</TabItem>
<TabItem value="docker-compose" label="Docker Compose">

```yaml
services:
  seerr:
    image: ghcr.io/seerr-team/seerr:latest
    environment:
      - NODE_EXTRA_CA_CERTS=/certs/my-ca.pem
    volumes:
      - /path/to/my-ca.pem:/certs/my-ca.pem:ro
    ports:
      - 5055:5055
```

</TabItem>
</Tabs>

Replace `/path/to/my-ca.pem` with the actual path to your CA certificate on the host. The path after the colon (`/certs/my-ca.pem`) is where it will be available inside the container.

:::tip
The certificate must be in PEM format. Open it in a text editor — if it starts with `-----BEGIN CERTIFICATE-----`, it is PEM. If it contains binary data, convert it with `openssl x509 -inform DER -in cert.cer -out cert.pem`.
:::

For more details, see the [Node.js documentation on adding CA certificates](https://nodejs.org/en/learn/http/enterprise-network-configuration#adding-additional-ca-certificates).

---

### Using Seerr Advanced Verifying Signed Artifacts (`docs/using-seerr/advanced/verifying-signed-artifacts.mdx`)

---
id: verifying-signed-artifacts
title: Verifying Signed Artifacts
sidebar_label: Verify Signed Artifacts
description: Learn how to verify Seerr's signed artifacts and SBOM attestations.
---

import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';

# Verifying Signed Artifacts

These artifacts are cryptographically signed using [Sigstore Cosign](https://docs.sigstore.dev/quickstart/quickstart-cosign/):
- Container images
- Helm charts

This ensures that the images you pull are authentic, tamper-proof, and built by the official Seerr release pipeline.

Additionally each container image also includes a CycloneDX SBOM (Software Bill of Materials) attestation, generated with [Trivy](https://aquasecurity.github.io/trivy/), providing transparency about all dependencies included in the image.

---

## Prerequisites

You will need the following tools installed:

- [Cosign](https://docs.sigstore.dev/cosign/system_config/installation/)

To verify images:

- [Docker](https://docs.docker.com/get-docker/) **or** [Podman](https://podman.io/getting-started/installation) (including [Skopeo](https://github.com/containers/skopeo/blob/main/install.md))

---

## Verifying Signed Images

### Image Locations

Official Seerr images are available from:

- GitHub Container Registry (GHCR): `ghcr.io/seerr-team/seerr:<tag>`
- Docker Hub: `seerr/seerr:<tag>`

You can view all available tags on the [Seerr Releases page](https://github.com/seerr-team/seerr/releases).

---

### Verifying a Specific Release Tag

Each tagged release (for example `v2.7.4`) is immutable and cryptographically signed.
Verification should always be performed using the image digest (SHA256).

#### Retrieve the Image Digest

<Tabs groupId="verify-methods">
  <TabItem value="docker" label="Docker">

```bash
docker buildx imagetools inspect ghcr.io/seerr-team/seerr:v2.7.4 --format '{{json .Manifest.Digest}}' | tr -d '"'
```
  </TabItem>

  <TabItem value="podman" label="Podman / Skopeo">

```bash
skopeo inspect docker://ghcr.io/seerr-team/seerr:v2.7.4 --format '{{.Digest}}'
```
  </TabItem>
</Tabs>

Example output:

```
sha256:abcd1234...
```

---

#### Verify the Image Signature

<Tabs groupId="registry-methods">
  <TabItem value="ghcr" label="GitHub Container Registry (GHCR)">

```bash
cosign verify ghcr.io/seerr-team/seerr@sha256:abcd1234... \
  --certificate-identity "https://github.com/seerr-team/seerr/.github/workflows/release.yml@refs/tags/v2.7.4" \
  --certificate-oidc-issuer "https://token.actions.githubusercontent.com"
```
  </TabItem>

  <TabItem value="dockerhub" label="Docker Hub">

```bash
cosign verify seerr/seerr@sha256:abcd1234... \
  --certificate-identity "https://github.com/seerr-team/seerr/.github/workflows/release.yml@refs/tags/v2.7.4" \
  --certificate-oidc-issuer "https://token.actions.githubusercontent.com"
```
  </TabItem>
</Tabs>

:::info Successful Verification Example
Verification for `ghcr.io/seerr-team/seerr@sha256:abcd1234...`

The following checks were performed:

- Cosign claims validated
- Signatures verified against the transparency log
- Certificate issued by Fulcio to the expected workflow identity
:::

---

### Verifying the `latest` Tag

:::warning Latest Tag Warning
The `latest` tag is **mutable**, meaning it will change with each new release.
Always verify the digest that `latest` currently points to.
:::

#### Retrieve the Digest for `latest`

<Tabs groupId="verify-methods">
  <TabItem value="docker" label="Docker">

```bash
docker buildx imagetools inspect ghcr.io/seerr-team/seerr:latest --format '{{json .Manifest.Digest}}' | tr -d '"'
```
  </TabItem>

  <TabItem value="podman" label="Podman / Skopeo">

```bash
skopeo inspect docker://ghcr.io/seerr-team/seerr:latest --format '{{.Digest}}'
```
  </TabItem>
</Tabs>

Example output:

```
sha256:abcd1234...
```

#### Verify the Signature

<Tabs groupId="registry-methods">
  <TabItem value="ghcr" label="GHCR">

```bash
cosign verify ghcr.io/seerr-team/seerr@sha256:abcd1234... \
  --certificate-identity-regexp "https://github.com/seerr-team/seerr/.github/workflows/release.yml@refs/tags/v.*" \
  --certificate-oidc-issuer "https://token.actions.githubusercontent.com"
```
  </TabItem>

  <TabItem value="dockerhub" label="Docker Hub">

```bash
cosign verify seerr/seerr@sha256:abcd1234... \
  --certificate-identity-regexp "https://github.com/seerr-team/seerr/.github/workflows/release.yml@refs/tags/v.*" \
  --certificate-oidc-issuer "https://token.actions.githubusercontent.com"
```
  </TabItem>
</Tabs>

:::tip
The wildcard `v.*` ensures verification works for any versioned release that `latest` represents.
:::

---

### Verifying SBOM Attestations

Each image includes a CycloneDX SBOM attestation.

#### Verify the Attestation

```bash
cosign verify-attestation ghcr.io/seerr-team/seerr@sha256:abcd1234... \
  --type cyclonedx \
  --certificate-identity "https://github.com/seerr-team/seerr/.github/workflows/release.yml@refs/tags/v2.7.4" \
  --certificate-oidc-issuer "https://token.actions.githubusercontent.com"
```
:::info Successful Verification Example
Verification for `ghcr.io/seerr-team/seerr@sha256:abcd1234...`

The following checks were performed:

- Cosign claims validated
- Signatures verified against the transparency log
- Certificate issued by Fulcio to the expected workflow identity
:::

#### Extract the SBOM for Inspection

```bash
cosign verify-attestation ghcr.io/seerr-team/seerr@sha256:abcd1234... \
  --type cyclonedx \
  --certificate-identity "https://github.com/seerr-team/seerr/.github/workflows/release.yml@refs/tags/v2.7.4" \
  --certificate-oidc-issuer "https://token.actions.githubusercontent.com" | jq -r '.payload | @base64d' > sbom.json
```

You can open `sbom.json` in a CycloneDX viewer or analyse it with [Trivy](https://aquasecurity.github.io/trivy/) or [Dependency-Track](https://dependencytrack.org/).

---

### Expected Certificate Identity

The expected certificate identity for all signed Seerr images is:

```
https://github.com/seerr-team/seerr/.github/workflows/release.yml@refs/tags/v*
```

This confirms that the image was:

- Built by the official Seerr Release workflow
- Produced from the seerr-team/seerr repository
- Signed using GitHub’s OIDC identity via Sigstore Fulcio

---

### Example: Full Verification Flow

<Tabs groupId="verify-examples">
  <TabItem value="docker" label="Docker">

```bash
DIGEST=$(docker buildx imagetools inspect ghcr.io/seerr-team/seerr:latest --format '{{json .Manifest.Digest}}' | tr -d '"')

cosign verify ghcr.io/seerr-team/seerr@"$DIGEST" \
  --certificate-identity-regexp "https://github.com/seerr-team/seerr/.github/workflows/release.yml@refs/tags/v.*" \
  --certificate-oidc-issuer "https://token.actions.githubusercontent.com"

cosign verify-attestation ghcr.io/seerr-team/seerr@"$DIGEST" \
  --type cyclonedx \
  --certificate-identity-regexp "https://github.com/seerr-team/seerr/.github/workflows/release.yml@refs/tags/v.*" \
  --certificate-oidc-issuer "https://token.actions.githubusercontent.com"
```
  </TabItem>

  <TabItem value="podman" label="Podman / Skopeo">

```bash
DIGEST=$(skopeo inspect docker://ghcr.io/seerr-team/seerr:latest --format '{{.Digest}}')

cosign verify ghcr.io/seerr-team/seerr@"$DIGEST" \
  --certificate-identity-regexp "https://github.com/seerr-team/seerr/.github/workflows/release.yml@refs/tags/v.*" \
  --certificate-oidc-issuer "https://token.actions.githubusercontent.com"
```
  </TabItem>
</Tabs>

## Verifying Signed Helm charts

### Helm Chart Locations

Official Seerr helm charts are available from:

- GitHub Container Registry (GHCR): `ghcr.io/seerr-team/seerr/seerr-chart/seerr-chart:<tag>`

You can view all available tags on the [Seerr Releases page](https://github.com/seerr-team/seerr/pkgs/container/seerr%2Fseerr-chart).

---

### Verifying a Specific Release Tag

Each tagged release (for example `3.0.0`) is immutable and cryptographically signed.
Verification should always be performed using the image digest (SHA256).

#### Retrieve the Helm Chart Digest

<Tabs groupId="verify-methods">
  <TabItem value="docker" label="Docker">

```bash
docker buildx imagetools inspect ghcr.io/seerr-team/seerr/seerr-chart:3.0.0 --format '{{json .Manifest.Digest}}' | tr -d '"'
```
  </TabItem>

  <TabItem value="podman" label="Podman / Skopeo">

```bash
skopeo inspect docker://ghcr.io/seerr-team/seerr/seerr-chart:3.0.0 --format '{{.Digest}}'
```
  </TabItem>
</Tabs>

Example output:

```
sha256:abcd1234...
```

---

#### Verify the Helm Chart Signature

```bash
cosign verify ghcr.io/seerr-team/seerr/seerr-chart@sha256:abcd1234... \
  --certificate-identity "https://github.com/seerr-team/seerr/.github/workflows/helm.yml@refs/heads/develop" \
  --certificate-oidc-issuer "https://token.actions.githubusercontent.com"
```

:::info Successful Verification Example
Verification for `ghcr.io/seerr-team/seerr/seerr-chart@sha256:abcd1234...`

The following checks were performed:

- Cosign claims validated
- Signatures verified against the transparency log
- Certificate issued by Fulcio to the expected workflow identity
:::

---

### Expected Certificate Identity

The expected certificate identity for all signed Seerr charts is:

```
https://github.com/seerr-team/seerr/.github/workflows/helm.yml@refs/heads/develop
```

This confirms that the chart was:

- Built by the official Seerr Release workflow
- Produced from the seerr-team/seerr repository
- Signed using GitHub’s OIDC identity via Sigstore Fulcio

---

### Example: Full Verification Flow

<Tabs groupId="verify-examples">
  <TabItem value="docker" label="Docker">

```bash
DIGEST=$(docker buildx imagetools inspect ghcr.io/seerr-team/seerr/seerr-chart:3.0.0 --format '{{json .Manifest.Digest}}' | tr -d '"')

cosign verify ghcr.io/seerr-team/seerr/seerr-chart@"$DIGEST" \
  --certificate-identity-regexp "https://github.com/seerr-team/seerr/.github/workflows/helm.yml@refs/heads/develop" \
  --certificate-oidc-issuer "https://token.actions.githubusercontent.com"

cosign verify-attestation ghcr.io/seerr-team/seerr/seerr-chart@"$DIGEST" \
  --type cyclonedx \
  --certificate-identity-regexp "https://github.com/seerr-team/seerr/.github/workflows/helm.yml@refs/heads/develop" \
  --certificate-oidc-issuer "https://token.actions.githubusercontent.com"
```
  </TabItem>

  <TabItem value="podman" label="Podman / Skopeo">

```bash
DIGEST=$(skopeo inspect docker://ghcr.io/seerr-team/seerr/seerr-chart:3.0.0 --format '{{.Digest}}')

cosign verify ghcr.io/seerr-team/seerr/seerr-chart@"$DIGEST" \
  --certificate-identity-regexp "https://github.com/seerr-team/seerr/.github/workflows/helm.yml@refs/heads/develop" \
  --certificate-oidc-issuer "https://token.actions.githubusercontent.com"
```
  </TabItem>
</Tabs>

---

## Troubleshooting

| Issue | Likely Cause | Suggested Fix |
|-------|---------------|----------------|
| `no matching signatures` | Incorrect digest or tag | Retrieve the digest again using Docker or Skopeo |
| `certificate identity does not match expected` | Workflow reference changed | Ensure your `--certificate-identity` matches this documentation |
| `cosign: command not found` | Cosign not installed | Install Cosign from the official release |
| `certificate expired` | Old release | Verify a newer tag or digest |

---

## Further Reading

- [Sigstore Documentation](https://docs.sigstore.dev)
- [Cosign Verification Guide](https://docs.sigstore.dev/cosign/verifying/verify/)
- [CycloneDX Specification](https://cyclonedx.org/specification/overview/)
- [Trivy Documentation](https://trivy.dev/latest/docs/)
- [Skopeo Documentation](https://github.com/containers/skopeo)
- [Podman Documentation](https://podman.io/get-started/)
- [Docker Documentation](https://docs.docker.com/)
- [Seerr GitHub Repository](https://github.com/seerr-team/seerr)

---

### Using Seerr Notifications Discord (`docs/using-seerr/notifications/discord.md`)

---
title: Discord
description: Configure Discord notifications.
sidebar_position: 3
---

# Discord

The Discord notification agent enables you to post notifications to a channel in a server you manage.

:::info
Users can optionally opt-in to being mentioned in Discord notifications by configuring their [Discord user ID](https://support.discord.com/hc/en-us/articles/206346498-Where-can-I-find-my-User-Server-Message-ID-) in their user settings.
:::

## Configuration

### Webhook URL

You can find the webhook URL in the Discord application, at **Server Settings &rarr; Integrations &rarr; Webhooks**.

### Notification Role ID (optional)

If a role ID is specified, it will be included in the webhook message. See [Discord role ID](https://support.discord.com/hc/en-us/articles/206346498-Where-can-I-find-my-User-Server-Message-ID).

### Thread ID (optional)

If a thread ID is specified, the notification will be sent to a specific thread, instead of the webhook channel. Leave it blank to send it directly to the channel.

### Bot Username (optional)

If you would like to override the name you configured for your bot in Discord, you may set this value to whatever you like!

### Bot Avatar URL (optional)

Similar to the bot username, you can override the avatar for your bot.

### Use Notification Recipient Locale

When enabled, notifications will be sent in the language of the user who triggered the notification (e.g., the user who made the request or reported the issue) based on their display language setting. When disabled, the **Notification Language** setting below is used instead.

### Notification Language

Sets the language for all notifications sent to this Discord channel. This option is only available when **Use Notification Recipient Locale** is disabled.

The thread must belong to the webhook's channel. A thread from a different channel will cause the request to fail and the notification will not be delivered.

---

### Using Seerr Notifications Email (`docs/using-seerr/notifications/email.md`)

---
title: Email
description: Configure email notifications for your users.
sidebar_position: 1
---

# Email

## Configuration

:::info
If the [Application URL](/using-seerr/settings/general#application-title) setting is configured in **Settings → General**, Seerr will explicitly set the origin server hostname when connecting to the SMTP host.
:::

### Require User Email

When enabled, users will be required to provide a valid email address in their user settings. This is useful if you want to ensure all users can receive email notifications.

### Sender Name (optional)

Configure a friendly name for the email sender (e.g., "Seerr").

### Sender Address

Set this to the email address you would like to appear in the "from" field of the email message.

Depending on your email provider, this may need to be an address you own. For example, Gmail requires this to be your actual email address.

### SMTP Host

Set this to the hostname or IP address of your SMTP server.

### SMTP Port

Set this to a supported port number for your SMTP host. `465` and `587` are commonly used.

### Encryption Method

In most cases, [Use Implicit TLS](https://tools.ietf.org/html/rfc8314) should be selected for port 465, and [Use STARTTLS](https://en.wikipedia.org/wiki/Opportunistic_TLS) if available for port 587. Please refer to your email provider's documentations for details on how to configure this setting.

The default value for this setting is **Use STARTTLS if available**.

### SMTP Username & Password

:::info
If your account has two-factor authentication enabled, you may need to create an application password instead of using your account password.
:::
Configure these values as appropriate to authenticate with your SMTP host.

### PGP Private Key & Password (optional)

Configure these values to enable encrypting and signing of email messages using [OpenPGP](https://www.openpgp.org/). Note that individual users must also have their **PGP public keys** configured in their user settings in order for PGP encryption to be used in messages addressed to them.

When configuring the PGP keys, be sure to keep the entire contents of the key intact. For example, private keys always begin with `-----BEGIN PGP PRIVATE KEY BLOCK-----` and end with `-----END PGP PRIVATE KEY BLOCK-----`.

---

### Using Seerr Notifications Gotify (`docs/using-seerr/notifications/gotify.md`)

---
title: Gotify
description: Configure Gotify notifications.
sidebar_position: 5
---

# Gotify

## Configuration

### Server URL

Set this to the URL of your Gotify server.

### Application Token

Add an application to your Gotify server, and set this field to the generated application token.

:::info
Please refer to the [Gotify API documentation](https://gotify.net/docs) for more details on configuring these notifications.
:::

### Notification Language

Sets the language for notifications sent to this Gotify server.

---

### Using Seerr Notifications Ntfy (`docs/using-seerr/notifications/ntfy.md`)

---
title: ntfy.sh
description: Configure ntfy.sh notifications.
sidebar_position: 6
---

# ntfy.sh

## Configuration

### Server Root URL

Set this to the URL of your ntfy.sh server.

### Topic

Set this to the topic you want to send notifications to.

### Tags (optional)

Set this to a comma-separated list of [ntfy tags](https://docs.ntfy.sh/publish/#tags-emojis) to apply to notifications (for example, `eyes` or `eyes,warning`).

### Username + Password authentication (optional)

Set this to the username and password for your ntfy.sh server.

### Token authentication (optional)

Set this to the token for your ntfy.sh server.

### Priority (optional)

Set the priority level for notifications. Options range from Minimum (1) to Urgent (5), with Default (3) being the standard level. Higher priority notifications may bypass Do Not Disturb settings on some devices.

:::info
Please refer to the [ntfy.sh API documentation](https://docs.ntfy.sh/) for more details on configuring these notifications.
:::

### Notification Language

Sets the language for notifications sent to this ntfy server.

---

### Using Seerr Notifications Pushbullet (`docs/using-seerr/notifications/pushbullet.md`)

---
title: Pushbullet
description: Configure Pushbullet notifications.
sidebar_position: 7
---

# Pushbullet

:::info
Users can optionally configure personal notifications in their user settings.

User notifications are separate from system notifications, and the available notification types are dependent on user permissions.
:::

## Configuration

### Access Token

[Create an access token](https://www.pushbullet.com/#settings) and set it here to grant Seerr access to the Pushbullet API.

### Channel Tag (optional)

Optionally, [create a channel](https://www.pushbullet.com/my-channel) to allow other users to follow the notification feed using the specified channel tag.

---

### Using Seerr Notifications Pushover (`docs/using-seerr/notifications/pushover.md`)

---
title: Pushover
description: Configure Pushover notifications.
sidebar_position: 8
---

# Pushover

:::info
Users can optionally configure personal notifications in their user settings.

User notifications are separate from system notifications, and the available notification types are dependent on user permissions.
:::

## Configuration

### Application/API Token

[Register an application](https://pushover.net/apps/build) and enter the API token in this field. (You can use one of the [official icons in our GitHub repository](https://github.com/seerr-team/seerr/tree/develop/public) when configuring the application.)

For more details on registering applications or the API token, please see the [Pushover API documentation](https://pushover.net/api#registration).

### User Key

Set this to the user key for your Pushover account. Alternatively, you can set this to a group key to deliver notifications to multiple users.

For more details, please see the [Pushover API documentation](https://pushover.net/api#identifiers).

---

### Using Seerr Notifications Slack (`docs/using-seerr/notifications/slack.md`)

---
title: Slack
description: Configure Slack notifications.
sidebar_position: 9
---

# Slack

## Configuration

### Webhook URL

Simply [create a webhook](https://my.slack.com/services/new/incoming-webhook/) and enter the URL in this field.

:::info
Please refer to the [Slack API documentation](https://api.slack.com/messaging/webhooks) for more details on configuring these notifications.
:::

### Notification Language

Sets the language for notifications sent to this Slack channel.

---

### Using Seerr Notifications Telegram (`docs/using-seerr/notifications/telegram.md`)

---
title: Telegram
description: Configure Telegram notifications.
sidebar_position: 10
---

# Telegram

:::info
Users can optionally configure personal notifications in their user settings.

User notifications are separate from system notifications, and the available notification types are dependent on user permissions.
:::

## Configuration

:::info
In order to configure Telegram notifications, you first need to [create a bot](https://telegram.me/BotFather).

Bots **cannot** initiate conversations with users, so users must have your bot added to a conversation in order to receive notifications.
:::

### Bot Username (optional)

If this value is configured, users will be able to click a link to start a chat with your bot and configure their own personal notifications.

The bot username should end with `_bot`, and the `@` prefix should be omitted.

### Bot Authentication Token

At the end of the bot creation process, [@BotFather](https://telegram.me/botfather) will provide an authentication token.

### Chat ID

To obtain your chat ID, simply create a new group chat, add [@get_id_bot](https://telegram.me/get_id_bot), and issue the `/my_id` command.

### Send Silently (optional)

Optionally, notifications can be sent silently. Silent notifications send messages without notification sounds.

---

### Using Seerr Notifications Webhook (`docs/using-seerr/notifications/webhook.md`)

---
title: Webhook
description: Configure webhook notifications.
sidebar_position: 4
---

# Webhook

The webhook notification agent enables you to send a custom JSON payload to any endpoint for specific notification events.

## Configuration

### Webhook URL

The URL you would like to post notifications to. Your JSON will be sent as the body of the request.

### Authorization Header (optional)

:::info
This is typically not needed. Please refer to your webhook provider's documentation for details.
:::

This value will be sent as an `Authorization` HTTP header.

### Custom Headers (optional)

You can add additional custom HTTP headers to be sent with each webhook request. This is useful for API keys, custom authentication schemes, or any other headers your webhook endpoint requires.

- Click "Add Header" to add a new header
- Enter the header name and value

:::warning
You cannot configure both the **Authorization Header** field and a custom `Authorization` header in Custom Headers at the same time. You must choose one method.
:::

### JSON Payload

Customize the JSON payload to suit your needs. Seerr provides several [template variables](#template-variables) for use in the payload, which will be replaced with the relevant data when the notifications are triggered.

## Template Variables

### General

| Variable                | Value                                                                                                                               |
| ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
| `{{notification_type}}` | The type of notification (e.g. `MEDIA_PENDING` or `ISSUE_COMMENT`)                                                                  |
| `{{event}}`             | A friendly description of the notification event                                                                                    |
| `{{subject}}`           | The notification subject (typically the media title)                                                                                |
| `{{message}}`           | The notification message body (the media overview/synopsis for request notifications; the issue description for issue notificatons) |
| `{{image}}`             | The notification image (typically the media poster)                                                                                 |

### Notify User

These variables are for the target recipient of the notification.

| Variable                                 | Value                                                                                        |
| ---------------------------------------- | -------------------------------------------------------------------------------------------- |
| `{{notifyuser_username}}`                | The target notification recipient's username                                                 |
| `{{notifyuser_email}}`                   | The target notification recipient's email address                                            |
| `{{notifyuser_avatar}}`                  | The target notification recipient's avatar URL                                               |
| `{{notifyuser_settings_discordIds}}`     | The target notification recipient's Discord ID(s) as a JSON array (if set)                   |
| `{{notifyuser_settings_telegramChatId}}` | The target notification recipient's Telegram Chat ID (if set)                                |

:::info
The `notifyuser` variables are not defined for the following request notification types, as they are intended for application administrators rather than end users:

- Request Pending Approval
- Request Automatically Approved
- Request Processing Failed

On the other hand, the `notifyuser` variables _will_ be replaced with the requesting user's information for the below notification types:

- Request Approved
- Request Declined
- Request Available

If you would like to use the requesting user's information in your webhook, please instead include the relevant variables from the [Request](#request) section below.
:::

### Special

The following variables must be used as a key in the JSON payload (e.g., `"{{extra}}": []`).

| Variable      | Value                                                                                                                          |
| ------------- | ------------------------------------------------------------------------------------------------------------------------------ |
| `{{media}}`   | The relevant media object                                                                                                      |
| `{{request}}` | The relevant request object                                                                                                    |
| `{{issue}}`   | The relevant issue object                                                                                                      |
| `{{comment}}` | The relevant issue comment object                                                                                              |
| `{{extra}}`   | The "extra" array of additional data for certain notifications (e.g., season/episode numbers for series-related notifications) |

#### Media

The `{{media}}` will be `null` if there is no relevant media object for the notification.

These following special variables are only included in media-related notifications, such as requests.

| Variable                    | Value                                                                                                          |
| ----------------------------| -------------------------------------------------------------------------------------------------------------- |
| `{{media_type}}`            | The media type (`movie` or `tv`)                                                                               |
| `{{media_imdbid}}`          | The media's IMDb ID                                                                                            |
| `{{media_tmdbid}}`          | The media's TMDB ID                                                                                            |
| `{{media_tvdbid}}`          | The media's TheTVDB ID                                                                                         |
| `{{media_status}}`          | The media's availability status (`UNKNOWN`, `PENDING`, `PROCESSING`, `PARTIALLY_AVAILABLE`, or `AVAILABLE`)    |
| `{{media_status4k}}`        | The media's 4K availability status (`UNKNOWN`, `PENDING`, `PROCESSING`, `PARTIALLY_AVAILABLE`, or `AVAILABLE`) |
| `{{media_jellyfinMediaId}}` | The media's Jellyfin Media ID                                                                                  |
| `{{media_plexRatingKey}}`   | The media's Plex ratingKey, if available (for standard library match)                                          |
| `{{media_plexRatingKey4k}}` | The media's Plex ratingKey for 4K match, if available                                                          |

#### Request

The `{{request}}` will be `null` if there is no relevant media object for the notification.

The following special variables are only included in request-related notifications.

| Variable                                  | Value                                                                          |
| ----------------------------------------- | ------------------------------------------------------------------------------ |
| `{{request_id}}`                          | The request ID                                                                 |
| `{{requestedBy_username}}`                | The requesting user's username                                                 |
| `{{requestedBy_email}}`                   | The requesting user's email address                                            |
| `{{requestedBy_avatar}}`                  | The requesting user's avatar URL                                               |
| `{{requestedBy_jellyfinUserId}}`          | The requesting user's Jellyfin User ID                                         |
| `{{requestedBy_settings_discordIds}}`     | The requesting user's Discord ID(s) as a JSON array (if set)                   |
| `{{requestedBy_settings_telegramChatId}}` | The requesting user's Telegram Chat ID (if set)                                |

#### Issue

The `{{issue}}` will be `null` if there is no relevant media object for the notification.

The following special variables are only included in issue-related notifications.

| Variable                                 | Value                                                                          |
| ---------------------------------------- | ------------------------------------------------------------------------------ |
| `{{issue_id}}`                           | The issue ID                                                                   |
| `{{reportedBy_username}}`                | The requesting user's username                                                 |
| `{{reportedBy_email}}`                   | The requesting user's email address                                            |
| `{{reportedBy_avatar}}`                  | The requesting user's avatar URL                                               |
| `{{reportedBy_settings_discordIds}}`     | The reporting user's Discord ID(s) as a JSON array (if set)                    |
| `{{reportedBy_settings_telegramChatId}}` | The requesting user's Telegram Chat ID (if set)                                |

#### Comment

The `{{comment}}` will be `null` if there is no relevant media object for the notification.

The following special variables are only included in issue comment-related notifications.

| Variable                                  | Value                                                                          |
| ----------------------------------------- | ------------------------------------------------------------------------------ |
| `{{comment_message}}`                     | The comment message                                                            |
| `{{commentedBy_username}}`                | The commenting user's username                                                 |
| `{{commentedBy_email}}`                   | The commenting user's email address                                            |
| `{{commentedBy_avatar}}`                  | The commenting user's avatar URL                                               |
| `{{commentedBy_settings_discordIds}}`     | The commenting user's Discord ID(s) as a JSON array (if set)                   |
| `{{commentedBy_settings_telegramChatId}}` | The commenting user's Telegram Chat ID (if set)                                |

---

### Using Seerr Notifications Webpush (`docs/using-seerr/notifications/webpush.md`)

---
title: Web Push
description: Configure web push notifications for your users.
sidebar_position: 2
---

# Web Push

:::warning
Web push notifications require a secure connection to your Seerr instance. Refer to the [Reverse Proxy](/extending-seerr/reverse-proxy) documentation for more information.
:::

The web push notification agent enables you and your users to receive Seerr notifications in a supported browser. This offers a native notification experience without the need to install an app.

This notification agent does not require any configuration, but is not enabled by default in Seerr.

To set up web push notifications, simply enable the agent in **Settings → Notifications → Web Push**.

You and your users have the option to enable web push notifications by going to your **User Profile → Edit Settings → Notifications → Web Push → Enable web push**. Here you can also customize the notifications you'd like to receive.

:::info[Mobile Users]
For Web Push notifications to work on mobile you need to add Seerr to your home screen as progressive web app (PWA). 
:::

:::info[iOS Users]
On iOS you may need to enable the Safari notifications feature flag by going to **Settings → Safari → Advanced → Feature Flags** and enabling "Notifications".
:::

---

### Using Seerr Plex Watchlist Auto Request (`docs/using-seerr/plex/watchlist-auto-request.md`)

---
title: Watchlist Auto Request
description: Learn how to use the Plex Watchlist Auto Request feature
sidebar_position: 1
---

# Watchlist Auto Request

The Plex Watchlist Auto Request feature allows Seerr to automatically create requests for media items you add to your Plex Watchlist. Simply add content to your Plex Watchlist, and Seerr will automatically request it for you.

:::info
This feature is only available for Plex users. Local users cannot use the Watchlist Auto Request feature.
:::

## Prerequisites

- You must have logged into Seerr at least once with your Plex account
- Your administrator must have granted you the necessary permissions
- Your Plex account must have access to the Plex server configured in Seerr

## Permission System

The Watchlist Auto Request feature uses a two-tier permission system:

### Administrator Permissions (Required)
Your administrator must grant you these permissions in your user profile:
- **Auto-Request** (master permission)
- **Auto-Request Movies** (for movie auto-requests)
- **Auto-Request Series** (for TV series auto-requests)

### User Activation (Required)
You must enable the feature in your own profile settings:
- **Auto-Request Movies** toggle
- **Auto-Request Series** toggle

:::warning Two-Step Process
Both administrator permissions AND user activation are required. Having permissions doesn't automatically enable the feature - you must also activate it in your profile.
:::

## How to Enable

### Step 1: Check Your Permissions
Contact your administrator to verify you have been granted:
- `Auto-Request` permission
- `Auto-Request Movies` and/or `Auto-Request Series` permissions

### Step 2: Activate the Feature
1. Go to your user profile settings
2. Navigate to the "General" section
3. Find the "Auto-Request" options
4. Enable the toggles for:
   - **Auto-Request Movies** - to automatically request movies from your watchlist
   - **Auto-Request Series** - to automatically request TV series from your watchlist

### Step 3: Start Using
- Add movies and TV shows to your Plex Watchlist
- Seerr will automatically create requests for new items
- You'll receive notifications when items are auto-requested

## How It Works

Once properly configured, Seerr will:

1. Periodically checks your Plex Watchlist for new items
2. Verify if the content already exists in your media libraries
3. Automatically submits requests for new items that aren't already available
4. Only requests content types you have permissions for
5. Notifiy you when auto-requests are created

:::info Content Limitations
Auto-request only works for standard quality content. 4K content must be requested manually if you have 4K permissions.
:::

## For Administrators

### Granting Permissions
1. Navigate to **Users** > **[Select User]** > **Permissions**
2. Enable the required permissions:
   - **Auto-Request** (master toggle)
   - **Auto-Request Movies** (for movie auto-requests)
   - **Auto-Request Series** (for TV series auto-requests)
3. Optionally enable **Auto-Approve** permissions for automatic approval

### Default Permissions
- Go to **Settings** > **Users** > **Default Permissions**
- Configure auto-request permissions for new users
- This sets the default permissions but users still need to activate the feature individually

## Limitations

- Local users cannot use this feature
- 4K content requires manual requests
- Users must have logged into Seerr with their Plex account
- Respects user request limits and quotas
- Won't request content already in your libraries

---

### Using Seerr Settings General (`docs/using-seerr/settings/general.md`)

---
title: General
description: Configure global and default settings for Seerr.
sidebar_position: 1
---

# General

## API Key

This is your Seerr API key, which can be used to integrate Seerr with third-party applications. Do **not** share this key publicly, as it can be used to gain administrator access!

If you need to generate a new API key for any reason, simply click the button to the right of the text box.

If you want to set the API key, rather than letting it be randomly generated, you can use the API_KEY environment variable. Whatever that variable is set to will be your API key.

## Application Title

If you aren't a huge fan of the name "Seerr" and would like to display something different to your users, you can customize the application title!

## Application URL

Set this to the externally-accessible URL of your Seerr instance.

You must configure this setting in order to enable password reset and generation emails.

## Enable Image Caching

When enabled, Jellseerr will proxy and cache images from pre-configured sources (such as TMDB). This can use a significant amount of disk space.

Images are saved in the `config/cache/images` and stale images are cleared out every 24 hours.

You should enable this if you are having issues with loading images directly from TMDB in your browser.

## Display Language

Set the default display language for Seerr. Users can override this setting in their user settings.

## Discover Region, Discover Language & Streaming Region

These settings filter content shown on the "Discover" home page based on regional availability and original language, respectively. The Streaming Region filters the available streaming providers on the media page. Users can override these global settings by configuring these same options in their user settings.

## Blocklist Region and Blocklist Language

These settings control the region and language used specifically for blocklist content scanning. The "Process Blocklisted Tags" job uses these settings to determine which content to scan for blocklisting, independent of the general Discover settings.

- **Blocklist Region**: The region used for blocklist content scanning. Leave empty to scan all regions.
- **Blocklist Language**: The language used for blocklist content scanning. Leave empty to scan all languages.

These settings are separate from the general "Discover Region" and "Discover Language" settings, allowing you to blocklist content from specific regions/languages regardless of what users see in their Discover pages.

## Blocklist Content with Tags and Limit Content Blocklisted per Tag

These settings blocklist any TV shows or movies that have one of the entered tags. The "Process Blocklisted Tags" job adds entries to the blocklist based on the configured blocklisted tags. If a blocklisted tag is removed, any media blocklisted under that tag will be removed from the blocklist when the "Process Blocklisted Tags" job runs.

The limit setting determines how many pages per tag the job will process, with each page containing 20 entries. The job cycles through all 16 available discovery sort options, querying the defined number of pages to blocklist media that is most likely to appear at the top of each sort. Higher limits will create a more accurate blocklist, but will require more storage.

Blocklisted tags are disabled until at least one tag is entered. These settings cannot be overridden in user settings.

## Hide Available Media

When enabled, media which is already available will not appear on the "Discover" home page, or in the "Recommended" or "Similar" categories or other links on media detail pages.

Available media will still appear in search results, however, so it is possible to locate and view hidden items by searching for them by title.

This setting is **disabled** by default.

## Hide Blocklisted Items

When enabled, media that has been blocklisted will not appear on the "Discover" home page, for all administrators. This can be useful to hide content that you don't want to see, such as content with specific tags or content that has been manually blocklisted when you have the "Manage Blocklist" permission.

This setting is **disabled** by default.

## Hide Requested Media

When enabled, media that has been requested (but not yet available) will not appear on the "Discover" home page, or in the "Recommended" or "Similar" categories or other links on media detail pages.

Requested media will still appear in search results, however, so it is possible to locate and view hidden items by searching for them by title.

This setting is **disabled** by default.

## Allow Partial Series Requests

When enabled, users will be able to submit requests for specific seasons of TV series. If disabled, users will only be able to submit requests for all unavailable seasons.

This setting is **enabled** by default.

---

### Using Seerr Settings Jobs&Cache (`docs/using-seerr/settings/jobs&cache.md`)

---
title: Jobs & Cache
description: Configure jobs and cache settings.
sidebar_position: 6
---

# Jobs & Cache

Seerr performs certain maintenance tasks as regularly-scheduled jobs, but they can also be manually triggered on this page.

Seerr also caches requests to external API endpoints to optimize performance and avoid making unnecessary API calls. If necessary, the cache for any particular endpoint can be cleared by clicking the "Flush Cache" button.

You can also view the current image cache size as well as the total number of cached images.

---

### Using Seerr Settings Mediaserver (`docs/using-seerr/settings/mediaserver.mdx`)

---
title: Mediaserver Settings
description: Configure your Jellyfin, Emby, or Plex server settings.
sidebar_position: 3
---

# Media Server

import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';

<Tabs groupId="media-server-type" queryString>
    <TabItem value="jellyfin" label="Jellyfin">
:::info
To set up Jellyfin, make sure you log in using an account with administrative privileges.

The email address can be any email address and is only used for notifications, password resets, and local sign-in.
It is **not** tied to your Jellyfin account.
:::

### Jellyfin Libraries

In this section, simply select the libraries you would like Seerr to scan. Seerr will periodically check the selected libraries for available content to update the media status that is displayed to users.

If you do not see your Jellyfin library listed, verify your Jellyfin settings are correct and click the Sync Libraries button.

### Manual Library Scan

Seerr will perform a full scan of your Jellyfin libraries once every 24 hours (recently added items are fetched more frequently). If this is your first time configuring Jellyfin, a one-time full manual library scan is recommended!

### Jellyfin Settings

This section is where you configure the connection to your Jellyfin server.

    <Tabs groupId="versions" queryString>
        <TabItem value="latest" label="Latest">

#### Internal URL

The internal URL is the URL that Seerr will use to communicate with your Jellyfin server. This URL should be accessible from the machine running Seerr.

In most cases, this will be the hostname or IP address of the machine running Jellyfin, followed by the port number Jellyfin is running on (usually 8096).

:::note
When running Seerr in a docker container with a bridged network (default), the container's network will be separate from the host network. Therefore, you cannot use `localhost` or `127.0.0.1` as the internal URL as it will resolve to the container itself.
:::
:::tip
If you are running Jellyfin in a docker container, you can put both Seerr and Jellyfin on the same docker network by using a custom [docker network](https://docs.docker.com/reference/cli/docker/network/). This will allow you to use the container name as the internal URL.
:::

#### External URL

The external URL is the URL that your users will use to access Jellyfin. This URL is used to generate links in `Play on Jellyfin` buttons, Jellyfin avatars and other places where users need to access Jellyfin directly.

In most cases, the external URL will be different from the internal URL. This is especially true if you are connecting to Jellyfin using docker container names or local IP addresses.

#### Forgot Password URL

The forgot password URL is the URL that users will be directed to when they click the "Forgot Password" button on the login page. This URL should be accessible from the machine running Seerr.

By default, this field is empty and the "Forgot Password" button on the login page will redirect to the Jellyfin internal URL with the path `/web/index.html#!/forgotpassword`.

You can customize this URL to point to a custom password reset page if you have one.

        </TabItem>
        <TabItem value="develop" label="develop">

#### Hostname or IP Address

If you have Seerr installed on the same network as Jellyfin, you can set this to the local IP address of your Jellyfin server. Otherwise, this should be set to a valid hostname (e.g., jellyfin.myawesomeserver.com).

In most cases, this will be the hostname or IP address of the machine running Jellyfin.

:::note
When running Seerr in a docker container with a bridged network (default), the container's network will be separate from the host network. Therefore, you cannot use `localhost` or `127.0.0.1` as the internal URL as it will resolve to the container itself.
:::
:::tip
If you are running Jellyfin in a docker container, you can put both Seerr and Jellyfin on the same docker network by using a custom [docker network](https://docs.docker.com/reference/cli/docker/network/). This will allow you to use the container name as the internal URL.
:::

#### Port

This value should be set to the port that your Jellyfin server listens on. The default port that Jellyfin uses is 8096, but you may need to set this to 443 or some other value if your Jellyfin server is hosted on a VPS or a different machine and is behind a reverse proxy.

#### Use SSL

Enable this setting to connect to Jellyfin via HTTPS rather than HTTP. Self-signed certificates are not trusted by default, but you can configure Seerr to accept them. See [Self-Signed Certificates](/using-seerr/advanced/self-signed-certificates) for details.

#### External URL

The external URL is the URL that your users will use to access Jellyfin. This URL is used to generate links in `Play on Jellyfin` buttons, Jellyfin avatars and other places where users need to access Jellyfin directly.

In most cases, the external URL will be different from the internal URL. This is especially true if you are connecting to Jellyfin using docker container names or local IP addresses.

#### Forgot Password URL

The forgot password URL is the URL that users will be directed to when they click the "Forgot Password" button on the login page. This URL should be accessible from the machine running Seerr.

By default, this field is empty and the "Forgot Password" button on the login page will redirect to the Jellyfin internal URL with the path `/web/index.html#!/forgotpassword`.

You can customize this URL to point to a custom password reset page if you have one.

            </TabItem>
        </Tabs>
    </TabItem>

   <TabItem value="emby" label="Emby">
:::info
To set up Emby, make sure you log in using an account with administrative privileges.

The email address can be any email address and is only used for notifications, password resets, and local sign-in.
It is **not** tied to your Emby account.
:::

### Emby Libraries

In this section, simply select the libraries you would like Seerr to scan. Seerr will periodically check the selected libraries for available content to update the media status that is displayed to users.

If you do not see your Emby library listed, verify your Emby settings are correct and click the Sync Libraries button.

### Manual Library Scan

Seerr will perform a full scan of your Emby libraries once every 24 hours (recently added items are fetched more frequently). If this is your first time configuring Emby, a one-time full manual library scan is recommended!

### Emby Settings

This section is where you configure the connection to your Emby server.

        <Tabs groupId="versions" queryString>
            <TabItem value="latest" label="Latest">

#### Internal URL

The internal URL is the URL that Seerr will use to communicate with your Emby server. This URL should be accessible from the machine running Seerr.

In most cases, this will be the hostname or IP address of the machine running Emby, followed by the port number Emby is running on (usually 8096).

:::note
When running Seerr in a docker container with a bridged network (default), the container's network will be separate from the host network. Therefore, you cannot use `localhost` or `127.0.0.1` as the internal URL as it will resolve to the container itself.
:::
:::tip
If you are running Emby in a docker container, you can put both Seerr and Emby on the same docker network by using a custom [docker network](https://docs.docker.com/reference/cli/docker/network/). This will allow you to use the container name as the internal URL.
:::

#### External URL

The external URL is the URL that your users will use to access Emby. This URL is used to generate links in `Play on Emby` buttons, Emby avatars and other places where users need to access Emby directly.

In most cases, the external URL will be different from the internal URL. This is especially true if you are connecting to Emby using docker container names or local IP addresses.

#### Forgot Password URL

The forgot password URL is the URL that users will be directed to when they click the "Forgot Password" button on the login page. This URL should be accessible from the machine running Seerr.

By default, this field is empty and the "Forgot Password" button on the login page will redirect to the Emby internal URL with the path `/web/index.html#!/forgotpassword.html`.

You can customize this URL to point to a custom password reset page if you have one.

            </TabItem>
            <TabItem value="develop" label="develop">

#### Hostname or IP Address

If you have Seerr installed on the same network as Emby, you can set this to the local IP address of your Emby server. Otherwise, this should be set to a valid hostname (e.g., jellyfin.myawesomeserver.com).

In most cases, this will be the hostname or IP address of the machine running Emby.

:::note
When running Seerr in a docker container with a bridged network (default), the container's network will be separate from the host network. Therefore, you cannot use `localhost` or `127.0.0.1` as the internal URL as it will resolve to the container itself.
:::
:::tip
If you are running Emby in a docker container, you can put both Seerr and Emby on the same docker network by using a custom [docker network](https://docs.docker.com/reference/cli/docker/network/). This will allow you to use the container name as the internal URL.
:::

#### Port

This value should be set to the port that your Emby server listens on. The default port that Emby uses is 8096, but you may need to set this to 443 or some other value if your Emby server is hosted on a VPS or a different machine and is behind a reverse proxy.

#### Use SSL

Enable this setting to connect to Emby via HTTPS rather than HTTP. Self-signed certificates are not trusted by default, but you can configure Seerr to accept them. See [Self-Signed Certificates](/using-seerr/advanced/self-signed-certificates) for details.

#### External URL

The external URL is the URL that your users will use to access Emby. This URL is used to generate links in `Play on Emby` buttons, Emby avatars and other places where users need to access Emby directly.

In most cases, the external URL will be different from the internal URL. This is especially true if you are connecting to Emby using docker container names or local IP addresses.

#### Forgot Password URL

The forgot password URL is the URL that users will be directed to when they click the "Forgot Password" button on the login page. This URL should be accessible from the machine running Seerr.

By default, this field is empty and the "Forgot Password" button on the login page will redirect to the Emby internal URL with the path `/web/index.html#!/startup/forgotpassword.html`.

You can customize this URL to point to a custom password reset page if you have one.

            </TabItem>
        </Tabs>
    </TabItem>

    <TabItem value="plex" label="Plex">

### Plex Settings

:::info
To set up Plex, you can either enter your details manually or select a server retrieved from [plex.tv](https://plex.tv/). Press the button to the right of the "Server" dropdown to retrieve available servers.

Depending on your setup/configuration, you may need to enter your Plex server details manually in order to establish a connection from Seerr.
:::

#### Hostname or IP Address

If you have Seerr installed on the same network as Plex, you can set this to the local IP address of your Plex server. Otherwise, this should be set to a valid hostname (e.g., `plex.myawesomeserver.com`).

#### Port

This value should be set to the port that your Plex server listens on. The default port that Plex uses is `32400`, but you may need to set this to `443` or some other value if your Plex server is hosted on a VPS or cloud provider.

#### Use SSL

Enable this setting to connect to Plex via HTTPS rather than HTTP. Self-signed certificates are not trusted by default, but you can configure Seerr to accept them. See [Self-Signed Certificates](/using-seerr/advanced/self-signed-certificates) for details.

#### Web App URL (optional)

The **Play on Plex** buttons on media pages link to items on your Plex server. By default, these links use the [Plex Web App](https://support.plex.tv/articles/200288666-opening-plex-web-app/) hosted from plex.tv, but you can provide the URL to the web app on your Plex server and we'll use that instead!

Note that you will need to enter the full path to the web app (e.g., `https://plex.myawesomeserver.com/web`).

### Plex Libraries

In this section, simply select the libraries you would like Seerr to scan. Seerr will periodically check the selected libraries for available content to update the media status that is displayed to users.

If you do not see your Plex libraries listed, verify your Plex settings are correct and click the **Sync Libraries** button.

### Manual Library Scan

Seerr will perform a full scan of your Plex libraries once every 24 hours (recently added items are fetched more frequently). If this is your first time configuring Plex, a one-time full manual library scan is recommended!

</TabItem>

</Tabs>

---

### Using Seerr Settings Network (`docs/using-seerr/settings/network.md`)

---
title: Network
description: Configure Network settings.
sidebar_position: 7
---

# Network

Network-related settings are available in the **Network** tab under **Settings**. These options control how Seerr communicates with external services

## DNS Caching

Seerr allows you to enable DNS caching if you are experiencing DNS-related issues. When enabled, it improves performance and reduces the number of DNS lookups required for external API calls. This can help speed up response times and reduce the load on DNS servers, especially when a local resolver like Pi-hole is used.

### Configuration

You can enable the DNS caching settings in the Network tab of the Seerr settings. The default values follow the standard DNS caching behavior.

- **Force Minimum TTL**: Set a minimum time-to-live (TTL) in seconds for DNS cache entries. This ensures that frequently accessed DNS records are cached for a longer period, reducing the need for repeated lookups. Default is 0.
- **Force Maximum TTL**: Set a maximum time-to-live (TTL) in seconds for DNS cache entries. This prevents infrequently accessed DNS records from being cached indefinitely, allowing for more up-to-date information to be retrieved. Default is -1 (unlimited).

## Force IPv4 resolution first

Sometimes there are configuration issues with IPv6 that prevent the hostname resolution from working correctly.

You can force resolution to prefer IPv4 by going to `Settings > Network`, enabling `Force IPv4 Resolution First`, and then restarting Seerr.

## HTTP(S) Proxy

If you can't change your DNS servers or force IPV4 resolution, you can use Seerr through a proxy.

In some places (like China), the ISP blocks not only the DNS resolution but also the connection to the TMDB API.

## Enable Proxy Support

If you have Seerr behind a reverse proxy, enable this setting to allow Seerr to correctly register client IP addresses. For details, please see the [Express Documentation](https://expressjs.com/en/guide/behind-proxies.html).

This setting is **disabled** by default.

## Enable CSRF Protection

:::warning
**This is an advanced setting.** Please only enable this setting if you are familiar with CSRF protection and how it works.
:::

CSRF stands for [cross-site request forgery](https://en.wikipedia.org/wiki/Cross-site_request_forgery). When this setting is enabled, all external API access that alters Seerr application data is blocked.

If you do not use Seerr integrations with third-party applications to add/modify/delete requests or users, you can consider enabling this setting to protect against malicious attacks.

One caveat, however, is that HTTPS is required, meaning that once this setting is enabled, you will no longer be able to access your Seerr instance over _HTTP_ (including using an IP address and port number).

If you enable this setting and find yourself unable to access Seerr, you can disable the setting by modifying `settings.json` in `/app/config`.

This setting is **disabled** by default.

## API Request Timeout

The API Request Timeout setting defines the maximum time (in seconds) Seerr will wait for a response from external services, such as Radarr or Sonarr. The default value is 10 seconds, though it can be entirely disabled by setting it to 0. Please note that any changes to this value require restarting Seerr to take effect.

Enforcing a timeout ensures the Seerr interface remains responsive and prevents infinite loading states when a connected service unexpectedly goes offline. Conversely, you may want to increase this value if you frequently experience failed requests due to your external services being slow to respond, which often happens when they are under heavy load or querying network-mounted storage.

---

### Using Seerr Settings Notifications (`docs/using-seerr/settings/notifications.mdx`)

---
title: Notifications
description: Configure notifications for your users.
sidebar_position: 5
---

# Notifications

Please see the [Notifications](/using-seerr/notifications) page for more information.

---

### Using Seerr Settings Services (`docs/using-seerr/settings/services.md`)

---
title: Services
description: Configure your default services.
sidebar_position: 4
---

# Services

:::info
**If you keep separate copies of non-4K and 4K content in your media libraries, you will need to set up multiple Radarr/Sonarr instances and link each of them to Seerr.**

Seerr checks these linked servers to determine whether or not media has already been requested or is available, so two servers of each type are required _if you keep separate non-4K and 4K copies of media._

**If you only maintain one copy of media, you can instead simply set up one server and set the "Quality Profile" setting on a per-request basis.**
:::

### Radarr/Sonarr Settings

:::warning
**Only v3 & V4 Radarr/Sonarr servers are supported!** If your Radarr/Sonarr server is still running v2, you will need to upgrade in order to add it to Seerr.
::::

#### Default Server

At least one server needs to be marked as "Default" in order for requests to be sent successfully to Radarr/Sonarr.

If you have separate 4K Radarr/Sonarr servers, you need to designate default 4K servers _in addition to_ default non-4K servers.

#### 4K Server

Only select this option if you have separate non-4K and 4K servers. If you only have a single Radarr/Sonarr server, do _not_ check this box!

#### Server Name

Enter a friendly name for the Radarr/Sonarr server.

#### Hostname or IP Address

If you have Seerr installed on the same network as Radarr/Sonarr, you can set this to the local IP address of your Radarr/Sonarr server. Otherwise, this should be set to a valid hostname (e.g., `radarr.myawesomeserver.com`).

#### Port

This value should be set to the port that your Radarr/Sonarr server listens on. By default, Radarr uses port `7878` and Sonarr uses port `8989`, but you may need to set this to `443` or some other value if your Radarr/Sonarr server is hosted on a VPS or cloud provider.

#### Use SSL

Enable this setting to connect to Radarr/Sonarr via HTTPS rather than HTTP. Self-signed certificates are not trusted by default, but you can configure Seerr to accept them. See [Self-Signed Certificates](/using-seerr/advanced/self-signed-certificates) for details.

#### API Key

Enter your Radarr/Sonarr API key here. Do _not_ share these key publicly, as they can be used to gain administrator access to your Radarr/Sonarr servers!

You can locate the required API keys in Radarr/Sonarr in **Settings &rarr; General &rarr; Security**.

#### URL Base

If you have configured a URL base for your Radarr/Sonarr server, you _must_ enter it here in order for Jellyeerr to connect to those services!

You can verify whether or not you have a URL base configured in your Radarr/Sonarr server at **Settings &rarr; General &rarr; Host**. (Note that a restart of your Radarr/Sonarr server is required if you modify this setting!)

#### Profiles, Root Folder, Minimum Availability

Select the default settings you would like to use for all new requests. Note that all of these options are required, and that requests will fail if any of these are not configured!

#### External URL (optional)

If the hostname or IP address you configured above is not accessible outside your network, you can set a different URL here. This "external" URL is used to add clickable links to your Radarr/Sonarr servers on media detail pages.

#### Enable Scan (optional)

Enable this setting if you would like to scan your Radarr/Sonarr server for existing media/request status. It is recommended that you enable this setting, so that users cannot submit requests for media which has already been requested or is already available.

#### Enable Automatic Search (optional)

Enable this setting to have Radarr/Sonarr to automatically search for media upon approval of a request.

---

### Using Seerr Settings Users (`docs/using-seerr/settings/users.md`)

---
title: User Settings
description: Configure global and default user settings.
sidebar_position: 2
---

# Users

## Enable Local Sign-In

When enabled, users who have configured passwords will be allowed to sign in using their email address.

When disabled, your mediaserver OAuth becomes the only sign-in option, and any "local users" you have created will not be able to sign in to Seerr.

This setting is **enabled** by default.

## Enable Jellyfin/Emby/Plex Sign-In

When enabled, users will be able to sign in to Seerr using their Jellyfin/Emby/Plex credentials, provided they have linked their media server accounts.

When disabled, users will only be able to sign in using their email address. Users without a password set will not be able to sign in to Seerr.

This setting is **enabled** by default.

## Enable New Jellyfin/Emby/Plex Sign-In

When enabled, users with access to your media server will be able to sign in to Seerr even if they have not yet been imported. Users will be automatically assigned the permissions configured in the [Default Permissions](#default-permissions) setting upon first sign-in.

This setting is **enabled** by default.

## Global Movie Request Limit & Global Series Request Limit

Select the request limits you would like granted to users.

Unless an override is configured, users are granted these global request limits.

Note that users with the **Manage Users** permission are exempt from request limits, since that permission also grants the ability to submit requests on behalf of other users.

## Default Permissions

Select the permissions you would like assigned to new users to have by default upon account creation.

If [Enable New Jellyfin/Emby/Plex Sign-In](#enable-new-jellyfinembyplex-sign-in) is enabled, any user with access to your media server will be able to sign in to Seerr, and they will be granted the permissions you select here upon first sign-in.

This setting only affects new users, and has no impact on existing users. In order to modify permissions for existing users, you will need to edit the users.

---

### Using Seerr Users Adding Users (`docs/using-seerr/users/adding-users.mdx`)

---
title: Adding Users
description: Add users to your Seerr instance.
sidebar_position: 2
---

# Adding Users

There are currently two methods to add users to Seerr: importing Mediaserver users and creating "local users." All new users are created with the [default permissions](/using-seerr/settings/users#default-permissions) defined in **Settings &rarr; Users**.

### Importing Mediaserver Users

import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';

<Tabs groupId="media-server-type" queryString>
  <TabItem value="jellyfin" label="Jellyfin">
    Clicking the **Import Jellyfin Users** button on the **User List** page will fetch the list of users with access to the Jellyfin server and add them to Seerr automatically.

    Importing Jellyfin users is not required, however. Any user with access to the Jellyfin server can log in to Seerr even if they have not been imported, and will be assigned the configured [default permissions](/using-seerr/settings/users#default-permissions) upon their first login.

:::tip
To disable new Jellyfin sign-ins, navigate to **Settings &rarr; Users** and uncheck the [**Enable New Jellyfin Sign-In**](/using-seerr/settings/users#enable-new-jellyfinembyplex-sign-in) box.
:::

  </TabItem>
  <TabItem value="emby" label="Emby">
    Clicking the **Import Emby Users** button on the **User List** page will fetch the list of users with access to the Emby server and add them to Seerr automatically.

    Importing Emby users is not required, however. Any user with access to the Emby server can log in to Seerr even if they have not been imported, and will be assigned the configured [default permissions](/using-seerr/settings/users#default-permissions) upon their first login.

:::tip
To disable new Emby sign-ins, navigate to **Settings &rarr; Users** and uncheck the [**Enable New Emby Sign-In**](/using-seerr/settings/users#enable-new-jellyfinembyplex-sign-in) box.
:::

  </TabItem>

  <TabItem value="plex" label="Plex">
    Clicking the **Import Plex Users** button on the **User List** page will fetch the list of users with access to the Plex server from [plex.tv](https://www.plex.tv/), and add them to Seerr automatically.

    Importing Plex users is not required, however. Any user with access to the Plex server can log in to Seerr even if they have not been imported, and will be assigned the configured [default permissions](/using-seerr/settings/users#default-permissions) upon their first login.

:::tip
To disable new Plex sign-ins, navigate to **Settings &rarr; Users** and uncheck the [**Enable New Plex Sign-In**](/using-seerr/settings/users#enable-new-jellyfinembyplex-sign-in) box.
:::

  </TabItem>
</Tabs>

### Creating Local Users

If you would like to grant Seerr access to a user who doesn't have their own Plex account and/or access to the Plex server, you can manually add them by clicking the **Create Local User** button.

#### Email Address

Enter a valid email address at which the user can receive messages pertaining to their account and other notifications. The email address currently cannot be modified after the account is created.

#### Automatically Generate Password

If an [application URL](/using-seerr/settings/general#application-url) is set and [email notifications](/using-seerr/notifications/email) have been configured and enabled, Seerr can automatically generate a password for the new user.

#### Password

If you would prefer to manually configure a password, enter a password here that is a minimum of 8 characters.

---

### Using Seerr Users Deleting Users (`docs/using-seerr/users/deleting-users.md`)

---
title: Deleting Users
description: Delete users from Seerr.
sidebar_position: 4
---

# Deleting Users

When users are deleted, all of their data and request history is also cleared from the database.

---

### Using Seerr Users Editing Users (`docs/using-seerr/users/editing-users.md`)

---
title: Editing Users
description: Edit user settings and permissions.
sidebar_position: 3
---

# Editing Users

From the **User List**, you can click the **Edit** button to modify a particular user's settings.

You can also click the check boxes and click the **Bulk Edit** button to set user permissions for multiple users at once.

## General

### Display Name

You can optionally set a "friendly name" for any user. This name will be used in lieu of their media server (Jellyfin/Emby/Plex) username (for users imported from the media server) or their email address (for manually-created local users).

### Email

:::note
This field is read-only for users imported from Plex.
:::
You can optionally set a proper email address for any user. This email address will be used for notifications, local sign-in and password resets.

By default, users imported from Jellyfin/Emby will use their media server username as their email address.

:::warning
You cannot leave this field blank.
:::

### Display Language

Users can override the [global display language](/using-seerr/settings/general#display-language) to use Seerr in their preferred language.

### Discover Region & Discover Language

Users can override the [global filter settings](/using-seerr/settings/general#discover-region-discover-language--streaming-region) to suit their own preferences.

### Movie Request Limit & Series Request Limit

You can override the default settings and assign different request limits for specific users by checking the **Enable Override** box and selecting the desired request limit and time period.

Unless an override is configured, users are granted the global request limits.

Note that users with the **Manage Users** permission are exempt from request limits, since that permission also grants the ability to submit requests on behalf of other users.

Users are also unable to modify their own request limits.

## Password

All "local users" are assigned passwords upon creation, but users imported from Plex can also optionally configure passwords to enable sign-in using their email address.

Passwords must be a minimum of 8 characters long.

## Notifications

Users can configure their personal notification settings here. Please see [Notifications](/using-seerr/notifications/) for details on configuring and enabling notifications.

## Permissions

Users cannot modify their own permissions. Users with the **Manage Users** permission can manage permissions of other users, except those of users with the **Admin** permission.

---

### Using Seerr Users Owner (`docs/using-seerr/users/owner.md`)

---
title: Owner Account
description: Your owner account is the primary account for managing Seerr.
sidebar_position: 1
---

# Owner Account

The user account created during Seerr setup is the "Owner" account, which cannot be deleted or modified by other users. This account's credentials are used to authenticate with your media server and configure Seerr settings.

:::note
In case of Jellyfin/Emby, the owner account is also used for API access to your media server. This account should have a valid authentication token for your media server.
:::

:::tip
If your authentication token is ever invalidated or changed, you can refresh it by re-authenticating with your media server.
:::

---

--- METRICS ---
- Files Extracted: 46
- Estimated Token Budget: ~39672 tokens
- Canonical Reference: https://codewiki.google/github.com/seerr-team/seerr
