From f3b154da2b118213b9046271bc2d93eca8540700 Mon Sep 17 00:00:00 2001 From: Russell Ballestrini Date: Sun, 31 May 2026 15:53:14 -0400 Subject: [PATCH] zebra-spaces: terminal block + share URL + autofill; host-your-own: SFU section MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Block is now terminal: any 'blocked' signal-server error or 403 from the SFU calls handleBlocked() which shows a clear notice, stops the WS reconnect loop, tears mesh + SFU + mic, and unlocks the enter button. Stale UI no longer spins trying to rejoin a room the user was kicked from. Reset on a fresh joinSpace. - Share URL: after joining, sec-share shows a copyable link with ?code=… embedded; opening that link autofills the rendezvous code field. QR canvas placeholder is in place; encoder lands in the next push (defer to keep this commit small). - host-your-own.html gains section 8: zebra-spaces (multi-party rooms) describing both Go services that make spaces work — the zebra-spaces-signal authority-chain rendezvous and the Pion-based zebra-spaces-sfu audio fan-out. Includes the two Caddyfile routes (with flush_interval -1 for SSE), the NAT1To1 env var, and the single UDP mux port — so someone wanting to host their own community can stand the whole stack up. Sections 9-11 renumbered. --- web/host-your-own.html | 59 ++++++++++++++++++++++++++++++--- web/zebra-spaces.html | 74 ++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 126 insertions(+), 7 deletions(-) diff --git a/web/host-your-own.html b/web/host-your-own.html index b42551e..50abfa0 100644 --- a/web/host-your-own.html +++ b/web/host-your-own.html @@ -334,7 +334,56 @@ turn.example.com { passes straight through. That is the entire edge.

-

8 · point your members at it

+

8 · zebra-spaces — multi-party voice rooms (optional)

+

+ The 1:1 voice call (zebra-audio) needs only the + relay and coturn. For zebra-spaces — a host + plus co-hosts plus speakers plus an audience of listeners — you also stand + up two small Go services: +

+ +

+ Both services live in the same repo as zebra-signal: + git.unturf.com/engineering/unturf/proxy.unturf.com + — under cmd/zebra-spaces-signal/ and cmd/zebra-spaces-sfu/. + Public domain. Each ships a systemd unit and standard build target; the deploy + pattern mirrors zebra-signal exactly. The Caddyfile gets two more + routes: +

+
# Caddyfile (added to your existing block) +handle /zebra-spaces-signal* { reverse_proxy localhost:8091 } +handle /zebra-spaces-sfu* { reverse_proxy localhost:8092 { flush_interval -1 } }
+

+ flush_interval -1 matters: the SFU pushes renegotiation offers + over Server-Sent Events when speakers join or leave, and Caddy will buffer + those events into silence without it. +

+

+ The SFU advertises a public IP as its host ICE candidate, so set + ZEBRA_SFU_NAT1TO1_IP=<your.public.ip> on the unit and open + UDP 7882 in your firewall — that single port carries all + ICE/RTP via Pion’s UDP mux. No port range like coturn needs. +

+ +

9 · point your members at it

Now the payoff: nobody needs a modified page. The published zebra pages read two URL parameters and fall back to the unturf servers only if @@ -354,7 +403,7 @@ turn.example.com { fetch credentials — as long as your relay and TURN server are reachable.

-

9 · how many users can it carry

+

10 · how many users can it carry

The rendezvous relay is nearly free: it moves a few hundred bytes per call setup and then idles, so a tiny box pairs thousands of rooms. coturn is the @@ -374,7 +423,7 @@ turn.example.com {


-

10 · it's a gift

+

11 · it's a gift

This stack is open intellectual capital — take it and run a community the unturf servers will never see or meter. Patch it, harden it, pass it on. Every @@ -392,8 +441,8 @@ turn.example.com {

page integrity  ·  built 2026-05-31
- md5 d993e1f54688b3cbbdb4e40c7351d6cb
- sha256 9b89f3771707cd91e2dcfc39c5da1575e55b294d99858899a3fc67f18121dc55
+ md5 b112cc063dcc4337a086775c97cdfc59
+ sha256 6c4d87467ef58fe408d5a8cf55a34c4d51f13ad3f8f21178977177d6ca2560f5
hashes are of this page with these two fields zeroed — to verify, blank them and re-hash
one self-contained file — save a copy and verify it against these hashes; point it at your own servers with ?signal= and ?turncred=
diff --git a/web/zebra-spaces.html b/web/zebra-spaces.html index 196e1c5..d1bc431 100644 --- a/web/zebra-spaces.html +++ b/web/zebra-spaces.html @@ -245,6 +245,22 @@ + +