Spectator app (Gateway public surface)
Reference for the Timers Studio spectator app: what the audience sees on /ask/<room>, how identity is kept without a login, which permissions apply and how branding is inherited from the room.
Last updated
Spectator app (Gateway public surface)
The spectator app is the public face of the Gateway module. It is what a person in the audience actually sees when they open a Timers Studio room on their phone: a lightweight, login-free page served at timers.studio/ask/<room>. Everything else in the platform — Studio, Moderator, Player — is hidden from them. This surface is intentionally narrow.
A spectator arrives here in one of two ways. Either they scan a QR code shown on stage, on a slide or in the event program, or they type a short URL that the organiser handed out. In both cases the path is the same: /ask/<room> resolves the room against the controllers table and loads the audience UI. There is no lobby, no account creation, no email prompt.
What a spectator sees
The app is mobile-first and thumb-friendly, with a dark theme by default. From the moment the page loads, a spectator can reach:
- Ask a question — a 280-character form that writes to
spatial_questions. An optional seat picker (SeatSelector) attaches avector_positionand azone_idso the director can locate who is speaking. - Vote on a live poll —
SpectatorPollVoteslides up from the bottom the instant the director opens a poll. It takes priority over the question form until the vote is cast or the poll closes. - Agenda — a read-only view of the running order, shown when the organiser leaves it enabled. It reflects the same data the operator edits in the Agenda module.
- Live badge — a small indicator tied to
controllers.timer_statethat flips to LIVE while a timer is running on stage. - Success screen — after a question is sent, a confirmation with a reset button so the same device can send another one.
Tabs stay subscribed in the background. When the director opens a poll, the spectator does not need to refresh; the vote sheet arrives on its own.
Identity and privacy
The spectator app never asks for a password. Identity is held by a spectator_id that lives in the browser, not on the server session.
- On first visit, the app generates a
spectator_idand stores it inlocalStorage(keyed on the room, for examplefp_<room>). - A row is inserted into
spectatorswith this id, theroom_idand an optionalnickname. - Returning from the same device reuses the same
spectator_id, so the operator counters do not double-count a person who reopens the page. - Clearing the browser storage resets the identity. This is by design and matches the audience expectation that nothing sticks after the show.
Because no email, phone number or account is required, the Gateway stays on the friendly side of GDPR: the only data collected is an anonymous id, the optional nickname and the content the spectator explicitly types (a question, a vote). Seat choice is stored only when the spectator picks one.
Permissions and limits
A few rules keep the surface calm under load:
- Rate limit — a given
spectator_idcan send one question every 10 seconds. The form disables itself between sends. - Question length — 280 characters, enforced client-side and re-checked on insert.
- One active poll at a time — the spectator only ever sees the poll currently flagged
active. Past polls are not browsable from this surface. - No editing, no deleting — once a question is sent, the spectator cannot rewrite it. Moderation happens on the operator side.
- No moderator tools — approving, pushing to the Player or drawing a tombola winner all happen in the Studio. The spectator app exposes none of those.
Branding
The spectator app inherits the look of the room it belongs to. The same theme that drives the Studio header and the Player background is applied here:
- Primary and accent colours read from the room theme.
- The organiser logo shows at the top of the app when one is set on the controller.
- Dark mode is the default; the room theme can override it.
- Language follows the admin language of the controller, including right-to-left layout for Arabic.
The goal is that a spectator on /ask/<room> feels they are in the same event as the stage screen, without any Timers Studio chrome drawing attention away from the show.
FAQ
Do spectators need to create an account?
No. The spectator app has no login, no sign-up, no email field. An anonymous spectator_id is generated in the browser on first visit.
What data does the Gateway collect?
An anonymous spectator_id stored in localStorage, an optional nickname, plus whatever the spectator explicitly sends — a question text, a seat choice, a poll vote. No email, no phone, no account.
Does it work without installing an app? Yes. The spectator app is a web page. Any modern mobile or desktop browser opens it directly from a QR code or a short URL. There is nothing to install.
Can we hide the agenda from spectators? Yes. The organiser can toggle the agenda visibility from the Studio. When it is off, the spectator app still loads normally; only the agenda tab is absent.
Next reads
- Gateway module overview — how the spectator app and the operator workspace fit together.
- Open the Access Gateway — the operator side that reads what spectators are sending.
- Vote on a live poll (spectator view) — a focused walk-through of the poll flow.