The Shot

A live crowd game

Built by nCubo

What if halftime wasn't something the crowd watched — but something the crowd played?

A concept video: the arena, the crowd and the game are a visualization. The Shot is in construction.

Building The Shot

The court stays empty. The game happens on the screen and in the crowd's hands.

Thousands of phones, two teams, one match on the big screen — and a result nobody controls on their own.

We're building it on three fronts at once, on top of a system that already runs a bingo night on the phones in one room and across four homes on four networks. The rules are written.

In construction. Every claim below says what it is: running, measured, or still a design.

Three fronts, built at once

The Shot is three pieces, each running its own part of the match on its own device. The rules of the game are the other half — they are written, and they come after this.

10,000 phoneseach with its own PuppettapsbatchedThe ensembleone Puppet per team and verbBlue · LiftBlue · AimBlue · ShootPurple · BlockPurple · DeflectPurple · ChargeTotalsGamethe rules decidefacts, not picturesScreensMatchSponsorStatsConsolestart · pause · advance10,000 phoneseach with its own Puppettaps, batchedThe ensembleone Puppet per team and verbBlue · LiftBlue · AimBlue · ShootPurple · BlockPurple · DeflectPurple · ChargeTotalsGamethe rules decidefacts, not picturesMatchSponsorStatsScreensConsolestart · pause · advance

The phone

Your part of the match.

  • Its own Puppet: your team, your role, what you did
  • Draws the game itself — no video
Proven in our bingo

The way in and a phone that keeps its own state. Drawing the match is what comes next.

Next A game client at 60 frames a second

The big screen

The show the whole building watches.

  • Its own Puppet, with a memory of every fact
  • Each screen can show something different
Measured · TV emulator

Switched off mid-match, it came back with nothing missing.

Next Real televisions, more screens

The console

Whoever runs the night.

  • One app, for Android and iOS
  • Every action recorded: who, and when
Skeleton running

Screens paired by role; every moment goes out on its second.

Next The full console

Measured · 1 October 2026

Ten thousand phones press at once. 99 in 100 taps are on disk within 33 milliseconds.

Faster than the blink of an eye — and on disk before it counts. The same job on MySQL took almost three seconds: by then, the shot is already in the air.

83×

faster than MySQL

33 ms against 2,751 ms

4×

less CPU per message

111 µs against 473 µs

0

taps lost

in all 16 runs

How long a phone waits, on the same clock

a blink of an eye: 0.1–0.4 s
Puppet33 ms
MySQL2.75 s

99 of every 100 phones waited this long or less, at the busiest moment of the game. At this load MySQL ran out of room and its queue grew; the Puppet still had room to spare.

And with 4× less disk per message.

One desktop, 10,000 simulated phones, five taps per message and a burst of about 60,000 messages a second. Both confirm only once the tap is on disk. Puppeteer's FileSystem journal against MySQL 8.0.46 with Entity Framework Core, writing in groups.

Same promise on both sides: a tap is confirmed only once it is on disk, and both write in groups. Written one tap at a time, neither keeps up beyond 5,000 phones — and with 1,000 phones MySQL answers first.

What we tested

The same game, two places to keep it

Ten thousand simulated phones play the same game against the same server. Taps that arrive together wait in a queue and leave as one batch. The only thing that changes is where that batch is kept: a Puppet's journal, or a MySQL table.

10,000 phonesfive taps per messageThe same servertaps queue up,leave in batchesPuppetone command per batchJournal fileone entry, on diskEntity Frameworkone INSERT per rowMySQL tableredo log, on diskthe phone hears back only after the diskone desktop · loopback · no TLSone desktop · loopback · no TLS10,000 phonesfive taps per messageThe same servertaps queue up,leave in batchesPuppetone command per batchJournal fileone entry, on diskEntity Frameworkone INSERT per rowMySQL tableredo log, on diskthe phone hears back only after the disk

The write each one does, shortened from the code of the test

MySQL · Entity Framework Core
foreach (var tap in batch)
    db.Taps.Add(new TapRow {
        Uuid = tap.Uuid,
        Device = tap.Device,
        N = tap.N });
db.SaveChanges();
// one transaction, committed to disk
Puppeteer · FileSystem journal
puppet.Using("tally.TapBatch(@devices, @uuids, @ns);")
      .WithParameters(p => {
          p["devices", typeof(string[])] = devices;
          p["uuids",   typeof(string[])] = uuids;
          p["ns",      typeof(int[])]    = ns; })
      .PerformCommand();
// one journal entry, on disk before it returns

How fast each one writes to disk, with no network in between: one writer in a loop for 8 seconds

