Optional contact info β used for notifications and shared with co-players.
Used for initial seeding only β real scores take over after round 1.
Optional contact info β used for notifications and shared with co-players.
Used for initial seeding only β real scores take over after round 1.
Optional contact info β used for notifications and shared with co-players.
Used for initial seeding only β real scores take over after round 1.
{{ t('txt_ph_searching') }}
{{ query ? t('txt_ph_no_profiles_matching_q', { q: query }) : (t('txt_hub_no_results') + '.') }}
| {{ t('txt_ph_name') }} | {{ t('txt_txt_email') }} | {{ t('txt_ph_padel_elo') }} | {{ t('txt_ph_tennis_elo') }} | {{ t('txt_txt_passphrase') }} | {{ t('txt_ph_created') }} | ||
|---|---|---|---|---|---|---|---|
| {{ p.name || 'β' }}{{ t('txt_ph_ghost_badge') }} | {{ p.email || 'β' }} | {{ padelElo(p) }} ({{ padelEloMatches(p) }})β | {{ tennisElo(p) }} ({{ tennisEloMatches(p) }})β |
β
{{ p.passphrase }}
|
{{ fmtDate(p.created_at) }} |
{{ t('txt_ph_past_participants_hint') }}
{{ t('txt_ph_searching') }}
{{ t('txt_txt_no_results') }}
| {{ t('txt_ph_name') }} | {{ t('txt_ph_past_last_tournament') }} | |
|---|---|---|
| {{ r.name || 'β' }} | {{ r.last_tournament_name || 'β' }} |
The recipient sets their own password. Link expires in 48 hours.
The community pre-selected when you create a new tournament or lobby.
{{ t('txt_comm_no_communities') }}
| {{ t('txt_comm_col_name') }} | {{ t('txt_comm_col_id') }} | |
|---|---|---|
| {{ c.name }} | {{ c.id }} |
{{ t('txt_comm_no_tournaments') }}
| {{ t('txt_comm_col_tournament') }} | {{ t('txt_comm_col_community') }} |
|---|---|
| {{ tour.name }} {{ tour.type }} | {{ rowMsg('t', tour.id).text }} |
Reassign registration lobbies to different communities.
{{ t('txt_comm_no_registrations') }}
| {{ t('txt_comm_col_lobby') }} | {{ t('txt_comm_col_community') }} |
|---|---|
| {{ r.name }} {{ t('txt_comm_archived') }} | {{ rowMsg('r', r.id).text }} |
Upgrade a community to a club to add branding, player tiers, and seasons.
What this app does and how to find your way around it. Use the sections below to understand the four pages, the player and organizer flows, the tournament formats, and the rating system.
Admin β the organizer's control panel for creating tournaments and lobbies, managing rounds and scores, and coordinating the team. TV View β a public read-only display at /tv/<id> showing live standings, results, and the bracket, designed to be shown on a big screen or shared with all participants. Registrations β a sign-up page where players self-register with custom questionnaires before an event starts. Player Hub β each participant's personal dashboard at /player, aggregating all their active and past events under one passphrase.
Participants never create a username or password. Each player is issued a unique passphrase β a short sequence of words β that gives access to their personal match view, score entry, and the Player Hub. The organizer can share it as a printed card, a QR code, or by email.
Multiple tournament formats (Group+Playoff, Mexicano, direct Playoffs), co-organizers, player self-scoring, announcements, and shareable links. Converting a registration lobby into a live tournament carries every player credential over unchanged.
In the Create tab, pick a format (Group + Play-off, Mexicano, or Direct Play-offs) and sport, then enter player or team names, court names, and β for Mexicano β points per match. Format-specific scoring and pairing knobs live under the Advanced Settings drop-down in the same form. Press Create Tournament.
Open the Player Codes panel. Every player has a passphrase (e.g. brave-little-tiger) and a QR code β print the QR cards, copy a single code, or email them in bulk. That code is all a player needs to see their matches and enter scores; no account required.
Open /tv/<id> (or set a custom alias) on a big screen, or send players the link β it shows live standings, courts, and the bracket with no login. Choose which sections appear and whether players can self-score in the TV Settings panel.
Enter scores as matches finish. In Mexicano, confirm each roundβs proposed pairings to advance β browse the alternative pairing sets first if you want. You can add or remove players mid-event where the format allows.
When group or Mexicano play is done, press Start Play-offs to seed the bracket (add wildcards or late entries here). Once a champion is decided, export a self-contained HTML or PDF summary with the bracket and full match history.
The public demo site runs the complete app. Log in with the shared admin account to use every feature β registration lobbies, clubs, communities, the Player Hub, custom addresses, and more. Data is shared between visitors and reset periodically, so don't use it for real events.
From the login dialog you can also mint a personal demo-xxxxxx account with its own generated passphrase (usable to log in from other devices). It has a minimal admin surface: one active tournament at a time, and no registration lobbies, clubs, communities, custom addresses, or Player Hub profiles. The account and everything it creates are automatically deleted 3 days after sign-up.
Players register through a lobby (public list or join code) and submit answers to organizer-defined questions. On registration, each participant receives a unique passphrase β a short sequence of words that acts as their personal key throughout the app.
When a tournament starts, players enter their passphrase (or scan a QR code) to reach their personal match view β pairings, courts, standings, and score entry, all scoped to them. The passphrase can be shared by the organizer as a printed card, a QR code, or by email.
Players can follow live standings, see their upcoming pairings and assigned courts, and (if enabled by the organizer) submit or confirm scores directly from their own view, reducing the admin's workload mid-event.
Announcements, match comments, and optional email updates keep everyone aligned during the event.
Players can set up a Player Hub profile at /player with just an email. This gives them a single persistent passphrase that works across all events: registering for a lobby pre-fills name, email, and contact automatically; once a tournament starts it appears in the Hub dashboard alongside all other active and past events.
The Hub also tracks career stats β matches played, win rate, best rank β and lets you browse your history with any specific participant across all tournaments (who you played with, who you played against, and your win rate in each combination).
Players who don't have a Hub profile yet can still link individual events retroactively by entering the passphrase they received for that event.
Create a tournament directly with a fixed roster, or open a registration lobby first to gather participants before the event. Lobbies support custom questionnaires (skill level, availability, etc.), optional join-code access to restrict who can sign up, a public participant list so players can see who else is in, and co-editors to help manage incoming registrations.
Convert a lobby into a live tournament with a single click β choose the format (Group+Playoff, Mexicano, or direct Playoffs), set group sizes, court names, and scoring rules. All registered players are pre-filled automatically and each player's passphrase carries over unchanged, so credentials printed or emailed before the event remain valid.
Use the Player Codes panel to view, copy, download, or print all passphrases as QR-code cards ready to hand out. You can also email credentials individually or in bulk directly from the panel. Players can optionally link their passphrase to their Player Hub profile for cross-event access.
Generate pairings, assign courts, and enter or edit scores as each round plays out. For Mexicano, browse multiple proposed pairing sets and pick the best balance before confirming. Mid-event roster tools allow substitutions where the format supports it. When group rounds finish, trigger play-offs and seed the bracket β adding wildcards or late entries if needed.
Invite co-editors who gain full operational access (pairings, scores, announcements) while ownership-sensitive actions β deleting the tournament, managing credentials, changing core settings β stay restricted to the owner and platform admins.
Post announcements that appear on every player's view and the TV display. Send targeted email notifications to all players or selected individuals. Once the event is done, export a self-contained HTML or PDF summary with the full bracket and match history, then archive the tournament to keep the list tidy.
Custom questionnaires, participant review, co-editors, and one-click conversion into live tournaments.
Round management, score tracking, match comments, announcements, and mid-event roster tools (where supported).
Per-player QR/passphrase login for personal match context and distributed score entry.
Shareable live display for standings, results, bracket, and selected sections with configurable refresh behavior.
Use communities as your base scope, then layer clubs when you need branding, season tracking, and richer club operations.
A community is where tournaments and registration lobbies live. It controls default assignment, keeps operations separated by league or venue, and defines the scope where ELO and rankings are computed (global, community, or club context).
A club sits on top of one community and adds logo branding, player tiers, season tracking, leaderboard views, tournament assignment tools, and co-editor workflows for recurring organizer teams.
Use only communities when you run occasional events, temporary series, or lightweight sign-up flows. You still get full tournament operations, registration conversion, and TV/public sharing without maintaining club roster structures.
Create a club when the same organizer team runs recurring events and needs persistent identity, player roster governance, collaborator workflows, and season continuity. Clubs are also the right place for tier-based progression and club-specific leaderboards.
You can reassign tournaments and lobbies to another community for cleanup or migration. If the new community is incompatible with the current club or season, those assignments are automatically cleared to keep scope relationships valid.
Create communities first (for structure), promote active ones to clubs, assign events to the right season, and keep default community + roster data up to date as your event calendar grows.
Set a default community for admins, keep tournament-to-club assignment aligned before opening registrations, review season assignment before each event starts, and use club branding only where long-term identity matters.
Participants are divided into groups for a round-robin stage, then top finishers advance to a knockout bracket. Supports both Padel and Tennis scoring.
Team mode: fixed pairs play every other pair in their group β a complete round-robin. Player (Americano) mode: partners rotate each round so players pair with all others at least once; matchups are formed dynamically to keep each round competitive relative to current group standings.
Pairings are generated each round based on current standings: leaders play against leaders, weaker players against similarly ranked ones. Each round the admin can browse several proposed pairing sets and pick the best balance. Rounds can be unlimited (stop whenever you like) or set to a fixed count.
The Advanced Settings expose fine-grained control over scoring and pairing behaviour:
Start straight in a bracket β seed participants in the desired order and the bracket is generated immediately. No prior group stage needed. Useful for standalone knockout events or fully custom-seeded draws.
Available in every format that includes play-offs. Single elimination (knockout): lose once and you're out. Double elimination (Espejo): a parallel losers' bracket gives everyone a second chance β the finalist must be beaten twice to be knocked out, rewarding consistency across the whole draw.
Use the built-in schema generator below to visualise and export the full bracket structure (PNG, SVG, or PDF) before committing to creating an event.
A margin-aware ELO engine tracks player skill across tournaments. Ratings update after every completed match and appear in the Player Hub.
Instead of pure win/loss, the actual score blends a binary component W (1 | 0.5 | 0) with a continuous margin ratio R. Close wins and blowouts produce different rating changes.
R = 0.5 + (yours β opp) / (2 Γ (yours + opp))
S = Ξ± Β· W + (1 β Ξ±) Β· R
yours = your points, opp = opponent's points, W = win/draw/loss (1 | 0.5 | 0), R = margin ratio, Ξ± = blend weight (0.5). The 0.5 in the R formula is a centering constant (so a draw gives R = 0.5) β it is not related to Ξ±.
S is the blended actual score that replaces the simple win/loss value in the classic ELO update formula. A higher S means a stronger result β the standard ELO calculation then compares S against the expected score to determine how much your rating changes.
After each match your rating changes based on how your blended result S compares to the expected score E. Outperform expectations and you gain ELO; underperform and you lose it.
E = 1 / (1 + 10(opp_rating β your_rating) / 400)
Ξ = K Γ (S β E)
new_rating = old_rating + Ξ
E = expected score (0β1) based on the rating gap β a higher-rated opponent yields a higher E for them and a lower one for you, so beating a stronger player is rewarded more. When S > E your rating rises; when S < E it drops. K controls the maximum change per match (see K-factor tiers below).
New players move faster: Kβ=β40 for the first 20 matches, Kβ=β20 up to 40 matches, then Kβ=β10. This lets newcomers find their level quickly while experienced players have stable ratings.
When your opponent has very few matches, their rating is unreliable. To protect established players (β₯20 matches) from large swings caused by provisional opponents, the rating change is scaled by a reliability factor. Provisional players always receive full deltas so their ratings converge quickly.
reliability(n) = 0.3 + 0.7 Γ n / 20 Β (capped at 1.0)
Ξadj = Ξ Γ reliability(opponent_matches)
n = opponentβs completed match count. The dampener only activates for established players (β₯20 matches). At 0 opponent matches the delta is 30% of normal; at 20 it reaches 100%. In doubles, the minimum reliability of the two opponents is used. Provisional players (<20 matches) always get full rating changes for fast calibration.
Expected score uses team-average ratings. A partner-strength multiplier compensates for mismatched pairs: a strong player paired with a weaker partner gets amplified gains and softened losses, and vice versa. The multiplier ranges from 0.5Γ to 1.5Γ.
Winners always gain at least +1 ELO and losers always lose at least β1, regardless of margin or expected score. Every match result is meaningful.
When all pending group matches are completed a Start Play-offs button appears. Clicking it fetches a recommended list of advancing participants ranked by group standings. The admin can then tick or untick any participant to adjust the selection, add external / seeded participants by name and score (useful for wildcards or late entries that skip the group stage), choose single or double elimination, and confirm. The checked order determines bracket seeding.
Play-offs are optional and can be triggered at any point after any Mexicano round. When started, the admin sees a team-builder where each bracket seed slot has player dropdowns pre-filled based on leaderboard rankings. In individual mode, the admin pairs two players per slot to form a bracket team β the combined leaderboard score is shown as a guide. In team mode, each slot holds one pre-formed team. Any slot can be replaced by an external participant. Once all slots are confirmed, choose single or double elimination and launch the bracket.
Both formats support adding participants who were not in the qualifying stage directly into any bracket seed slot, with a manually assigned score. Useful for seeded wildcards, guests, or late registrations.
Generate a visual diagram of the tournament structure before creating it.
Full documentation on GitHub β
Found a bug, weird behavior, or have a suggestion? Open an issue on GitHub.
Enter your email address and we'll send you a password reset link.
Choose a new password for your account.