docs: archive event-comms (Concord + Cordn) idea for later evaluation

No decision, no code — parked with the protocol facts, recommended default
(Concord, zero-infra) vs optional Cordn/MLS upgrade, and the open questions.
This commit is contained in:
SkateSpots 2026-10-03 17:03:11 +07:00
parent e1a2b91241
commit 45d021fedb

View file

@ -1892,6 +1892,47 @@ keeps `stateRef` in sync cross-tab; the backup flag is per-account
(partial — schema + notice done); a few i18n leftovers (some StashPage
literals) and gray-500/600 contrast.
## Event comms — Concord + Cordn (idea only, NOT started — 2026-10-03)
Parked for later evaluation; **no decision, no code.** The idea: a **host tool**
for running each event's communications, split by **event visibility** (public
vs private) — *not* a "staff room". Owner = the event's main host; per event,
plus a host console that lists/manages them. We likely run **no infrastructure**.
**Recommended default → Concord** (`concordprotocol.org`, MIT; Discord-shaped
E2EE over Nostr; relays only, no server):
- CORD-01 private streams · CORD-02 communities (key possession = membership;
owner-rooted roster; `community_id`; `community_root`/`control_root`; epochs;
Control/Chat/Guestbook planes) · CORD-03 public **and private** channels (each
its own key) · CORD-04 roles · CORD-05 invites (revocable links + kind-`3313`
direct invites) · CORD-06 rekeys/refoundings (removal = rotate) · CORD-07 A/V ·
CORD-08 disappearing messages.
- ⚠️ Concord "public" is **still E2EE** (open membership, not world-readable) —
world-readable chatter is plain Nostr (kind 1/`1111` on the event). Relays must
NOT enforce NIP-59's `p` guard (members subscribe by stream author).
- Kinds: 1059/20013/20014/21059 envelopes; 9/1111/7/5/3302 chat; 3308 control;
3303 rekey; 3306/3309/3312 guestbook; 33301 invite bundle; 13303 invite list;
33302 community list; 3313 direct invite.
- ⚠️ **No official JS SDK** (`vector_sdk` is Rust). TS references: **Armada**
(Capacitor/TS) and **Accordion** (browser TS). Writing one is a real project
(frozen HKDF derivations, the Control-plane **fold**, epochs, byte-identical
encoding; interop failures are silent empty rooms).
**Optional upgrade (private events only) → Cordn/MLS**
(`github.com/Cordn-msg/cordn`; ts-mls coordinator + ContextVM server; per-group
cursors; KeyPackages; Docker `ghcr.io/cordn-msg/cordn`). Gives **forward secrecy
+ post-compromise security + true member removal**. ⚠️ **Requires a coordinator**
— if we don't run one, the host supplies one (public default on
`relay.contextvm.org`, or self-host). Cordn has **no A/V**. We already ship a
Coordinator settings card + `src/lib/cordn/*` + a crew `coordinator` tag, but the
app currently uses a Cordn URL **as a relay** and does NOT do coordinator RPC —
real MLS + RPC is new work.
**Open questions on revisit:** (1) public event = open-join E2EE (Concord) vs
world-readable (plain Nostr) vs both; (2) one host community with a channel per
event vs a community per event; (3) is a Concord **private channel** (zero infra)
enough for private events, or is MLS worth requiring a coordinator?
## Nostr Protocol Integration
This project comes with custom hooks for querying and publishing events on the Nostr network.