One at a timeIn batches of 100
StoreTime per writeless is betterMessages stored per secondmore is betterMessages stored per secondmore is better
Puppet journal0.40 ms2,477219,837
MySQL through Entity Framework1.15 ms86610,714
MySQL with plain SQL0.70 ms1,43458,658

Even without Entity Framework, the Puppet is faster. Entity Framework sends each row of a batch separately; with plain SQL, the same MySQL stores five times more. The Puppet still stores almost four times more than that.

How the test was set up

  • One machine, over loopback, without TLS. In a real deployment every MySQL write also travels to the database. The Puppet's journal is local to the game; replicating it is a separate step.
  • MySQL in its best setup: native on the machine, a 1 GB buffer pool and no binary log.

Intel i9-14900 desktop with an NVMe drive, Windows 11. MySQL 8.0.46 with Entity Framework Core 8. Puppeteer with its FileSystem journal.

What it proves

Ten thousand participants, none of them alike

Every phone holds a different capability, and the same phone can hold another one the next turn. The result is the sum of all of them.

Design · modelled

Every device keeps its own history

The player on the phone and every fact on the big screen — each in its own journal, on its own device, replayed when it comes back.

Proven in the bingo · measured on the screen

It survives what breaks

A big screen switched off mid-match comes back with nothing missing. In our bingo, the night goes on while the organizer's phone is down.

Measured · proven in the bingo

One system, any sport

Swap the six roles and the same system plays soccer. Nothing underneath changes.

Design

How it's played

Eight moments, in the order they happen. This is the game; the numbered steps after it are how we are building it.

  1. Scan to enterScan to play

    A code takes you in. It opens in the phone's browser — no app store, no account.

    The big screen over the arena showing a QR code and the words Scan to play, with the crowd below holding up phones.
  2. Two teams, one stand eachTeam Blue vs Team Purple

    You enter as Blue or Purple according to your section. The building becomes two halves playing against each other.

    The big screen split between Team Blue and Team Purple with the score between them, over two stands lit in each colour.
  3. The phone gives you a roleYour role

    Not everyone does the same thing: some give the ball height, some aim it, some block. It changes every turn, so nobody is stuck with one verb all night.

    Six phones held up in the crowd, each showing a different role: Lift, Aim, Shoot, Block, Deflect and Charge.
  4. One team attacks, the other defendsBlue attacks · Purple defends

    Three moments inside one possession, and both sides are in all three: Lift against Block, Aim against Deflect, and then the shot goes up while the defenders charge. Next turn it flips.

    The big screen during an attack: the ball in the air toward the hoop between the Blue and Purple banners, with the clock and the score below.
  5. Thousands of taps, one play

    You act when your role is called, and only then. No single tap moves the ball — they add up, and your side's sum against theirs decides how high it goes and where it ends up.

    A hand holding a phone that reads Your role: Shoot, with a large Shoot button, the lit arena behind it.
  6. The shot goes up, and everybody watches it landBucket!

    The result is drawn on the big screen: the ball flies, and the whole building — not only whoever tapped — sees where it ends up.

    The big screen showing the ball going through the hoop and the word Bucket!, with the score on either side.
  7. New turn, new roles

    Whoever was attacking now defends, and the six roles are dealt across the crowd again.

    A phone showing Your new role: Deflect, in front of a big screen that reads New turn — Purple attacks, Blue defends.
  8. The side that is behind has to earn its last shotCOMEBACK SHOT EARNED!

    When the turns run out, if somebody is ahead both stands build power at once — and the side that is behind only gets to shoot if it finishes with more. If the turns end level there is no race at all: sudden death, one shot each, for up to two rounds. The view pulls back, and what it pulls back to is thousands of people who were playing one match.

    The whole arena from high in the stands: the court, the big screen, and thousands of lit phones.

The frames are from the concept video at the top of the page — a simulation of the night, not a night that has happened. Its scoreboards are older than the rules: a game is four turns, every basket is worth two, and there are no quarters.

The shape of a game

Two to four minutes, with an arc — and the side that is behind has to earn its last chance.

  1. Opening

    Phones join; a draw on the big screen picks who attacks first.

  2. The turns

    The sides alternate. Four turns by default, six for a longer slot.

  3. The Power Race

    If somebody is ahead, both stands build power at once. The side behind has to finish with more.

  4. The last shot — or none

    Win the race and you shoot — one shot per basket behind, and you must make them all.

  5. Sudden death

    Level? One shot each, no power. Twice, then it is a draw.

How long a game runs depends on how it ends

  • The leader holds the race~1:53
  • A last shot that misses~2:13–2:28
  • Decided in the first sudden-death round~2:34–3:08
  • A second round, or a draw~3:14–3:48

