A donation tug-of-war for the stream. Kick money fills the pot; keep money pushes the goal further away. The rope moves live while people give, and the KICKED card holds on screen until the operator starts the next guest.
No account, no install, no network. It runs off a USB stick. Every release is frozen — the version you download today stays downloadable.
Two things happen on the operator's machine: the relay runs in a terminal, and the control room is a page you keep open.
Node is the only requirement. Leave this window open for the whole stream.
node relay.js
control-room.html
This is the operator's screen — the buttons, the pot, the guest timer. It explains itself on the page, so there is nothing to memorise.
overlay.html to OBS as a Browser Source
It is transparent by design. On its own it looks like nothing — that is correct; it only draws once the control room sends it something.
| File | What it is |
|---|---|
overlay.html | The graphic OBS shows. |
control-room.html | The operator's buttons. |
relay.js | Connects the two. Node, no dependencies. |
README.md | Setup, the query parameters, and what to do when nothing is happening. |
EVENTS.md | For a developer wiring real donations in. |
manifest.json | The version, and a checksum for every file above. |
The control room says which of these it is, in the status line under the buttons. This is the part worth reading before the stream, not during it.
The relay stopped, or was never started. Start it again — the page reconnects on its own.
The click was real but the connection was not. Wait a moment and press it again.
The card holds until you press play, so nothing moves on before the next guest sits down.
The overlay does not read your donation platform directly; something sends it an event. There are three ways to do that, and EVENTS.md opens with a runnable example rather than a specification.
If you report a problem, quote the version — it is on the
control room and in manifest.json. It tells us exactly which bytes you are running.