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-userremove-useredit-metadatacreate-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 39003 role 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.31.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が入りました。
  • WispPR #471でflag、invite、role、AUTH prompt向けNIP-29 group configurationを追加し、PR #478でgroup 902190079009イベントの前にAUTHを待つ順序を強化し、admin側failureも表示するようにしました。

Primary sources:

Mentioned in:

See also: