@@ -129,3 +129,146 @@ Common use cases include meeting rooms/workshops, watch-together activities, or
129129 "sig" : " 997f62ddfc0827c121043074d50cfce7a528e978c575722748629a4137c45b75bdbc84170bedc723ef0a5a4c3daebf1fef2e93f5e2ddb98e5d685d022c30b622"
130130}
131131```
132+
133+ ## Interactive Rooms and Meetings
134+ -----
135+
136+ ` draft ` ` optional `
137+
138+ Service 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+
144+ A 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+
165+ Room 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
171+ Provider 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+
179+ A 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+
201+ Event 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
207+ Event 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+
212+ Examples
213+
214+ Interactive 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+
236+ Conference 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+
259+ New ` kind: 10312 ` provides an event which signals presence of a listener.
260+
261+ The presence event SHOULD be updated at regular intervals and clients SHOULD filter presence events older than
262+ a 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+ ```
0 commit comments