26 min read

Set Up WhisperSubs Workers with Jellyfin and Localtonet

Install and verify WhisperSubs transcription workers in Jellyfin, then securely expose your configured Jellyfin HTTP endpoint with Localtonet.

Jellyfin host sending transcription work to a worker and serving remote access through a Localtonet tunnel.
WhisperSubs coordinates transcription workers, while Localtonet provides a path to the configured Jellyfin HTTP endpoint.
Tutorials Β· WhisperSubs Β· Jellyfin Β· Localtonet Β· 2026

Generate AI subtitles on hardware you control, then reach the configured Jellyfin interface remotely

WhisperSubs adds Whisper-based subtitle generation to Jellyfin and can run transcription on the Jellyfin server or across additional workers. This guide covers the documented plugin installation, engine and model requirements, local verification, subtitle modes, routine operation, worker planning, and common failures. After Jellyfin and WhisperSubs work locally, we show how to expose your existing Jellyfin HTTP endpoint with Localtonet. Localtonet publishes Jellyfin, not a separate WhisperSubs web server, so administrators and authorized users continue to interact with WhisperSubs through Jellyfin.

πŸ”’ Keep transcription on hardware you control 🌐 Publish your configured Jellyfin HTTP endpoint ⚑ Expand processing with optional transcription workers

How WhisperSubs, Jellyfin, workers, and Localtonet fit together

WhisperSubs is a Jellyfin plugin for generating subtitle files with Whisper speech-to-text models. Its default processing path runs transcription on the Jellyfin server. The plugin can also distribute work to a pool of additional machines, GPUs, a NAS, or a deliberately configured hosted endpoint. Local workers are used before the plugin bursts to a paid provider.

The important architectural distinction is that WhisperSubs does not need to become a separate public media application. Its administration interface, progress information, library browser, and user request controls appear inside Jellyfin. When you add remote access with Localtonet, the local target is therefore your existing Jellyfin HTTP listener. An authorized administrator who opens the resulting public HTTPS address reaches Jellyfin and can then navigate to the WhisperSubs controls allowed by Jellyfin.

🎬 Jellyfin provides the application interface WhisperSubs is installed from Jellyfin's plugin catalog. Administrators configure it through the Jellyfin dashboard, while permitted users can request subtitles from an item menu when that capability is enabled.
🧠 Whisper performs transcription The plugin requires a whisper-cli binary and a GGML model. On Linux, supported downloads are available from the plugin settings. On macOS and Windows, whisper-cli must be installed separately and its path supplied to the plugin.
πŸ–₯️ Workers add processing capacity Transcription runs on the Jellyfin server by default. Optional workers let you use other controlled hardware and process work across a pool, but remote processing is disabled until you configure it deliberately.
🌐 Localtonet publishes Jellyfin Our client establishes an outbound connection to a Localtonet relay. An HTTP tunnel can provide a public HTTPS address for the Jellyfin HTTP endpoint without requiring inbound router port forwarding or a public IP address.

This separation also helps with troubleshooting. A plugin installation problem belongs to Jellyfin or WhisperSubs. A transcription failure belongs to the engine, model, FFmpeg, media permissions, selected binary, or worker. A page that works locally but not through its public address points instead to the Jellyfin listener, Localtonet client, or tunnel configuration.

Localtonet does not replace the WhisperSubs worker pool

The integration in this guide exposes the configured Jellyfin web endpoint so authorized people can reach Jellyfin and its plugin interface. It does not automatically register transcription workers, distribute media to them, or turn the Localtonet relay into a Whisper worker.

Prerequisites and planning decisions

Begin with a working Jellyfin installation. Confirm that you can sign in locally as an administrator and reach the Dashboard and Plugins pages. Do not start by creating a public tunnel. Installing and testing locally first keeps application, transcription, and networking problems separate.

Requirement Documented expectation What to verify
Jellyfin Version 10.11.0 or later Confirm the running server version before installing the plugin.
FFmpeg Jellyfin's bundled FFmpeg or an FFmpeg executable available on PATH Verify Jellyfin can access FFmpeg because WhisperSubs uses it to extract audio.
Whisper engine The whisper.cpp whisper-cli binary Use the plugin download on Linux where compatible, or supply the executable manually on macOS and Windows.
Whisper model A GGML model file Download a model from the plugin settings or provide one manually.
Media storage A location where generated subtitle files can be written next to media Check filesystem permissions, free space, and the implications of writing to the library.
Optional vocal separation The bs_roformer-cli binary Only install it if you want vocal separation. Transcription can fall back to the original audio when separation is unavailable.
Optional remote access A reachable local Jellyfin HTTP address and port Use the actual listener configured in your Jellyfin installation. This guide does not assume a default port.

