mirror of
https://github.com/nostr-protocol/nips.git
synced 2024-12-23 00:45:53 -05:00
04fec8c96d
Co-authored-by: Asai Toshiya <to.asai.60@gmail.com>
91 lines
2.5 KiB
Markdown
91 lines
2.5 KiB
Markdown
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.
|
|
|
|
```jsonc
|
|
{
|
|
"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.
|
|
|
|
```jsonc
|
|
{
|
|
"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 `a` tag points to the latest scene the user has read.
|
|
|
|
```jsonc
|
|
{
|
|
"kind": 30298,
|
|
"tags": [
|
|
// d-tag defines the starting point so that if the user sees an interative post again, the client can find it.
|
|
["d", "<kind:pubkey:d-tag>"],
|
|
|
|
// cached to simplify preview purposes
|
|
["title", "<root_event_title>"],
|
|
["summary", "<root_event_summary>"],
|
|
["image", "<image url for preview>"],
|
|
|
|
// root with relay hint
|
|
["A", "<kind:pubkey:d-tag>", "<relay_hint>"],
|
|
|
|
// current scene with relay hint
|
|
["a", "<kind:pubkey:d-tag>", "<relay_hint>"],
|
|
|
|
// reading status
|
|
["status", "<new|reading|done>"]
|
|
]
|
|
}
|
|
``` |