Pulsarr

Environment variables

Every setting Pulsarr reads from .env, with its default.

Pulsarr reads these from .env, or from the container's environment in Docker. Most of them are also settings in the app, and you only need .env to fix a value before first start or to keep it under version control.

A variable in .env replaces the value saved in the app every time Pulsarr starts. This happens even when the variable is set to an empty value. A change you make in the app lasts only until the next restart, so remove the variable from .env if you want to manage that setting in the app.

Restart Pulsarr after changing .env. Values marked JSON take one line of JSON, for example sonarrTags=["4k","kids"].

Server

VariableDefaultDescription
TZTime zone for the container, for example America/Los_Angeles. Docker only.
listenPort3003Port Pulsarr listens on.
baseUrlhttp://localhostAddress Sonarr and Radarr use to reach Pulsarr for webhooks. Set in the app through Fix the address.
port3003Port Sonarr and Radarr use to reach Pulsarr for webhooks.
basePath/Path prefix when Pulsarr is served under a subfolder by a reverse proxy, for example /pulsarr. See Reverse proxy.
dataDirFolder for the database and logs. Defaults to ./data in Docker and Linux, C:\ProgramData\Pulsarr on Windows and ~/.config/Pulsarr on macOS.
logLevelinfofatal, error, warn, info, debug, trace or silent.
enableConsoleOutputtrueSet to false to log only to files.
enableRequestLoggingfalseLog every HTTP request.
rateLimitMax500Requests allowed per client per minute. Sign-in and account routes have their own smaller fixed limit this does not change.
closeGraceDelay10000Milliseconds to wait for work to finish on shutdown.
allowIframesfalseAllow Pulsarr to be embedded in another page, such as a dashboard. Removes the X-Frame-Options header, which otherwise allows framing only from the same origin.

Database

To set up PostgreSQL or move to it from SQLite, see PostgreSQL.

VariableDefaultDescription
dbTypesqlitesqlite or postgres.
dbPath<dataDir>/db/pulsarr.dbSQLite database file.
dbHostlocalhostPostgreSQL host.
dbPort5432PostgreSQL port.
dbNamepulsarrPostgreSQL database.
dbUserpostgresPostgreSQL user.
dbPasswordpulsarrpostgrespwPostgreSQL password.
dbConnectionStringFull PostgreSQL connection string. Used instead of the five settings above.

Security

VariableDefaultDescription
authenticationMethodrequiredrequired, requiredExceptLocal (no sign-in from your local network) or disabled.
cookieSecretGeneratedSigns session cookies. At least 32 characters.
cookieNamepulsarrName of the session cookie. Two Pulsarr instances on one host need different names.
cookieSecuredfalseSend the session cookie over HTTPS only. Turn on when Pulsarr is behind HTTPS.
webhookSecretGeneratedAuthenticates webhooks from Sonarr and Radarr. At least 16 characters.

Pulsarr generates the secrets on first start and stores them, so they stay the same across restarts. Set them in .env only if you need fixed values.

For requiredExceptLocal, local means loopback, the private IPv4 ranges 10.0.0.0/8, 172.16.0.0/12 and 192.168.0.0/16, IPv4 link-local 169.254.0.0/16, and IPv6 unique local fc00::/7 and link-local fe80::/10.

Reverse proxy

The proxy must pass the path through unchanged, basePath prefix included.

Pulsarr trusts forwarded headers only from loopback, link-local and private addresses. The proxy must send X-Forwarded-For, or every visitor shares the proxy's address and trips the per-IP rate limits together. Traefik, Caddy and Nginx Proxy Manager send it by default. Plain nginx needs proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;.

Behind Cloudflare, the proxy must trust Cloudflare's address ranges to pass on real client addresses. Local sign-in bypass then works only for LAN clients that reach the proxy directly.

An authentication proxy in front of Pulsarr must let /v1/notifications/webhook and /v1/notifications/webhook/maintainerr through, after any basePath. Otherwise Sonarr, Radarr and Maintainerr webhooks get 401.

Plex

VariableDefaultDescription
plexTokens[]JSON. Plex tokens. Set in the app by linking a Plex account.
plexServerUrlPlex server address. Empty means automatic.
skipIfExistsOnPlexfalseSkip requests your server or shared servers already have.
skipFriendSyncfalseDon't create the friends' watchlist RSS feed.
selfRssYour watchlist RSS feed. Filled in by Pulsarr.
friendsRssFriends' watchlist RSS feed. Filled in by Pulsarr.

Sonarr and Radarr

Pulsarr uses these only to create a first Sonarr or Radarr instance when there is none. After that, manage instances on the Sonarr and Radarr pages, and remove these variables from .env.

VariableDefaultDescription
sonarrBaseUrlhttp://localhost:8989Sonarr address.
sonarrApiKeyplaceholderSonarr API key.
sonarrQualityProfileQuality profile.
sonarrRootFolderRoot folder path.
sonarrSeasonMonitoringallSeason monitoring. One of all, future, missing, existing, recent, pilot, firstSeason, lastSeason, monitorSpecials, unmonitorSpecials or none, or a rolling mode, pilotRolling, firstSeasonRolling or allSeasonPilotRolling.
sonarrMonitorNewItemsallall or none.
sonarrCreateSeasonFoldersfalsePut each season in its own folder.
sonarrBypassIgnoredfalseAdd content even when it's on Sonarr's import list exclusions.
sonarrTags[]JSON. Tags added to every show.
radarrBaseUrlhttp://localhost:7878Radarr address.
radarrApiKeyplaceholderRadarr API key.
radarrQualityProfileQuality profile.
radarrRootFolderRoot folder path.
radarrBypassIgnoredfalseAdd content even when it's on Radarr's import list exclusions.
radarrTags[]JSON. Tags added to every movie.