Account for the operating system

The engine setup differs by platform. Linux users can download both the Whisper engine binary and a model from the WhisperSubs settings page. The project offers multiple prebuilt binary variants, so the selected build must match the server's CPU and any intended acceleration backend.

On macOS and Windows, an empty binary variant list is expected behavior rather than a broken plugin page. Prebuilt Whisper engine downloads are Linux-only. Install whisper-cli yourself and enter its real filesystem location in Whisper Binary Path. Model downloads remain available through the settings page on all three platforms.

Do not copy an engine path from another operating system or deployment layout. For example, paths inside a container differ from host paths. Jellyfin must be able to see and execute the path from its own runtime environment.

Decide whether the Jellyfin server is sufficient

A separate worker is optional. Start with the local Jellyfin server unless you already know it lacks suitable processing resources. A successful local transcription gives you a baseline before you introduce worker networking, credentials, extra storage access, or a hosted provider.

GPU acceleration options documented by the project include CUDA for NVIDIA hardware, Vulkan for Intel, AMD, or NVIDIA hardware, and ROCm for AMD hardware. Availability on a particular system still depends on compatible hardware, drivers, container passthrough where relevant, and a matching Whisper binary. Do not select an accelerated build solely because the hardware vendor appears in that list.

Plan for access to media and generated files

WhisperSubs extracts audio from your media and writes subtitle files beside the media. Confirm that the Jellyfin process has the necessary read and write permissions before running a large job. Avoid broad filesystem permissions when a narrower library-specific permission is sufficient.

Install WhisperSubs from the Jellyfin plugin repository

Jellyfin plugin repository and catalog views for installing WhisperSubs.
Add the WhisperSubs repository, then install the plugin from Jellyfin’s catalog.

The recommended installation method uses the project's Jellyfin repository. It avoids manually compiling and copying the plugin assembly, and it keeps plugin discovery inside Jellyfin's normal catalog workflow.

1

Open Jellyfin's plugin repositories

Sign in to Jellyfin as an administrator. Open Dashboard, select Plugins, and then open Repositories.

2

Add the WhisperSubs repository

Add a plugin repository using the official manifest URL shown below. Preserve the complete HTTPS address and manifest filename.

3

Install WhisperSubs from the catalog

Return to the plugin Catalog, find WhisperSubs, and select Install. Wait for Jellyfin to finish the installation.

4

Restart Jellyfin

Restart the Jellyfin server so it loads the newly installed plugin. Reloading only the browser page is not a substitute for restarting the server process.

5

Open the WhisperSubs settings page

After Jellyfin returns, sign in again if necessary and open Dashboard, Plugins, and WhisperSubs. The plugin is installed, but it cannot transcribe until an engine and model are configured.

https://geiserx.github.io/whisper-subs/manifest.json

If WhisperSubs does not appear in the catalog, first recheck the manifest URL and confirm that the Jellyfin server can retrieve the repository metadata. If installation appears to complete but the settings page is absent, verify that Jellyfin was actually restarted and that its version meets the plugin requirement.

Why this guide does not use the manual build method

The project also documents a developer-oriented manual path that builds the plugin in Release configuration and copies WhisperSubs.dll into a Jellyfin plugin directory. That path introduces .NET build requirements and deployment-specific plugin locations. It is unnecessary for the normal installation covered here, so the repository installation is the safer and simpler baseline.

Installation is only the first stage

Seeing WhisperSubs in Jellyfin confirms that the plugin loaded. It does not prove that whisper-cli can run, that a model is present, that FFmpeg can extract audio, or that Jellyfin can write subtitle files.

Configure the Whisper engine, model, and subtitle behavior

Configure the engine on Linux

Open the WhisperSubs settings page and use its engine setup controls to select a compatible Linux binary variant. The project publishes multiple variants because processors and acceleration environments do not all support the same instructions or backends. Choose according to the actual CPU, GPU, drivers, and runtime available to Jellyfin.

