{
 "what": "A storyboard as a semantic graph: nodes are things, edges carry the meaning. Generated by formats.js v0.1.0 from the storyboard and its cast.",
 "format": "storyboards.sgit.ai/graph/v1",
 "storyboard": "a-secret-by-qr",
 "nodes": [
  {
   "id": "storyboard:a-secret-by-qr",
   "type": "storyboard",
   "label": "A secret, as a QR code",
   "subtitle": "Noor seals a token to Leo's key; Mallory gets the link and nothing else; Kofi writes to Noor's inbox without an account. 9 panels.",
   "status": "built",
   "url": "https://storyboards.sgit.ai/pki/a-secret-by-qr/"
  },
  {
   "id": "shelf:Keys for people",
   "type": "shelf",
   "label": "Keys for people"
  },
  {
   "id": "author:pki.agent",
   "type": "author",
   "label": "pki.agent"
  },
  {
   "id": "panel:a-secret-by-qr/1",
   "type": "panel",
   "label": "A secret, as a QR code",
   "n": 1,
   "kind": "cover",
   "text": "A secret, as a QR code: Encrypted in the browser. Only their key opens it."
  },
  {
   "id": "character:noor",
   "type": "character",
   "label": "Noor"
  },
  {
   "id": "character:leo",
   "type": "character",
   "label": "Leo"
  },
  {
   "id": "character:kofi",
   "type": "character",
   "label": "Kofi"
  },
  {
   "id": "source:send/index.html",
   "type": "source",
   "label": "send/index.html"
  },
  {
   "id": "panel:a-secret-by-qr/2",
   "type": "panel",
   "label": "Not in a chat",
   "n": 2,
   "kind": "scene",
   "text": "Not in a chat. Noor says: “A token for Leo. Not in a chat.”"
  },
  {
   "id": "prop:laptop",
   "type": "prop",
   "label": "laptop"
  },
  {
   "id": "prop:envelope",
   "type": "prop",
   "label": "envelope"
  },
  {
   "id": "source:Keys for people",
   "type": "source",
   "label": "Keys for people"
  },
  {
   "id": "panel:a-secret-by-qr/3",
   "type": "panel",
   "label": "Sealed to Leo's key",
   "n": 3,
   "kind": "scene",
   "text": "Sealed to Leo's key."
  },
  {
   "id": "prop:key",
   "type": "prop",
   "label": "key"
  },
  {
   "id": "prop:arrow",
   "type": "prop",
   "label": "arrow"
  },
  {
   "id": "source:message.js",
   "type": "source",
   "label": "message.js"
  },
  {
   "id": "panel:a-secret-by-qr/4",
   "type": "panel",
   "label": "A link, and a QR code",
   "n": 4,
   "kind": "scene",
   "text": "A link, and a QR code. Noor says: “The part after the # never reaches a server.”"
  },
  {
   "id": "prop:qr",
   "type": "prop",
   "label": "qr"
  },
  {
   "id": "source:test_people.mjs",
   "type": "source",
   "label": "test_people.mjs"
  },
  {
   "id": "panel:a-secret-by-qr/5",
   "type": "panel",
   "label": "Leo opens it",
   "n": 5,
   "kind": "scene",
   "text": "Leo opens it. Leo says: “Signed by Noor. It checks.”"
  },
  {
   "id": "prop:phone",
   "type": "prop",
   "label": "phone"
  },
  {
   "id": "source:m/index.html",
   "type": "source",
   "label": "m/index.html"
  },
  {
   "id": "panel:a-secret-by-qr/6",
   "type": "panel",
   "label": "Mallory has the link",
   "n": 6,
   "kind": "scene",
   "text": "Mallory has the link. Mallory says: “I have the link. And?”"
  },
  {
   "id": "character:mallory",
   "type": "character",
   "label": "Mallory"
  },
  {
   "id": "prop:mark",
   "type": "prop",
   "label": "mark"
  },
  {
   "id": "panel:a-secret-by-qr/7",
   "type": "panel",
   "label": "Kofi writes to Noor",
   "n": 7,
   "kind": "scene",
   "text": "Kofi writes to Noor. Kofi says: “No account?”"
  },
  {
   "id": "prop:server",
   "type": "prop",
   "label": "server"
  },
  {
   "id": "prop:sign",
   "type": "prop",
   "label": "sign"
  },
  {
   "id": "source:account.js, deliver",
   "type": "source",
   "label": "account.js, deliver"
  },
  {
   "id": "panel:a-secret-by-qr/8",
   "type": "panel",
   "label": "Only Noor reads it",
   "n": 8,
   "kind": "scene",
   "text": "Only Noor reads it. Noor says: “Opened in my vault. Nowhere else.”"
  },
  {
   "id": "prop:vault",
   "type": "prop",
   "label": "vault"
  },
  {
   "id": "source:vault/index.html#inbox",
   "type": "source",
   "label": "vault/index.html#inbox"
  },
  {
   "id": "panel:a-secret-by-qr/9",
   "type": "panel",
   "label": "Only their key opens it. Nothing readable passes through a server.",
   "n": 9,
   "kind": "punchline",
   "text": "Only their key opens it. Nothing readable passes through a server.."
  },
  {
   "id": "source:test_people_browser.mjs",
   "type": "source",
   "label": "test_people_browser.mjs"
  }
 ],
 "edges": [
  {
   "from": "storyboard:a-secret-by-qr",
   "type": "on_shelf",
   "to": "shelf:Keys for people"
  },
  {
   "from": "storyboard:a-secret-by-qr",
   "type": "made_by",
   "to": "author:pki.agent"
  },
  {
   "from": "storyboard:a-secret-by-qr",
   "type": "has_panel",
   "to": "panel:a-secret-by-qr/1",
   "n": 1
  },
  {
   "from": "panel:a-secret-by-qr/1",
   "type": "features",
   "to": "character:noor",
   "pose": "point",
   "mood": "happy"
  },
  {
   "from": "panel:a-secret-by-qr/1",
   "type": "features",
   "to": "character:leo",
   "pose": "stand",
   "mood": "happy"
  },
  {
   "from": "panel:a-secret-by-qr/1",
   "type": "features",
   "to": "character:kofi",
   "pose": "wave",
   "mood": "happy"
  },
  {
   "from": "panel:a-secret-by-qr/1",
   "type": "quotes",
   "to": "source:send/index.html"
  },
  {
   "from": "storyboard:a-secret-by-qr",
   "type": "has_panel",
   "to": "panel:a-secret-by-qr/2",
   "n": 2
  },
  {
   "from": "panel:a-secret-by-qr/1",
   "type": "next",
   "to": "panel:a-secret-by-qr/2"
  },
  {
   "from": "panel:a-secret-by-qr/2",
   "type": "features",
   "to": "character:noor",
   "pose": "think",
   "mood": "determined"
  },
  {
   "from": "character:noor",
   "type": "says",
   "to": "panel:a-secret-by-qr/2",
   "text": "A token for Leo. Not in a chat."
  },
  {
   "from": "panel:a-secret-by-qr/2",
   "type": "shows",
   "to": "prop:laptop"
  },
  {
   "from": "panel:a-secret-by-qr/2",
   "type": "shows",
   "to": "prop:envelope"
  },
  {
   "from": "panel:a-secret-by-qr/2",
   "type": "drawn_from",
   "to": "source:Keys for people"
  },
  {
   "from": "storyboard:a-secret-by-qr",
   "type": "has_panel",
   "to": "panel:a-secret-by-qr/3",
   "n": 3
  },
  {
   "from": "panel:a-secret-by-qr/2",
   "type": "next",
   "to": "panel:a-secret-by-qr/3"
  },
  {
   "from": "panel:a-secret-by-qr/3",
   "type": "shows",
   "to": "prop:key"
  },
  {
   "from": "panel:a-secret-by-qr/3",
   "type": "shows",
   "to": "prop:arrow"
  },
  {
   "from": "panel:a-secret-by-qr/3",
   "type": "shows",
   "to": "prop:envelope"
  },
  {
   "from": "panel:a-secret-by-qr/3",
   "type": "drawn_from",
   "to": "source:message.js"
  },
  {
   "from": "storyboard:a-secret-by-qr",
   "type": "has_panel",
   "to": "panel:a-secret-by-qr/4",
   "n": 4
  },
  {
   "from": "panel:a-secret-by-qr/3",
   "type": "next",
   "to": "panel:a-secret-by-qr/4"
  },
  {
   "from": "panel:a-secret-by-qr/4",
   "type": "features",
   "to": "character:noor",
   "pose": "point",
   "mood": "happy"
  },
  {
   "from": "character:noor",
   "type": "says",
   "to": "panel:a-secret-by-qr/4",
   "text": "The part after the # never reaches a server."
  },
  {
   "from": "panel:a-secret-by-qr/4",
   "type": "shows",
   "to": "prop:qr"
  },
  {
   "from": "panel:a-secret-by-qr/4",
   "type": "drawn_from",
   "to": "source:test_people.mjs"
  },
  {
   "from": "storyboard:a-secret-by-qr",
   "type": "has_panel",
   "to": "panel:a-secret-by-qr/5",
   "n": 5
  },
  {
   "from": "panel:a-secret-by-qr/4",
   "type": "next",
   "to": "panel:a-secret-by-qr/5"
  },
  {
   "from": "panel:a-secret-by-qr/5",
   "type": "features",
   "to": "character:leo",
   "pose": "arms-up",
   "mood": "happy"
  },
  {
   "from": "character:leo",
   "type": "says",
   "to": "panel:a-secret-by-qr/5",
   "text": "Signed by Noor. It checks."
  },
  {
   "from": "panel:a-secret-by-qr/5",
   "type": "shows",
   "to": "prop:phone"
  },
  {
   "from": "panel:a-secret-by-qr/5",
   "type": "shows",
   "to": "prop:envelope"
  },
  {
   "from": "panel:a-secret-by-qr/5",
   "type": "drawn_from",
   "to": "source:m/index.html"
  },
  {
   "from": "storyboard:a-secret-by-qr",
   "type": "has_panel",
   "to": "panel:a-secret-by-qr/6",
   "n": 6
  },
  {
   "from": "panel:a-secret-by-qr/5",
   "type": "next",
   "to": "panel:a-secret-by-qr/6"
  },
  {
   "from": "panel:a-secret-by-qr/6",
   "type": "features",
   "to": "character:mallory",
   "pose": "shrug",
   "mood": "confused"
  },
  {
   "from": "character:mallory",
   "type": "says",
   "to": "panel:a-secret-by-qr/6",
   "text": "I have the link. And?"
  },
  {
   "from": "panel:a-secret-by-qr/6",
   "type": "shows",
   "to": "prop:envelope"
  },
  {
   "from": "panel:a-secret-by-qr/6",
   "type": "shows",
   "to": "prop:mark"
  },
  {
   "from": "panel:a-secret-by-qr/6",
   "type": "drawn_from",
   "to": "source:test_people.mjs"
  },
  {
   "from": "storyboard:a-secret-by-qr",
   "type": "has_panel",
   "to": "panel:a-secret-by-qr/7",
   "n": 7
  },
  {
   "from": "panel:a-secret-by-qr/6",
   "type": "next",
   "to": "panel:a-secret-by-qr/7"
  },
  {
   "from": "panel:a-secret-by-qr/7",
   "type": "features",
   "to": "character:kofi",
   "pose": "point",
   "mood": "happy"
  },
  {
   "from": "character:kofi",
   "type": "says",
   "to": "panel:a-secret-by-qr/7",
   "text": "No account?"
  },
  {
   "from": "panel:a-secret-by-qr/7",
   "type": "shows",
   "to": "prop:envelope"
  },
  {
   "from": "panel:a-secret-by-qr/7",
   "type": "shows",
   "to": "prop:arrow"
  },
  {
   "from": "panel:a-secret-by-qr/7",
   "type": "shows",
   "to": "prop:server"
  },
  {
   "from": "panel:a-secret-by-qr/7",
   "type": "shows",
   "to": "prop:sign"
  },
  {
   "from": "panel:a-secret-by-qr/7",
   "type": "drawn_from",
   "to": "source:account.js, deliver"
  },
  {
   "from": "storyboard:a-secret-by-qr",
   "type": "has_panel",
   "to": "panel:a-secret-by-qr/8",
   "n": 8
  },
  {
   "from": "panel:a-secret-by-qr/7",
   "type": "next",
   "to": "panel:a-secret-by-qr/8"
  },
  {
   "from": "panel:a-secret-by-qr/8",
   "type": "features",
   "to": "character:noor",
   "pose": "think",
   "mood": "happy"
  },
  {
   "from": "character:noor",
   "type": "says",
   "to": "panel:a-secret-by-qr/8",
   "text": "Opened in my vault. Nowhere else."
  },
  {
   "from": "panel:a-secret-by-qr/8",
   "type": "shows",
   "to": "prop:vault"
  },
  {
   "from": "panel:a-secret-by-qr/8",
   "type": "shows",
   "to": "prop:envelope"
  },
  {
   "from": "panel:a-secret-by-qr/8",
   "type": "drawn_from",
   "to": "source:vault/index.html#inbox"
  },
  {
   "from": "storyboard:a-secret-by-qr",
   "type": "has_panel",
   "to": "panel:a-secret-by-qr/9",
   "n": 9
  },
  {
   "from": "panel:a-secret-by-qr/8",
   "type": "next",
   "to": "panel:a-secret-by-qr/9"
  },
  {
   "from": "panel:a-secret-by-qr/9",
   "type": "features",
   "to": "character:noor",
   "pose": "wave",
   "mood": "happy"
  },
  {
   "from": "panel:a-secret-by-qr/9",
   "type": "features",
   "to": "character:leo",
   "pose": "arms-up",
   "mood": "happy"
  },
  {
   "from": "panel:a-secret-by-qr/9",
   "type": "features",
   "to": "character:kofi",
   "pose": "point",
   "mood": "happy"
  },
  {
   "from": "panel:a-secret-by-qr/9",
   "type": "quotes",
   "to": "source:test_people_browser.mjs"
  }
 ]
}
