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 (partial — schema + notice done); a few i18n leftovers (some StashPage
literals) and gray-500/600 contrast. 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 ## Nostr Protocol Integration
This project comes with custom hooks for querying and publishing events on the Nostr network. This project comes with custom hooks for querying and publishing events on the Nostr network.