2.4 KiB
NIP-63
Interactive Stories
draft
optional
This NIP introduces kind:30296
and kind:30297
as living notes designed to create interactive stories. These notes include option
tags for navigating to subsequent notes, allowing readers to continue exploring the story. Kind:30296
serves as starting events for the reader, while kind:30297
represents individual scenes within the narrative.
The modularity of this approach allows Scenes from multiple authors to be combined into bigger stories.
Prologue (kind:30296)
Prologue events are entry points in the story.
They SHOULD contain title
, summary
and image
to help clients render a preview of the story.
option
tags include a description for the action button, an address and the relay to find the next scene.
{
"kind": 30296,
"content": "<the beginning of the story>",
"tags": [
["d", "<unique identifier>"],
["title", "<short title for the prologue>"],
["summary", "<summary for preview>"],
["image", "<image url for preview>"],
["option", "<description>", "<kind:pubkey:d-tag>", "<relay_hint>"],
["option", "<description>", "<kind:pubkey:d-tag>", "<relay_hint>"],
// ...
]
}
Scene (kind:30297)
Scenes describe a given point in a story with potential options and SHOULD include an optional title
tag.
{
"kind": 30297,
"content": "<description of the scene>",
"tags": [
["d", "<unique identifier>"],
["title", "<short title for this scene>"],
["option", "<description>", "<kind:pubkey:d-tag>", "<relay_hint>"],
["option", "<description>", "<kind:pubkey:d-tag>", "<relay_hint>"],
// ...
]
}
The story concludes when no option
tags are present.
The .content
field does not accept markdown.
Reading State
Kind 30298
stores the latest state of the story.
The d
tag of the replaceable event MUST match the root event's id.
The e
tag points to the latest scene the user has read.
{
"kind": 30298,
"tags": [
["d", "<root_event_id>"],
// cached to simplify preview purposes
["title", "<root_event_title>"],
["summary", "<root_event_summary>"],
["image", "<image url for preview>"],
// root with relay hint
["E", "<root_event_id>", "<relay_hint>"],
// current scene with relay hint
["e", "<event_id>", "<relay_hint>"],
// reading status
["status", "<new|reading|done>"]
]
}