# Discourse Video Stream :movie\_camera:

**URL:** https://meta.discourse.org/t/discourse-video-stream/388754
**Category:** Plugin
**Tags:** video
**Created:** [November 17, 2025, 8:45pm UTC](https://meta.discourse.org/t/discourse-video-stream/388754 "2025-11-17T20:45:24Z")
**Posts on this page:** 6
**Page:** 1

<div class="post-metadata">

### Author: ![Falco](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/falco/32/179432_2.png) [@Falco](https://meta.discourse.org/u/Falco)
#### Post date: [November 17, 2025, 8:45pm UTC](https://meta.discourse.org/t/discourse-video-stream/388754/1 "2025-11-17T20:45:24Z")

</div>

**Discourse Video Stream** adds seamless Cloudflare Stream integration for uploading and embedding high-quality, long-form video content **and live streaming** in your Discourse site.

## Overview

This plugin provides a complete workflow for handling large video files with adaptive bitrate streaming, allowing your users to upload videos directly from the composer and play them back with automatic quality adjustment based on their network conditions. It also supports creating live streams with RTMPS broadcasting.

## Key Features

- **:clapper_board: Composer Integration** : Optional toolbar button for direct video uploads from the composer
- **:outbox_tray: Automatic Upload Interception** : Videos exceeding a configurable size threshold are automatically uploaded to Cloudflare Stream instead of local storage
- **:high_voltage: Resumable Uploads** : Built on `tus-js-client` for reliable uploads of files well beyond 200 MB with automatic resume on connection issues
- **:locked: Secure Proxy** : Server-side endpoint generates short-lived Cloudflare Stream upload URLs, keeping your API credentials safe
- **:satellite_antenna: Live Streaming** : Create live streams with RTMPS broadcasting directly from the composer
- **:movie_camera: Custom BBCode** : Simple `[video-stream id="..."]` syntax for embedding videos
- **:television: Adaptive Streaming** : Shaka Player integration with DASH manifests for smooth playback across varying network speeds
- **:gear: Playback Controls** : Built-in UI for resolution selection and playback speed control

## Installation

Add the plugin to your `app.yml`:

```yaml
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/xfalcox/discourse-video-stream.git

```

Then rebuild your container:

```
./launcher rebuild app

```

## Configuration

Navigate to Admin → Settings → Video streaming and configure:

| Setting | Description | Default |
| --- | --- | --- |
| video\_stream\_enabled | Enable the video streaming plugin | false |
| video\_stream\_account\_id | Your Cloudflare account identifier | - |
| video\_stream\_api\_token | API token with Stream:Edit permissions | - |
| video\_stream\_customer\_subdomain | Your Cloudflare Stream domain (e.g., [customer-xxxxx.cloudflarestream.com](http://customer-xxxxx.cloudflarestream.com)) | - |
| video\_stream\_allowed\_extensions | Comma-separated list of allowed video formats | mp4,webm,mov |
| video\_stream\_max\_file\_size | Maximum file size in MB (1-2000) | 500 |
| video\_stream\_intercept\_native\_uploads | Automatically intercept large video uploads | true |
| video\_stream\_intercept\_threshold\_mb | Size threshold in MB for automatic interception (1-2000) | 10 |
| video\_stream\_enable\_live\_streams | Enable live streaming feature | false |

## Getting Cloudflare Stream Credentials

1. Log into your Cloudflare dashboard
2. Navigate to Stream under your account
3. Copy your Account ID from the Stream overview
4. Create an API token with Stream:Edit permissions
5. Note your Customer subdomain from the Stream settings

## Usage

Once configured, users have two ways to upload videos:

### Automatic Interception

When a user drags and drops or selects a video file that exceeds the video\_stream\_intercept\_threshold\_mb setting, the plugin automatically handles it via Cloudflare Stream instead of local storage. **You need to allow video file extensions on the allowed extension settings for this to work**.

### Manual Upload

Users can click the composer toolbar’s pop-up menu (:plus:) and select the video upload option to explicitly upload to Cloudflare Stream.

Both methods insert a [video-stream id=“video\_id”] BBCode tag that renders as an adaptive streaming player with resolution and speed controls.

### Live Streaming

When video\_stream\_enable\_live\_streams is enabled, users can create live streams:

1. Click the composer toolbar’s pop-up menu (:plus:) and select “Create live stream”
2. A modal generates RTMPS credentials via Cloudflare Stream API
3. Copy the RTMPS URL and stream key using the convenient copy buttons
4. Use the credentials with OBS, Streamlabs, or any RTMPS-compatible broadcasting software
5. Click “Insert embed” to add the [video-stream id=“…”] BBCode to your post
6. Start broadcasting immediately

#### Live Stream Features:

- Automatic recording enabled by default (streams are saved for later playback)
- Same adaptive player works for both live and recorded content
- Users see live content while streaming, then can watch the recording afterward
- Secure credential handling with warning messages

## Why Cloudflare Stream?

We have support for doing the same using AWS in code, and with Mux in [GitHub - discourse/discourse-video · GitHub](https://github.com/discourse/discourse-video), so a cheaper alternative sounded like a good idea.

## Requirements

- Active Cloudflare account with Stream enabled

## Source & Support

- Repository: [GitHub - xfalcox/discourse-video-stream · GitHub](https://github.com/xfalcox/discourse-video-stream)

## Screenshots

 ![image](https://global.discourse-cdn.com/meta/original/4X/c/0/e/c0e2f307c2139790b3d06dffc5c281e11845d992.jpeg)

 ![image](https://global.discourse-cdn.com/meta/original/4X/6/4/5/6453988d333211e061fde26e4fbfeb19d2c21b95.png)

 ![image](https://global.discourse-cdn.com/meta/original/4X/c/b/e/cbe097670e0c3cd9d62f462e7d041efea6a0034f.png)

## Demo

Visit my test site and upload some videos

[https://discourse-on-a-pi5.falco.dev/t/test-video-upload-plugin/20?u=falco](https://discourse-on-a-pi5.falco.dev/t/test-video-upload-plugin/20?u=falco)

* * *

Note: This is **not** an #official plugin.

---

<div class="post-metadata">

### Author: ![Falco](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/falco/32/179432_2.png) [@Falco](https://meta.discourse.org/u/Falco)
#### Post date: [November 24, 2025, 10:46pm UTC](https://meta.discourse.org/t/discourse-video-stream/388754/2 "2025-11-24T22:46:30Z")

</div>

## Update: Live Streaming Support Now Available! :satellite_antenna:

The plugin now supports **live streaming** with RTMPS broadcasting!

 ![image](https://global.discourse-cdn.com/meta/original/4X/c/b/e/cbe097670e0c3cd9d62f462e7d041efea6a0034f.png)

**What’s new:**

- Create live streams directly from the composer toolbar menu
- Get RTMPS credentials instantly via Cloudflare Stream API
- Stream with OBS, Streamlabs, or any RTMPS-compatible software
- Automatic recording enabled - streams are saved for playback after broadcasting ends
- Same `[video-stream id="..."]` BBCode and adaptive player for both live and recorded content

**How to enable:**  
Set `video_stream_enable_live_streams` to `true` in Admin → Settings → Video streaming

See the updated OP for full details on the live streaming workflow.

---

<div class="post-metadata">

### Author: ![ccdw](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/ccdw/32/51564_2.png) [@ccdw](https://meta.discourse.org/u/ccdw)
#### Post date: [December 26, 2025, 11:42am UTC](https://meta.discourse.org/t/discourse-video-stream/388754/3 "2025-12-26T11:42:21Z")

</div>

Hey, Very nice. I work in Film and TV and we are building a media centric experience.

We use [Bunny](https://bunny.net/). How easy would it be for us to modify endpoints in the plugin to allow different CDNs/Streaming platforms?

---

<div class="post-metadata">

### Author: ![Falco](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/falco/32/179432_2.png) [@Falco](https://meta.discourse.org/u/Falco)
#### Post date: [December 26, 2025, 12:24pm UTC](https://meta.discourse.org/t/discourse-video-stream/388754/4 "2025-12-26T12:24:46Z")

</div>

It appears that Bunny offering is awfully similar to the Cloudflare one, it should be easy to add support for it.

---

<div class="post-metadata">

### Author: ![ccdw](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/ccdw/32/51564_2.png) [@ccdw](https://meta.discourse.org/u/ccdw)
#### Post date: [December 27, 2025, 1:12am UTC](https://meta.discourse.org/t/discourse-video-stream/388754/5 "2025-12-27T01:12:15Z")

</div>

Thanks Falco. Will look into it.

---

<div class="post-metadata">

### Author: ![Ray\_Crick](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/ray_crick/32/497381_2.png) [@Ray\_Crick](https://meta.discourse.org/u/Ray_Crick)
#### Post date: [June 2, 2026, 10:29pm UTC](https://meta.discourse.org/t/discourse-video-stream/388754/6 "2026-06-02T22:29:25Z")

</div>

Great plugin and thank you. For some reason on first upload video was working but audio wasn’t working in the community, but video and audio worked in Cloudflare. Deleted, and tried again and now all is good.
