Bazarr+ v2.3.0 (Keystone)
Bazarr+ v2.3.0 makes provider extensibility a first-class platform feature. Provider Hub V1 turns subtitle providers into installable plugins backed by catalog sources, a marketplace UI, staged activation, isolated workers, hash-checked bundles, and a visible activity trail.
Keystone also lands the companion Provider Hub ecosystem work in LavX/bazarr-provider-catalog: an official catalog repository, SDK tooling for provider authors, SmokeHub as the deterministic reference provider, and SubtitleCat as the first real catalog provider. Under that visible feature work, Bazarr+ rebases its subtitle patch layer onto Subliminal 2.6, removes the legacy bundled dependency tree from the release path, tightens provider compatibility checks, and carries forward the v2.2.1 Docker auth hotfix line.
56 commits since v2.2.1, including 40 non-merge commits. The release touches the provider platform, dependency loading, Docker packaging, CI, catalog development, and the Settings > Providers experience.
Headline: Provider Hub (the Keystone)
Provider Hub is the new plugin foundation for subtitle providers. It is designed so end users can install providers from a marketplace while Bazarr+ still treats third-party Python code with clear boundaries.
Enable and manage it under Settings > Providers. Marketplace, Updates, Sources, My Providers, and Activity now live in the same provider settings area.
What it does:
- Catalog sources: Bazarr+ ships with an official GitHub catalog source and supports additional GitHub catalog sources for community providers.
- Marketplace UI: Users can browse provider cards, filter by source, see trust badges, install providers, test connections, uninstall plugins, and discover updates.
- My Providers integration: Installed plugins appear beside shipped providers with source labels, state labels, language metadata, and priority controls.
- Staged lifecycle: Installs, updates, and active removals are staged first. Bazarr+ keeps the current active provider running until restart, then promotes or removes the staged plugin.
- Restart banner: The UI shows a clear restart-required state when staged provider changes are waiting.
- Activity log: Catalog refreshes, installs, updates, tests, removals, durations, target identities, version changes, and errors are recorded for operators.
- Developer source override: Operators can point a catalog source at a temporary branch for provider development and validation.
Provider Hub does not hot-reload Python provider modules. That is intentional. Live unload and reload of provider code is risky when third-party dependencies are involved. V1 favors restart activation because it gives Bazarr+ a stable boundary between the currently running provider set and the next one.
Companion Catalog and SDK
The Provider Hub runtime in Bazarr+ pairs with the new official catalog repository:
- Repository:
LavX/bazarr-provider-catalog - Purpose: official catalog source for Provider Hub plugins.
- Layout:
catalog.json,providers/,sdk/, andtests/.
The catalog SDK is authoring tooling. Installed providers do not import it at runtime.
SDK commands:
python3 -B -m sdk validatepython3 -B -m sdk hash providers/<id>python3 -B -m sdk build-catalogpython3 -B -m sdk smoke-test
Provider authors get templates, manifest validation, bundle hashing, catalog generation, smoke tests, and catalog-level tests without importing Bazarr internals. Dependencies must be pinned wheels with SHA-256 hashes.
SmokeHub remains the deterministic no-network reference provider for install, config, secret, dependency, and worker checks.
First Catalog Provider: SubtitleCat
SubtitleCat is the first real Provider Hub catalog provider. It lives in LavX/bazarr-provider-catalog#1, targeting the official catalog for this release.
What it provides:
- No-login subtitlecat.com scraper.
- Movie and episode support.
- Broad language coverage.
- Optional inclusion of cached machine-translated subtitle files.
- Request delay control for polite scraping.
- Rich match keys derived from release names so manual-search ranking can compete with shipped providers.
- Source page links surfaced through provider payloads.
Once the catalog PR lands on the catalog repository's default branch, clean v2.3.0 installs should be able to refresh the official source and see SubtitleCat in Marketplace.
Plugin Safety Model
Provider Hub's hard part is not the marketplace card. The hard part is the boundary around code Bazarr+ did not ship.
Every provider package must declare a manifest. Bazarr+ validates:
- Provider id, name, version, supported media, and languages.
- Entry module and entry class.
- Declared files and SHA-256 file hashes.
- Bundle SHA-256.
- GitHub source repository, commit, catalog URL, and optional source path.
- Exact, hash-checked Python dependencies.
- Secret fields that must be redacted before data reaches the UI.
Install-time behavior is guarded too:
- Provider files are fetched from a pinned GitHub commit.
- Bundles are verified before use.
- Dependencies install into a provider-specific virtual environment.
- Pip runs with hash checking and binary-only constraints.
- A worker process imports and smoke-validates the provider before the install is staged.
- Active plugins run through a worker protocol that serializes video, language, candidate, and download payloads across a clear boundary.
Trust is explicit. The official catalog source is trusted. Custom catalog sources are stored as untrusted, even if a caller tries to mark them trusted. That does not make community plugins unusable. It makes the trust signal honest.
Subliminal 2.6 Foundation
v2.3.0 rebases the Bazarr+ subtitle patch layer onto Subliminal 2.6 and removes the legacy vendored dependency tree from the release path.
Why this matters:
- Bazarr+ can rely on current Python packages instead of carrying a large stale
libs/snapshot. - Dependency loading is now explicit and tested.
- Docker images install runtime dependencies through pip during the build.
- The patched provider layer stays in
custom_libs/, where Bazarr+-specific behavior belongs. - Provider compatibility guards cover the high-risk edges of the Subliminal rebase.
The test suite includes dedicated checks for dependency loading, Subliminal version behavior, embedded subtitles, FileBot refinement, Subsunacs behavior, SignalR compatibility, and provider registration.
Provider Improvements
- Manual search now queries all providers instead of stopping too early.
- Provider Hub plugins register dynamically when active installations exist.
- Provider auth and config assembly includes active Provider Hub configuration while keeping secret values redacted from the UI.
- Generated provider language metadata gives the provider picker richer coverage data.
- Prijevodi-Online is included from the v2.2.1 hotfix line.
- SubtitleCat becomes available through the official catalog after the companion catalog PR lands.
Reliability
- Manual download cache imports fixed by resolving dual
sys.pathimport behavior. - Lingarr cold-start retry delay increased so cold deployments have time to answer before Bazarr+ gives up.
- Translate-only mass operations optimized by avoiding an unnecessary full table join.
- SignalR dependency bumps handled through a compatibility layer.
- Docker packaging includes PostgreSQL requirements in the image build.
- Backend CI installs ffmpeg so embedded-subtitle tests exercise real media fixtures.
- Supervisor startup SSE guarded when
EventSourceis unavailable.
UI / UX
Settings > Providers received the largest UI change in this release.
- Provider Hub marketplace with catalog cards, update cards, source drawers, empty states, and status badges.
- Trust badges for official and community catalog entries.
- Staged-change banners that explain when restart is required.
- Compact
Pending restartstate so narrow provider cards do not clip actions. - Plugin and shipped labels in the provider picker and provider list.
- Generated provider language metadata for clearer provider selection.
- Activity rows with target, version diff, duration, and copyable error details.
The goal is practical: installing a provider should feel like installing a plugin, not editing source code.
CI / Docker
- CI tests Python 3.12, 3.13, and 3.14 backend paths with dependency and Subliminal rebase guards.
- Provider Hub and compat contract tests run against the new plugin boundary.
- Frontend CI continues to typecheck, test, format-check, and build the React UI.
- Docker release builds publish versioned,
latest, and SHA tags only from release-tagged flows. - GitHub Pages deployment for the static site is separated from Docker release publishing.
- Docker version tags use semver without the
vprefix.
Acknowledgements
Grateful thanks to everyone who participated in this release: contributors, reviewers, testers, provider authors, and everyone who helped validate Provider Hub, the catalog SDK, Subliminal compatibility, UI flows, Docker packaging, and the Keystone release assets.
Release contributors and participants:
- @LavX: [Provider Hub], [catalog integration], [Subliminal 2.6 rebase], [unvendoring], [Docker auth], [CI/release], [Keystone assets].
- @davidgut1982: [manual search], [manual download cache], [Lingarr cold-start retry].
- @rtalmaci: [Docker PostgreSQL packaging], [translation metadata].
- @bartlangelaan: [manual-search issue report].
Migration from v2.2.1
Docker users can upgrade in place.
docker pull ghcr.io/lavx/bazarr:2.3.0
# or :latest after the release workflow publishes
docker compose up -dNo config migration is required for existing shipped providers. Existing provider settings continue to work.
Provider Hub is additive:
- Open Settings > Providers.
- Refresh the official catalog source.
- Install a provider from Marketplace.
- Restart Bazarr+ when the staged-change banner appears.
- Add the installed provider to the enabled provider list and save settings.
For source installs, refresh Python dependencies after pulling this release. v2.3.0 no longer relies on the old checked-in libs/ dependency tree.
Docker
docker pull ghcr.io/lavx/bazarr:2.3.0
docker pull ghcr.io/lavx/bazarr:latestDocker Compose:
git clone --recursive https://github.com/LavX/bazarr.git
cd bazarr
docker compose up -dAfter upgrade, confirm the UI loads and /api/system/status reports 2.3.0.
Full Changelog: v2.2.1...v2.3.0
