Tournament management for pickleball - organizers, referees, players, and spectators.
Create tournaments, register teams, manage matches and courts
/organizer
Score live matches, control match flow
/referee
Register for tournaments, check in on match day
/player/register
View fixtures, standings, and live scores
/
/organizer → Tournament Set-Up → Create Tournament. Enter a name, description, and add one or more seasons. Note the Super Tournament ID displayed after creation./organizer → Match Ops for:/organizer → Post-Match for DUPR reports and the tournament leaderboard./login and enter your referee credentials. After sign-in you land on /me, which lists every tournament you've been assigned to as a referee under Current, Upcoming, and Past tabs. If you don't see a tournament you expect, ask the chief referee to add you via the tournament_referees assignment./me dashboard, find the tournament card and click Score matches. This jumps you to /referee/<tournamentId>/matches — the full match list for that category./court/<matchId>) is built for tablets at the side of the court:+ on the team that just scored a point; − if you tapped wrong.| Status | Meaning |
|---|---|
| Scheduled | Not yet started |
| In Progress | Currently being played |
| Completed | Finished with a winner |
| Walkover | One team didn't show up; chief referee resolves manually |
Picklr's + / − buttons are scoring-mode agnostic. You can use them for either model — just tap + on whichever team won the rally, regardless of who was serving.
The match length is governed by two tournament-level settings stored on the tournaments row in the database:
points_per_game — default 11; the point total a team must reach to win a set.win_by_two — default true; if the score reaches 10–10 at games-to-11, play continues until one team leads by 2.max_sets — default 3; best of N sets.These values are set when the tournament category is created (in /chief/new or directly in Supabase). Picklr does not currently enforce who is serving, track server numbers (first / second server), or auto-rotate the serve. Side-out enforcement and a server indicator are on the Phase 6 roadmap — until then, the referee is the source of truth for which team scored each rally.
/player/register or use the registration link from the organizer/tournament/playercheckin to check in/ (landing page)For live streaming overlay: /tournament/overlay?tournament=ID&match=MATCH_ID
The chief referee runs the draw generator from /chief/<id>/draws after promoting CSV-uploaded participants into teams. Picklr supports two formats and turns them into a court-by-court schedule that no team is ever double-booked in.
Teams are first sorted by seed (lower number = higher seed; un-seeded teams sort last). Picklr then distributes them into pools using a snake / serpentine algorithm so the strong and weak teams are spread evenly:
The default pool size is 4 teams (configurable via the "Teams per pool" field). Pool count is ceil(teamCount / teamsPerPool). If teams don't divide evenly, the last pools are slightly smaller — they still play full round-robin internally.
Inside each pool, every team plays every other team exactly once. For a pool of N teams that's N × (N − 1) / 2 matches:
| Pool size | Matches per pool |
|---|---|
| 3 | 3 |
| 4 | 6 |
| 5 | 10 |
| 6 | 15 |
For single elimination format: teams are sorted by seed, padded with byes to the next power of 2 (4 / 8 / 16 / 32 …), then bracketed in standard 1-vs-N order (1 vs 16, 8 vs 9, etc.). Byes are awarded to the top seeds — they simply skip Round 1.
Once the match list is built, Picklr packs it onto courts in time slots. Each slot is slotMinutes long (default 30 min). The scheduler walks the match list and, for every slot:
This guarantees: no team plays two matches at the same time, courts are kept maximally busy, and the total day length is roughly (totalMatches / numCourts) × slotMinutes.
The generator first builds an in-memory preview showing every match with its slot, court, time, and pool. Nothing touches the database until you click Commit draw. On commit, Picklr writes:
pools + pool_teams rows for each poolrounds row (the slot/time fields disambiguate ordering)matches row per scheduled match with court_number, scheduled_time, and status = scheduledtournaments.draw_status = 'generated'Once committed, referees see the matches in their court mode and the public tournament page populates fixtures, standings, and stats automatically.
| URL | Purpose |
|---|---|
/ | Landing - tournament selection |
/tournament/<id> | Public tournament view |
/organizer | Organizer dashboard |
/organizer/tournament-set-up | Tournament creation |
/organizer/match-ops | Match operations |
/referee | Referee portal |
/player/register | Player registration |
/tournament/playercheckin | Player check-in |
/tournament/overlay | Stream score overlay |
/help | This guide |