How the generators actually work
A plain-language description of what happens when you click Generate. Written from the source code, not marketing copy.
Random team generator
Randomness source
Names are shuffled with a Fisher–Yates shuffle seeded from crypto.getRandomValues, the browser's cryptographically secure random source. We don't use Math.random for the shuffle because its quality varies between browsers and engines, and a poor PRNG can produce subtly biased team assignments on small lists.
Pure-random mode
In pure-random mode, the shuffled list is partitioned into the requested number of teams using round-robin assignment (name #1 → team 1, name #2 → team 2, …). This guarantees that team sizes differ by at most one, regardless of whether the roster divides evenly.
Skill-balanced mode
When ratings are supplied (e.g. Alex 4), we sort the roster by rating descending and snake-draft it: team 1, 2, … N, then N, N−1, … 1, then 1, 2, … N again, and so on. Snake-drafting keeps total team rating very close — for typical inputs, the heaviest and lightest team end up within one rating point. We then shuffle the order of names within each team so the output doesn't look sorted.
What we don't do
We don't optimise globally with simulated annealing or integer programming. Snake drafting is good enough for the inputs people actually paste (5–200 names with ratings 1–10) and is fast enough to run in a single keystroke. If the perfectly optimal split matters to you — say, a competitive league — re-roll a few times and pick the closest.
Bracket maker
Bracket sizes
Single-elimination brackets always have a power-of-two slot count (4, 8, 16, 32, 64). When the team count isn't a power of two, the next-larger size is chosen and the gap is filled with first-round byes. Byes are placed at the top seeds so the highest-rated teams skip the play-in round, matching the standard convention used by most sports federations.
Seeding
By default we use standard "1 vs N, 2 vs N−1" seeding, which keeps the top seeds on opposite halves of the bracket and only collides them in the final. Random seeding ignores rank entirely — useful for friendly tournaments where you want surprise matchups.
Rendering and printing
The bracket is rendered as plain SVG with explicit pixel coordinates. Print uses the same SVG (no rasterisation), which is why the printed output stays crisp at any paper size. PDF export wraps the same SVG in a single-page PDF document generated client-side; PNG export rasterises the SVG via a temporary canvas at 2× the on-screen resolution.
Privacy by construction
Both tools run entirely in your browser. The names you paste are kept in React state and component memory only — they are never sent to our servers, never logged, and never persisted unless you click Export. Refreshing the page clears them. See privacy for the full data flow.
Known limits
- Maximum recommended roster size is around 1,000 names; beyond that the UI may stutter.
- Single-elimination only — no double-elim, round-robin or Swiss yet.
- No persistent storage; closing the tab loses your roster unless exported.