Settings

Re-run setup wizard Export config

Integrations

Reachable from inside this app's container -- use the same URL/API key you'd use from Bazarr's own settings. Changes here take effect immediately, no restart needed.

Optional. Enables a content-advisory check (nudity/sexual content) before scanning a title. Leave blank to disable.
Append ?token=<this> to the Sonarr/Radarr/Bazarr webhook URLs. "Generate new" fills in a fresh random one -- save to actually rotate it.

Audio Processing

to

Titles tagged vulgarr-audio/vulgarr-video/vulgarr-both in Radarr/Sonarr (e.g. via Overseerr's Advanced Request tag picker) always run the matching pipeline(s) on import, regardless of these toggles.
Used to de-duplicate near-simultaneous events for the same title, not to block either source.
Whisper mode is slower (runs a local alignment model per matched line) but more accurate. Only applies to new titles -- existing ones keep their current setting, editable individually or per-show.

Video Processing

Detects candidate explicit-content scenes via a local frame classifier. Never runs automatically on import, unlike Audio Processing above -- only ever starts from an explicit "Scan for scenes" click, since a scan has a real CPU cost and Apply produces a full second encoded "Vulgarr Edit" copy of the movie/episode.

Auto-approval & Claude Vision

When on, a scan's candidates are approved automatically and blurred into the "Vulgarr Edit" file as soon as the scan finishes -- no manual review click needed. If a scan turns up a scene that shouldn't have been caught (or misses one), go to that title's review list, reject/adjust it there, then hit Apply again to regenerate the file -- it always rebuilds from whatever's currently approved, including scenes already baked into an earlier version. Turn this off to go back to fully manual review before anything is ever blurred.
Optional extra check before auto-approving: sends a few frames from each candidate to a Claude-vision-capable endpoint and asks for a yes/no verdict, to catch false positives (ordinary, non-sexualized swimwear) that NudeNet alone can flag -- it also blocks sexualized/provocative content even without full nudity (thongs, lingerie, and similar). A clear "no" outright rejects the candidate, the same as manually clicking Reject. Off by default -- this is the one thing in vulgarr that costs real external money per use (a fraction of a cent per scan). Requires an OpenAI-compatible vision API below, e.g. a self-hosted LiteLLM proxy in front of Anthropic's API -- see /docker/stack/litellm in the repo. If this is on but the endpoint is unreachable or misconfigured, candidates just fall back to normal manual review -- it never causes an auto-approval on its own.
Must match a model_name alias in the proxy's own config, not a raw Anthropic model ID -- the litellm stack's default config.yaml defines "claude-haiku-4-5" and "claude-sonnet-5".
Cost optimization: skips the Claude call entirely (auto-approves directly, same as if the filter were off) for a candidate whose own dense re-scan already cleared this fraction -- there's little value paying to double-check something NudeNet was barely uncertain about. Set to 1 to always call Claude regardless of confidence.

Scene detection scanning

Minimum per-frame classifier score (0-1) to count as a hit. Kept permissive by default -- every candidate is reviewed manually either way, so a stricter value only risks missing real scenes.
Nearby hits within this many seconds of each other are merged into one candidate scene.
A single sampled frame below the normal consecutive-frame requirement still counts as a real candidate if its own confidence clears this higher bar -- catches quick-cut flashes narrower than the sample interval without loosening the false-positive check for ordinary low-confidence single-frame noise.
How many sampled frames to extract+classify at once within a single scan. Free speedup on multi-core hardware -- doesn't change which scenes get found, only how fast a scan finishes.
After the main scan finds a candidate, this many seconds are added to each side before a second, denser re-scan of just that window -- powers the "Approve high-confidence" bulk action below.
Also drives how tightly a candidate's actual start/end gets refined (see "Verification padding" above) -- not just the confidence stat. Lower = closer to native frame-rate precision.
Fraction of a candidate's dense verification samples that must clear the confidence threshold to be eligible for one-click bulk approval. Short/borderline scenes naturally score low here and stay in the manual queue.

Blur output

Lower = better quality, bigger file. Only affects the "Vulgarr Edit" sibling file's re-encode -- 23 is a reasonable default.
Faster presets finish sooner but produce a larger file at the same quality.
Very Heavy
Light to Maximum. Defaults to Very Heavy, tested via direct visual comparison to leave nothing recognizable -- Maximum goes further still for extra headroom.
Extra margin added before each approved scene's start. Kept smaller than the end padding below -- detection reliably catches where a scene actually begins.
Extra margin added after each approved scene's end. Kept wider than the start padding -- the classifier repeatedly stops detecting a few seconds before a scene's real end, so this is where an unblurred boundary is most likely to show real content.
#$!%*
Approximate -- CSS blur isn't pixel-identical to ffmpeg's boxblur, but scales the same direction as the two sliders above.

Backups

Off = the original is deleted right after processing instead of kept under /data/backups. There is no other copy of the unmodified file once this is off.
0 = keep every backup forever. Defaults to 7 days. Backups live under /data/backups and are the only copy of the original, unmodified file. Ignored while "Keep backups" above is off.

Authentication

Off by default. Turn this on if this app is reachable by anyone other than you (e.g. exposed beyond your LAN) -- otherwise every page here, including this one, is wide open.

Leave blank to keep the current password. Required (once, the first time) before "Username & password" can take effect -- and if "Single sign-on" is selected, this doubles as a break-glass login (always reachable at /auth/login/basic) for when Authentik itself is unreachable or misconfigured.