nips/63.md
2024-11-25 16:34:15 -05:00

2.4 KiB

NIP-63

Build Your Own Adventure

draft optional

This NIP introduces kind:296 and kind:297 as text-based notes designed to create interactive stories. These notes include options for navigating to subsequent notes, allowing readers to continue exploring the story. Kind:296 serves as starting events for the reader, while kind:297 represents individual scenes within the narrative.

The idea is to emulate "choose your own adventure" books, where each reader's journey through the story is unique.

Scene events MAY include an optional title tag and multiple option tags that point to the next possible scenes.

Clients SHOULD render the options in a way that allows users to select and seamlessly navigate to the corresponding posts.

Example for kind:296 (Prologue)

Prologue events are entry points in the story.

They SHOULD contain title, summary and image to help clients render a preview of the story.

{
  "kind": 296,
  "content": "<the beginning of the story>",
  "tags": [
    ["title", "<short title for the prologue>"],
    ["summary", "<summary for preview>"],
    ["image", "<image url for preview>"],

    ["option", "<description>", "<event_id>", "<relay_hint>"],
    ["option", "<description>", "<event_id>", "<relay_hint>"],
    // ...
  ]
}

Example for kind:297 (Scene)

Scenes describe a given point in a story with potential options.

{
  "kind": 297,
  "content": "<description of the scene>",
  "tags": [
    ["title", "<short title for this scene>"],

    ["option", "<description>", "<event_id>", "<relay_hint>"],
    ["option", "<description>", "<event_id>", "<relay_hint>"],
    // ...
  ]
}

The story concludes when no option tags are present.

The .content field SHOULD follow the same formatting rules as kind:1.

Reading State

Kind 30296 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": 30296,
  "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>"]
  ]
}