# Byes and Brackets > A tournament organiser for amateur competitions - club cups, pub and darts leagues, chess club Swiss events, school sports days, esports LAN brackets, board-game nights. The organiser enters entrants with seeds (by drag), clubs and earliest start times, picks a format, and the browser generates the structure, schedules it onto courts and time slots with rest gaps, records results entered on the bracket or the fixture grid, and keeps live standings with configurable tiebreakers. A metered model reviews the draw for fairness and proposes swaps, and writes round reports with qualification scenarios and picks; the page replays every swap against its draw checker and simulates every scenario before showing it. Live at https://byes-and-brackets.skillsafe.ai/ · API tutorial at https://byes-and-brackets.skillsafe.ai/api.html · Tokens at https://byes-and-brackets.skillsafe.ai/tokens.html ## What it does One work object: one event of 3 to 64 entrants (a league takes up to 24, or 16 home and away, so one saved record stays under the account store's 64 KB document cap). Formats: single elimination; double elimination with a losers' bracket and an optional grand-final reset; round robin (once, or home and away); Swiss; groups then knockout. The free lane (no account, no model, all in the browser): - Brackets for any field size: the bracket is the next power of two, seeds are placed in standard order (1 v P, the top two only meet in the final) and byes go to the top seeds. Walkovers carry the entrant through without a court. - Double elimination: the losers' bracket alternates drop-in rounds (losers of the next winners' round, in reversed order on alternate rounds) with consolidation rounds, then the grand final and an optional reset that is played only if the losers' bracket champion wins the first final. - Round robin by the circle method (an odd field gets a rest each round); Swiss paired from the scores, Dutch fold, lowest-ranked entrant without a bye sits out an odd field, never a rematch; groups by snake seeding (one entrant per pot), group finishers crossed into a knockout so group-mates do not meet straight away. - Scheduling: each match takes the earliest slot with a free court after the matches it draws an entrant from, with the rest gap (free slots between an entrant's matches) and each entrant's earliest start respected. Slots can be minutes, a day or a week. - Standings: points (configurable win/draw/loss), then the chosen tiebreakers in order - head-to-head (a mini-table among exactly the entrants still level), score difference, scored, wins, Buchholz, Sonneborn-Berger - then the seed. Each row says which rule separated it from the row above. - Clinch badges from an enumeration of every remaining result (win, draw, loss) of a table: first place certain, qualified, out, or alive. - Draw checks: double bookings, a match before the match that decides its entrant, rest gaps, availability, seeds 1 and 2 in one half, two of the top four in one quarter, byes on the wrong seeds, same-club first-round meetings or groups, two from one pot in a group (a group of death for the top pot), group-mates meeting in the first knockout round, Swiss rematches. - Views: the bracket as SVG (winners', losers', grand final), a crosstable for a league, Swiss pairings by round, a fixture grid of time slots by courts with sticky round headers, standings, a to-play list, the checks. A TV display mode cycles the tables, the next matches, the latest results and the bracket. - Exports: the bracket (or the fixtures) as standalone SVG, a printable schedule, CSV of fixtures and results, an .ics calendar of every scheduled match with its court, the event as JSON (which opens again), and a Markdown report. Three metered lanes over one system prompt (gpt-terra), routed by the `task` field: - `review` - the draw before play: an assessment by area (seeding, byes, rest, availability, balance, clubs, schedule, courts, format, fairness) and swaps (entrant A trades places with entrant B) naming the checker findings they clear. Each swap is replayed: clean, clears nothing, would break (with the new finding) or cannot apply. - `rereview` - after the organiser accepted or declined swaps or changed the draw by hand: each earlier swap is marked done, still needed, dropped or superseded, and only what is still worth doing is proposed. - `round` - after results: a short report, callouts pinned to played matches (upset, thriller, rout, milestone), scenarios ("E3 qualifies if E3 wins M14") verified by simulating every remaining result (verified, on tiebreak, not guaranteed, contradicted), and a pick with a confidence level for every ready match, upsets labelled by table position or seed. History is saved to the organiser's SkillSafe account (a declared collection, one record per event) and mirrored in the browser. ## The contract Run body, all strings: `{ "task": "review" | "rereview" | "round", "title", "kind", "notes", "format", "settings": JSON, "entrants": JSON, "matches": JSON, "byes": JSON, "standings": JSON, "findings": JSON, "status": JSON, "clipped": JSON (optional), "changes": JSON (rereview), "previous": JSON (rereview) }`. Reply, one JSON object: review/rereview `{task, title, headline, assessment[] {area, verdict, note, entrants, matches}, swaps[] {a, b, reason, addresses}, schedule[], notes[], previous[] {ref, status, note}}`; round `{task, title, round, headline, report[], callouts[] {match, kind, text}, scenarios[] {entrant, outcome, if[] {match, winner}, text}, predictions[] {match, pick, confidence, upset, why}, notes[]}`. ## Sources Derived from the agent skill @onewave-ai/bracket-predictor (https://skillsafe.ai/skill/@onewave-ai/bracket-predictor/), from the onewave-ai/claude-skills repository (MIT): reading a draw as a forecaster - seeds as chalk, upset potential between close seeds, chalk against contrarian picks, explicit confidence levels. Applied here to organising amateur competitions rather than betting or professional sports. Not affiliated with the skill's author.