From the first idea to the arena

Six steps done, five ahead.

  1. 01

    Start with the crowd

    The crowd is the controller. People join from their own phones — no account, nothing to set up.

  2. 02

    Give everyone a role

    Six roles, and your phone only ever shows you yours. Next turn it may hand you another.

  3. 03

    Turn thousands of actions into one

    No single tap moves the ball. Each side's roles add up against the other side's.

  4. 04

    Make the arena react

    Your phone gives you one instruction. The big screen shows what everybody did together.

  5. 05

    Build a model we could watch

    A full four-turn match we could step through and rewind — it is where Charge came from.

  6. 06

    Put it in the arena

    The arena view at the top of this page, to check the game reads from the back row.

  7. 07 Next

    Play one phase end to end

    One phase on real phones, real screens and the console, together.

  8. 08 Next

    Put the screens on real televisions

    The big screen on the hardware a venue hangs on its walls.

  9. 09 Next

    Find where one machine breaks

    The whole path of a tap, pushed until it drops something.

  10. 10 Next

    Calculate the arena

    What every device was measured to do, times the people in the building.

  11. 11 Next

    Take it to an arena

    With people. Nothing above substitutes for it.

Participant #4281

Turn 1

Attack

Aim

Guide it toward the basket

Turn 2

Defence

Block

Keep the shot down

Same participant. Same game. Different capability.

The model's arena: two grandstands of lit phones, purple on the left and blue on the right, with a screen above the court listing three roles for each team.
The six roles in the model, three to a team, with two phones showing what their holder was dealt this turn. Left and right are the two grandstands.
A turn in the model: the court with the ball in the air, the screen above it showing six role bars and the score, and one phone from each team showing the role that person was dealt.
A turn resolving. The screen carries the six bars and the score; the two cards are what one person on each side is holding. The percentages are a worked example, chosen so a turn reads.

One format. Any sport, any event.

Swap the six roles and the same system runs a different sport.

SideBasketballSoccer
AttackLiftBuild
AimAim
ShootShoot
DefenceBlockPress
DeflectBlock
ChargeCounter

Same format. Different sport. Same moment — your phone says SHOOT, you tap, and the whole building watches one ball.

First ideas · soccer

Concept sheet for the soccer version of The Shot: a big screen showing a goal, two teams in orange and green, and six roles — Build, Aim and Shoot on attack, Press, Block and Counter on defence.
The soccer version, drawn the same way: same format, same shared moment, six different roles and two different colours. Nobody has played this one either.

Where a sponsor fits

The screen is the product here, not a surface beside it — which changes what a brand can buy.

The ordinary places

The board, the frame around the play, the moment the teams are announced.

A brand that does something

A boost released into play, felt as part of the game. Both sides get the same — a brand cannot buy an advantage.

What comes back is participation

Not how many were in the building, but how many played: joined, acted, in which turn.

Who is part of the night

The crowd plays it, but the crowd isn't the only one with a part.

Player
Joins from a phone, receives a team and a role, and contributes to the play.
Host / Operator
Runs the night: starts the game, holds it at a safe break, releases the sponsor's moment, and can end it.
Big Screen Controller
Controls what the building sees — the game, transitions, sponsor moments and celebrations.
Sponsor
Has a place inside the experience: a branded round, an intervention, a reward, or a moment of its own.

Design · the night

Concept illustration of one night of The Shot: a host with a tablet showing round and turn controls, a player holding a phone in the crowd, a sponsor's representative at a laptop beside a screen offering a sponsored moment, and a big screen controller at a wall of monitors — all of them in the same arena, under the same big screen showing the game.
One night, four surfaces, one screen behind all of them.

Design · the admin

Design of The Shot's admin, in eight sections: Event Setup, Live Dashboard, Game Control, Teams & Roles, Crowd Pulse, Big Screen Control, Sponsor Experience and Reporting. The figures shown in it are sample data.
The working shape of the operator side: setup before the event, control while it is live, and the record left afterwards.

What it's built on

Not the first thing we've asked a room full of phones to do together — and the three below are not sketches. They run, and each has a page with the measurements on it.

The Village Hall

A bingo night running entirely on the phones in the room: no server holding the messages, no database holding the night.

The Village Hall

Peer to peer

The same bingo across four homes on four networks, over iroh — and what that does and does not establish.

Peer to peer

Puppeteer

The substrate underneath: software subjects that carry their own identity, authority and history.

Puppeteer

This page grows as the work does. What's here is what we've decided, what we built to check it, and what we still don't know.

Same game. Different participants. Different capabilities. One shared result.