You will set up a bucket, install one plugin on both machines, go live at the main campus, and receive at a satellite.
Before you start
| Item | Detail |
|---|---|
| OBS Studio 32.2.2 | At the main campus, and at each satellite that receives on a PC. |
| An S3-compatible bucket | Cloudflare R2 is the assumed default — it charges no egress, which is what makes sending the same service to several campuses affordable. AWS S3, Backblaze B2 and MinIO also work. |
| A read and write token | It must include s3:ListBucket. Cloudflare's
“Object Read & Write” token has it; an object-scoped
token does not, and the recordings list will tell you so rather than
showing an empty list. |
| Storage headroom | Roughly 2.7 GB per hour of service at 6 Mbps. |
This is alpha software — see what has been tested before a Sunday depends on it.
Setup
Download the build for each platform from Releases, and install it at the main campus and at every satellite. It is one module containing both plugins — the same download does the sending and the receiving.
Download obs-multisite-v0.1.17-alpha-windows-x64.zip and
copy the obs-plugins and data folders into
your OBS install directory — usually
C:\Program Files\obs-studio\ — merging with what
is already there.
Apple Silicon. Download obs-multisite-v0.1.17-alpha-macos-arm64.zip
and move obs-multisite.plugin into
~/Library/Application Support/obs-studio/plugins/.
Then clear the quarantine flag, or macOS will silently refuse to load it — these builds are not signed yet:
xattr -dr com.apple.quarantine \
~/Library/Application\ Support/obs-studio/plugins/obs-multisite.plugin
Download obs-multisite-v0.1.17-alpha-linux-x86_64.tar.gz and put
obs-multisite.so in
~/.config/obs-studio/plugins/obs-multisite/bin/64bit/
with data/ alongside it.
Restart OBS. You should now see Multisite Encoder and Multisite Decoder under View → Docks.
Nothing in this project deletes anything. Without a lifecycle rule, every service you ever broadcast stays in the bucket for ever, and you pay for all of it.
In your storage provider's console, add a rule for the prefix
events/ and another for rooms/, both deleting
objects after the same number of days. Seven days is the design
default.
The rule is also your DVR depth — a campus can rewind only as far as retention allows. If you want a campus to be able to replay last month's service, retention has to cover last month.
Open the Multisite Encoder dock → Settings…
Press Go live. The dock shows how much has been sent, how much is waiting, and whether the link is healthy.
If the internet drops, the encoder keeps recording to disk and sends the backlog when it returns. Nothing is lost and nothing is skipped.
Stereo only? You are done with this step. For more than stereo — a mix, mics on their own tracks, a click for the band — enable the tracks in OBS's own Settings → Output → Recording, assign sources to tracks in Advanced Audio Properties, then name them under Settings… → Track labels so the campus sees “Click” and not “Track 3”.
Playback waits until a minute of the service is buffered before it starts, so the picture never chases the live edge.
Each campus runs its own clock: hold the picture for a local welcome, resume, then catch up to now — or stay a set number of minutes behind live all service. What one campus does has no effect on any other.
To play a past service instead, pick it from the Recordings list. To add an ISO or the click, add a Multisite Audio Track (Decoder) for the same feed — it costs no extra download, because every track already arrives in the same segment.
Alternative
Instead of OBS at the satellite, a Raspberry Pi 5 can be the whole campus player: HDMI out to the screen, a splash and idle screen between services, and a browser control panel on the church network. One script installs it.
curl -fsSL --retry 5 \
https://raw.githubusercontent.com/stageaudioworks/obs-multisite/main/scripts/player/install.sh \
| sudo bash
The appliance is driven from its own web page, or from a Stream Deck through the Companion module, which speaks to it directly over HTTP — no OBS involved at the far end at all.
By default the Pi's audio leaves on the HDMI socket with the picture, so it reaches whatever is plugged into the Pi and nothing else. A second script puts it on the network as an eight-channel AES67 stream instead — where it appears in Dante Controller and routes to any Dante device, or to a console that takes AES67 directly:
curl -fsSL \
https://raw.githubusercontent.com/stageaudioworks/obs-multisite/main/scripts/player/merging-aes67.sh \
| sudo bash
It builds an open RAVENNA stack from source, so give it a few minutes.
It leaves the player on HDMI until you move it deliberately with
--point-player, so the install can be proven before anything
the congregation sees is touched. It also creates the stream, so the box is
sending as soon as it is up; the switch for it afterwards is on the player's
own page, along with the multicast address it publishes to, the port, and
whether the clock has locked.
A PTP master has to exist on the network, or nothing flows. The daemon slaves to a clock; it does not hand one out. A Dante device, a console or an Anubis can be that master — with none of them, the stream stays silent. This is the most likely reason for quiet after a clean install, and it is a network question rather than a fault.
The route from the Pi's source to a receiver is still made by hand in Dante Controller. Test against the real Dante hardware the site will use.
Which to choose for a given room — PC or appliance — is set out in Choosing a satellite.
Then, if you want it
The relay container reads the same files already in your bucket and pushes them to YouTube, Facebook or any RTMP or SRT destination — without uploading the service a second time. Streaming to the public →
Both docks serve an operator page on your church network — Go live and markers on the sending side; play, hold, jog and the recordings list on the receiving side. The address is in the dock under Settings → Remote control, port 8080 unless you change it. No password: the building's network is the guard.
The Companion module gives you buttons that light up — on air, held, behind live, link offline — for either half, and for the Pi appliance. Companion module →
Any completed service pulls down as a single MP4 with every audio track intact — including services whose encoder crashed part-way through.
If something is wrong
[multisite],
including why they refused something.ListBucket. The dock will say so rather than showing
you nothing.xattr command in step 1 and restart OBS.A good bug report is a real contribution: much of what works well here was fixed because somebody took the time to paste a log. Open an issue →
| You want to… | Read |
|---|---|
| Install, configure and operate in depth | Operator guide |
| Choose between a PC and the Pi box | Choosing a satellite |
| Put the appliance's sound on the network | AES67 audio |
| Send the service to YouTube or Facebook | Streaming to the public |
| Build, test or contribute | Developer guide |
| Read the design and storage protocol | PROJECT-SCOPE |