After choosing the variant, use the settings page to download the engine. Confirm that the resulting configuration points to the downloaded whisper-cli executable. If the executable immediately terminates with exit code 132, a common cause is an illegal CPU instruction from an incompatible binary variant. Select a build compatible with the processor rather than repeatedly retrying the same executable.

Configure the engine on macOS or Windows

Install whisper-cli separately because the plugin does not offer prebuilt engine downloads for these platforms. Then set Whisper Binary Path to the actual whisper-cli executable. The exact installation command and path depend on how whisper.cpp is installed on that machine, so no universal command or path is safe to provide.

Check the path from Jellyfin's point of view. A path that works in your interactive shell can still fail when Jellyfin runs under a service account with a different working directory, environment, or filesystem access. Use an absolute path and grant only the execution and read permissions required by the Jellyfin service.

Download and select a model

Model downloads are available from the plugin settings on Linux, macOS, and Windows. Select and download a GGML model, wait for the download to complete, and confirm that the model path is populated. A plugin with a valid engine but no model still cannot transcribe.

Model choice affects resource requirements and transcription behavior, but the supplied evidence does not establish a universal best model for every language, server, or GPU. Begin with a model that fits the memory and processing capacity of the machine, verify one file, and evaluate its output before scheduling the whole library.

Choose a subtitle mode

Mode Generated output Operational consideration
Full A complete transcription of speech This is the default mode and the most direct baseline for an initial test.
Forced only Only foreign-language dialogue It performs VAD segmentation and per-chunk language detection. The documented example notes that a two-hour film may require roughly 240 language-detection calls before transcription begins.
Full + forced Both full and forced subtitles for each audio track Expect more output and processing than a single full transcription.
Translation only An English translated subtitle Whisper translation supports English as the target language and skips native-language transcription in this mode.
Lyrics Experimental LRC files for music libraries Jellyfin can discover the resulting lyric files automatically.

Automatic language detection first considers each audio stream's language tag. If a tag is absent, Whisper's own detection is used. For media containing multiple audio languages, the plugin can generate a subtitle for each audio language.

Understand output naming

WhisperSubs writes generated subtitles beside the media. Its default filename template is {name}.{lang}.{label}{.type}, and the default label is WhisperSubs. A Spanish movie can therefore produce the following files:

Movie.es.WhisperSubs.srt
Movie.es.WhisperSubs.forced.srt
Movie.en.WhisperSubs.translated.srt

Music output uses an LRC file such as Song.lrc. The subtitle label is both the title shown in Jellyfin's subtitle picker and the marker WhisperSubs uses to recognize files it created. If you change the label, choose something distinctive. Older files containing the .generated. anchor remain recognized.

Review the skip behavior before processing a mature library. The scheduled task skips media that already has a usable subtitle in the required language. Forced tracks do not meet that requirement while Ignore forced subtitles when skipping remains enabled, which is the documented default. Image-based subtitle tracks are not counted unless Count image-based subtitles as present is enabled.

Verify a local transcription before adding workers or remote access

Use one short, representative media item for the first test. It should be stored in a library location where Jellyfin can read the media and write an adjacent subtitle. A small test reduces the time needed to diagnose an engine, model, or permission problem.

1

Confirm the plugin configuration is complete

Check that the Whisper binary path and model path are present. If you enabled optional vocal separation, confirm its binary separately rather than assuming it is part of whisper-cli.

2

Submit one subtitle request

Use the WhisperSubs administration interface to select a test item and request the desired mode. Full mode is the clearest initial baseline because it avoids the additional forced-dialogue detection phase.

3

Watch real-time progress

Observe the live banner for the current item, processing phase, per-file progress, and queue depth. Confirm that work advances rather than repeatedly returning to a failed state.

4

Inspect the generated file

Verify that the expected SRT or LRC file appears next to the media and uses the configured label and filename template. Check that the Jellyfin service owns or can manage the output as intended.

5

Play the item in Jellyfin

After the metadata refresh, open the item, select the generated subtitle from Jellyfin's subtitle picker, and check timing, language, readability, and whether the selected mode produced the expected kind of track.

A completed job should leave both an observable plugin result and a usable media-side file. Checking only the queue is not enough. Likewise, finding an SRT file without testing playback does not confirm that Jellyfin indexed it or that the content matches the intended language.

