upleb.uk

Public git repos — served from a NIP-34 GRASP relay at git.upleb.uk

summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--53.md143
1 files changed, 143 insertions, 0 deletions
diff --git a/53.md b/53.md
index 69d1c9f..d64f3ef 100644
--- a/53.md
+++ b/53.md
@@ -129,3 +129,146 @@ Common use cases include meeting rooms/workshops, watch-together activities, or
129 "sig": "997f62ddfc0827c121043074d50cfce7a528e978c575722748629a4137c45b75bdbc84170bedc723ef0a5a4c3daebf1fef2e93f5e2ddb98e5d685d022c30b622" 129 "sig": "997f62ddfc0827c121043074d50cfce7a528e978c575722748629a4137c45b75bdbc84170bedc723ef0a5a4c3daebf1fef2e93f5e2ddb98e5d685d022c30b622"
130} 130}
131``` 131```
132
133## Interactive Rooms and Meetings
134-----
135
136`draft` `optional`
137
138Service providers want to offer Interactive Rooms to the Nostr network in such a way that participants can easily log and query by clients. This NIP describes a general framework to advertise rooms and their associated events.
139
140## Concepts
141
142### Interactive Room (kind:30312)
143
144A special event with `kind:30312` "Interactive Room" defines the configuration and properties of a virtual interactive space. Each room has a unique identifier and can host multiple events/meetings.
145
146```jsonc
147{
148 "kind": 30312,
149 "tags": [
150 ["d", "<unique identifier>"], // Required: Room identifier
151 ["room", "<name of the room>"], // Required: Display name
152 ["summary", "<description>"], // Optional: Room description
153 ["image", "<preview image url>"], // Optional: Room image
154 ["status", "<open, private, closed>"], // Required: Room accessibility
155 ["service", "<url>"], // Required: URL to access the room
156 ["endpoint", "<url>"], // Optional: API endpoint for status/info
157 ["t", "<hashtag>"], // Optional: Multiple hashtags allowed
158 ["p", "<pubkey>", "<url>", "<role>", "<proof>"], // Required: At least one provider
159 ["relays", "<url>", "<url>", /*...*/] // Optional: Preferred relays
160 ],
161 "content": "" // Usually empty, may contain additional metadata
162}
163```
164
165Room properties:
166* MUST be either open, private or closed. Closed means the room is not in operation.
167* MAY specify access control policy for private rooms (e.g. invite-only, payment required)
168* MAY persist when not in use
169* MUST have at least one provider with "Host" role
170* MAY have multiple providers with different roles
171Provider roles (p tags):
172* Host: Full room management capabilities
173* Moderator: Room moderation capabilities
174* Speaker: Allowed to present/speak
175* Optional proof field for role verification
176
177### Room Meeting (kind:30313)
178
179A special event with kind:30313 represents a scheduled or ongoing meeting within a room. It MUST reference its parent room using the d tag.
180
181```jsonc
182{
183 "kind": 30313,
184 "tags": [
185 ["d", "<event-unique-identifier>"], // Required: Event identifier
186 ["a", "30312:<pubkey>:<room-id>", "wss://nostr.example.com"], // Required: Reference to parent room, 'd' from 30312
187 ["title", "<meeting-title>"], // Required: Meeting title
188 ["summary", "<description>"], // Optional: Meeting description
189 ["image", "<preview image url>"], // Optional: Meeting image
190 ["starts", "<unix timestamp>"], // Required: Start time
191 ["ends", "<unix timestamp>"], // Optional: End time
192 ["status", "<planned, live, ended>"], // Required: Meeting status
193 ["total_participants", "<number>"], // Optional: Total registered
194 ["current_participants", "<number>"], // Optional: Currently active
195 ["p", "<pubkey>", "<url>", "<role>"], // Optional: Participant with role
196 ],
197 "content": "" // Usually empty, may contain additional metadata
198}
199```
200
201Event properties:
202* MUST reference parent room via d tag
203* MUST have a status (planned/live/ended)
204* MUST have a start time
205* MAY track participant counts
206* MAY include participant roles specific to the event
207Event management:
208* Clients SHOULD update event status regularly when live
209* Events without updates for 1 hour MAY be considered ended
210* starts and ends timestamps SHOULD be updated when status changes
211
212Examples
213
214Interactive Room (kind:30312)
215
216```jsonc
217{
218 "kind": 30312,
219 "tags": [
220 ["d", "main-conference-room"],
221 ["room", "Main Conference Hall"],
222 ["summary", "Our primary conference space"],
223 ["image", "https://example.com/room.jpg"],
224 ["status", "open"],
225 ["service", "https://meet.example.com/room"],
226 ["endpoint", "https://api.example.com/room"],
227 ["t", "conference"],
228 ["p", "f7234bd4c1394dda46d09f35bd384dd30cc552ad5541990f98844fb06676e9ca", "wss://nostr.example.com/", "Owner"],
229 ["p", "14aeb..8dad4", "wss://provider2.com/", "Moderator"],
230 ["relays", "wss://relay1.com", "wss://relay2.com"]
231 ],
232 "content": ""
233}
234```
235
236Conference Event (kind:30313)
237
238```jsonc
239{
240 "kind": 30313,
241 "tags": [
242 ["d", "annual-meeting-2025"],
243 ["a", "30312:f7234bd4c1394dda46d09f35bd384dd30cc552ad5541990f98844fb06676e9ca:main-conference-room", "wss://nostr.example.com"]
244 ["title", "Annual Company Meeting 2025"],
245 ["summary", "Yearly company-wide meeting"],
246 ["image", "https://example.com/meeting.jpg"],
247 ["starts", "1676262123"],
248 ["ends", "1676269323"],
249 ["status", "live"],
250 ["total_participants", "180"],
251 ["current_participants", "175"],
252 ["p", "91cf9..4e5ca", "wss://provider1.com/", "Speaker"],
253 ],
254 "content": ""
255}
256```
257## Room Presence
258
259New `kind: 10312` provides an event which signals presence of a listener.
260
261The presence event SHOULD be updated at regular intervals and clients SHOULD filter presence events older than
262a given time window.
263
264**This kind `10312` is a regular replaceable event, as such presence can only be indicated in one room at a time.**
265
266```json
267{
268 "kind": 10312,
269 "tags": [
270 ["a" , "<room-a-tag>", "<relay-hint>", "root"],
271 ["hand", "1"] // hand raised flag
272 ]
273}
274```