The Body is Obsolete

2025-2026Real-time / Networked

Browser-based interactive fiction disguised as a chatroom, with generative p5.js visuals. Built independently for live performance.

Interactive fiction disguised as an MSN-era chatroom. The audience joins what looks like a retro messenger — draggable windows, avatars, a synthwave grid rendered in p5.js — and a story arrives message by message, in real time. They steer it by clicking dialogue choices, which post to the chat as their own lines.

How it works

  • The story is written in Twine and compiled offline to JSON by a custom twee-to-JSON compiler. The server only ever plays JSON; the narrative stays editable by a non-programmer.
  • Nobody types the script live. The server performs it: each line lands after a delay of 500 ms + 40 ms per character (clamped between 1 and 6 seconds), so the narrator appears to type like a person.
  • Three separate pages, three roles: the player chatroom, a narrator console ("Initiate Transmission", restart, end), and a control desk with live sliders for the glitch intensity and colour theme of the p5 visuals.
  • While a story is running, join/leave notices are suppressed so the fiction never breaks. If the narrator disconnects mid-story, "Liz has left the chat" is deferred until the story formally ends — and only sent if she's still gone.
  • Branching resolves server-side against variable state, so choices can be gated and the story can notice things — a counter mechanic lets it say "the third time you ask" and mean it.

Numbers

112 story nodes, 154 choices, 141 narrator lines. Runs on Express and Socket.IO, self-hosted in Docker behind an Nginx proxy.

Node.jsSocket.iop5.js
Live ↗GitHub
interactive-fictionp5socket-ioperformance