NIP-29: Relay-based Groups
NIP-29は、relayがgroup membership、permission、message visibilityを管理するrelay-based groupsを定義します。
仕組み
groupはrelay hostとgroup idの組み合わせで識別され、relayがmembershipとmoderationのauthorityになります。groupへ送られるユーザー作成イベントはgroup idを持つhタグを含みます。relay生成metadataは、relay自身の鍵で署名されたaddressable eventを使います。
中核metadata eventはkind 39000で、39001から39003はadmin、member、supported roleを記述します。moderation actionは、put-user、remove-user、edit-metadata、create-inviteのような9000番台イベントで行われます。
アクセスモデル
- private: memberだけがgroup messageを読める
- closed: relayがinvite-code処理を使わない限り、join requestは無視される
- hidden: relayはnon-memberへgroup metadataを隠し、groupを発見不能にする
- restricted: memberだけがgroupへmessageを書ける
これらのtagは独立しています。誰でも読めるがmemberだけが書けるgroupにもでき、non-memberから完全に隠すこともできます。この分離は重要で、clientはprivateをあらゆるaccess ruleの総称として扱うべきではありません。
信頼モデル
NIP-29はtrustlessなgroup protocolではありません。hosting relayが、どのmoderation eventを有効とみなすか、どんなroleがあるか、member listを見せるか、古いあるいは文脈外messageを受け入れるかを決めます。clientはsignatureとtimeline referenceを検証できますが、groupの実際の状態についてはrelay policyに依存します。
このためmigrationやforkは可能ですが、自動ではありません。同じgroup idが異なるrelay上に別の履歴やruleで存在できるため、relay URLが実質的にgroup identityの一部になります。
実装メモ
- clientはrelay URLをgroup host keyとして扱うべきです。2026年1月の明確化で、pubkeyではなくこれを使うことが仕様上はっきりしました
- group stateはmoderation historyから再構築され、39000番台のrelay eventはそのstateの参考snapshotです
- timelineの
previous参照は、UI threadingの改善だけでなく、relay fork間での文脈外rebroadcastを防ぐためにあります
最近の仕様作業
- PR #2310とhodlbodのFlotilla 1.7.3/1.7.4 release notesは、calendar eventやpollなどのnon-chat content typeをkind
9で包む提案を行っています。これにより、それらをgroupへ送ったときroom contextを保持できます。 - PR #2319はsubgroup hierarchyを追加し、1つのgroupが同じrelay上で独立groupを乱立させずに複数parallel channelを持てるようにします。subgroup identifierは既存の
hタグへ相乗りし、旧client向けの単一hタグmessage形を保ちます。 - PR #2316はkind
39003role eventに明示的permissionを定義し、各roleを、invite、add-user、remove-user、edit-metadata、delete-event、add-permissionのような操作集合と、任意の期限付きexpiryを持つnamed setにします。
Implementations
- Flotillaはhodlbodの主要NIP-29 clientです。1.7.3と1.7.4では、kind-9 wrapping、poll、NIP-46 login via Aegis URL scheme、space invite向けnative share、room mention、mobile clipboard image paste、draft、video in callsが入りました。
- WispはPR #471でflag、invite、role、AUTH prompt向けNIP-29 group configurationを追加し、PR #478でgroup
9021、9007、9009イベントの前にAUTHを待つ順序を強化し、admin側failureも表示するようにしました。
Primary sources:
- NIP-29 Specification
- PR #2106 - Clarified
private,closed, andhidden - PR #2190 - Clarified relay URL as the relay key
- PR #2111 - Added
unallowpubkeyandunbanpubkey - PR #2310 - Kind-9 wrapping for non-chat content
- PR #2319 - Subgroups spec
- PR #2316 - Explicit role permissions on kind 39003
- Flotilla 1.7.4
- Wisp PR #471 - NIP-29 group configuration
Mentioned in:
- Newsletter #2: NIP Updates
- Newsletter #3: December Recap
- Newsletter #6: NIP Updates
- Newsletter #11: NIP Updates
- Newsletter #12: NIP Updates
- Newsletter #19: Flotilla 1.7.3/1.7.4
- Newsletter #19: Wisp NIP-29 config
- Newsletter #19: NIP Updates (subgroups, role permissions)
See also: