---
title: "Manage video in Umbraco, stream elsewhere"
description: "uMux now supports Umbraco 18, joined by uBun and uGum for syncing local videos to Mux, Bunny Stream or Gumlet without changing the editor workflow."
date: 2026-09-14
tags: ["umbraco", "package", "video", "umbraco-cloud"]
---

Serving a 50 MB video one hundred times uses about 5 GB of bandwidth. Do that across ten videos and you have used the entire monthly bandwidth allowance for an Umbraco Cloud Starter project.

Video delivery is therefore something I would rather leave to a video platform. Editors should not have to care about that choice, though. They should still be able to upload and manage videos in Umbraco without copying IDs or embed codes between systems.

That was the idea behind [uMux](/blog/umux-announcement), my integration for [Mux](https://www.mux.com/video-api). I have now released an Umbraco 18 version, along with two alternatives: uBun for [Bunny Stream](https://bunny.net/stream/) and uGum for [Gumlet](https://www.gumlet.com/).

## Why move video delivery elsewhere?

The original file stays in Umbraco. This gives me a copy if a project stops using its current provider or needs to move elsewhere later.

The website uses the provider's playback URL instead of serving that original file to visitors. This moves the playback traffic away from Umbraco Cloud, where the current monthly allowances are [50 GB for Starter, 300 GB for Standard and 1,000 GB for Professional](https://umbraco.com/products/umbraco-cloud/pricing/).

Mux, Bunny Stream and Gumlet all process the uploaded file into HLS streams. An HLS-compatible player can switch between different renditions as the viewer's available bandwidth changes. It also streams the video in segments instead of treating it as one large download.

## One workflow, three providers

The editor workflow is the same with all three packages:

1. Upload a video to an Umbraco Upload property, for example on the default Video media type.
2. Save the item.
3. The package sends the file to the configured provider.
4. The provider's asset ID and playback details are stored in a second property.
5. The website uses those playback details when rendering the video.

[uMux](https://marketplace.umbraco.com/package/umbraco.community.umux) is the original package I built for this workflow. Its latest release adds support for Umbraco 18.

[uBun](https://marketplace.umbraco.com/package/umbraco.community.ubun) and [uGum](https://marketplace.umbraco.com/package/umbraco.community.ugum) are now available on the Umbraco Marketplace. Both have releases for Umbraco 17 and 18.

I considered building a shared package with replaceable providers. In the end, each integration had enough settings, API behaviour and provider-specific details to make separate packages simpler. They can share the same general idea without forcing every future difference through a common abstraction.

## Small differences between the providers

This is not intended as a full comparison, but each provider has a useful angle:

- I find [Gumlet's fixed plans and included usage](https://www.gumlet.com/blog/gumlet-pricing-update-2026/) easier to explain than a price assembled from several kinds of usage.
- [bunny.net is based in Europe](https://bunny.net/about/), which can matter when a client prefers a European supplier.
- Mux has a strong set of developer tools. [Mux Player includes Mux Data](https://www.mux.com/docs/guides/player-core-functionality), and a playback ID can also produce [thumbnails, animated GIFs and storyboards](https://www.mux.com/docs/guides/get-images-from-a-video).

The right choice still depends on the project. The point of the three packages is that the Umbraco workflow does not have to depend on that choice.

## Could Umbraco Automate do this?

Yes, but Automate does not remove the provider-specific work. [Umbraco Automate supports custom actions](https://docs.umbraco.com/umbraco-automate/extending/custom-action), so an automation could react to a CMS event and send a video to an external service.

A complete video integration still needs code to read the media file, authenticate with the provider, follow its upload process, check the processing status, store the playback details in Umbraco and remove remote assets when videos are replaced or deleted. It also needs a way to show that status to the editor. At that point, the custom action has started to look a lot like one of these packages.

Automate makes more sense when video upload is one step in a larger workflow that editors need to configure. uMux, uBun and uGum cover the fixed case where saving an Umbraco item should keep its video in sync with one provider.

## Getting started

Install the package for the provider you want to use:

```bash
dotnet add package Umbraco.Community.uMux --version 18.0.0
dotnet add package Umbraco.Community.uBun --version 18.0.0
dotnet add package Umbraco.Community.uGum --version 18.0.0
```

> **Note:** Install one of these packages, not all three. For Umbraco 17, use version `17.0.0` of the corresponding package.

Add the matching provider settings to `appsettings.json`. Only the section for the installed package is needed.

```json
{
  "Umbraco": {
    "Mux": {
      "ApiTokenId": "YOUR_TOKEN_ID",
      "ApiSecret": "YOUR_TOKEN_SECRET"
    },
    "BunnyStream": {
      "LibraryId": 123456,
      "ApiKey": "YOUR_STREAM_API_KEY",
      "PullZoneHostname": "vz-example.b-cdn.net"
    },
    "Gumlet": {
      "ApiKey": "YOUR_GUMLET_API_KEY",
      "SourceId": "YOUR_GUMLET_SOURCE_ID"
    }
  }
}
```

Then create a data type using **Mux Sync**, **Bunny Stream Sync** or **Gumlet Sync**. Set **Upload Property Alias** to the alias of the Upload property containing the local video, and add the sync property to the same media, content or member type.

The stored playback value differs slightly by provider:

| Package | Stored playback details |
| --- | --- |
| uMux | `PlaybackId`, used with Mux Player or `https://stream.mux.com/{PLAYBACK_ID}.m3u8` |
| uBun | `HlsUrl` and `EmbedUrl` |
| uGum | `PlaybackUrl` containing the HLS URL |

The repositories contain the complete setup and playback examples for [uMux](https://github.com/skttl/umbraco-mux), [uBun](https://github.com/skttl/umbraco-ubun) and [uGum](https://github.com/skttl/umbraco-ugum).

## One thing to get right

The sync property and Upload property must be on the same Umbraco type. The value in **Upload Property Alias** must also match the actual alias exactly.

For a video uploaded before adding the sync property, save the media item again to start the first synchronization.

## Final thoughts

These packages keep the part editors care about in Umbraco. They upload and manage a normal media item, while the chosen provider handles processing and playback. The local original remains available if the project needs to change provider later.

uBun and uGum are the first alternatives to uMux. I have more providers I want to integrate, and keeping each package independent leaves room for their differences.