From 45d021fedb5d20132c68bbf89b2b663d9de126ba Mon Sep 17 00:00:00 2001 From: SkateSpots Date: Sat, 3 Oct 2026 17:03:11 +0700 Subject: [PATCH] docs: archive event-comms (Concord + Cordn) idea for later evaluation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit No decision, no code — parked with the protocol facts, recommended default (Concord, zero-infra) vs optional Cordn/MLS upgrade, and the open questions. --- AGENTS.md | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/AGENTS.md b/AGENTS.md index 63b6b5e..5df9ed2 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -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.