Skip to content

The live room

Every deck that talks to a room server has a live room: one per deck, shared by the presenter, the projector and every phone. On deck.kadal.cc a published deck’s room is created for you; you can also host one yourself.

Put <QrJoin /> on a slide (or show the QR from the presenter view’s room panel). The audience scans it — or opens /join — and sees:

  • the deck at your slide, in a stage-exact mirror (same scale, backgrounds and fitting as the projector), which they can tap to fill the screen sideways;
  • buttons to react, ask and upvote, answer polls and quizzes, set the pace, raise a hand and bookmark a slide;
  • your notes, when you share them.

Nobody installs anything or signs in. How many phones can be in a room at once depends on the plan — see pricing.

A viewer who opens a live deck starts in step with you and is shown nothing about it — the deck simply moves. The moment they move themselves, by any means (a key, a swipe, the overview, search, a link), they stop following, and nothing moves them again: you can step through the whole deck and they stay where they stopped reading. A pill then offers Follow the presenter, which jumps them to you and puts them back in step.

What still reaches a viewer who is reading on their own: your drawings (on the slide they were drawn on), confetti, a shared term card (only on its own slide) and blackout. What does not: the laser and the spotlight, which point at a place on your slide and mean nothing on any other.

<QrJoin />
<Presence />
<Reactions />
<Poll
id="tool"
question="What do you present with today?"
options={["Keynote", "Google Slides", "reveal.js", "Something else"]}
/>
<Poll id="pace" kind="rating" scale={5} question="How is the pace so far?" />
<WordCloud id="oneword" question="One word for how this feels" />
<Quiz
id="q1"
question="Which separator starts a vertical slide?"
options={["---", "----", "***", "==="]}
correct={1}
seconds={20}
/>
<Leaderboard top={5} />
<Questions limit={5} />
<Pace />
Component What it does
<QrJoin /> the QR code and link to /join
<Presence /> how many people are here, and on which slides
<Reactions /> the reaction bar: 👏 🔥 ❤️ 😂 🤯 👀 🙋 💡 float across every screen, with session totals
<Poll id question options kind> kind: choice (default), multi, rating (with scale); the presenter opens, closes and resets it
<WordCloud id question /> one-word answers, sized by how many gave them
<Quiz id question options correct seconds> a timed question; answers are scored by speed, with a nickname
<Leaderboard top> the quiz leaderboard
<Questions limit> the audience’s questions, ranked by upvotes; the presenter marks them answered
<Pace /> the pace meter: too slow, fine, too fast

Every viewer’s messages are throttled per person, and anything only a presenter may do (moving the deck, opening a poll, drawing for everyone) is dropped when a viewer sends it. A vote or an upvote counts once per person.

Switch features off in the configuration: reactions: false, qa: false, polls: false, or drawings: { enabled: false }. audienceNotes: true shows every slide’s notes on the audience page — useful after the talk.

The presenter view’s Start session begins a session: its peak audience, questions, reactions and poll results are saved while it runs and when it ends, so you can read them afterwards in /stats (or the dashboard, on a hosted deck). The room’s own state survives a reload and a quiet period, so a phone that sleeps through a slide comes back in step.

A room can require a Cloudflare Turnstile check before a viewer connects: set live.turnstile to your Turnstile site key, and give the room server the matching secret.