State
{ "next_slide": false, "count": 0, "threshold": 5 }
Endpoints
| Path | Effect |
|---|---|
GET /state | Read state, no side effects. |
GET /advance | Set next_slide = true. |
GET /poll | Return {next_slide} and reset it to false. A deck polls this; reading it consumes the flag. |
GET /tick | count++. Auto-advances when count >= threshold (resets count). |
GET /threshold/N | Set threshold to integer N. |
GET /reset | Reset everything to defaults. |
Audience interaction
Share /click with the audience — each device gets a big button that fires /tick once every 5 minutes (cooldown stored in localStorage, survives page reloads).
Feedback
Anonymous: an entry is a timestamp and a piece of text.
| Path | Effect |
|---|---|
POST /feedback | Body {"text": "..."}. 1000 characters max, 30 a minute across everyone. |
GET /show_feedback | Every note, newest first, with the date and time it arrived. |
GET /feedback.xml | The file itself. |