Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Build Your Own Adventure posts #1606

Open
wants to merge 9 commits into
base: master
Choose a base branch
from
91 changes: 91 additions & 0 deletions 63.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
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>"],

Comment on lines +48 to +49
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Make it possible to reply to scenes with further scenes. If your story gets referenced, your client should pick up on that (if you follow me for example) and make it easy for you to add my event as an option using the title as description of a further option.

Suggested change
["title", "<short title for this scene>"],
["title", "<short title for this scene>"],
["E", "<root_event_id>", "<relay_hint>"],
["e", "<event_id>", "<relay_hint>"],

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hum... I wonder how to do that.. we could add a tag but then you will have to remember deleting it later. Or maybe we just create another kind...

["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.
vitorpamplona marked this conversation as resolved.
Show resolved Hide resolved

```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>"]
]
}
```