← The Kibitz Engine · deep dive
What Kibitz protects, what it doesn't, and who can see what. Honest by design.
Companions: architecture.md (the planes), verification.md (admission security).
| Component | What it is | What it can see |
|---|---|---|
| Media plane | full WebRTC mesh, DTLS-SRTP | nothing in the clear leaves the browsers; no media server |
| Data plane | peer-to-peer DTLS data mesh | content goes browser→browser; no participant relays it |
| Signaling broker | signal.kibitz.chat (stateless) |
presence metadata only — connection events, room ids, ephemeral peer ids; not content |
| TURN relay | Cloudflare Realtime (when direct fails) | encrypted packets + IPs; cannot decrypt the call |
| Coordinator | a participant's browser (migratory) | room content it's granted (it's in the room) + coordinates presence/gate + distributes the capability grant map. No discretionary powers — it relays signaling and host commands, it doesn't author them. |
| Host (admin) | a peer that proves the room's host credential | may lock/kick/admit. Its mod commands are signed, room-bound, cert-bound, and fresh (hostKey.ts), so even a malicious coordinator can't forge them. An open room has no host at all. |
The headline property: there is no server that can decode or record a call. Content is E2E-encrypted between browsers; the edge helpers are content-blind. There is nothing central to subpoena, record, or shut down mid-call.
Note the coordinator/host split. The coordinator is positional, migratory plumbing — it holds the room id, keeps the roster, runs presence ping/reap, and relays signaling; it has no moderation powers of its own. The host is a verified peer who holds a discretionary credential (see §4). This decoupling is deliberate: it stops a stranger who happens to become coordinator from seizing moderation, and it means bans don't vanish when the coordinator role migrates.
These are inherent to a P2P, in-room model — stated plainly:
rosterGate.ts → the useCall
content gate): a peer's proof is bound to its DTLS cert, so it can't be replayed. With signed
invites the roster still gates the door but the bearer token isn't cert-bound — so the
peer-to-peer "refuse to share" step is OIDC-only until invites carry per-guest keys. What stays
irreducible
is connectivity coordination / denial of service (someone must route signaling; the role
migrates) and non-cryptographic methods (a shared name/code is only as good as who
checks it).mod command is then signed, room-bound,
cert-bound to the signer's live DTLS fingerprint, and fresh (≤120s) before the coordinator
enacts it (hostKey.ts verifyHostCommand → room.ts handleMod/enactMod,
room.ts:528-543) — so even a malicious coordinator can't forge moderation; it verifies
against the link-committed host public key, and an open room (no committed key) drops every
command (!committedHostKey → return, room.ts:529). The credential tiers differ in strength:
a password key (gh/ghk, ECDSA P-256 sealed under a host password) is un-spoofable and
migration-safe, but honest limit: the sealed key rides the public link, so a weak host
password is offline brute-forceable (PBKDF2 only slows it — there's no server to throttle;
hostKey.ts:10-11) — use a strong passphrase; an OIDC email host (gho) is un-spoofable and
portable (proven by a cert-bound ID token, room.ts declareHost, room.ts:745-750); a soft
name (ghn) has no crypto and is spoofable by any link-holder. The coordinator stays
trusted for the roster; the host's powers are gated by the committed key/email/name.safetyPins.ts, pinStatus → 'mismatch', safetyPins.ts:30-33,68).
Honest limits: the pin is keyed on a self-asserted name (not a cryptographic identity — for
that, use a verified room), and it is established only on an explicit verify, so a
man-in-the-middle present from the very first call can't auto-pin itself (safetyPins.ts:14-22).relayPref.ts) mounts the call relayOnly so
other participants see the TURN relay's IP instead of yours — but honest limit: the relay
(and the host) still see your IP (relayPref.ts:3-4), it adds a little latency, and it can't
read your media/data (still end-to-end encrypted).Detailed in verification.md §6. Summary:
room).mod command is checked against the committed
host public key and rejected unless it is room-bound, cert-bound to the signer's live
fingerprint, and fresh (hostKey.ts:130-136), so it can't be forged by the coordinator,
carried to another room, or replayed later. With no host key committed the command is dropped
outright (open room = no admin, room.ts:529).see-screen/hear-audio, so every sharer withholds the screen-share
and audio tracks from it (a placeholder is substituted on its connection — it never receives
a frame). It has no send-chat, so any chat/app/pay/ink it emits is dropped by every
honest peer (and logged to the host's audit feed). Its only effect is reading. Granting
it more (speak, act, media) is an explicit, revocable host decision.backend/egress so the host sees
"what it perceives leaves the E2EE room" before granting it perception. That routing is the
operator's choice — disclosed honestly, not enforced.caps update only from the current host id
(useCall.ts:686-688), so a non-authority peer can't rewrite policy. The grants are clamped on
the wire (sanitizeGrant, capabilities.ts:72; intersectGrant — never more than requested,
capabilities.ts:85), so an agent's limits hold the same way no matter which participant is
sharing or sending.The one verification method that needs a backend (verification.md §4.5) sees join metadata (which email asked to join which room) — a privacy cost the other methods avoid. It does not see call content. Use it only when proving email control without a third-party IdP is worth that trade.
The project is operated pseudonymously and holds no call content, accounts, or recordings — by construction, not policy. The legal/privacy surface is therefore minimal: the only data that touches infrastructure is ephemeral presence metadata and (optionally) TURN-relayed encrypted packets.