From 1e76f62f71d54d09e15b7f73c6a8044bfc7b7e86 Mon Sep 17 00:00:00 2001
From: Russell Ballestrini
Date: Sun, 31 May 2026 10:54:36 -0400
Subject: [PATCH] zebra-spaces v0.1: multi-party voice rooms with roles,
identity, vault
New page: web/zebra-spaces.html. Extends the rendezvous + WebRTC mesh
model from zebra-audio (1:1) to a room of up to ~8 speakers (host + 2
co-hosts + speakers) with listeners (deferred to v0.2 for SFU fan-out).
Identity: per-browser persistent Ed25519 keypair in localStorage,
plus a per-session UUID for in-room "whose who". Password-vault
backup/restore (PBKDF2 600k + AES-GCM, matches zebra-audio's crypto)
emits a self-contained 'zspc-id-v1|...' blob.
Roles: everyone joins as listener; mods (host + co-hosts) extend
mic-invites that listeners accept/decline; host promotes to co-host;
mods demote and boot. Co-hosts cannot remove the host. Every role
transition is signed by the acting mod's Ed25519 over a canonical
input bound to room_id + epoch, so a compromised relay cannot forge
promotions, only refuse to relay them.
Pairs with cmd/zebra-spaces-signal in proxy.unturf.com.
Nav: zebra-audio and host-your-own cross-link to spaces.
Makefile: stamp target now covers zebra-spaces.html (web/chat.html
and web/how-it-works.html stamps refreshed today as a side effect).
---
Makefile | 2 +-
web/chat.html | 6 +-
web/host-your-own.html | 10 +-
web/how-it-works.html | 6 +-
web/zebra-audio.html | 7 +-
web/zebra-spaces.html | 992 +++++++++++++++++++++++++++++++++++++++++
6 files changed, 1008 insertions(+), 15 deletions(-)
create mode 100644 web/zebra-spaces.html
diff --git a/Makefile b/Makefile
index 61c1e2b..5b43bc9 100644
--- a/Makefile
+++ b/Makefile
@@ -8,7 +8,7 @@ PULSE = src/pulse.c
# stamp each web page with today's date + its own md5/sha256 (run before deploy)
stamp:
- @node web/stamp.js web/chat.html web/zebra-audio.html web/how-it-works.html web/host-your-own.html
+ @node web/stamp.js web/chat.html web/zebra-audio.html web/zebra-spaces.html web/how-it-works.html web/host-your-own.html
all: tx rx chat bt carrier zebrad
diff --git a/web/chat.html b/web/chat.html
index 7579faf..3932a7a 100644
--- a/web/chat.html
+++ b/web/chat.html
@@ -1649,9 +1649,9 @@ logLine('sys', 'chat content lives in encrypted SRTP audio. no IP packets carry
})();
diff --git a/web/host-your-own.html b/web/host-your-own.html
index 88d6185..f932ada 100644
--- a/web/host-your-own.html
+++ b/web/host-your-own.html
@@ -71,8 +71,8 @@
unturf
- The zebra pages (the chat and the voice
- call) need exactly two things from a server: a rendezvous relay
+ The zebra pages (the chat, the 1:1 voice
+ call, and the multi-party spaces) need exactly two things from a server: a rendezvous relay
so two browsers can find each other, and a TURN server so they
can still connect when both sit behind NAT. Everything else — the crypto,
the modem, the audio — runs in the browser. This page hands you the whole
@@ -383,9 +383,9 @@ turn.example.com {
+
+ your key lives only in this browser; back it up if you want it on another device or after clearing data.
+
+
+
backup — pick a password; you'll get a text blob to save.
+
+
+
+
+
restore — paste a backup blob + its password. overwrites your current identity.
+
+
+
+
+
+
+
+ idle
+
+
+
+
+
+
space
+
+
+
+
+
+
+ idle
+
+
+
+
+
+
+
+
+
+
+
+ everyone joins as a listener. host (first to enter) can invite listeners to the
+ mic. co-hosts share mod powers but cannot remove the host. audio is end-to-end
+ encrypted (DTLS-SRTP); SDP is encrypted with the rendezvous code before reaching
+ the relay.
+
+
+
+
+
+ you're invited to the mic.
+
+
+
+
+
+
+
+
room
+
+
+
+
+
your hand
+
+
+
+ tap "raise hand" to ask a mod for the mic.
+