Circle rotation with an independent validator
The round robin fixture generator fixes one circle position and rotates the rest after each round. Opposite positions form the fixtures; a placeholder represents rest for odd fields. The resulting plan is checked independently by counting every unordered pair separately within each cycle, rejecting self matches, checking each entrant appears exactly once per round including a bye, and recounting team statistics. Missing or repeated fixtures inside a cycle make the schedule fail. Repeating an opponent in a later requested cycle is intentional and is not reported as an accidental duplicate.
Home and away totals that can be inspected
When home/away is enabled, a cyclic orientation balances each team’s role totals: an odd-sized single cycle gives equal home and away counts, while an even-sized single cycle differs by one. Each adjacent two-cycle block reverses every fixture and gives equal home and away totals. Three cycles leave at most one difference; four restore equality. These are total-count properties. The page does not promise alternating home and away every round, eliminate all role streaks, minimize travel, or enforce a shared home venue restriction.
Actual fixtures and explicit rest rows in exports
The match total counts real team-versus-team games only. CSV also contains one explicit bye row per odd-team round, so the file can have more rows than the displayed match total. Each fixture row retains cycle, round, match number, role labels, both IDs and both names. Copy and print append complete per-team counts. Formula-leading names are protected for spreadsheet use. These are organizer records, not a league-system import guarantee, a saved project file or a live calendar subscription.