ProJudge
A darkened ballroom set for a dance competition: four tablets on stands along a long judges table, an announcer station to their left, every screen switched off.
Judging & show control · live dance competitions

The room
never stops.

Judging, show control, and awards for multi-room competitions. A dead iPad, a hub reboot, a dropped network — back in under 60 seconds, with nothing lost. Everything runs on hardware in your ballroom, so the show never waits on the venue's Wi-Fi.

Demo coming soon See a room run
A competition day

186 routines.
Twelve hours.
One dark ballroom.

Three or four judges, one announcer, a trophy table, and a schedule that has to hold. Everything runs on hardware in your ballroom, so the show never waits on the venue's Wi-Fi.

  • 186 entries
  • 4 judges
  • 10–12 hours
One show state

Three screens, and nobody reading a number off someone else's.

The judge scores. The announcer runs the room. The trophy table already knows. All three are views of the same live state, so no one is waiting on a runner with a clipboard.

The seat

A judge signs in by tapping their own name.

No password and no setup. The roster seats them, so identity comes from the show — and a device can never call itself someone else.

Durable the moment it happens

Written before it's sent.

Every slider move, chip, ink stroke, and second of audio lands on the device the instant it happens, then syncs. Nothing has to reach a network to be safe.

Why it doesn't go down

Designed for recovery, not for luck.

Every competition system fails eventually. The difference is what happens in the next sixty seconds — and whether anyone in the audience ever knows.

  1. 01

    A judge's iPad dies mid-routine.

    Nothing is lost with it. Every input was written to that device the moment it happened, and everything already synced is on the room hub.

  2. 02

    A spare comes out of the case.

    No pairing, no configuration, no account. It joins the room and asks one question.

  3. 03

    The judge taps their own name.

    The roster already seats them, so the device inherits the person rather than the person signing into the device.

  4. 04

    It resumes exactly where the room is.

    “Resuming at #1490 · 2 of 4 scores in”

  5. 05

    The dead device goes read-only on its own.

    If it ever wakes up, it can't write. Two devices never fight over one seat, and the audience never learns any of this happened.

The ProJudge role picker on a spare iPad: a card per seat showing the rostered judge's name, which seats are in use, and each one's resume state — including 'Resuming at #1490 · 2 of 4 scores in'.
Role picker · a spare device joining mid-show Live screenshot · not a mockup
One system · every seat in the room

The same show, from wherever you're sitting.

A judge, an announcer, the room tech, the director, and the runner at the trophy table all need different things from the same afternoon. Each gets a surface built for the job, not a role toggle on someone else's screen.

Judge · iPad

Score a full day without leaving one screen.

  • Sliders tuned to where scores actually land, with ±0.05 steppers and tap-to-type
  • The spoken critique records itself — no button, no naming, no filing
  • Apple Pencil notes on the sheet, delivered with the audio
  • Four view presets, because judges are not identical
The ProJudge judge app: five scored parameters with sliders and good / needs-work chips, a running total of 27.50 out of 30, a projected panel score of 110.00 out of 120, a Gold badge, and 2.70 to Platinum.
Judge scoring · Pro presetiPad · landscape
One number · every screen it touches

Follow a single score out of a judge's hands.

These are the real values from the screenshot above — the same routine, carried through the system without anyone retyping it.

  1. 01 · The sheet
    27.50/ 30

    Five parameters on your rubric, in 0.05 increments. Costume opens full and is deducted from, exactly as on paper.

  2. 02 · The panel
    110.00/ 120

    The judge sees the panel projection while they judge — four judges scoring out of 30 each, so the composite is out of 120.

  3. 03 · The award
    GOLD

    The level that composite currently lands on, from your configured cutoffs — with the distance to the next rung, 2.70 to Platinum.

  4. 04 · The cart
    Provisional → Locked

    Nothing reaches a cart while it can still move. Once the set locks, the trophy table sees the level, the entry, the studio, and how many medals that group size needs.

  5. 05 · The microphone
    One cursor

    The announcer's script and the trophy tablet advance together, so the runner is already holding the right trophy when the name is read.

Multi-room

The clash, twenty minutes before it happens.

Rooms share their running order and their real pace, so a dancer due on two stages minutes apart is flagged on both announcers' screens — with the move that fixes it, before anyone is standing in the wings.

Room 1 · Ballroom A
#1491
12:27 PM
Room 2 · Ballroom B
#2491
12:29 PM
  • Conflicts are derived from the room's observed pace, not the printed schedule, so they can't drift from what's actually happening
  • One room proposes the fix, the other confirms it in a tap — and both keep their own record of it
  • A room that goes quiet is excluded from detection rather than guessed at. If a room can't be seen, the screen says so instead of inventing an all-clear
The ProJudge conflict resolver: two clashing entries with their projected times, the reason (a one minute gap where twenty minutes of costume buffer is needed), a recommended move with the engine's own reasoning, an alternative move, hold options, and a snooze.
Conflict resolver · the engine's own reasoning, verbatim All changes logged
Status honesty

Nothing shows green unless it was verified.

The recording meter is drawn from audio that actually reached the disk, not from the microphone signal. It is the difference between a screen you can glance at and a screen you have to double-check.

