From 408044eeb409dd3796f4044fd6f769ac9b681ae5 Mon Sep 17 00:00:00 2001 From: Jon Staab Date: Fri, 31 Oct 2025 11:05:21 -0700 Subject: [PATCH 1/6] Clarify closed/private, add hidden to nip 29 --- 29.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/29.md b/29.md index 601d63ad6a..ce9a39ea98 100644 --- a/29.md +++ b/29.md @@ -160,7 +160,10 @@ When this event is not found, clients may still connect to the group, but treat } ``` -`name`, `picture` and `about` are basic metadata for the group for display purposes. `public` signals the group can be _read_ by anyone, while `private` signals that only AUTHed users can read. `open` signals that anyone can request to join and the request will be automatically granted, while `closed` signals that members must be pre-approved or that requests to join will be manually handled. +- `name`, `picture` and `about` are basic metadata for the group for display purposes. +- `public` signals the group can be _read_ by anyone, while `private` signals that only members can read. If omitted, groups should be considered `public` by default. +- `open` signals that the group can be _written to_ by anyone, while `closed` signals that only members can write. If omitted, groups should be considered `open` by default. +- `hidden` signals that group metadata, events, and member lists should not be served to non-members. Implies `private` and `closed`, but event authors SHOULD explicitly set those tags as well. - *group admins* (`kind:39001`) (optional) From 4c357e08c965f4421882227385e565641cfcf61f Mon Sep 17 00:00:00 2001 From: Jon Staab Date: Fri, 31 Oct 2025 13:37:54 -0700 Subject: [PATCH 2/6] Restore meaning of closed, add public-write mode --- 29.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/29.md b/29.md index ce9a39ea98..22d2897b8a 100644 --- a/29.md +++ b/29.md @@ -161,8 +161,9 @@ When this event is not found, clients may still connect to the group, but treat ``` - `name`, `picture` and `about` are basic metadata for the group for display purposes. -- `public` signals the group can be _read_ by anyone, while `private` signals that only members can read. If omitted, groups should be considered `public` by default. -- `open` signals that the group can be _written to_ by anyone, while `closed` signals that only members can write. If omitted, groups should be considered `open` by default. +- `public` indicates that group messages can be _read_ by anyone, while `private` indicates that only members have access. If omitted, groups should be considered `public` by default. +- `public-write` indicates that the group can be _written to_ by anyone, while `private-write` indicates that only members can write. If omitted, groups should be considered `public-write` by default. +- `open` indicates that requests to join the group will be automatically granted, while `closed` indicates that join requests are manually approved. If omitted, groups should be considered `closed` by default. - `hidden` signals that group metadata, events, and member lists should not be served to non-members. Implies `private` and `closed`, but event authors SHOULD explicitly set those tags as well. - *group admins* (`kind:39001`) (optional) From 3acf7d20d6a49a690dd709b86d7e8338a710baeb Mon Sep 17 00:00:00 2001 From: Jon Staab Date: Fri, 31 Oct 2025 14:57:02 -0700 Subject: [PATCH 3/6] Add permissive/restricted language to nip 29 --- 29.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/29.md b/29.md index 22d2897b8a..e60c782727 100644 --- a/29.md +++ b/29.md @@ -162,7 +162,7 @@ When this event is not found, clients may still connect to the group, but treat - `name`, `picture` and `about` are basic metadata for the group for display purposes. - `public` indicates that group messages can be _read_ by anyone, while `private` indicates that only members have access. If omitted, groups should be considered `public` by default. -- `public-write` indicates that the group can be _written to_ by anyone, while `private-write` indicates that only members can write. If omitted, groups should be considered `public-write` by default. +- `permissive` indicates that the group can be _written to_ by anyone, while `restricted` indicates that only members can write. If omitted, groups should be considered `permissive` by default. - `open` indicates that requests to join the group will be automatically granted, while `closed` indicates that join requests are manually approved. If omitted, groups should be considered `closed` by default. - `hidden` signals that group metadata, events, and member lists should not be served to non-members. Implies `private` and `closed`, but event authors SHOULD explicitly set those tags as well. From 774a0d64525003a4ee75efc5aa7c1471c505d239 Mon Sep 17 00:00:00 2001 From: Jon Staab Date: Fri, 31 Oct 2025 14:58:35 -0700 Subject: [PATCH 4/6] Redefine nip29 open/closed --- 29.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/29.md b/29.md index e60c782727..781e6b25a9 100644 --- a/29.md +++ b/29.md @@ -163,7 +163,7 @@ When this event is not found, clients may still connect to the group, but treat - `name`, `picture` and `about` are basic metadata for the group for display purposes. - `public` indicates that group messages can be _read_ by anyone, while `private` indicates that only members have access. If omitted, groups should be considered `public` by default. - `permissive` indicates that the group can be _written to_ by anyone, while `restricted` indicates that only members can write. If omitted, groups should be considered `permissive` by default. -- `open` indicates that requests to join the group will be automatically granted, while `closed` indicates that join requests are manually approved. If omitted, groups should be considered `closed` by default. +- `open` indicates that users can expect join requests to be honored, while `closed` indicates that join requests are ignored. If omitted, groups should be considered `open` by default. - `hidden` signals that group metadata, events, and member lists should not be served to non-members. Implies `private` and `closed`, but event authors SHOULD explicitly set those tags as well. - *group admins* (`kind:39001`) (optional) From df7cd409a50db01ebdba484b272df5915c1787f1 Mon Sep 17 00:00:00 2001 From: Jon Staab Date: Fri, 31 Oct 2025 15:40:49 -0700 Subject: [PATCH 5/6] Remove positive versions of restriction tags --- 29.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/29.md b/29.md index 781e6b25a9..c61228d578 100644 --- a/29.md +++ b/29.md @@ -153,18 +153,18 @@ When this event is not found, clients may still connect to the group, but treat ["name", "Pizza Lovers"], ["picture", "https://pizza.com/pizza.png"], ["about", "a group for people who love pizza"], - ["public"], // or ["private"] - ["open"] // or ["closed"] + ["private"], + ["closed"] ] // other fields... } ``` - `name`, `picture` and `about` are basic metadata for the group for display purposes. -- `public` indicates that group messages can be _read_ by anyone, while `private` indicates that only members have access. If omitted, groups should be considered `public` by default. -- `permissive` indicates that the group can be _written to_ by anyone, while `restricted` indicates that only members can write. If omitted, groups should be considered `permissive` by default. -- `open` indicates that users can expect join requests to be honored, while `closed` indicates that join requests are ignored. If omitted, groups should be considered `open` by default. -- `hidden` signals that group metadata, events, and member lists should not be served to non-members. Implies `private` and `closed`, but event authors SHOULD explicitly set those tags as well. +- `private` indicates that only members can _read_ group messages. Omitting this tag indicates that anyone can read group messages. +- `restricted` indicates that only members can _write_ messages to the group. Omitting this tag indicates that anyone can send messages to the group. +- `hidden` indicates that relays should hide group metadata from non-members. Omitting this tag indicates that anyone can request group metadata events. +- `closed` indicates that join requests are ignored. Omitting this tag indicates that users can expect join requests to be honored. - *group admins* (`kind:39001`) (optional) From 78eeac5765871b80b7c78b8c354637d52fd0c41e Mon Sep 17 00:00:00 2001 From: Jon Staab Date: Fri, 31 Oct 2025 15:45:36 -0700 Subject: [PATCH 6/6] Clarify some related wording around invite codes --- 29.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/29.md b/29.md index c61228d578..9099e4da7f 100644 --- a/29.md +++ b/29.md @@ -83,7 +83,7 @@ Any user can send a kind `9021` event to the relay in order to request admission } ``` -The optional `code` tag may be used by the relay to preauthorize acceptances in `closed` groups, together with the `kind:9009` `create-invite` moderation event. +The optional `code` tag may be used by the relay to preauthorize acceptance, together with the `kind:9009` `create-invite` moderation event. - *leave request* (`kind:9022`) @@ -235,7 +235,7 @@ The latest of either `kind:9000` or `kind:9001` events present in a group should ### Adding yourself to a group -When a group is `open`, anyone can send a `kind:9021` event to it in order to be added, then expect a `kind:9000` event to be emitted confirming that the user was added. The same happens with `closed` groups, except in that case a user may only send a `kind:9021` if it has an invite code. +Anyone can send a `kind:9021` join request to a group. The relay may then generate a `kind:9000` event immediately, or defer that decision to an administator. If a group is `closed`, join requests are not honored unless they include an invite code. ### Storing your list of groups