WhisperSubs can resume interrupted transcription from its last timestamp instead of starting the entire item again. This is useful after a transient interruption, but it should not be treated as a reason to ignore recurring engine or storage failures.

Do not schedule the full library yet

Validate several representative files first, including different codecs, languages, audio layouts, and storage locations used in your library. A successful short clip proves the basic path, but it may not reveal all media-specific or permission-specific failures.

Plan and validate WhisperSubs transcription workers

WhisperSubs assigning transcription jobs to local workers and receiving subtitle results.
Workers receive transcription jobs from WhisperSubs and return generated subtitle results to Jellyfin.

Once local transcription works, you can consider additional workers. WhisperSubs supports a worker pool for distributing transcription across extra machines, GPUs, a NAS, or a hosted endpoint. It can also use Groq, OpenAI, or OpenRouter as a backend when deliberately configured. Processing stays on hardware you control by default, but media leaves the Jellyfin server when you intentionally configure a remote worker or hosted provider.

Worker expansion should solve a specific constraint. A worker may provide a suitable GPU, isolate a heavy workload from the media server, or increase parallel processing capacity. It also adds network reachability, authentication, service lifecycle, and resource-management concerns.

🏠 Local server first The Jellyfin server is the default processing location. Keep this baseline operational so you can compare worker behavior against a known-good local job.
🧩 Worker pool Additional controlled machines can participate in transcription. This can spread work across available compute resources instead of relying on one host.
πŸ’³ Hosted backend Paid providers are optional and must be configured deliberately. Free local workers are used before bursting to a paid backend.
πŸ”‘ Authenticated communication The project provides API-key-aware diagnostics for worker communication. Treat every worker key as a secret and never place it in a public URL, article, log excerpt, or tunnel name.

A safe worker rollout sequence

  1. Complete one successful transcription on the Jellyfin server.
  2. Choose a worker host with a compatible processor or GPU and sufficient storage and memory for its engine and model.
  3. Install the official worker implementation according to the documentation matching the deployed WhisperSubs version.
  4. Configure the worker's engine, model, and required authentication without exposing its API key.
  5. Ensure Jellyfin can reach the worker endpoint through the intended private or controlled network path.
  6. Add the worker through WhisperSubs using the endpoint and authentication fields documented by the installed release.
  7. Inspect the worker status before sending a test job.
  8. Submit one test item and verify that it is processed by the intended worker.
  9. Add further workers only after the first one behaves predictably.
Exact worker commands are version-specific

The available evidence confirms a worker container, worker pool, status and queue diagnostics, API keys, and hosted backends, but it does not establish the current container image name, environment variables, endpoint path, listening port, or registration field names. We do not guess those values. Use the remote-worker instructions that match your installed WhisperSubs release, and do not reuse an example secret.

This limitation matters because an incorrect port or variable can produce a service that appears to start while remaining incompatible with the plugin. It is safer to leave an exact value unspecified than to publish a stale container command. Record the version, worker address, selected backend, and non-secret configuration when you deploy it so future troubleshooting begins with a reproducible inventory.

Protect remote worker traffic

Keep worker endpoints private whenever the architecture permits it. Apply authentication, network restrictions, least privilege, and a narrow path between Jellyfin and each worker. If a worker processes media remotely, understand what audio or media-derived data crosses that connection and whether the destination is hardware you control or a hosted provider.

Exposing Jellyfin through Localtonet does not require exposing worker endpoints. These are separate traffic paths. Public Jellyfin access is for the application interface, while worker connectivity is for transcription processing. Do not point the Jellyfin HTTP tunnel at a worker just because both are associated with WhisperSubs.

Expose the working Jellyfin HTTP endpoint with Localtonet

Remote browser reaching a local Jellyfin HTTP endpoint through a Localtonet tunnel.
Localtonet routes requests from a public endpoint to the working Jellyfin HTTP service on the private network.

Add remote access only after Jellyfin, WhisperSubs, and at least one local transcription work on the local network. You need the exact local IP address or hostname and HTTP port on which Jellyfin is listening from the Localtonet client's point of view.

This article intentionally does not provide a supposed Jellyfin default address or port. Jellyfin listeners vary by installation, reverse-proxy arrangement, container mapping, and administrator configuration. Open the address that already works locally and record its host and port. If Localtonet runs in a container or on another device, remember that 127.0.0.1 refers to that client environment, not automatically to the Jellyfin host.

With Localtonet, our client initiates an outbound connection to a relay server. This means the workflow does not require inbound router port forwarding, firewall changes, VPN setup, or a public IP address. The tunnel is available only while the selected Localtonet client is connected and the tunnel is running.

1

Install and run the Localtonet client

Install our client on the Jellyfin host or another device that can reach the configured Jellyfin HTTP endpoint. Confirm that this device can open the same local address and port before proceeding.

2

Select the client device

Use the device-specific authentication token associated with the client that will run the tunnel. Keep the token private and never place it in screenshots, commands, logs, or shared documentation.

3

Select an available relay server

Choose a server or region currently offered in the Localtonet dashboard. Available server codes can vary, so obtain the value from the current product rather than copying a hardcoded example.

4

Create an HTTP tunnel

Configure the tunnel's local target with the real Jellyfin IP address and HTTP port. HTTP tunnels can use a random subdomain, a custom subdomain where supported, or a custom domain. All three process types serve the target at a public HTTPS address.

5

Start the tunnel

Creating the configuration does not start it. Use the Start button, wait for the selected client and tunnel to report a connected state, and copy the assigned public URL.

6

Test the public Jellyfin address

Open the assigned URL from a network that is not the Jellyfin LAN. Sign in with a normal authorized Jellyfin account, verify playback according to your own policy, and confirm that an administrator can reach the WhisperSubs page when administration is required.

The current dashboard is authoritative for available servers, regions, process options, and account-specific capabilities. If you choose a custom domain, follow the current DNS instructions rather than assuming a record type or target. For the product workflow, consult our Localtonet HTTP tunnel documentation.

Localtonet choice Target or result Role in this setup
HTTP tunnel Jellyfin's configured local IP address and HTTP port Publishes the Jellyfin web application at a public HTTPS address.
Random Sub Domain A generated public address Suitable when you do not need to select the public hostname.
Custom Sub Domain A selected subdomain where supported Provides a more recognizable address when available for the account and configuration.
Custom Domain Your domain connected according to current DNS requirements Useful when you want Jellyfin under a domain you manage.
Stop The public route becomes unavailable Use it when temporary remote access is no longer needed.
Publishing Jellyfin expands its reachable audience

Require strong Jellyfin credentials, remove unused accounts, limit administrator access, review plugin permissions, and keep Jellyfin and its plugins updated. Do not treat an unguessable public URL as authorization. Stop or delete the tunnel when it is no longer required.

Verify both application and tunnel state

Test the public address in a private browser session so an existing local login does not hide an authentication problem. Confirm that the connection presents the expected Jellyfin sign-in page, not an unrelated service on the same host. Then sign in with a least-privileged test account and verify only the capabilities that account should have.

For administrative testing, use an administrator account only when necessary. Open the WhisperSubs page, inspect queue status, and avoid launching a large job merely to prove that the interface loads. If you need to verify a request flow, use the same small media item that passed local testing.

Routine operation, security, and troubleshooting

Operate the queue deliberately

WhisperSubs gives manual user requests priority over the background sweep. Non-administrator users can request subtitles from the item menu only after an administrator enables that option. Consider the processing capacity of your server or workers before enabling requests broadly.

The default scheduled task runs daily at 2:00 AM and on startup. A persistent skip cache prevents repeated probing of unchanged items. Review scheduling in the context of your server's backup window, media scans, power availability, and other compute-intensive jobs.

Real-time progress reports the current item, current phase, file progress, and queue depth. Use those signals to distinguish a long transcription from a stalled process. Preserve relevant, non-secret Jellyfin and plugin logs when diagnosing a failure.

Diagnose installation and engine failures

Symptom Likely area What to check
WhisperSubs is absent from the catalog Plugin repository Recheck the complete manifest URL and confirm Jellyfin can retrieve repository metadata.
Plugin installed but settings are missing Jellyfin restart or compatibility Restart the server process and confirm Jellyfin is version 10.11.0 or later.
Binary variant list is empty on Windows or macOS Expected platform behavior Install whisper-cli manually and configure Whisper Binary Path. Model downloading remains available.
whisper-cli exits with code 132 CPU or binary compatibility Select a binary variant compatible with the processor and acceleration environment.
Audio extraction fails FFmpeg Confirm Jellyfin's bundled FFmpeg or an FFmpeg executable on PATH is accessible to the service.
Transcription completes but no subtitle is written Filesystem access Check write permission, free space, library mount mode, and the output path visible to Jellyfin.
Subtitle exists but is absent in Jellyfin Naming or metadata refresh Check the filename template, label, language marker, and whether the metadata refresh completed.
Worker remains unavailable Worker process, endpoint, or authentication Confirm worker status, network reachability, version-compatible endpoint settings, and API-key configuration without logging the secret.
Local Jellyfin works but the public URL does not Localtonet target or lifecycle Confirm the client is connected, the tunnel is started, and the configured local IP and port are reachable from the client device.

Check container and service boundaries

Container deployments commonly fail because a path or address is valid on the host but not inside the container. A host path to whisper-cli, a model, or media is useful only if Jellyfin sees the corresponding mounted path. The same rule applies to networking. A Jellyfin container cannot necessarily reach a worker through the worker host's loopback address.

GPU acceleration in a container additionally requires appropriate device passthrough and compatible drivers. WhisperSubs cannot compensate for a GPU that the Jellyfin or worker runtime cannot see. Establish hardware visibility before treating the plugin configuration as the source of the problem.

Maintain privacy expectations

By default, transcription occurs on the Jellyfin server, and self-hosted workers can keep processing on systems you control. That privacy boundary changes if you add a hosted provider or a remote worker outside your controlled network. Document which destinations receive media-derived data and remove unused provider credentials.

Localtonet's role is connectivity to Jellyfin. The Localtonet client establishes an outbound relay connection, and the public endpoint exists only while the selected client is connected and the tunnel is running. You can stop the tunnel without uninstalling Jellyfin or WhisperSubs, and you can delete it when the remote-access configuration is no longer needed.

Frequently asked questions

Does WhisperSubs require a remote worker?

No. Transcription runs on the Jellyfin server by default. Additional workers are optional and are useful when you want to add other CPUs or GPUs, isolate the workload, or increase processing capacity.

Can the plugin download whisper-cli on every operating system?

No. Built-in engine binary downloads are available on Linux. On macOS and Windows, install whisper-cli separately and configure Whisper Binary Path. Model downloads are available through the plugin settings on all three platforms.

Where does WhisperSubs save generated subtitles?

It writes subtitle files next to the media. Jellyfin picks them up during the metadata refresh that follows. The default naming template includes the media name, language, WhisperSubs label, and subtitle type.

Does Localtonet expose a standalone WhisperSubs server?

No. In this workflow, the Localtonet HTTP tunnel points to Jellyfin's configured local HTTP endpoint. WhisperSubs remains a Jellyfin plugin, and its controls are reached through the Jellyfin interface.

What Jellyfin port should I enter in Localtonet?

Enter the port used by your actual Jellyfin HTTP listener. Installations, containers, and reverse proxies can use different mappings, so this guide does not assume a default. Test the address from the Localtonet client device before creating the tunnel.

Does creating an HTTP tunnel start it automatically?

No. Creating the tunnel saves its configuration. You must select Start, and the chosen Localtonet client must remain connected. You can later stop the tunnel temporarily or delete it when it is no longer needed.

Will media always stay on my own server?

Local processing keeps transcription on the Jellyfin server, and self-hosted workers can keep it on hardware you control. That changes if you deliberately configure a remote worker or hosted provider. Review the destination and its privacy implications before enabling it.

Can WhisperSubs translate subtitles into any target language?

No. Whisper's translation output is English. Translation-only mode generates an English translated subtitle and skips the native-language transcription.

Make your verified Jellyfin setup available with Localtonet

Once WhisperSubs can complete a local transcription, install our client on a device that can reach Jellyfin, create an HTTP tunnel to the configured Jellyfin listener, and start the tunnel when authorized remote access is needed.

Get Started Free β†’

Localtonet is a secure multi-protocol tunneling and proxy platform designed to expose localhost, devices, private services, and AI agents to the public internet supporting HTTP/HTTPS tunnels, TCP/UDP forwarding, mobile proxy infrastructure, file server publishing, latency-optimized game connectivity, and developer-ready AI agent endpoint exposure from a single unified control plane.

support