nips/63.md

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