Ripple Effect

For tabletop players and storytellers

Storyboard the campaign, and track everything in it

Lay a campaign out as scenes on a board, keep every character, item and faction as an entity with typed attributes, and let console variables hold the state of the world while you play.

Storyboarding

Every scene a card, every choice a wire

Players go where they like. The board shows the whole session at a glance, and the next scene is never further away than a right-click on the canvas.

  • The branch you didn’t plan for is a card dropped on the board and wired in
  • Chapters are boards of their own, and a Jump hands the story on
  • Dice in standard notation, with the usual rolls as presets
  • Press play at the table; pause, edit the board, and pick up where you were
Start
At the gates
elsenmar-at-the-gates
The queue has not moved since noon, and the gate-captain is turning people away by the cartload.
Talk your way in
Find another way
Persuasion
execcompleted
Roll1d20 + 3
total
Into the sewers
Did it work?
execyes
Components and entities

Describe a goblin once. Spawn six.

Characters, items and factions are components; the ones the story makes and changes are entities. What the party did to the sword in chapter one is still true in chapter five, because it is the same sword.

  • A component is a name and an ordered bag of typed attributes — no schema to design first
  • Spawn makes as many as you ask, and finds the same ones again on a second visit
  • Cards ask who is still standing, whether one exists, and take one away
  • Python reads them too: component("Goblin")["hp"]
Goblin.component.json
hpint7
attackstring1d6
lootlist<asset>[2 files]
Spawn
execcompleted
Goblin
nameGoblin
count6entities

Entities the campaign holds

  • Goblin 1
  • Goblin 2
  • Goblin 3
  • Goblin 4
  • Goblin 5
  • Goblin 6
Console variables

The state of the world, typed and in view

How alarmed the city is, whether the gates are open, which season it is. Console variables are the campaign’s own ledger, and any card or script can read the world from them.

How console variables work

  • Declared once with a type: whole numbers, numbers, switches, text, Markdown, files and JSON
  • Get, Set and Branch cards read and write them without a line of code
  • Scoped to one board or to the whole campaign
  • Watched live in a panel while the story plays
Console variables
city_alarmint0
gates_openboolfalse
seasonstringautumn
patronsjson{…}
Variable branch
execyes
city_alarm
value≥2no
Soundscapes

Set the mood for every scene

Music and ambience that follow the story at the table, without anybody reaching for a playlist: move on to the next scene and the sound moves with you.

  • A soundscape is a timeline of clips: music under a scene, rain on the roof, a bell every half minute
  • A passage names one, and it plays from there until another passage brings its own — or silence
  • Clips loop gaplessly, play once, or repeat with a rest between plays
  • Lanes you can name, lock, mute and solo while you work, every clip with its waveform
  • A one-off sound — a door, a scream, a fanfare — is a card dropped where it happens
harbour-night.soundscape.json0:00 — 2:00
Music
harbour-at-night.ogg · loop
Rain
rain-on-slate.ogg · loop
Bell
At the gatesplaysharbour-night…until a passage brings its own, or silence

Open a folder and start writing

No account, no project scaffold, nothing written into your directory that you did not ask for.