TMDB

VariableDefaultDescription
tmdbApiKeyTMDB API read access token. Docker images and native builds include one. Builds from source do not.
tmdbRegionUSRegion for streaming provider lookups.

Notifications

VariableDefaultDescription
discordBotTokenDiscord bot token.
discordClientIdDiscord application client ID.
discordWebhookUrlDiscord webhook URLs, comma-separated.
appriseUrlAddress of your Apprise server.
systemAppriseUrlApprise URLs for admin notifications.
appriseEmailSenderSender address used when a user's Apprise setting is a plain email address.
enableApprisefalseSet by Pulsarr when it can reach the Apprise server.
plexMobileEnabledfalseSend Plex mobile push notifications. Needs Plex Pass.
approvalNotifynoneWhere to send approval requests. See the options below.
queueWaitTime120000Milliseconds to collect episodes into one notification.
newEpisodeThreshold172800000Episodes that aired within this many milliseconds count as new.
pendingWebhookRetryInterval20Seconds between retries of webhooks Pulsarr couldn't match yet.
pendingWebhookMaxAge10Minutes to keep retrying them.
pendingWebhookCleanupInterval60Seconds between clean-ups of expired ones.
publicContentNotificationsAll offJSON. Settings from the Public content page.

approvalNotify takes none, all, discord-only, apprise-only, webhook-only, dm-only, discord-webhook, discord-message or discord-both.

User tags

VariableDefaultDescription
tagUsersInSonarrfalseTag shows in Sonarr with the users who requested them.
tagUsersInRadarrfalseTag movies in Radarr with the users who requested them.
tagPrefixpulsarr-userPrefix for user tags.
tagNamingSourceusernameusername or alias.
cleanupOrphanedTagstrueRemove tags of users who no longer exist.
removedTagModeremoveWhat happens to a tag when a user removes the item. One of remove, keep or special-tag.
removedTagPrefixpulsarr-removedPrefix used by special-tag.

Delete sync

VariableDefaultDescription
deletionModewatchlistwatchlist or tag-based.
deleteMoviefalseDelete movies.
deleteEndedShowfalseDelete ended shows.
deleteContinuingShowfalseDelete continuing shows.
deleteFilestrueDelete files from disk too.
respectUserSyncSettingtrueOnly delete content from users with sync on.
deleteSyncTrackedOnlyfalseOnly delete content Pulsarr requested.
deleteSyncCleanupApprovalsfalseRemove approval records for deleted content.
deleteSyncRequiredTagRegexIn tag-based mode, only content with a tag matching this regular expression is deleted.
maxDeletionPrevention10Stop a run that would delete more than this percentage of your library.
enablePlexPlaylistProtectionfalseNever delete content on a protection playlist.
plexProtectionPlaylistNameDo Not DeleteName of that playlist.
deleteSyncNotifynoneWhere to send delete sync results. One of none, message, webhook, both, or any approvalNotify option.
deleteSyncNotifyOnlyOnDeletionfalseOnly notify when something was deleted.

Maintainerr

VariableDefaultDescription
maintainerrEnabledfalseTurn on the Maintainerr integration.
maintainerrUrlMaintainerr address.
maintainerrExclusionModewatchlisterswatchlisters excludes handled media for its current watchlisters. global excludes it for every user.
maintainerrWebhookSecretGeneratedAuthenticates webhooks from Maintainerr. At least 16 characters.

New user defaults

VariableDefaultDescription
newUserDefaultCanSynctrueNew users' watchlists sync.
newUserDefaultRequiresApprovalfalseNew users' requests need approval.
newUserDefaultMovieQuotaEnabledfalseNew users get a movie quota.
newUserDefaultMovieQuotaTypemonthlydaily, weekly_rolling or monthly.
newUserDefaultMovieQuotaLimit10Movies allowed per quota period.
newUserDefaultMovieBypassApprovalfalseMovie requests over the quota are approved anyway.
newUserDefaultShowQuotaEnabledfalseNew users get a show quota.
newUserDefaultShowQuotaTypemonthlydaily, weekly_rolling or monthly.
newUserDefaultShowQuotaLimit10Shows allowed per quota period.
newUserDefaultShowBypassApprovalfalseShow requests over the quota are approved anyway.

JSON settings

These take one line of JSON. quotaSettings and plexLabelSync fill in any field you leave out from the defaults shown. approvalExpiration, plexSessionMonitoring and publicContentNotifications need every field.

quotaSettings, from the Quotas page:

{"cleanup":{"enabled":true,"retentionDays":90},"weeklyRolling":{"resetDays":7},"monthly":{"resetDay":1,"handleMonthEnd":"last-day"}}

approvalExpiration, from the Approval settings page. expirationAction is expire or auto_approve:

{"enabled":false,"defaultExpirationHours":72,"expirationAction":"expire","autoApproveOnQuotaAvailable":false,"cleanupExpiredDays":30}

plexLabelSync, from the Plex labels page:

{"enabled":false,"labelPrefix":"pulsarr","labelNamingSource":"username","cleanupOrphanedLabels":false,"removedLabelMode":"remove","removedLabelPrefix":"pulsarr:removed","autoResetOnScheduledSync":false,"tagSync":{"enabled":false,"syncRadarrTags":true,"syncSonarrTags":true}}

plexSessionMonitoring, from the Session monitoring page:

{"enabled":false,"pollingIntervalMinutes":15,"remainingEpisodes":2,"filterUsers":[],"enableAutoReset":true,"inactivityResetDays":7,"autoResetIntervalHours":24,"enableProgressiveCleanup":false}

Last updated on