The ProJudge judge app with capture stalled: the badge reads NOT CAPTURING in red with the underlying reason, writeFailed disk full, and the waveform has flatlined at the moment the writes stopped.
NOT CAPTURING · writeFailed("disk full")The waveform stalls where the writes did
The ProJudge judge app recording normally: a green live waveform and a REC badge counting 2:17 — the state a signal-driven meter would keep showing even after the disk stopped accepting audio.
REC 2:17 · genuinely healthyA signal meter shows this either way

A meter driven by the microphone signal draws the healthy waveform in both cases, because the microphone is fine — it's the disk that stopped. The judge would find out at the end of the day; the studio would find out when the file never arrived.

Deductions

The printed overtime chart is wrong. We found it in the fixtures.

The chart every table works from states the rule correctly, then tabulates it as 16-second spans for a 15-second block — so the last second of each printed row really belongs to the next one. Read literally, it under-deducts by one block on 17 specific seconds of every competition day.

4:00
The rule

0.1 per judge for every 15 seconds, or any portion of one, past the limit — after a 15% allowance for machine calibration error.

Limit 3:00Allowance 3:27
The formula · what ProJudge applies
1.2
Block 3 · 0.3 per judge
Where the chart contradicts itself
0.8 vs 1.2
4:00 is printed in two rows at once

At exactly 4:00 the printed chart lists the same second twice, in two rows, with two different answers — 0.8 as the end of one and 1.2 as the start of the next. The formula gives 1.2. All 21 rows are encoded as test fixtures, and the same fixtures run against both the TypeScript hub and the Swift judge app, so the two can never quietly disagree.

What the studio gets back

The feedback studios actually pay you for.

A number with no explanation is the most common complaint about a competition weekend. Every routine goes home with the judge's own voice attached to it.

01 · Audio

The spoken critique

Recorded per routine and per judge, starting when the routine does. A file is never named by a human — the name comes from the show, so it can't be misfiled.

02 · Transcript next

Searchable text

The critique as text, so a studio can search a weekend's feedback instead of scrubbing audio for the one note they remember. Transcription runs on the room's own hub, so a minor's audio never leaves the building. Not shipped yet — it's waiting on release wording, not on code.

03 · Ink

The judge's written notes

The pencil marks made on the sheet during the routine, delivered alongside the audio rather than thrown away with the tablet.

Rules are config, not code

Your rubric, your ladder, your ceremony order.

No scoring parameter, cutoff, buffer, or award level is written into the software. They live in a versioned config per event, which is why a new season's scale is an edit rather than a release — and why this runs for organisations whose rules look nothing like each other's.

  • Parameters, maxima, and increments
  • Award levels and their cutoffs, by competition level, age band, and panel size
  • Deduction reasons, costume buffers, re-dance policy, ceremony order
A configured ladder
  • Silver
  • Gold
  • Platinum
  • Double Platinum
  • Crystal

Five rungs here. Another event's config draws a different number of them, in its own order, with its own names — and every screen follows.

How we know

A full competition day, replayed against disaster, on every change.

A show simulator runs a scripted 186-entry day over the real protocol, with the failures deliberately switched on. It has to stay green, so a change cannot quietly break "run a full day."

Simulated day186 entries over the real WebSocket protocol, up to 100× speed
Chaos, deliberatelyKill a client mid-score · drop the network for 60 seconds · kill the hub mid-set
Invariants checkedReplay equality, idempotency, and no lost work — every run
Domain tests399, at roughly 100% branch coverage
Hub tests172, including 46 multi-client integration tests
Judge app tests120, against the same shared fixtures as the hub
State machinesEvery transition tested — including every illegal one
The questions you were going to ask anyway

What happens when it breaks.

What if the internet goes down?

Nothing happens. The room hub in your ballroom is the source of truth and sits on its own network, so the internet isn't in the path of the show at all. Cloud backup and remote monitoring are extras that can fail without the day noticing.

What if a judge's tablet dies?

Hand them a spare and they tap their own name. It resumes at the routine the room is on, with the scores they'd already submitted intact, and the dead device goes read-only if it ever comes back. Target is under sixty seconds, box to scoring.

What if the hub itself dies?

It reboots by replaying its own log and comes back in the state it died in. Judges keep scoring through the outage on their own devices, and their queued work delivers itself when the hub answers again.

What if we have to go back to paper?

Then you go to paper — it's a written procedure, not an improvisation, and it's rehearsed in the pilot runbook. Because history is append-only, re-entering that block afterwards adds to the record instead of overwriting it, so nothing already captured can be corrupted by the catch-up.

Can we use our own rules and award scale?

Yes, and that's the intended path. Parameters, increments, cutoffs, deductions, buffers, and ceremony order are all versioned config. Nothing about a rubric is compiled into the software.

The escalation ladder, in order: a blip self-heals · a dead device hot-swaps · a dead hub replays on boot · paper only when digital can't be restored in time.

See it run a real day.

The fastest way to judge this is to watch a room run — routines advancing, four judges scoring, a set locking, and the awards cart filling itself in. It takes about fifteen minutes.

Demo coming soon Booking opens shortly