Local-app passwords — no username, the password picks the role. A coach types the coach password on their iPad and gets REPLAY only; your admin password unlocks everything.
USERS
roles: fan < parent < player < coach < manager < admin — uploads need parent+, tagging coach+, this page (incl. SCHEDULE/TEAMS) admin. Associate players to give a parent/player their PLAYERS page (a parent can have several — twins!).
cloud note: with the admin key configured (DEPLOY.md step 5), adding a user here ALSO emails their sign-in invite and role changes sync to Supabase automatically. Without it, invites are manual (Supabase → Authentication → Users) and access roles are the SQL snippet in DEPLOY.md 1c.
RIG HEALTH —
loading health…
OPTIONAL VIDEO WORK
Everything here is layered on top of the
required camera → video destination path. Choices are saved on the rig and survive code
updates. Workers already running may need a service restart before every change is active.
TAG TYPES
the REPLAY tag buttons and the EDITOR type list. pre / post = seconds captured before and after the tap (defaults — every clip is still trimmable in EDITOR). Deleting a type keeps existing clips of that type. GOAL is load-bearing (operator goal flow) and can't be removed.
PRACTICE MODE
for practices: drills at both ends, 25+ bodies, extra pucks. The follow (and the aux cameras riding it) commit to ONE drill instead of sitting between two. Pucks and jersey numbers don't matter — the live follow never reads either.
RINK DRIFT SENTINEL
re-measures the pano's board stripes and flags a bumped camera on the HEALTH board. Measured cost: 49 ms of one CPU core per check. 3 agreeing checks to flag, 3 to clear.
AUTO-FOLLOW DETECTION
player detection feeding the AUTO BROADCAST camera. Rate applies live; confidence applies when the pano next starts.
AUTO CAMERA FRAMING
how wide the AUTO BROADCAST camera sits and how hard it chases the play. Applies LIVE, no restart. Blank = leave the shipped default alone.
Width values are fractions of the entire pano: 0.2 = 20% of its width, not 20% of native. Smaller values allow tighter zoom. Use native to avoid enlarging source pixels. Values above the available maximum hold a wide shot.
CROSS-CAMERA FUSION
how the rig decides two cameras are looking at the SAME player. These need tuning AT THE RINK — the right values depend on how accurately our cameras agree on a position, which has never been measured with the aux cams calibrated.
AUX CAMERA AUTO-FOLLOW
the OBSBOTs aim themselves at the play, driven by the pano's detections (no second detector). This physically moves the cameras. Does nothing until the pano has a rink frame AND each camera has ≥3 follow-calibration points.
coming to this section: DeepStream infer interval, SAHI tiling for the follow detector, announcer-cue service.
ON-ICE GRAPHICS (AR)
graphics painted flat ON THE ICE — a logo, a reveal animation, or a video/replay projected on the sheet — locked to the rink by calibration. Real-time (GPU composite), shows in the live preview. For EMPTY ice (pregame / intermission / stoppages); players are not cut out.
⚠ the pano has no rink frame yet — it needs a rink calibration, so this paints nothing.
a static "house lights down, ice lit" layer — dims everything OFF the ice so the sheet pops. Cheap (one multiply, no AR), composes with any graphic. Pregame or all-game.
STREAM TARGET
Where the rig pushes the live program. Set these
and GO LIVE pushes straight to your YouTube stream key — no Google Cloud project needed.
You create the broadcast in YouTube Studio; the rig only sends video to it.
Leave them blank to use the scheduled-broadcast path instead (needs OAuth).
Anyone holding this key can broadcast to your
channel. It is stored on the rig only (mode 600, never committed) and is never sent back
to this page — the field shows blank even when one is set. Reset it in YouTube Studio if
it ever leaks.
BROADCAST SCOREBUG
size and on-screen position of the score bar overlaid on the broadcast video. Applies to the next render.
Enter the team access code (ask a coach or team manager).
Tell us who you are. An admin reviews every request.
MARKING A MOMENT
Pause on the moment you want, choose what the play shows, optionally tap the players involved,
and add a note — then SAVE MOMENT.
Zamerai makes a clip around that point. Trim its start and end, retag it, or add players later
from the CLIPS list — nothing here is final.
EXPORTING A CLIP
⤓ on a clip asks for a downloadable video file of just that moment — its window is
whatever the clip is trimmed to, so trim it first if you want more or less.
The cut does not happen in your browser. The request is queued, a machine picks it up and
cuts it from the full game, and the finished file lands back here. The button tracks it:
⤓ not exported yet — click to ask for it ⋯ queued — waiting for the renderer ◍ rendering now ⤓ ready — click to download ! failed — click to try again
A clip is usually a few MB and takes seconds once the renderer picks it up. If the renderer
is offline the request simply waits — nothing is lost, and it runs when the machine is back.
Once downloaded the file is yours: it plays anywhere, with no internet.
Asking for the same clip twice will not render it twice.
FOLLOW THESE STEPS TOP TO BOTTOM. Finish each numbered stage before continuing.
1 · CONNECT, VERIFY L/R + AIM
Discover the cameras, then open LIVE JOIN. Confirm physical L/R order. With a calibrated rigid head, LIVE JOIN shows both sources after the exact production rectification; do not counter-roll cameras to align raw frames.
LENS FITTED
camera profile pending
2 · CAPTURE EXACT SOURCE
After camera order and physical aim are correct, freeze one synchronized L/R pair for every stitch candidate in this session.
No source frame captured.
fixed rig calibration pending
3 · COMPUTE + REVIEW STITCH
Compute from the captured pair, then PREVIEW → VALIDATE → ACTIVATE the exact candidate. Only ACTIVATE changes the live pano.
active revision —
OPTIONAL JOIN MODE AFTER ACTIVATION—
4 · SOLVE RINK
One look at the live pano, no clicks: the ends of the ice, the near boards, the far kickplate + 10 ft, the three lines. This is what the vPTZ frames with and what the tracker gate is. Re-solve after any stitch change or camera bump; CONFIRM only when the overlay looks right.
—
4b · CANONICAL PANO RINK FRAME (feet mapping; not used for framing)
AUTO-MAP below detects named rink landmarks from fresh synchronized pano frames, validates topology, confidence and coverage, then activates the current venue geometry before any physical camera moves. Manual rink fit remains available as a fallback.
5 · AUTONOMOUS AUX-CAMERA MAPS
Map every movable camera sequentially, or pick one. Thor reuses the pano's player detections, moves one camera at a time through a bounded centre-out scan, solves its physical pose and return delay, validates on held-out frames, then activates only each passing map. No fiducial or configured rink-side location.
auto-calibration idle
SETUP TOOL
6 · CONFIRM READINESS
Setup is complete only when this reports READY.
not checked
RECOVERY · ROLLBACK (ONLY IF NEEDED)
No rollback loaded.
COLOR MATCH
PANO PAIR—
ISO —KELVIN —SHUTTER —
ORDER — do these once per setup, top to bottom: 1. PANO SETUP — capture one exact source pair, compute and PREVIEW a stitch
candidate, then VALIDATE + ACTIVATE it. Sets the GEOMETRY without overwriting live state during compute. 2. PANO PAIR → LOCK PAIR (below) — sets the two pano cameras' EXPOSURE so the two
halves look identical. Aim at the ice, let auto settle, then lock. Redo when the light changes,
not when the rig moves. 3. MATCH ALL (below) — makes on-air CUTS consistent: the whole pano, net and
scorer all render the ICE the same. Click a lit neutral spot (ice / grey card) in each,
then MATCH ALL. The pano moves via its base, so LOCK PAIR's seam match is preserved. Geometry and exposure are independent — fixing one never fixes the other.
MATCH ALL — the cameras cut between on air: pano (whole), net, scorer. Click the ice in each.
—
● LIVE
if reversed:
GAME FOLLOW MAP0/4 points
Aim this camera at each rink point, then capture it. Use the same four points for every moving camera.