# 12-pulsarr.md

kstack:
  book: Centerpoint Home Lab
  chapter: Media Management
  page: Pulsarr
  tags: [pulsarr, watchlist, notifications, arr, media-management]
---

## Overview

Pulsarr is a watchlist automation and notification bridge for the *arr stack. It
monitors Plex and Jellyfin watchlists, automatically adds requested movies and TV
shows to Radarr and Sonarr, and sends notifications when content is downloaded and
available. It also integrates with TMDB for metadata-enriched notifications.

## Access

| Type      | URL                                      | Notes                                           |
|-----------|------------------------------------------|-------------------------------------------------|
| Internal  | `https://pulsarr.home.local`             | LAN access via Step-CA TLS                      |
| External  | `https://pulsarr.jeeves5454.ddns.net`    | Authentik SSO + GeoBlock + CrowdSec             |

## Configuration

**Image:** `lakker/pulsarr:latest`
**Compose project:** `arr` stack

### Traefik Labels

```yaml
# External route
traefik.http.routers.pulsarr-external.rule: Host(`pulsarr.jeeves5454.ddns.net`)
traefik.http.routers.pulsarr-external.entrypoints: websecure
traefik.http.routers.pulsarr-external.tls.certresolver: letsencrypt
traefik.http.routers.pulsarr-external.middlewares: authentik-auth@docker,plex-geoblock@file,crowdsec-bouncer@file
traefik.http.routers.pulsarr-external.service: pulsarr-svc

# Internal route
traefik.http.routers.pulsarr-internal.rule: Host(`pulsarr.home.local`)
traefik.http.routers.pulsarr-internal.entrypoints: websecure
traefik.http.routers.pulsarr-internal.tls.certresolver: step-ca
traefik.http.routers.pulsarr-internal.service: pulsarr-svc

traefik.http.services.pulsarr-svc.loadbalancer.server.port: 3003
```

### Key Environment Variables

| Variable      | Value             | Purpose                                      |
|---------------|-------------------|----------------------------------------------|
| `TZ`          | `America/Toronto` | Timezone                                     |
| `port`        | `3003`            | Application listen port                      |
| `tmdbApiKey`  | **REDACTED**      | TMDB API key for metadata and notification enrichment |

## Volumes / Bind Mounts

| Host Path                               | Container Path | Purpose                            |
|-----------------------------------------|----------------|------------------------------------|
| `/home/jeeves/docker/arr/pulsarr/config`| `/app/data`    | Pulsarr database and configuration |

## Integration Points

| Service  | Purpose                                                  |
|----------|----------------------------------------------------------|
| Sonarr   | Adds TV shows from watchlists; receives completion events |
| Radarr   | Adds movies from watchlists; receives completion events   |
| Plex     | Reads watchlists from Plex accounts                      |
| TMDB     | Fetches poster art and metadata for notifications         |

## Notes / Gotchas

- The TMDB API key (`tmdbApiKey`) is visible in the container environment — treat
  it as a secret. Rotate at `themoviedb.org` if exposed.
- Pulsarr's watchlist sync requires Plex account API tokens configured in the
  Pulsarr UI settings.
- Pulsarr is healthy-checked (`(healthy)` status in `docker ps`) — the healthcheck
  endpoint is configured internally.
- Notification channels (Discord, Telegram, etc.) are configured in Pulsarr settings
  and stored in the `/app/data` bind mount.

---
*Last Updated: 2026-06-16*